Mesa (master): glx: Handle create_context in terms of create_context_attribs

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Tue Dec 1 19:05:17 UTC 2020


Module: Mesa
Branch: master
Commit: 63822802ef3de4d7a10b96e86e3de4a4f07b77c7
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=63822802ef3de4d7a10b96e86e3de4a4f07b77c7

Author: Adam Jackson <ajax at redhat.com>
Date:   Tue Nov 10 16:06:47 2020 -0500

glx: Handle create_context in terms of create_context_attribs

For the DRI backends we factor this out to a dri_common_create_context
method. Indirect gets the same transformation but doesn't use the common
method since it can't rely on DRI being built.

Reviewed-by: Eric Anholt <eric at anholt.net>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/7660>

---

 src/glx/dri2_glx.c     | 53 +---------------------------------------------
 src/glx/dri3_glx.c     | 14 +------------
 src/glx/dri_common.c   | 14 +++++++++++++
 src/glx/dri_common.h   |  6 ++++++
 src/glx/drisw_glx.c    | 55 +-----------------------------------------------
 src/glx/indirect_glx.c | 57 +++++++++++++++++++++++---------------------------
 6 files changed, 49 insertions(+), 150 deletions(-)

diff --git a/src/glx/dri2_glx.c b/src/glx/dri2_glx.c
index efb6f1f1275..15252b5b269 100644
--- a/src/glx/dri2_glx.c
+++ b/src/glx/dri2_glx.c
@@ -176,57 +176,6 @@ dri2_unbind_context(struct glx_context *context, struct glx_context *new)
    (*psc->core->unbindContext) (pcp->driContext);
 }
 
-static struct glx_context *
-dri2_create_context(struct glx_screen *base,
-		    struct glx_config *config_base,
-		    struct glx_context *shareList, int renderType)
-{
-   struct dri2_context *pcp, *pcp_shared;
-   struct dri2_screen *psc = (struct dri2_screen *) base;
-   __GLXDRIconfigPrivate *config = (__GLXDRIconfigPrivate *) config_base;
-   __DRIcontext *shared = NULL;
-
-   /* Check the renderType value */
-   if (!validate_renderType_against_config(config_base, renderType))
-       return NULL;
-
-   if (shareList) {
-      /* If the shareList context is not a DRI2 context, we cannot possibly
-       * create a DRI2 context that shares it.
-       */
-      if (shareList->vtable->destroy != dri2_destroy_context) {
-	 return NULL;
-      }
-
-      pcp_shared = (struct dri2_context *) shareList;
-      shared = pcp_shared->driContext;
-   }
-
-   pcp = calloc(1, sizeof *pcp);
-   if (pcp == NULL)
-      return NULL;
-
-   if (!glx_context_init(&pcp->base, &psc->base, &config->base)) {
-      free(pcp);
-      return NULL;
-   }
-
-   pcp->base.renderType = renderType;
-
-   pcp->driContext =
-      (*psc->dri2->createNewContext) (psc->driScreen,
-                                      config->driConfig, shared, pcp);
-
-   if (pcp->driContext == NULL) {
-      free(pcp);
-      return NULL;
-   }
-
-   pcp->base.vtable = &dri2_context_vtable;
-
-   return &pcp->base;
-}
-
 static struct glx_context *
 dri2_create_context_attribs(struct glx_screen *base,
 			    struct glx_config *config_base,
@@ -1219,7 +1168,7 @@ dri2_get_driver_name(struct glx_screen *glx_screen)
 }
 
 static const struct glx_screen_vtable dri2_screen_vtable = {
-   .create_context         = dri2_create_context,
+   .create_context         = dri_common_create_context,
    .create_context_attribs = dri2_create_context_attribs,
    .query_renderer_integer = dri2_query_renderer_integer,
    .query_renderer_string  = dri2_query_renderer_string,
diff --git a/src/glx/dri3_glx.c b/src/glx/dri3_glx.c
index 47a8e9a5686..ce3d040ecbe 100644
--- a/src/glx/dri3_glx.c
+++ b/src/glx/dri3_glx.c
@@ -343,18 +343,6 @@ error_exit:
    return NULL;
 }
 
-static struct glx_context *
-dri3_create_context(struct glx_screen *base,
-                    struct glx_config *config_base,
-                    struct glx_context *shareList, int renderType)
-{
-   unsigned int error;
-   uint32_t attribs[2] = { GLX_RENDER_TYPE, renderType };
-
-   return dri3_create_context_attribs(base, config_base, shareList,
-                                      1, attribs, &error);
-}
-
 static void
 dri3_destroy_drawable(__GLXDRIdrawable *base)
 {
@@ -822,7 +810,7 @@ dri3_get_driver_name(struct glx_screen *glx_screen)
 }
 
 static const struct glx_screen_vtable dri3_screen_vtable = {
-   .create_context         = dri3_create_context,
+   .create_context         = dri_common_create_context,
    .create_context_attribs = dri3_create_context_attribs,
    .query_renderer_integer = dri3_query_renderer_integer,
    .query_renderer_string  = dri3_query_renderer_string,
diff --git a/src/glx/dri_common.c b/src/glx/dri_common.c
index f152882d63a..5256a4e2b04 100644
--- a/src/glx/dri_common.c
+++ b/src/glx/dri_common.c
@@ -602,6 +602,20 @@ dri2_check_no_error(uint32_t flags, struct glx_context *share_context,
    return true;
 }
 
+struct glx_context *
+dri_common_create_context(struct glx_screen *base,
+                          struct glx_config *config_base,
+                          struct glx_context *shareList,
+                          int renderType)
+{
+   unsigned int error;
+   uint32_t attribs[2] = { GLX_RENDER_TYPE, renderType };
+
+   return base->vtable->create_context_attribs(base, config_base, shareList,
+                                               1, attribs, &error);
+}
+
+
 /*
  * Given a display pointer and screen number, determine the name of
  * the DRI driver for the screen (i.e., "i965", "radeon", "nouveau", etc).
diff --git a/src/glx/dri_common.h b/src/glx/dri_common.h
index 24af8a98472..364ca3faa29 100644
--- a/src/glx/dri_common.h
+++ b/src/glx/dri_common.h
@@ -83,6 +83,12 @@ dri2_check_no_error(uint32_t flags, struct glx_context *share_context,
                     int major, unsigned *error);
 
 
+extern struct glx_context *
+dri_common_create_context(struct glx_screen *base,
+                          struct glx_config *config_base,
+                          struct glx_context *shareList,
+                          int renderType);
+
 #endif /* GLX_DIRECT_RENDERING */
 
 #endif /* _DRI_COMMON_H */
diff --git a/src/glx/drisw_glx.c b/src/glx/drisw_glx.c
index b45dd784524..ebd0dcdeb2d 100644
--- a/src/glx/drisw_glx.c
+++ b/src/glx/drisw_glx.c
@@ -482,59 +482,6 @@ static const struct glx_context_vtable drisw_context_vtable = {
    .get_proc_address    = NULL,
 };
 
-static struct glx_context *
-drisw_create_context(struct glx_screen *base,
-		     struct glx_config *config_base,
-		     struct glx_context *shareList, int renderType)
-{
-   struct drisw_context *pcp, *pcp_shared;
-   __GLXDRIconfigPrivate *config = (__GLXDRIconfigPrivate *) config_base;
-   struct drisw_screen *psc = (struct drisw_screen *) base;
-   __DRIcontext *shared = NULL;
-
-   if (!psc->base.driScreen)
-      return NULL;
-
-   /* Check the renderType value */
-   if (!validate_renderType_against_config(config_base, renderType))
-       return NULL;
-
-   if (shareList) {
-      /* If the shareList context is not a DRISW context, we cannot possibly
-       * create a DRISW context that shares it.
-       */
-      if (shareList->vtable->destroy != drisw_destroy_context) {
-	 return NULL;
-      }
-
-      pcp_shared = (struct drisw_context *) shareList;
-      shared = pcp_shared->driContext;
-   }
-
-   pcp = calloc(1, sizeof *pcp);
-   if (pcp == NULL)
-      return NULL;
-
-   if (!glx_context_init(&pcp->base, &psc->base, &config->base)) {
-      free(pcp);
-      return NULL;
-   }
-
-   pcp->base.renderType = renderType;
-
-   pcp->driContext =
-      (*psc->core->createNewContext) (psc->driScreen,
-				      config->driConfig, shared, pcp);
-   if (pcp->driContext == NULL) {
-      free(pcp);
-      return NULL;
-   }
-
-   pcp->base.vtable = &drisw_context_vtable;
-
-   return &pcp->base;
-}
-
 static struct glx_context *
 drisw_create_context_attribs(struct glx_screen *base,
 			     struct glx_config *config_base,
@@ -782,7 +729,7 @@ drisw_get_driver_name(struct glx_screen *glx_screen)
 }
 
 static const struct glx_screen_vtable drisw_screen_vtable = {
-   .create_context         = drisw_create_context,
+   .create_context         = dri_common_create_context,
    .create_context_attribs = drisw_create_context_attribs,
    .query_renderer_integer = drisw_query_renderer_integer,
    .query_renderer_string  = drisw_query_renderer_string,
diff --git a/src/glx/indirect_glx.c b/src/glx/indirect_glx.c
index f370daf8bb6..a7a6ba5f13b 100644
--- a/src/glx/indirect_glx.c
+++ b/src/glx/indirect_glx.c
@@ -348,6 +348,18 @@ static const struct glx_context_vtable indirect_context_vtable = {
    .get_proc_address    = NULL,
 };
 
+_X_HIDDEN struct glx_context *
+indirect_create_context(struct glx_screen *psc,
+			struct glx_config *mode,
+			struct glx_context *shareList, int renderType)
+{
+   unsigned error = 0;
+   const uint32_t attribs[] = { GLX_RENDER_TYPE, renderType };
+
+   return indirect_create_context_attribs(psc, mode, shareList,
+                                          1, attribs, &error);
+}
+
 /**
  * \todo Eliminate \c __glXInitVertexArrayState.  Replace it with a new
  * function called \c __glXAllocateClientState that allocates the memory and
@@ -358,20 +370,31 @@ static const struct glx_context_vtable indirect_context_vtable = {
  * parameters.  It is just the allocator for the \c glx_context.
  */
 _X_HIDDEN struct glx_context *
-indirect_create_context(struct glx_screen *psc,
-			struct glx_config *mode,
-			struct glx_context *shareList, int renderType)
+indirect_create_context_attribs(struct glx_screen *psc,
+				struct glx_config *mode,
+				struct glx_context *shareList,
+				unsigned num_attribs,
+				const uint32_t *attribs,
+				unsigned *error)
 {
    struct glx_context *gc;
    int bufSize;
    CARD8 opcode;
    __GLXattribute *state;
+   int i, renderType = GLX_RGBA_TYPE;
 
    opcode = __glXSetupForCommand(psc->dpy);
    if (!opcode) {
       return NULL;
    }
 
+   for (i = 0; i < num_attribs; i++) {
+      uint32_t attr = attribs[i*2], val = attribs[i*2 + 1];
+
+      if (attr == GLX_RENDER_TYPE)
+         renderType = val;
+   }
+
    /* Allocate our context record */
    gc = calloc(1, sizeof *gc);
    if (!gc) {
@@ -449,34 +472,6 @@ indirect_create_context(struct glx_screen *psc,
    return gc;
 }
 
-_X_HIDDEN struct glx_context *
-indirect_create_context_attribs(struct glx_screen *base,
-				struct glx_config *config_base,
-				struct glx_context *shareList,
-				unsigned num_attribs,
-				const uint32_t *attribs,
-				unsigned *error)
-{
-   int renderType = GLX_RGBA_TYPE;
-   unsigned i;
-
-   /* The error parameter is only used on the server so that correct GLX
-    * protocol errors can be generated.  On the client, it can be ignored.
-    */
-   (void) error;
-
-   /* All of the attribute validation for indirect contexts is handled on the
-    * server, so there's not much to do here. Still, we need to parse the
-    * attributes to correctly set renderType.
-    */
-   for (i = 0; i < num_attribs; i++) {
-      if (attribs[i * 2] == GLX_RENDER_TYPE)
-         renderType = attribs[i * 2 + 1];
-   }
-
-   return indirect_create_context(base, config_base, shareList, renderType);
-}
-
 static const struct glx_screen_vtable indirect_screen_vtable = {
    .create_context         = indirect_create_context,
    .create_context_attribs = indirect_create_context_attribs,



More information about the mesa-commit mailing list