[Mesa-dev] [PATCH v2 2/3] glapi/glx: call __glEmptyImage if USE_XCB, not memcpy directly

Julien Cristau jcristau at debian.org
Fri Jul 20 02:09:19 PDT 2012


From: Julien Cristau <julien.cristau at logilab.fr>

We were stomping on the caller's buffer by ignoring their alignment
requests and other pixel store modes.  This patch makes the USE_XCB path match
the older one more closely.

Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=52059

Signed-off-by: Julien Cristau <julien.cristau at logilab.fr>
---
v2: add explicit bugzilla reference to commit message, drop unused
    assignment

 src/mapi/glapi/gen/glX_proto_send.py |   35 ++++++++++++++++++++++++---------
 1 files changed, 25 insertions(+), 10 deletions(-)

diff --git a/src/mapi/glapi/gen/glX_proto_send.py b/src/mapi/glapi/gen/glX_proto_send.py
index 9068a61..029f8d9 100644
--- a/src/mapi/glapi/gen/glX_proto_send.py
+++ b/src/mapi/glapi/gen/glX_proto_send.py
@@ -673,16 +673,31 @@ generic_%u_byte( GLint rop, const void * ptr )
 
 			if f.needs_reply():
 				print '        %s_reply_t *reply = %s_reply(c, %s, NULL);' % (xcb_name, xcb_name, xcb_request)
-				if output and f.reply_always_array:
-					print '        (void)memcpy(%s, %s_data(reply), %s_data_length(reply) * sizeof(%s));' % (output.name, xcb_name, xcb_name, output.get_base_type_string())
-
-				elif output and not f.reply_always_array:
-					if not output.is_image():
-						print '        if (%s_data_length(reply) == 0)' % (xcb_name)
-						print '            (void)memcpy(%s, &reply->datum, sizeof(reply->datum));' % (output.name)
-						print '        else'
-					print '        (void)memcpy(%s, %s_data(reply), %s_data_length(reply) * sizeof(%s));' % (output.name, xcb_name, xcb_name, output.get_base_type_string())
-
+				if output:
+					if output.is_image():
+						[dim, w, h, d, junk] = output.get_dimensions()
+						if f.dimensions_in_reply:
+							w = "reply->width"
+							h = "reply->height"
+							d = "reply->depth"
+							if dim < 2:
+								h = "1"
+							else:
+								print '        if (%s == 0) { %s = 1; }' % (h, h)
+							if dim < 3:
+								d = "1"
+							else:
+								print '        if (%s == 0) { %s = 1; }' % (d, d)
+
+						print '        __glEmptyImage(gc, 3, %s, %s, %s, %s, %s, %s_data(reply), %s);' % (w, h, d, output.img_format, output.img_type, xcb_name, output.name)
+					else:
+						if f.reply_always_array:
+							print '        (void)memcpy(%s, %s_data(reply), %s_data_length(reply) * sizeof(%s));' % (output.name, xcb_name, xcb_name, output.get_base_type_string())
+						else:
+							print '        if (%s_data_length(reply) == 0)' % (xcb_name)
+							print '            (void)memcpy(%s, &reply->datum, sizeof(reply->datum));' % (output.name)
+							print '        else'
+							print '            (void)memcpy(%s, %s_data(reply), %s_data_length(reply) * sizeof(%s));' % (output.name, xcb_name, xcb_name, output.get_base_type_string())
 
 				if f.return_type != 'void':
 					print '        retval = reply->ret_val;'
-- 
1.7.2.5



More information about the mesa-dev mailing list