summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdam Jackson <ajax@redhat.com>2017-11-14 15:15:01 -0500
committerAdam Jackson <ajax@redhat.com>2017-12-13 10:08:40 -0500
commitb832dac751f81d803d33df7c4dd929f77a69c7b0 (patch)
tree9b424035e63086e153070f7469ae70ae4793e221
parentee64427c6c5b22514b4d427fb9cee11b8239baea (diff)
glx: Fix glXQueryContext for GLX_FBCONFIG_ID and GLX_RENDER_TYPE (v2)
Just never filled in, oops. Seems to have gone unnoticed because normally glXQueryContext simply returns the values filled in by the client library when the context was created. The only path by which you normally get to a GLXQueryContext request is glXImportContext, and then only if the context is already indirect. However, that's a statement about Mesa's libGL (and anything else that inherited that bit of the SGI SI more or less intact). Nothing prevents a mischeivous client from issuing that request of a direct context, and if they did we'd be in trouble because we never bothered to preserve the associated fbconfig in the context state, so we'd crash looking up GLX_VISUAL_ID_EXT. So let's fix that too. v2: Fixed missing preservation of the config in DRI2 (Eric Anholt) Signed-off-by: Adam Jackson <ajax@redhat.com> Reviewed-by: Eric Anholt <eric@anholt.net> (cherry picked from commit 5d667df6ea1634191a26f9a7c26bc883701d62b0)
-rw-r--r--glx/glxcmds.c7
-rw-r--r--glx/glxdri2.c1
-rw-r--r--glx/glxdriswrast.c1
-rw-r--r--hw/xquartz/GL/indirect.c2
4 files changed, 9 insertions, 2 deletions
diff --git a/glx/glxcmds.c b/glx/glxcmds.c
index 86aab5498..386a53410 100644
--- a/glx/glxcmds.c
+++ b/glx/glxcmds.c
@@ -215,6 +215,7 @@ __glXdirectContextCreate(__GLXscreen * screen,
if (context == NULL)
return NULL;
+ context->config = modes;
context->destroy = __glXdirectContextDestroy;
context->loseCurrent = __glXdirectContextLoseCurrent;
@@ -1720,7 +1721,7 @@ DoQueryContext(__GLXclientState * cl, GLXContextID gcId)
ClientPtr client = cl->client;
__GLXcontext *ctx;
xGLXQueryContextInfoEXTReply reply;
- int nProps = 3;
+ int nProps = 5;
int sendBuf[nProps * 2];
int nReplyBytes;
int err;
@@ -1742,6 +1743,10 @@ DoQueryContext(__GLXclientState * cl, GLXContextID gcId)
sendBuf[3] = (int) (ctx->config->visualID);
sendBuf[4] = GLX_SCREEN_EXT;
sendBuf[5] = (int) (ctx->pGlxScreen->pScreen->myNum);
+ sendBuf[6] = GLX_FBCONFIG_ID;
+ sendBuf[7] = (int) (ctx->config->fbconfigID);
+ sendBuf[8] = GLX_RENDER_TYPE;
+ sendBuf[9] = (int) (ctx->config->renderType);
if (client->swapped) {
__glXSwapQueryContextInfoEXTReply(client, &reply, sendBuf);
diff --git a/glx/glxdri2.c b/glx/glxdri2.c
index 8f6c3ab6a..91de0476a 100644
--- a/glx/glxdri2.c
+++ b/glx/glxdri2.c
@@ -557,6 +557,7 @@ __glXDRIscreenCreateContext(__GLXscreen * baseScreen,
return NULL;
}
+ context->base.config = glxConfig;
context->base.destroy = __glXDRIcontextDestroy;
context->base.makeCurrent = __glXDRIcontextMakeCurrent;
context->base.loseCurrent = __glXDRIcontextLoseCurrent;
diff --git a/glx/glxdriswrast.c b/glx/glxdriswrast.c
index a9472cd4e..e310fda75 100644
--- a/glx/glxdriswrast.c
+++ b/glx/glxdriswrast.c
@@ -244,6 +244,7 @@ __glXDRIscreenCreateContext(__GLXscreen * baseScreen,
if (context == NULL)
return NULL;
+ context->base.config = glxConfig;
context->base.destroy = __glXDRIcontextDestroy;
context->base.makeCurrent = __glXDRIcontextMakeCurrent;
context->base.loseCurrent = __glXDRIcontextLoseCurrent;
diff --git a/hw/xquartz/GL/indirect.c b/hw/xquartz/GL/indirect.c
index 2d88ef284..6738946ff 100644
--- a/hw/xquartz/GL/indirect.c
+++ b/hw/xquartz/GL/indirect.c
@@ -156,7 +156,7 @@ __glXAquaScreenCreateContext(__GLXscreen *screen,
memset(context, 0, sizeof *context);
context->base.pGlxScreen = screen;
-
+ context->base.config = conf;
context->base.destroy = __glXAquaContextDestroy;
context->base.makeCurrent = __glXAquaContextMakeCurrent;
context->base.loseCurrent = __glXAquaContextLoseCurrent;