glx: Implement GLX_EXT_no_config_context (v2)
Only enabled for the DRI backends at the moment. In principle WGL/CGL could support this - it's sort of implied by GL 3.0 support - but in practice their implementations back GLX drawables with native drawables (and not anonymous FBOs), so they would need either a corresponding window system binding extension or significant implementation work. v2: Require that the two screen numbers match, per v4 of spec. Khronos: https://github.com/KhronosGroup/OpenGL-Registry/pull/102 Signed-off-by: Adam Jackson <ajax@redhat.com> Reviewed-by: Eric Anholt <eric@anholt.net>
This commit is contained in:
parent
f0fffa926a
commit
a4c1e29082
|
@ -93,7 +93,7 @@ __glXDisp_CreateContextAttribsARB(__GLXclientState * cl, GLbyte * pc)
|
||||||
__GLXcontext *ctx = NULL;
|
__GLXcontext *ctx = NULL;
|
||||||
__GLXcontext *shareCtx = NULL;
|
__GLXcontext *shareCtx = NULL;
|
||||||
__GLXscreen *glxScreen;
|
__GLXscreen *glxScreen;
|
||||||
__GLXconfig *config;
|
__GLXconfig *config = NULL;
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
/* The GLX_ARB_create_context_robustness spec says:
|
/* The GLX_ARB_create_context_robustness spec says:
|
||||||
|
@ -136,8 +136,10 @@ __glXDisp_CreateContextAttribsARB(__GLXclientState * cl, GLbyte * pc)
|
||||||
if (!validGlxScreen(client, req->screen, &glxScreen, &err))
|
if (!validGlxScreen(client, req->screen, &glxScreen, &err))
|
||||||
return __glXError(GLXBadFBConfig);
|
return __glXError(GLXBadFBConfig);
|
||||||
|
|
||||||
if (!validGlxFBConfig(client, glxScreen, req->fbconfig, &config, &err))
|
if (req->fbconfig) {
|
||||||
return __glXError(GLXBadFBConfig);
|
if (!validGlxFBConfig(client, glxScreen, req->fbconfig, &config, &err))
|
||||||
|
return __glXError(GLXBadFBConfig);
|
||||||
|
}
|
||||||
|
|
||||||
/* Validate the context with which the new context should share resources.
|
/* Validate the context with which the new context should share resources.
|
||||||
*/
|
*/
|
||||||
|
@ -182,6 +184,9 @@ __glXDisp_CreateContextAttribsARB(__GLXclientState * cl, GLbyte * pc)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case GLX_RENDER_TYPE:
|
case GLX_RENDER_TYPE:
|
||||||
|
/* Not valid for GLX_EXT_no_config_context */
|
||||||
|
if (!req->fbconfig)
|
||||||
|
return BadValue;
|
||||||
render_type = attribs[2 * i + 1];
|
render_type = attribs[2 * i + 1];
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -206,6 +211,15 @@ __glXDisp_CreateContextAttribsARB(__GLXclientState * cl, GLbyte * pc)
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
case GLX_SCREEN:
|
||||||
|
/* Only valid for GLX_EXT_no_config_context */
|
||||||
|
if (req->fbconfig)
|
||||||
|
return BadValue;
|
||||||
|
/* Must match the value in the request header */
|
||||||
|
if (attribs[2 * i + 1] != req->screen)
|
||||||
|
return BadValue;
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
if (!req->isDirect)
|
if (!req->isDirect)
|
||||||
return BadValue;
|
return BadValue;
|
||||||
|
|
|
@ -86,6 +86,7 @@ static const struct extension_info known_glx_extensions[] = {
|
||||||
{ GLX(EXT_framebuffer_sRGB), VER(0,0), N, },
|
{ GLX(EXT_framebuffer_sRGB), VER(0,0), N, },
|
||||||
{ GLX(EXT_import_context), VER(0,0), Y, },
|
{ GLX(EXT_import_context), VER(0,0), Y, },
|
||||||
{ GLX(EXT_libglvnd), VER(0,0), N, },
|
{ GLX(EXT_libglvnd), VER(0,0), N, },
|
||||||
|
{ GLX(EXT_no_config_context), VER(0,0), N, },
|
||||||
{ GLX(EXT_stereo_tree), VER(0,0), N, },
|
{ GLX(EXT_stereo_tree), VER(0,0), N, },
|
||||||
{ GLX(EXT_texture_from_pixmap), VER(0,0), N, },
|
{ GLX(EXT_texture_from_pixmap), VER(0,0), N, },
|
||||||
{ GLX(EXT_visual_info), VER(0,0), Y, },
|
{ GLX(EXT_visual_info), VER(0,0), Y, },
|
||||||
|
|
|
@ -48,6 +48,7 @@ enum {
|
||||||
EXT_fbconfig_packed_float_bit,
|
EXT_fbconfig_packed_float_bit,
|
||||||
EXT_import_context_bit,
|
EXT_import_context_bit,
|
||||||
EXT_libglvnd_bit,
|
EXT_libglvnd_bit,
|
||||||
|
EXT_no_config_context_bit,
|
||||||
EXT_stereo_tree_bit,
|
EXT_stereo_tree_bit,
|
||||||
EXT_texture_from_pixmap_bit,
|
EXT_texture_from_pixmap_bit,
|
||||||
EXT_visual_info_bit,
|
EXT_visual_info_bit,
|
||||||
|
|
|
@ -1770,13 +1770,13 @@ DoQueryContext(__GLXclientState * cl, GLXContextID gcId)
|
||||||
sendBuf[0] = GLX_SHARE_CONTEXT_EXT;
|
sendBuf[0] = GLX_SHARE_CONTEXT_EXT;
|
||||||
sendBuf[1] = (int) (ctx->share_id);
|
sendBuf[1] = (int) (ctx->share_id);
|
||||||
sendBuf[2] = GLX_VISUAL_ID_EXT;
|
sendBuf[2] = GLX_VISUAL_ID_EXT;
|
||||||
sendBuf[3] = (int) (ctx->config->visualID);
|
sendBuf[3] = (int) (ctx->config ? ctx->config->visualID : 0);
|
||||||
sendBuf[4] = GLX_SCREEN_EXT;
|
sendBuf[4] = GLX_SCREEN_EXT;
|
||||||
sendBuf[5] = (int) (ctx->pGlxScreen->pScreen->myNum);
|
sendBuf[5] = (int) (ctx->pGlxScreen->pScreen->myNum);
|
||||||
sendBuf[6] = GLX_FBCONFIG_ID;
|
sendBuf[6] = GLX_FBCONFIG_ID;
|
||||||
sendBuf[7] = (int) (ctx->config->fbconfigID);
|
sendBuf[7] = (int) (ctx->config ? ctx->config->fbconfigID : 0);
|
||||||
sendBuf[8] = GLX_RENDER_TYPE;
|
sendBuf[8] = GLX_RENDER_TYPE;
|
||||||
sendBuf[9] = (int) (ctx->config->renderType);
|
sendBuf[9] = (int) (ctx->config ? ctx->config->renderType : GLX_DONT_CARE);
|
||||||
|
|
||||||
if (client->swapped) {
|
if (client->swapped) {
|
||||||
int length = reply.length;
|
int length = reply.length;
|
||||||
|
|
|
@ -441,6 +441,7 @@ create_driver_context(__GLXDRIcontext * context,
|
||||||
int *error)
|
int *error)
|
||||||
{
|
{
|
||||||
context->driContext = NULL;
|
context->driContext = NULL;
|
||||||
|
const __DRIconfig *driConfig = config ? config->driConfig : NULL;
|
||||||
|
|
||||||
if (screen->dri2->base.version >= 3) {
|
if (screen->dri2->base.version >= 3) {
|
||||||
uint32_t ctx_attribs[4 * 2];
|
uint32_t ctx_attribs[4 * 2];
|
||||||
|
@ -483,10 +484,8 @@ create_driver_context(__GLXDRIcontext * context,
|
||||||
}
|
}
|
||||||
|
|
||||||
context->driContext =
|
context->driContext =
|
||||||
(*screen->dri2->createContextAttribs)(screen->driScreen,
|
(*screen->dri2->createContextAttribs)(screen->driScreen, api,
|
||||||
api,
|
driConfig, driShare,
|
||||||
config->driConfig,
|
|
||||||
driShare,
|
|
||||||
num_ctx_attribs / 2,
|
num_ctx_attribs / 2,
|
||||||
ctx_attribs,
|
ctx_attribs,
|
||||||
&dri_err,
|
&dri_err,
|
||||||
|
@ -522,8 +521,7 @@ create_driver_context(__GLXDRIcontext * context,
|
||||||
}
|
}
|
||||||
|
|
||||||
context->driContext =
|
context->driContext =
|
||||||
(*screen->dri2->createNewContext) (screen->driScreen,
|
(*screen->dri2->createNewContext) (screen->driScreen, driConfig,
|
||||||
config->driConfig,
|
|
||||||
driShare, context);
|
driShare, context);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -831,6 +829,9 @@ initializeExtensions(__GLXscreen * screen)
|
||||||
__glXEnableExtension(screen->glx_enable_bits, "GLX_MESA_copy_sub_buffer");
|
__glXEnableExtension(screen->glx_enable_bits, "GLX_MESA_copy_sub_buffer");
|
||||||
LogMessage(X_INFO, "AIGLX: enabled GLX_MESA_copy_sub_buffer\n");
|
LogMessage(X_INFO, "AIGLX: enabled GLX_MESA_copy_sub_buffer\n");
|
||||||
|
|
||||||
|
__glXEnableExtension(screen->glx_enable_bits, "GLX_EXT_no_config_context");
|
||||||
|
LogMessage(X_INFO, "AIGLX: enabled GLX_EXT_no_config_context\n");
|
||||||
|
|
||||||
if (dri->dri2->base.version >= 3) {
|
if (dri->dri2->base.version >= 3) {
|
||||||
__glXEnableExtension(screen->glx_enable_bits,
|
__glXEnableExtension(screen->glx_enable_bits,
|
||||||
"GLX_ARB_create_context");
|
"GLX_ARB_create_context");
|
||||||
|
|
|
@ -211,6 +211,7 @@ __glXDRIscreenCreateContext(__GLXscreen * baseScreen,
|
||||||
__GLXDRIscreen *screen = (__GLXDRIscreen *) baseScreen;
|
__GLXDRIscreen *screen = (__GLXDRIscreen *) baseScreen;
|
||||||
__GLXDRIcontext *context, *shareContext;
|
__GLXDRIcontext *context, *shareContext;
|
||||||
__GLXDRIconfig *config = (__GLXDRIconfig *) glxConfig;
|
__GLXDRIconfig *config = (__GLXDRIconfig *) glxConfig;
|
||||||
|
const __DRIconfig *driConfig = config ? config->driConfig : NULL;
|
||||||
const __DRIcoreExtension *core = screen->core;
|
const __DRIcoreExtension *core = screen->core;
|
||||||
__DRIcontext *driShare;
|
__DRIcontext *driShare;
|
||||||
|
|
||||||
|
@ -240,8 +241,8 @@ __glXDRIscreenCreateContext(__GLXscreen * baseScreen,
|
||||||
context->base.releaseTexImage = __glXDRIreleaseTexImage;
|
context->base.releaseTexImage = __glXDRIreleaseTexImage;
|
||||||
|
|
||||||
context->driContext =
|
context->driContext =
|
||||||
(*core->createNewContext) (screen->driScreen,
|
(*core->createNewContext) (screen->driScreen, driConfig, driShare,
|
||||||
config->driConfig, driShare, context);
|
context);
|
||||||
|
|
||||||
return &context->base;
|
return &context->base;
|
||||||
}
|
}
|
||||||
|
@ -352,6 +353,9 @@ initializeExtensions(__GLXscreen * screen)
|
||||||
__glXEnableExtension(screen->glx_enable_bits, "GLX_MESA_copy_sub_buffer");
|
__glXEnableExtension(screen->glx_enable_bits, "GLX_MESA_copy_sub_buffer");
|
||||||
LogMessage(X_INFO, "IGLX: enabled GLX_MESA_copy_sub_buffer\n");
|
LogMessage(X_INFO, "IGLX: enabled GLX_MESA_copy_sub_buffer\n");
|
||||||
|
|
||||||
|
__glXEnableExtension(screen->glx_enable_bits, "GLX_EXT_no_config_context");
|
||||||
|
LogMessage(X_INFO, "IGLX: enabled GLX_EXT_no_config_context\n");
|
||||||
|
|
||||||
if (dri->swrast->base.version >= 3) {
|
if (dri->swrast->base.version >= 3) {
|
||||||
__glXEnableExtension(screen->glx_enable_bits,
|
__glXEnableExtension(screen->glx_enable_bits,
|
||||||
"GLX_ARB_create_context");
|
"GLX_ARB_create_context");
|
||||||
|
|
Loading…
Reference in New Issue