Patches for XCB (Jeremy Kolb)
This commit is contained in:
@@ -68,6 +68,12 @@
|
|||||||
#include "dri_glx.h"
|
#include "dri_glx.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef USE_XCB
|
||||||
|
#include <X11/xcl.h>
|
||||||
|
#include <X11/XCB/xcb.h>
|
||||||
|
#include <X11/XCB/glx.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
@@ -1349,10 +1355,17 @@ CARD8 __glXSetupForCommand(Display *dpy)
|
|||||||
GLubyte *__glXFlushRenderBuffer(__GLXcontext *ctx, GLubyte *pc)
|
GLubyte *__glXFlushRenderBuffer(__GLXcontext *ctx, GLubyte *pc)
|
||||||
{
|
{
|
||||||
Display * const dpy = ctx->currentDpy;
|
Display * const dpy = ctx->currentDpy;
|
||||||
|
#ifdef USE_XCB
|
||||||
|
XCBConnection *c = XCBConnectionOfDisplay(dpy);
|
||||||
|
#else
|
||||||
xGLXRenderReq *req;
|
xGLXRenderReq *req;
|
||||||
|
#endif /* USE_XCB */
|
||||||
const GLint size = pc - ctx->buf;
|
const GLint size = pc - ctx->buf;
|
||||||
|
|
||||||
if ( (dpy != NULL) && (size > 0) ) {
|
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 */
|
/* Send the entire buffer as an X request */
|
||||||
LockDisplay(dpy);
|
LockDisplay(dpy);
|
||||||
GetReq(GLXRender,req);
|
GetReq(GLXRender,req);
|
||||||
@@ -1363,6 +1376,7 @@ GLubyte *__glXFlushRenderBuffer(__GLXcontext *ctx, GLubyte *pc)
|
|||||||
_XSend(dpy, (char *)ctx->buf, size);
|
_XSend(dpy, (char *)ctx->buf, size);
|
||||||
UnlockDisplay(dpy);
|
UnlockDisplay(dpy);
|
||||||
SyncHandle();
|
SyncHandle();
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Reset pointer and return it */
|
/* Reset pointer and return it */
|
||||||
@@ -1392,6 +1406,10 @@ void __glXSendLargeChunk(__GLXcontext *gc, GLint requestNumber,
|
|||||||
const GLvoid * data, GLint dataLen)
|
const GLvoid * data, GLint dataLen)
|
||||||
{
|
{
|
||||||
Display *dpy = gc->currentDpy;
|
Display *dpy = gc->currentDpy;
|
||||||
|
#ifdef USE_XCB
|
||||||
|
XCBConnection *c = XCBConnectionOfDisplay(dpy);
|
||||||
|
XCBGlxRenderLarge(c, gc->currentContextTag, requestNumber, totalRequests, dataLen, data);
|
||||||
|
#else
|
||||||
xGLXRenderLargeReq *req;
|
xGLXRenderLargeReq *req;
|
||||||
|
|
||||||
if ( requestNumber == 1 ) {
|
if ( requestNumber == 1 ) {
|
||||||
@@ -1412,6 +1430,7 @@ void __glXSendLargeChunk(__GLXcontext *gc, GLint requestNumber,
|
|||||||
UnlockDisplay(dpy);
|
UnlockDisplay(dpy);
|
||||||
SyncHandle();
|
SyncHandle();
|
||||||
}
|
}
|
||||||
|
#endif /* USE_XCB */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@@ -120,6 +120,12 @@ class PrintGlxProtoStubs(glX_XML.GlxProto):
|
|||||||
print '#include "glxclient.h"'
|
print '#include "glxclient.h"'
|
||||||
print '#include "indirect_size.h"'
|
print '#include "indirect_size.h"'
|
||||||
print '#include <GL/glxproto.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 ''
|
||||||
print '#define __GLX_PAD(n) (((n) + 3) & ~3)'
|
print '#define __GLX_PAD(n) (((n) + 3) & ~3)'
|
||||||
print ''
|
print ''
|
||||||
@@ -414,6 +420,53 @@ generic_%u_byte( GLint rop, const void * ptr )
|
|||||||
|
|
||||||
if self.debug:
|
if self.debug:
|
||||||
print ' printf( "Enter %%s...\\n", "gl%s" );' % (f.name)
|
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 != []:
|
if f.fn_parameters != []:
|
||||||
pc_decl = "GLubyte const * pc ="
|
pc_decl = "GLubyte const * pc ="
|
||||||
@@ -472,11 +525,13 @@ generic_%u_byte( GLint rop, const void * ptr )
|
|||||||
# that don't already require a reply from the server.
|
# that don't already require a reply from the server.
|
||||||
print ' __indirect_glFinish();'
|
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:
|
if self.debug:
|
||||||
print ' printf( "Exit %%s.\\n", "gl%s" );' % (f.name)
|
print ' printf( "Exit %%s.\\n", "gl%s" );' % (f.name)
|
||||||
|
|
||||||
|
|
||||||
print ' UnlockDisplay(dpy); SyncHandle();'
|
|
||||||
print ' }'
|
print ' }'
|
||||||
print ' %s' % f.return_string()
|
print ' %s' % f.return_string()
|
||||||
print '}'
|
print '}'
|
||||||
|
Reference in New Issue
Block a user