The generic_*_byte functions did not rount the command size to a

multiple of 4 correctly in some cases.
This commit is contained in:
Ian Romanick
2005-01-07 02:29:42 +00:00
parent ba5ceda7e0
commit 3385d7cec3
2 changed files with 6 additions and 5 deletions

View File

@@ -119,10 +119,10 @@ static FASTCALL NOINLINE void
generic_3_byte( GLint rop, const void * ptr ) generic_3_byte( GLint rop, const void * ptr )
{ {
__GLXcontext * const gc = __glXGetCurrentContext(); __GLXcontext * const gc = __glXGetCurrentContext();
const GLuint cmdlen = 7; const GLuint cmdlen = 8;
emit_header(gc->pc, rop, cmdlen); emit_header(gc->pc, rop, cmdlen);
(void) memcpy((void *)(gc->pc + 4), ptr, 3); (void) memcpy((void *)(gc->pc + 4), ptr, 4);
gc->pc += cmdlen; gc->pc += cmdlen;
if (__builtin_expect(gc->pc > gc->limit, 0)) { (void) __glXFlushRenderBuffer(gc, gc->pc); } if (__builtin_expect(gc->pc > gc->limit, 0)) { (void) __glXFlushRenderBuffer(gc, gc->pc); }
} }
@@ -143,10 +143,10 @@ static FASTCALL NOINLINE void
generic_6_byte( GLint rop, const void * ptr ) generic_6_byte( GLint rop, const void * ptr )
{ {
__GLXcontext * const gc = __glXGetCurrentContext(); __GLXcontext * const gc = __glXGetCurrentContext();
const GLuint cmdlen = 10; const GLuint cmdlen = 12;
emit_header(gc->pc, rop, cmdlen); emit_header(gc->pc, rop, cmdlen);
(void) memcpy((void *)(gc->pc + 4), ptr, 6); (void) memcpy((void *)(gc->pc + 4), ptr, 8);
gc->pc += cmdlen; gc->pc += cmdlen;
if (__builtin_expect(gc->pc > gc->limit, 0)) { (void) __glXFlushRenderBuffer(gc, gc->pc); } if (__builtin_expect(gc->pc > gc->limit, 0)) { (void) __glXFlushRenderBuffer(gc, gc->pc); }
} }

View File

@@ -142,6 +142,7 @@ setup_vendor_request( __GLXcontext * gc, GLint code, GLint vop, GLint cmdlen )
print "/* Missing GLX protocol for %s. */" % (f.name) print "/* Missing GLX protocol for %s. */" % (f.name)
def print_generic_function(self, n): def print_generic_function(self, n):
size = (n + 3) & ~3
print """static FASTCALL NOINLINE void print """static FASTCALL NOINLINE void
generic_%u_byte( GLint rop, const void * ptr ) generic_%u_byte( GLint rop, const void * ptr )
{ {
@@ -153,7 +154,7 @@ generic_%u_byte( GLint rop, const void * ptr )
gc->pc += cmdlen; gc->pc += cmdlen;
if (__builtin_expect(gc->pc > gc->limit, 0)) { (void) __glXFlushRenderBuffer(gc, gc->pc); } if (__builtin_expect(gc->pc > gc->limit, 0)) { (void) __glXFlushRenderBuffer(gc, gc->pc); }
} }
""" % (n, n + 4, n) """ % (n, size + 4, size)
def common_emit_one_arg(self, p, offset, pc, indent, adjust): def common_emit_one_arg(self, p, offset, pc, indent, adjust):