[Mesa-dev] [PATCH 6/9] Support of RENDER_TYPE property [6/7] Verification of the RENDER_TYPE value.

Tomasz Lis listom at gmail.com
Tue Jul 16 11:56:30 PDT 2013


glx: Verification of the RENDER_TYPE value.

The change is to correctly handle the value of renderType in GLX context.
In case of the value being incorrect, context creation fails.
---
 src/glx/dri2_glx.c             |    9 +++++++++
 src/glx/dri_glx.c              |    5 +++++
 src/glx/drisw_glx.c            |   10 ++++++++++
 src/glx/glxclient.h            |    2 ++
 src/glx/glxcmds.c              |   24 ++++++++++++++++++++++++
 src/glx/indirect_glx.c         |    5 +++++
 src/mesa/drivers/x11/fakeglx.c |    5 ++++-
 7 files changed, 59 insertions(+), 1 deletion(-)

diff --git a/src/glx/dri2_glx.c b/src/glx/dri2_glx.c
index d60c675..bf11b25 100644
--- a/src/glx/dri2_glx.c
+++ b/src/glx/dri2_glx.c
@@ -205,6 +205,11 @@ dri2_create_context(struct glx_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.
@@ -277,6 +282,10 @@ dri2_create_context_attribs(struct glx_screen *base,
                                  error))
       goto error_exit;
 
+   /* Check the renderType value */
+   if (!validate_renderType_against_config(config_base, renderType))
+       goto error_exit;
+
    if (shareList) {
       pcp_shared = (struct dri2_context *) shareList;
       shared = pcp_shared->driContext;
diff --git a/src/glx/dri_glx.c b/src/glx/dri_glx.c
index cc45734..63eb884 100644
--- a/src/glx/dri_glx.c
+++ b/src/glx/dri_glx.c
@@ -581,6 +581,11 @@ dri_create_context(struct glx_screen *base,
    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 DRI context, we cannot possibly
        * create a DRI context that shares it.
diff --git a/src/glx/drisw_glx.c b/src/glx/drisw_glx.c
index ef0e52b..335140c 100644
--- a/src/glx/drisw_glx.c
+++ b/src/glx/drisw_glx.c
@@ -380,6 +380,11 @@ drisw_create_context(struct glx_screen *base,
    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.
@@ -451,6 +456,11 @@ drisw_create_context_attribs(struct glx_screen *base,
 				 error))
       return NULL;
 
+   /* Check the renderType value */
+   if (!validate_renderType_against_config(config_base, renderType)) {
+       return NULL;
+   }
+
    if (reset != __DRI_CTX_RESET_NO_NOTIFICATION)
       return NULL;
 
diff --git a/src/glx/glxclient.h b/src/glx/glxclient.h
index fc8f31c..7e5db0a 100644
--- a/src/glx/glxclient.h
+++ b/src/glx/glxclient.h
@@ -803,6 +803,8 @@ extern int
 applegl_create_display(struct glx_display *display);
 #endif
 
+extern Bool validate_renderType_against_config(const struct glx_config *config, int renderType);
+
 
 extern struct glx_drawable *GetGLXDrawable(Display *dpy, GLXDrawable drawable);
 extern int InitGLXDrawable(Display *dpy, struct glx_drawable *glxDraw,
diff --git a/src/glx/glxcmds.c b/src/glx/glxcmds.c
index 80977c8..502295f 100644
--- a/src/glx/glxcmds.c
+++ b/src/glx/glxcmds.c
@@ -224,6 +224,30 @@ ValidateGLXFBConfig(Display * dpy, GLXFBConfig fbconfig)
    return NULL;
 }
 
+/**
+ * Verifies context's GLX_RENDER_TYPE value with config.
+ * \param config GLX FBConfig which will support the returned renderType.
+ * \param renderType The context render type to be verified.
+ * \return True if the value of context renderType was approved, or 0 if no valid value was found.
+ */
+Bool
+validate_renderType_against_config(const struct glx_config *config, int renderType)
+{
+    switch (renderType) {
+    case GLX_RGBA_TYPE:
+        return (config->renderType & GLX_RGBA_BIT) != 0;
+    case GLX_COLOR_INDEX_TYPE:
+        return (config->renderType & GLX_COLOR_INDEX_BIT) != 0;
+    case GLX_RGBA_FLOAT_TYPE_ARB:
+        return (config->renderType & GLX_RGBA_FLOAT_BIT_ARB) != 0;
+    case GLX_RGBA_UNSIGNED_FLOAT_TYPE_EXT:
+        return (config->renderType & GLX_RGBA_UNSIGNED_FLOAT_BIT_EXT) != 0;
+    default:
+        break;
+    }
+    return 0;
+}
+
 _X_HIDDEN Bool
 glx_context_init(struct glx_context *gc,
 		 struct glx_screen *psc, struct glx_config *config)
diff --git a/src/glx/indirect_glx.c b/src/glx/indirect_glx.c
index 47e514d..b42bc55 100644
--- a/src/glx/indirect_glx.c
+++ b/src/glx/indirect_glx.c
@@ -352,6 +352,11 @@ indirect_create_context(struct glx_screen *psc,
       return NULL;
    }
 
+   /* Check the renderType value */
+   if (!validate_renderType_against_config(mode, renderType)) {
+       return NULL;
+   }
+
    /* Allocate our context record */
    gc = calloc(1, sizeof *gc);
    if (!gc) {
diff --git a/src/mesa/drivers/x11/fakeglx.c b/src/mesa/drivers/x11/fakeglx.c
index 7a2cfbe..c48fc40 100644
--- a/src/mesa/drivers/x11/fakeglx.c
+++ b/src/mesa/drivers/x11/fakeglx.c
@@ -2325,7 +2325,10 @@ Fake_glXCreateNewContext( Display *dpy, GLXFBConfig config,
    XMesaVisual xmvis = (XMesaVisual) config;
 
    if (!dpy || !config ||
-       (renderType != GLX_RGBA_TYPE && renderType != GLX_COLOR_INDEX_TYPE))
+       (renderType != GLX_RGBA_TYPE &&
+          renderType != GLX_COLOR_INDEX_TYPE &&
+       renderType != GLX_RGBA_FLOAT_TYPE_ARB &&
+          renderType != GLX_RGBA_UNSIGNED_FLOAT_TYPE_EXT))
       return 0;
 
    glxCtx = CALLOC_STRUCT(fake_glx_context);
-- 
1.7.9.5



More information about the mesa-dev mailing list