aboutsummaryrefslogtreecommitdiff
path: root/xorg-server/glx
diff options
context:
space:
mode:
Diffstat (limited to 'xorg-server/glx')
-rw-r--r--xorg-server/glx/glxcmds.c71
1 files changed, 41 insertions, 30 deletions
diff --git a/xorg-server/glx/glxcmds.c b/xorg-server/glx/glxcmds.c
index e836af8d5..f5f2babb8 100644
--- a/xorg-server/glx/glxcmds.c
+++ b/xorg-server/glx/glxcmds.c
@@ -1916,44 +1916,55 @@ DoGetDrawableAttributes(__GLXclientState * cl, XID drawId)
{
ClientPtr client = cl->client;
xGLXGetDrawableAttributesReply reply;
- __GLXdrawable *pGlxDraw;
+ __GLXdrawable *pGlxDraw = NULL;
+ DrawablePtr pDraw;
CARD32 attributes[14];
- int numAttribs = 0, error;
+ int num = 0, error;
if (!validGlxDrawable(client, drawId, GLX_DRAWABLE_ANY,
- DixGetAttrAccess, &pGlxDraw, &error))
- return error;
-
- attributes[0] = GLX_TEXTURE_TARGET_EXT;
- attributes[1] = pGlxDraw->target == GL_TEXTURE_2D ? GLX_TEXTURE_2D_EXT :
- GLX_TEXTURE_RECTANGLE_EXT;
- numAttribs++;
- attributes[2] = GLX_Y_INVERTED_EXT;
- attributes[3] = GL_FALSE;
- numAttribs++;
- attributes[4] = GLX_EVENT_MASK;
- attributes[5] = pGlxDraw->eventMask;
- numAttribs++;
- attributes[6] = GLX_WIDTH;
- attributes[7] = pGlxDraw->pDraw->width;
- numAttribs++;
- attributes[8] = GLX_HEIGHT;
- attributes[9] = pGlxDraw->pDraw->height;
- numAttribs++;
- attributes[10] = GLX_FBCONFIG_ID;
- attributes[11] = pGlxDraw->config->fbconfigID;
- numAttribs++;
- if (pGlxDraw->type == GLX_DRAWABLE_PBUFFER) {
- attributes[12] = GLX_PRESERVED_CONTENTS;
- attributes[13] = GL_TRUE;
- numAttribs++;
+ DixGetAttrAccess, &pGlxDraw, &error)) {
+ /* hack for GLX 1.2 naked windows */
+ int err = dixLookupWindow((WindowPtr *)&pDraw, drawId, client,
+ DixGetAttrAccess);
+ if (err != Success)
+ return error;
+ }
+ if (pGlxDraw)
+ pDraw = pGlxDraw->pDraw;
+
+ attributes[2*num] = GLX_Y_INVERTED_EXT;
+ attributes[2*num+1] = GL_FALSE;
+ num++;
+ attributes[2*num] = GLX_WIDTH;
+ attributes[2*num+1] = pDraw->width;
+ num++;
+ attributes[2*num] = GLX_HEIGHT;
+ attributes[2*num+1] = pDraw->height;
+ num++;
+ if (pGlxDraw) {
+ attributes[2*num] = GLX_TEXTURE_TARGET_EXT;
+ attributes[2*num+1] = pGlxDraw->target == GL_TEXTURE_2D ?
+ GLX_TEXTURE_2D_EXT :
+ GLX_TEXTURE_RECTANGLE_EXT;
+ num++;
+ attributes[2*num] = GLX_EVENT_MASK;
+ attributes[2*num+1] = pGlxDraw->eventMask;
+ num++;
+ attributes[2*num] = GLX_FBCONFIG_ID;
+ attributes[2*num+1] = pGlxDraw->config->fbconfigID;
+ num++;
+ if (pGlxDraw->type == GLX_DRAWABLE_PBUFFER) {
+ attributes[2*num] = GLX_PRESERVED_CONTENTS;
+ attributes[2*num+1] = GL_TRUE;
+ num++;
+ }
}
reply = (xGLXGetDrawableAttributesReply) {
.type = X_Reply,
.sequenceNumber = client->sequence,
- .length = numAttribs << 1,
- .numAttribs = numAttribs
+ .length = num << 1,
+ .numAttribs = num
};
if (client->swapped) {