summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/glx/x11/glxext.c23
-rw-r--r--src/mesa/glapi/glX_proto_send.py65
2 files changed, 81 insertions, 7 deletions
diff --git a/src/glx/x11/glxext.c b/src/glx/x11/glxext.c
index badaf9a559f..1d82af295fd 100644
--- a/src/glx/x11/glxext.c
+++ b/src/glx/x11/glxext.c
@@ -68,6 +68,12 @@
#include "dri_glx.h"
#endif
+#ifdef USE_XCB
+#include <X11/xcl.h>
+#include <X11/XCB/xcb.h>
+#include <X11/XCB/glx.h>
+#endif
+
#include <assert.h>
#ifdef DEBUG
@@ -1047,7 +1053,7 @@ static Bool AllocAndFetchScreenConfigs(Display *dpy, __GLXdisplayPrivate *priv)
fb_req->glxCode = X_GLXGetFBConfigs;
fb_req->screen = i;
break;
-
+
case 2:
GetReqExtra(GLXVendorPrivateWithReply,
sz_xGLXGetFBConfigsSGIXReq-sz_xGLXVendorPrivateWithReplyReq,vpreq);
@@ -1349,10 +1355,17 @@ CARD8 __glXSetupForCommand(Display *dpy)
GLubyte *__glXFlushRenderBuffer(__GLXcontext *ctx, GLubyte *pc)
{
Display * const dpy = ctx->currentDpy;
+#ifdef USE_XCB
+ XCBConnection *c = XCBConnectionOfDisplay(dpy);
+#else
xGLXRenderReq *req;
+#endif /* USE_XCB */
const GLint size = pc - ctx->buf;
if ( (dpy != NULL) && (size > 0) ) {
+#ifdef USE_XCB
+ XCBGlxRender(c, ctx->currentContextTag, size, (char *)ctx->buf);
+#else
/* Send the entire buffer as an X request */
LockDisplay(dpy);
GetReq(GLXRender,req);
@@ -1363,6 +1376,7 @@ GLubyte *__glXFlushRenderBuffer(__GLXcontext *ctx, GLubyte *pc)
_XSend(dpy, (char *)ctx->buf, size);
UnlockDisplay(dpy);
SyncHandle();
+#endif
}
/* Reset pointer and return it */
@@ -1392,8 +1406,12 @@ void __glXSendLargeChunk(__GLXcontext *gc, GLint requestNumber,
const GLvoid * data, GLint dataLen)
{
Display *dpy = gc->currentDpy;
+#ifdef USE_XCB
+ XCBConnection *c = XCBConnectionOfDisplay(dpy);
+ XCBGlxRenderLarge(c, gc->currentContextTag, requestNumber, totalRequests, dataLen, data);
+#else
xGLXRenderLargeReq *req;
-
+
if ( requestNumber == 1 ) {
LockDisplay(dpy);
}
@@ -1412,6 +1430,7 @@ void __glXSendLargeChunk(__GLXcontext *gc, GLint requestNumber,
UnlockDisplay(dpy);
SyncHandle();
}
+#endif /* USE_XCB */
}
diff --git a/src/mesa/glapi/glX_proto_send.py b/src/mesa/glapi/glX_proto_send.py
index 1ac46c3b4cd..57ed8b07c33 100644
--- a/src/mesa/glapi/glX_proto_send.py
+++ b/src/mesa/glapi/glX_proto_send.py
@@ -120,6 +120,12 @@ class PrintGlxProtoStubs(glX_XML.GlxProto):
print '#include "glxclient.h"'
print '#include "indirect_size.h"'
print '#include <GL/glxproto.h>'
+ print '#ifdef USE_XCB'
+ print '#include <X11/xcl.h>'
+ print '#include <X11/XCB/xcb.h>'
+ print '#include <X11/XCB/glx.h>'
+ print '#endif /* USE_XCB */'
+
print ''
print '#define __GLX_PAD(n) (((n) + 3) & ~3)'
print ''
@@ -411,10 +417,57 @@ generic_%u_byte( GLint rop, const void * ptr )
def printSingleFunction(self, f):
self.common_func_print_header(f)
-
+
if self.debug:
print ' printf( "Enter %%s...\\n", "gl%s" );' % (f.name)
+ if f.glx_vendorpriv == 0 and f.opcode_name()[-3:] != "ARB" and f.opcode_name()[-2:] != "NV":
+
+ # XCB specific:
+ print '#ifdef USE_XCB'
+ if self.debug:
+ print ' printf("\\tUsing XCB.\\n");'
+ print ' XCBConnection *c = XCBConnectionOfDisplay(dpy);'
+ print ' (void) __glXFlushRenderBuffer(gc, gc->pc);'
+ xcb_name = 'XCBGlx%s' % (f.opcode_name().rsplit("_", 1)[1]);
+ iparams=[]
+ for p in f.fn_parameters:
+ if p.is_output == 0:
+ iparams.append(p.name)
+
+ if f.image and f.image.is_output:
+ if f.image.img_format != "GL_COLOR_INDEX" or f.image.img_type != "GL_BITMAP":
+ iparams.append("state->storePack.swapEndian")
+ else:
+ iparams.append("0")
+
+ # Hardcode this in. lsb_first param (apparently always GL_FALSE)
+ # also present in GetPolygonStipple, but taken care of above.
+ if xcb_name == "XCBGlxReadPixels": iparams.append("0")
+
+ xcb_request = '%s(%s)' % (xcb_name, ", ".join(["c", "gc->currentContextTag"] + iparams))
+
+ if f.needs_reply():
+ print ' %sRep *reply = %sReply(c, %s, NULL);' % (xcb_name, xcb_name, xcb_request)
+ if f.output and f.reply_always_array:
+ print ' %s = (%s *)%sData(reply);' % (f.output.name, f.output.p_type.name, xcb_name)
+ elif f.output and not f.reply_always_array:
+ if not f.image:
+ print ' if (%sDataLength(reply) == 0)' % (xcb_name)
+ print ' %s = (%s *) &reply->datum;' % (f.output.name, f.output.p_type.name)
+ print ' else'
+ print ' %s = (%s *)%sData(reply);' % (f.output.name, f.output.p_type.name, xcb_name)
+ else:
+ print ' %s = (%s *)%sData(reply);' % (f.output.name, f.output.p_type.name, xcb_name)
+
+ if f.fn_return_type != 'void':
+ print ' retval = reply->ret_val;'
+ print ' free(reply);'
+ else:
+ print ' ' + xcb_request + ';'
+ print '#else'
+ # End of XCB specific.
+
if f.fn_parameters != []:
pc_decl = "GLubyte const * pc ="
else:
@@ -472,11 +525,13 @@ generic_%u_byte( GLint rop, const void * ptr )
# that don't already require a reply from the server.
print ' __indirect_glFinish();'
+ print ' UnlockDisplay(dpy); SyncHandle();'
+
+ if f.glx_vendorpriv == 0 and f.opcode_name()[-3:] != "ARB" and f.opcode_name()[-2:] != "NV":
+ print '#endif /* USE_XCB */'
+
if self.debug:
print ' printf( "Exit %%s.\\n", "gl%s" );' % (f.name)
-
-
- print ' UnlockDisplay(dpy); SyncHandle();'
print ' }'
print ' %s' % f.return_string()
print '}'
@@ -678,7 +733,7 @@ generic_%u_byte( GLint rop, const void * ptr )
# regular. Since they are so regular and there are so many
# of them, special case them with generic functions. On
# x86, this saves about 26KB in the libGL.so binary.
-
+
if f.variable_length_parameter() == None and len(f.fn_parameters) == 1:
p = f.fn_parameters[0]
if p.is_pointer: