glx: Validate the GLX_RENDER_TYPE value
Correctly handle the value of renderType in GLX context. In case of the value being incorrect, context creation fails. v2 (idr): indirect_create_context is just a memory allocator, so don't validate the GLX_RENDER_TYPE there. Fixes regressions in several GLX_ARB_create_context piglit tests. Signed-off-by: Tomasz Lis <tomasz.lis@intel.com> Signed-off-by: Ian Romanick <ian.d.romanick@intel.com> Reviewed-by: Ian Romanick <ian.d.romanick@intel.com>
This commit is contained in:
@@ -205,6 +205,10 @@ dri2_create_context(struct glx_screen *base,
|
|||||||
__GLXDRIconfigPrivate *config = (__GLXDRIconfigPrivate *) config_base;
|
__GLXDRIconfigPrivate *config = (__GLXDRIconfigPrivate *) config_base;
|
||||||
__DRIcontext *shared = NULL;
|
__DRIcontext *shared = NULL;
|
||||||
|
|
||||||
|
/* Check the renderType value */
|
||||||
|
if (!validate_renderType_against_config(config_base, renderType))
|
||||||
|
return NULL;
|
||||||
|
|
||||||
if (shareList) {
|
if (shareList) {
|
||||||
/* If the shareList context is not a DRI2 context, we cannot possibly
|
/* If the shareList context is not a DRI2 context, we cannot possibly
|
||||||
* create a DRI2 context that shares it.
|
* create a DRI2 context that shares it.
|
||||||
@@ -277,6 +281,10 @@ dri2_create_context_attribs(struct glx_screen *base,
|
|||||||
&api, &reset, error))
|
&api, &reset, error))
|
||||||
goto error_exit;
|
goto error_exit;
|
||||||
|
|
||||||
|
/* Check the renderType value */
|
||||||
|
if (!validate_renderType_against_config(config_base, renderType))
|
||||||
|
goto error_exit;
|
||||||
|
|
||||||
if (shareList) {
|
if (shareList) {
|
||||||
pcp_shared = (struct dri2_context *) shareList;
|
pcp_shared = (struct dri2_context *) shareList;
|
||||||
shared = pcp_shared->driContext;
|
shared = pcp_shared->driContext;
|
||||||
|
@@ -581,6 +581,10 @@ dri_create_context(struct glx_screen *base,
|
|||||||
if (!psc->base.driScreen)
|
if (!psc->base.driScreen)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
|
/* Check the renderType value */
|
||||||
|
if (!validate_renderType_against_config(config_base, renderType))
|
||||||
|
return NULL;
|
||||||
|
|
||||||
if (shareList) {
|
if (shareList) {
|
||||||
/* If the shareList context is not a DRI context, we cannot possibly
|
/* If the shareList context is not a DRI context, we cannot possibly
|
||||||
* create a DRI context that shares it.
|
* create a DRI context that shares it.
|
||||||
|
@@ -380,6 +380,10 @@ drisw_create_context(struct glx_screen *base,
|
|||||||
if (!psc->base.driScreen)
|
if (!psc->base.driScreen)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
|
/* Check the renderType value */
|
||||||
|
if (!validate_renderType_against_config(config_base, renderType))
|
||||||
|
return NULL;
|
||||||
|
|
||||||
if (shareList) {
|
if (shareList) {
|
||||||
/* If the shareList context is not a DRISW context, we cannot possibly
|
/* If the shareList context is not a DRISW context, we cannot possibly
|
||||||
* create a DRISW context that shares it.
|
* create a DRISW context that shares it.
|
||||||
@@ -451,6 +455,11 @@ drisw_create_context_attribs(struct glx_screen *base,
|
|||||||
&api, &reset, error))
|
&api, &reset, error))
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
|
/* Check the renderType value */
|
||||||
|
if (!validate_renderType_against_config(config_base, renderType)) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
if (reset != __DRI_CTX_RESET_NO_NOTIFICATION)
|
if (reset != __DRI_CTX_RESET_NO_NOTIFICATION)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
|
@@ -803,6 +803,9 @@ extern int
|
|||||||
applegl_create_display(struct glx_display *display);
|
applegl_create_display(struct glx_display *display);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
extern Bool validate_renderType_against_config(const struct glx_config *config,
|
||||||
|
int renderType);
|
||||||
|
|
||||||
|
|
||||||
extern struct glx_drawable *GetGLXDrawable(Display *dpy, GLXDrawable drawable);
|
extern struct glx_drawable *GetGLXDrawable(Display *dpy, GLXDrawable drawable);
|
||||||
extern int InitGLXDrawable(Display *dpy, struct glx_drawable *glxDraw,
|
extern int InitGLXDrawable(Display *dpy, struct glx_drawable *glxDraw,
|
||||||
|
@@ -224,6 +224,33 @@ ValidateGLXFBConfig(Display * dpy, GLXFBConfig fbconfig)
|
|||||||
return NULL;
|
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
|
_X_HIDDEN Bool
|
||||||
glx_context_init(struct glx_context *gc,
|
glx_context_init(struct glx_context *gc,
|
||||||
struct glx_screen *psc, struct glx_config *config)
|
struct glx_screen *psc, struct glx_config *config)
|
||||||
|
@@ -335,6 +335,10 @@ static const struct glx_context_vtable indirect_context_vtable = {
|
|||||||
* \todo Eliminate \c __glXInitVertexArrayState. Replace it with a new
|
* \todo Eliminate \c __glXInitVertexArrayState. Replace it with a new
|
||||||
* function called \c __glXAllocateClientState that allocates the memory and
|
* function called \c __glXAllocateClientState that allocates the memory and
|
||||||
* does all the initialization (including the pixel pack / unpack).
|
* does all the initialization (including the pixel pack / unpack).
|
||||||
|
*
|
||||||
|
* \note
|
||||||
|
* This function is \b not the place to validate the context creation
|
||||||
|
* parameters. It is just the allocator for the \c glx_context.
|
||||||
*/
|
*/
|
||||||
_X_HIDDEN struct glx_context *
|
_X_HIDDEN struct glx_context *
|
||||||
indirect_create_context(struct glx_screen *psc,
|
indirect_create_context(struct glx_screen *psc,
|
||||||
|
@@ -2325,7 +2325,10 @@ Fake_glXCreateNewContext( Display *dpy, GLXFBConfig config,
|
|||||||
XMesaVisual xmvis = (XMesaVisual) config;
|
XMesaVisual xmvis = (XMesaVisual) config;
|
||||||
|
|
||||||
if (!dpy || !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;
|
return 0;
|
||||||
|
|
||||||
glxCtx = CALLOC_STRUCT(fake_glx_context);
|
glxCtx = CALLOC_STRUCT(fake_glx_context);
|
||||||
|
Reference in New Issue
Block a user