aboutsummaryrefslogtreecommitdiffstats
path: root/src/mesa/glapi/glX_proto_send.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/mesa/glapi/glX_proto_send.py')
-rw-r--r--src/mesa/glapi/glX_proto_send.py96
1 files changed, 80 insertions, 16 deletions
diff --git a/src/mesa/glapi/glX_proto_send.py b/src/mesa/glapi/glX_proto_send.py
index 334caf82527..4f95da3aef7 100644
--- a/src/mesa/glapi/glX_proto_send.py
+++ b/src/mesa/glapi/glX_proto_send.py
@@ -103,6 +103,7 @@ class glXPixelFunctionUtility(glX_XML.glXFunction):
self.can_be_large = func.can_be_large
self.count_parameter_list = func.count_parameter_list
self.counter = func.counter
+ self.img_reset = None
return
@@ -166,6 +167,48 @@ read_reply( Display *dpy, size_t size, void * dest, GLboolean reply_is_always_ar
return reply.retval;
}
+static NOINLINE void
+read_pixel_reply( Display *dpy, __GLXcontext * gc, unsigned max_dim,
+ GLint width, GLint height, GLint depth, GLenum format, GLenum type,
+ void * dest, GLboolean dimensions_in_reply )
+{
+ xGLXSingleReply reply;
+ GLint size;
+
+ (void) _XReply(dpy, (xReply *) & reply, 0, False);
+
+ if ( dimensions_in_reply ) {
+ width = reply.pad3;
+ height = reply.pad4;
+ depth = reply.pad5;
+
+ if ((height == 0) || (max_dim < 2)) { height = 1; }
+ if ((depth == 0) || (max_dim < 3)) { depth = 1; }
+ }
+
+ size = reply.length * 4;
+ if (size != 0) {
+ void * buf = Xmalloc( size );
+
+ if ( buf == NULL ) {
+ _XEatData(dpy, size);
+ __glXSetError(gc, GL_OUT_OF_MEMORY);
+ }
+ else {
+ const GLint extra = 4 - (size & 3);
+
+ _XRead(dpy, buf, size);
+ if ( extra < 4 ) {
+ _XEatData(dpy, extra);
+ }
+
+ __glEmptyImage(gc, 3, width, height, depth, format, type,
+ buf, dest);
+ Xfree(buf);
+ }
+ }
+}
+
#define X_GLXSingle 0
static NOINLINE FASTCALL GLubyte *
@@ -265,8 +308,9 @@ generic_%u_byte( GLint rop, const void * ptr )
r = 2
for p in f.parameterIterator(1, r):
- self.common_emit_one_arg(p, offset, pc, indent, adjust)
- offset += p.size()
+ if p.name != f.img_reset:
+ self.common_emit_one_arg(p, offset, pc, indent, adjust)
+ offset += p.size()
return offset
@@ -328,6 +372,9 @@ generic_%u_byte( GLint rop, const void * ptr )
# parameter.
if not f.glx_rop:
+ if f.image and f.image.is_output:
+ print ' const __GLXattribute * const state = gc->client_state_private;'
+
print ' Display * const dpy = gc->currentDpy;'
skip_condition = "dpy != NULL"
elif f.can_be_large:
@@ -383,26 +430,43 @@ generic_%u_byte( GLint rop, const void * ptr )
print ' %s setup_single_request(gc, %s, cmdlen);' % (pc_decl, f.opcode_name())
self.common_emit_args(f, "pc", " ", 0, 0)
+ if f.image and f.image.is_output:
+ o = f.command_fixed_length() - 4
+ print ' *(int32_t *)(pc + %u) = 0;' % (o)
+ if f.image.img_format != "GL_COLOR_INDEX" or f.image.img_type != "GL_BITMAP":
+ print ' * (int8_t *)(pc + %u) = state->storePack.swapEndian;' % (o)
+
+ if f.img_reset:
+ print ' * (int8_t *)(pc + %u) = %s;' % (o + 1, f.img_reset)
+
if f.needs_reply():
- if f.output != None:
- output_size = f.output.p_type.size
- output_str = f.output.name
+ if f.image and f.image.is_output:
+ [dim, w, h, d, junk] = f.dimensions()
+ if f.dimensions_in_reply:
+ print " read_pixel_reply(dpy, gc, %u, 0, 0, 0, %s, %s, %s, GL_TRUE);" % (dim, f.image.img_format, f.image.img_type, f.image.name)
+ else:
+ print " read_pixel_reply(dpy, gc, %u, %s, %s, %s, %s, %s, %s, GL_FALSE);" % (dim, w, h, d, f.image.img_format, f.image.img_type, f.image.name)
else:
- output_size = 0
- output_str = "NULL"
+ if f.output != None:
+ output_size = f.output.p_type.size
+ output_str = f.output.name
+ else:
+ output_size = 0
+ output_str = "NULL"
- if f.fn_return_type != 'void':
- return_str = " retval = (%s)" % (f.fn_return_type)
- else:
- return_str = " (void)"
+ if f.fn_return_type != 'void':
+ return_str = " retval = (%s)" % (f.fn_return_type)
+ else:
+ return_str = " (void)"
- if f.reply_always_array:
- aa = "GL_TRUE"
- else:
- aa = "GL_FALSE"
+ if f.reply_always_array:
+ aa = "GL_TRUE"
+ else:
+ aa = "GL_FALSE"
+
+ print " %s read_reply(dpy, %s, %s, %s);" % (return_str, output_size, output_str, aa)
- print " %s read_reply(dpy, %s, %s, %s);" % (return_str, output_size, output_str, aa)
elif self.debug:
# Only emit the extra glFinish call for functions
# that don't already require a reply from the server.