Fwd: Changing <valueparam> to <switch> in render extension

Submitted by Jaya Tiwari on Oct. 18, 2014, 4:44 a.m.

Details

Message ID CAGt7qzXC+FtiZK-NR3CJcbMoQNZMc8zNbHrLa63t6-1aAjFqSA@mail.gmail.com
State New
Headers show

Commit Message

Jaya Tiwari Oct. 18, 2014, 4:44 a.m.
I am an OPW intern applicant for round 9 and interested in server-side xcb
under mentorship of Christian Linhart.

For my initial small contribution,

I have changed <valueparam> to <switch> in two requests of the render
extension.
The reason is that <switch> is recommended in the xml-xcb-spec instead of
<valueparam> and the <switch> contains a more precise description of the
protocol.

I have following observations :

1. xcb_render_create_picture_value_list_t :
  A new structure with value mask names is added.

2. Size computed by function xcb_render_create_picture_value_list_unpack
(as used by function xcb_render_create_picture_value_list_sizeof)
does essentially the same as the expression with popcount in
xcb_render_create_picture_sizeof, but xcb_render_create_picture_
sizeof computes the size of the whole request "render_create_picture"
and xcb_render_create_picture_value_list_sizeof only computes the size of
the switch ( with name "value_list" )
So it is not directly compatible because the name of the function is
different, so it won't compile or link with existing code which uses the
previous version.

3. parameter type const uint32_t* of value_list in
xcb_render_create_picture and xcb_render_create_picture_checked changed to
const void*.

4. In xcb_render_create_picture, again instead of initializing xcb_parts
with popcounting elements from value_list, it checks all possible masks
using xcb_render_create_picture_value_list_sizeof and initializes xcb_parts.

5. The work of sending request is done in xcb_render_create_picture, same
things is again repeated in xcb_render_create_picture_aux (i dont really
have much idea of differences in aux and non-aux functions)


Along is a xml (render extension) diff along with libxcl implementation
header and c files attached.

Please comment on the diffs and observations and correct me wherever my
understanding fails.

Thankyou.

Regards,
Jaya

diff --git a/before_change/src/render.h b/libxcb/src/render.h
index 8b4a524..ae3aada 100644
--- a/before_change/src/render.h
+++ b/libxcb/src/render.h
@@ -575,6 +575,25 @@ typedef struct xcb_render_query_pict_index_values_reply_t {
     uint8_t  pad1[20]; /**<  */
 } xcb_render_query_pict_index_values_reply_t;
 
+/**
+ * @brief xcb_render_create_picture_value_list_t
+ **/
+typedef struct xcb_render_create_picture_value_list_t {
+    uint32_t repeat; /**<  */
+    uint32_t alphamap; /**<  */
+    uint32_t alphaxorigin; /**<  */
+    uint32_t alphayorigin; /**<  */
+    uint32_t clipxorigin; /**<  */
+    uint32_t clipyorigin; /**<  */
+    uint32_t clipmask; /**<  */
+    uint32_t graphicsexposure; /**<  */
+    uint32_t subwindowmode; /**<  */
+    uint32_t polyedge; /**<  */
+    uint32_t polymode; /**<  */
+    uint32_t dither; /**<  */
+    uint32_t componentalpha; /**<  */
+} xcb_render_create_picture_value_list_t;
+
 /** Opcode for xcb_render_create_picture. */
 #define XCB_RENDER_CREATE_PICTURE 4
 
@@ -591,6 +610,25 @@ typedef struct xcb_render_create_picture_request_t {
     uint32_t                value_mask; /**<  */
 } xcb_render_create_picture_request_t;
 
+/**
+ * @brief xcb_render_change_picture_value_list_t
+ **/
+typedef struct xcb_render_change_picture_value_list_t {
+    uint32_t repeat; /**<  */
+    uint32_t alphamap; /**<  */
+    uint32_t alphaxorigin; /**<  */
+    uint32_t alphayorigin; /**<  */
+    uint32_t clipxorigin; /**<  */
+    uint32_t clipyorigin; /**<  */
+    uint32_t clipmask; /**<  */
+    uint32_t graphicsexposure; /**<  */
+    uint32_t subwindowmode; /**<  */
+    uint32_t polyedge; /**<  */
+    uint32_t polymode; /**<  */
+    uint32_t dither; /**<  */
+    uint32_t componentalpha; /**<  */
+} xcb_render_change_picture_value_list_t;
+
 /** Opcode for xcb_render_change_picture. */
 #define XCB_RENDER_CHANGE_PICTURE 5
 
@@ -1714,7 +1752,18 @@ xcb_render_query_pict_index_values_reply (xcb_connection_t
                                           xcb_generic_error_t                         **e  /**< */);
 
 int
-xcb_render_create_picture_sizeof (const void  *_buffer  /**< */);
+xcb_render_create_picture_value_list_serialize (void                                         **_buffer  /**< */,
+                                                uint32_t                                       value_mask  /**< */,
+                                                const xcb_render_create_picture_value_list_t  *_aux  /**< */);
+
+int
+xcb_render_create_picture_value_list_unpack (const void                              *_buffer  /**< */,
+                                             uint32_t                                 value_mask  /**< */,
+                                             xcb_render_create_picture_value_list_t  *_aux  /**< */);
+
+int
+xcb_render_create_picture_value_list_sizeof (const void  *_buffer  /**< */,
+                                             uint32_t     value_mask  /**< */);
 
 /**
  *
@@ -1733,7 +1782,7 @@ xcb_render_create_picture_checked (xcb_connection_t        *c  /**< */,
                                    xcb_drawable_t           drawable  /**< */,
                                    xcb_render_pictformat_t  format  /**< */,
                                    uint32_t                 value_mask  /**< */,
-                                   const uint32_t          *value_list  /**< */);
+                                   const void              *value_list  /**< */);
 
 /**
  *
@@ -1749,10 +1798,56 @@ xcb_render_create_picture (xcb_connection_t        *c  /**< */,
                            xcb_drawable_t           drawable  /**< */,
                            xcb_render_pictformat_t  format  /**< */,
                            uint32_t                 value_mask  /**< */,
-                           const uint32_t          *value_list  /**< */);
+                           const void              *value_list  /**< */);
+
+/**
+ *
+ * @param c The connection
+ * @return A cookie
+ *
+ * Delivers a request to the X server.
+ *
+ * This form can be used only if the request will not cause
+ * a reply to be generated. Any returned error will be
+ * saved for handling by xcb_request_check().
+ */
+xcb_void_cookie_t
+xcb_render_create_picture_aux_checked (xcb_connection_t                             *c  /**< */,
+                                       xcb_render_picture_t                          pid  /**< */,
+                                       xcb_drawable_t                                drawable  /**< */,
+                                       xcb_render_pictformat_t                       format  /**< */,
+                                       uint32_t                                      value_mask  /**< */,
+                                       const xcb_render_create_picture_value_list_t *value_list  /**< */);
+
+/**
+ *
+ * @param c The connection
+ * @return A cookie
+ *
+ * Delivers a request to the X server.
+ *
+ */
+xcb_void_cookie_t
+xcb_render_create_picture_aux (xcb_connection_t                             *c  /**< */,
+                               xcb_render_picture_t                          pid  /**< */,
+                               xcb_drawable_t                                drawable  /**< */,
+                               xcb_render_pictformat_t                       format  /**< */,
+                               uint32_t                                      value_mask  /**< */,
+                               const xcb_render_create_picture_value_list_t *value_list  /**< */);
+
+int
+xcb_render_change_picture_value_list_serialize (void                                         **_buffer  /**< */,
+                                                uint32_t                                       value_mask  /**< */,
+                                                const xcb_render_change_picture_value_list_t  *_aux  /**< */);
 
 int
-xcb_render_change_picture_sizeof (const void  *_buffer  /**< */);
+xcb_render_change_picture_value_list_unpack (const void                              *_buffer  /**< */,
+                                             uint32_t                                 value_mask  /**< */,
+                                             xcb_render_change_picture_value_list_t  *_aux  /**< */);
+
+int
+xcb_render_change_picture_value_list_sizeof (const void  *_buffer  /**< */,
+                                             uint32_t     value_mask  /**< */);
 
 /**
  *
@@ -1769,7 +1864,7 @@ xcb_void_cookie_t
 xcb_render_change_picture_checked (xcb_connection_t     *c  /**< */,
                                    xcb_render_picture_t  picture  /**< */,
                                    uint32_t              value_mask  /**< */,
-                                   const uint32_t       *value_list  /**< */);
+                                   const void           *value_list  /**< */);
 
 /**
  *
@@ -1783,7 +1878,38 @@ xcb_void_cookie_t
 xcb_render_change_picture (xcb_connection_t     *c  /**< */,
                            xcb_render_picture_t  picture  /**< */,
                            uint32_t              value_mask  /**< */,
-                           const uint32_t       *value_list  /**< */);
+                           const void           *value_list  /**< */);
+
+/**
+ *
+ * @param c The connection
+ * @return A cookie
+ *
+ * Delivers a request to the X server.
+ *
+ * This form can be used only if the request will not cause
+ * a reply to be generated. Any returned error will be
+ * saved for handling by xcb_request_check().
+ */
+xcb_void_cookie_t
+xcb_render_change_picture_aux_checked (xcb_connection_t                             *c  /**< */,
+                                       xcb_render_picture_t                          picture  /**< */,
+                                       uint32_t                                      value_mask  /**< */,
+                                       const xcb_render_change_picture_value_list_t *value_list  /**< */);
+
+/**
+ *
+ * @param c The connection
+ * @return A cookie
+ *
+ * Delivers a request to the X server.
+ *
+ */
+xcb_void_cookie_t
+xcb_render_change_picture_aux (xcb_connection_t                             *c  /**< */,
+                               xcb_render_picture_t                          picture  /**< */,
+                               uint32_t                                      value_mask  /**< */,
+                               const xcb_render_change_picture_value_list_t *value_list  /**< */);
 
 int
 xcb_render_set_picture_clip_rectangles_sizeof (const void  *_buffer  /**< */,
diff --git a/home/pratyush/checkout/xorg-build/proto/src/render.xml b/proto/src/render.xml
index 55b73f7..6285134 100644
--- a/home/pratyush/checkout/xorg-build/proto/src/render.xml
+++ b/proto/src/render.xml
@@ -280,16 +280,124 @@ for licensing information.
     <field type="PICTURE" name="pid" />
     <field type="DRAWABLE" name="drawable" />
     <field type="PICTFORMAT" name="format" />
-    <valueparam value-mask-type="CARD32"
-                value-mask-name="value_mask"
-                value-list-name="value_list" />
+    <field type="CARD32" name="value_mask" mask="CP"/>
+        <switch name="value_list">
+      <fieldref>value_mask</fieldref>
+      <bitcase>
+        <enumref ref="CP">Repeat</enumref>
+        <field type="CARD32" name="repeat" />
+      </bitcase>
+      <bitcase>
+        <enumref ref="CP">AlphaMap</enumref>
+        <field type="CARD32" name="alphamap" />
+      </bitcase>
+      <bitcase>
+        <enumref ref="CP">AlphaXOrigin</enumref>
+        <field type="CARD32" name="alphaxorigin" />
+      </bitcase>
+      <bitcase>
+        <enumref ref="CP">AlphaYOrigin</enumref>
+        <field type="CARD32" name="alphayorigin" />
+      </bitcase>
+      <bitcase>
+        <enumref ref="CP">ClipXOrigin</enumref>
+        <field type="CARD32" name="clipxorigin" />
+      </bitcase>
+      <bitcase>
+        <enumref ref="CP">ClipYOrigin</enumref>
+        <field type="CARD32" name="clipyorigin" />
+      </bitcase>
+      <bitcase>
+        <enumref ref="CP">ClipMask</enumref>
+        <field type="CARD32" name="clipmask" />
+      </bitcase>
+      <bitcase>
+        <enumref ref="CP">GraphicsExposure</enumref>
+        <field type="CARD32" name="graphicsexposure" />
+      </bitcase>
+      <bitcase>
+        <enumref ref="CP">SubwindowMode</enumref>
+        <field type="CARD32" name="subwindowmode" />
+      </bitcase>
+      <bitcase>
+        <enumref ref="CP">PolyEdge</enumref>
+        <field type="CARD32" name="polyedge" />
+      </bitcase>
+      <bitcase>
+        <enumref ref="CP">PolyMode</enumref>
+        <field type="CARD32" name="polymode" />
+      </bitcase>
+      <bitcase>
+        <enumref ref="CP">Dither</enumref>
+        <field type="CARD32" name="dither" />
+      </bitcase>
+      <bitcase>
+        <enumref ref="CP">ComponentAlpha</enumref>
+        <field type="CARD32" name="componentalpha" />
+      </bitcase>
+    </switch>
+
+
   </request>
 
   <request name="ChangePicture" opcode="5">
     <field type="PICTURE" name="picture" />
-    <valueparam value-mask-type="CARD32"
-                value-mask-name="value_mask"
-                value-list-name="value_list" />
+    <field type="CARD32" name="value_mask" mask="CP"/>
+    <switch name="value_list">
+      <fieldref>value_mask</fieldref>
+      <bitcase>
+        <enumref ref="CP">Repeat</enumref>
+        <field type="CARD32" name="repeat" />
+      </bitcase>
+      <bitcase>
+        <enumref ref="CP">AlphaMap</enumref>
+        <field type="CARD32" name="alphamap" />
+      </bitcase>
+      <bitcase>
+        <enumref ref="CP">AlphaXOrigin</enumref>
+        <field type="CARD32" name="alphaxorigin" />
+      </bitcase>
+      <bitcase>
+        <enumref ref="CP">AlphaYOrigin</enumref>
+        <field type="CARD32" name="alphayorigin" />
+      </bitcase>
+      <bitcase>
+        <enumref ref="CP">ClipXOrigin</enumref>
+        <field type="CARD32" name="clipxorigin" />
+      </bitcase>
+      <bitcase>
+        <enumref ref="CP">ClipYOrigin</enumref>
+        <field type="CARD32" name="clipyorigin" />
+      </bitcase>
+      <bitcase>
+        <enumref ref="CP">ClipMask</enumref>
+        <field type="CARD32" name="clipmask" />
+      </bitcase>
+      <bitcase>
+        <enumref ref="CP">GraphicsExposure</enumref>
+        <field type="CARD32" name="graphicsexposure" />
+      </bitcase>
+      <bitcase>
+        <enumref ref="CP">SubwindowMode</enumref>
+        <field type="CARD32" name="subwindowmode" />
+      </bitcase>
+      <bitcase>
+        <enumref ref="CP">PolyEdge</enumref>
+        <field type="CARD32" name="polyedge" />
+      </bitcase>
+      <bitcase>
+        <enumref ref="CP">PolyMode</enumref>
+        <field type="CARD32" name="polymode" />
+      </bitcase>
+      <bitcase>
+        <enumref ref="CP">Dither</enumref>
+        <field type="CARD32" name="dither" />
+      </bitcase>
+      <bitcase>
+        <enumref ref="CP">ComponentAlpha</enumref>
+        <field type="CARD32" name="componentalpha" />
+      </bitcase>
+    </switch>
   </request>
 
   <request name="SetPictureClipRectangles" opcode="6">

Patch hide | download patch | download mbox

diff --git a/before_change/src/render.c b/libxcb/src/render.c
index 5ac468c..cae02bd 100644
--- a/before_change/src/render.c
+++ b/libxcb/src/render.c
@@ -796,24 +796,257 @@  xcb_render_query_pict_index_values_reply (xcb_connection_t
 }
 
 int
-xcb_render_create_picture_sizeof (const void  *_buffer  /**< */)
+xcb_render_create_picture_value_list_serialize (void                                         **_buffer  /**< */,
+                                                uint32_t                                       value_mask  /**< */,
+                                                const xcb_render_create_picture_value_list_t  *_aux  /**< */)
+{
+    char *xcb_out = *_buffer;
+    unsigned int xcb_buffer_len = 0;
+    unsigned int xcb_align_to = 0;
+
+    unsigned int xcb_pad = 0;
+    char xcb_pad0[3] = {0, 0, 0};
+    struct iovec xcb_parts[14];
+    unsigned int xcb_parts_idx = 0;
+    unsigned int xcb_block_len = 0;
+    unsigned int i;
+    char *xcb_tmp;
+
+    if(value_mask & XCB_RENDER_CP_REPEAT) {
+        /* xcb_render_create_picture_value_list_t.repeat */
+        xcb_parts[xcb_parts_idx].iov_base = (char *) &_aux->repeat;
+        xcb_block_len += sizeof(uint32_t);
+        xcb_parts[xcb_parts_idx].iov_len = sizeof(uint32_t);
+        xcb_parts_idx++;
+        xcb_align_to = ALIGNOF(uint32_t);
+    }
+    if(value_mask & XCB_RENDER_CP_ALPHA_MAP) {
+        /* xcb_render_create_picture_value_list_t.alphamap */
+        xcb_parts[xcb_parts_idx].iov_base = (char *) &_aux->alphamap;
+        xcb_block_len += sizeof(uint32_t);
+        xcb_parts[xcb_parts_idx].iov_len = sizeof(uint32_t);
+        xcb_parts_idx++;
+        xcb_align_to = ALIGNOF(uint32_t);
+    }
+    if(value_mask & XCB_RENDER_CP_ALPHA_X_ORIGIN) {
+        /* xcb_render_create_picture_value_list_t.alphaxorigin */
+        xcb_parts[xcb_parts_idx].iov_base = (char *) &_aux->alphaxorigin;
+        xcb_block_len += sizeof(uint32_t);
+        xcb_parts[xcb_parts_idx].iov_len = sizeof(uint32_t);
+        xcb_parts_idx++;
+        xcb_align_to = ALIGNOF(uint32_t);
+    }
+    if(value_mask & XCB_RENDER_CP_ALPHA_Y_ORIGIN) {
+        /* xcb_render_create_picture_value_list_t.alphayorigin */
+        xcb_parts[xcb_parts_idx].iov_base = (char *) &_aux->alphayorigin;
+        xcb_block_len += sizeof(uint32_t);
+        xcb_parts[xcb_parts_idx].iov_len = sizeof(uint32_t);
+        xcb_parts_idx++;
+        xcb_align_to = ALIGNOF(uint32_t);
+    }
+    if(value_mask & XCB_RENDER_CP_CLIP_X_ORIGIN) {
+        /* xcb_render_create_picture_value_list_t.clipxorigin */
+        xcb_parts[xcb_parts_idx].iov_base = (char *) &_aux->clipxorigin;
+        xcb_block_len += sizeof(uint32_t);
+        xcb_parts[xcb_parts_idx].iov_len = sizeof(uint32_t);
+        xcb_parts_idx++;
+        xcb_align_to = ALIGNOF(uint32_t);
+    }
+    if(value_mask & XCB_RENDER_CP_CLIP_Y_ORIGIN) {
+        /* xcb_render_create_picture_value_list_t.clipyorigin */
+        xcb_parts[xcb_parts_idx].iov_base = (char *) &_aux->clipyorigin;
+        xcb_block_len += sizeof(uint32_t);
+        xcb_parts[xcb_parts_idx].iov_len = sizeof(uint32_t);
+        xcb_parts_idx++;
+        xcb_align_to = ALIGNOF(uint32_t);
+    }
+    if(value_mask & XCB_RENDER_CP_CLIP_MASK) {
+        /* xcb_render_create_picture_value_list_t.clipmask */
+        xcb_parts[xcb_parts_idx].iov_base = (char *) &_aux->clipmask;
+        xcb_block_len += sizeof(uint32_t);
+        xcb_parts[xcb_parts_idx].iov_len = sizeof(uint32_t);
+        xcb_parts_idx++;
+        xcb_align_to = ALIGNOF(uint32_t);
+    }
+    if(value_mask & XCB_RENDER_CP_GRAPHICS_EXPOSURE) {
+        /* xcb_render_create_picture_value_list_t.graphicsexposure */
+        xcb_parts[xcb_parts_idx].iov_base = (char *) &_aux->graphicsexposure;
+        xcb_block_len += sizeof(uint32_t);
+        xcb_parts[xcb_parts_idx].iov_len = sizeof(uint32_t);
+        xcb_parts_idx++;
+        xcb_align_to = ALIGNOF(uint32_t);
+    }
+    if(value_mask & XCB_RENDER_CP_SUBWINDOW_MODE) {
+        /* xcb_render_create_picture_value_list_t.subwindowmode */
+        xcb_parts[xcb_parts_idx].iov_base = (char *) &_aux->subwindowmode;
+        xcb_block_len += sizeof(uint32_t);
+        xcb_parts[xcb_parts_idx].iov_len = sizeof(uint32_t);
+        xcb_parts_idx++;
+        xcb_align_to = ALIGNOF(uint32_t);
+    }
+    if(value_mask & XCB_RENDER_CP_POLY_EDGE) {
+        /* xcb_render_create_picture_value_list_t.polyedge */
+        xcb_parts[xcb_parts_idx].iov_base = (char *) &_aux->polyedge;
+        xcb_block_len += sizeof(uint32_t);
+        xcb_parts[xcb_parts_idx].iov_len = sizeof(uint32_t);
+        xcb_parts_idx++;
+        xcb_align_to = ALIGNOF(uint32_t);
+    }
+    if(value_mask & XCB_RENDER_CP_POLY_MODE) {
+        /* xcb_render_create_picture_value_list_t.polymode */
+        xcb_parts[xcb_parts_idx].iov_base = (char *) &_aux->polymode;
+        xcb_block_len += sizeof(uint32_t);
+        xcb_parts[xcb_parts_idx].iov_len = sizeof(uint32_t);
+        xcb_parts_idx++;
+        xcb_align_to = ALIGNOF(uint32_t);
+    }
+    if(value_mask & XCB_RENDER_CP_DITHER) {
+        /* xcb_render_create_picture_value_list_t.dither */
+        xcb_parts[xcb_parts_idx].iov_base = (char *) &_aux->dither;
+        xcb_block_len += sizeof(uint32_t);
+        xcb_parts[xcb_parts_idx].iov_len = sizeof(uint32_t);
+        xcb_parts_idx++;
+        xcb_align_to = ALIGNOF(uint32_t);
+    }
+    if(value_mask & XCB_RENDER_CP_COMPONENT_ALPHA) {
+        /* xcb_render_create_picture_value_list_t.componentalpha */
+        xcb_parts[xcb_parts_idx].iov_base = (char *) &_aux->componentalpha;
+        xcb_block_len += sizeof(uint32_t);
+        xcb_parts[xcb_parts_idx].iov_len = sizeof(uint32_t);
+        xcb_parts_idx++;
+        xcb_align_to = ALIGNOF(uint32_t);
+    }
+    /* insert padding */
+    xcb_pad = -xcb_block_len & (xcb_align_to - 1);
+    xcb_buffer_len += xcb_block_len + xcb_pad;
+    if (0 != xcb_pad) {
+        xcb_parts[xcb_parts_idx].iov_base = xcb_pad0;
+        xcb_parts[xcb_parts_idx].iov_len = xcb_pad;
+        xcb_parts_idx++;
+        xcb_pad = 0;
+    }
+    xcb_block_len = 0;
+
+    if (NULL == xcb_out) {
+        /* allocate memory */
+        xcb_out = malloc(xcb_buffer_len);
+        *_buffer = xcb_out;
+    }
+
+    xcb_tmp = xcb_out;
+    for(i=0; i<xcb_parts_idx; i++) {
+        if (0 != xcb_parts[i].iov_base && 0 != xcb_parts[i].iov_len)
+            memcpy(xcb_tmp, xcb_parts[i].iov_base, xcb_parts[i].iov_len);
+        if (0 != xcb_parts[i].iov_len)
+            xcb_tmp += xcb_parts[i].iov_len;
+    }
+
+    return xcb_buffer_len;
+}
+
+int
+xcb_render_create_picture_value_list_unpack (const void                              *_buffer  /**< */,
+                                             uint32_t                                 value_mask  /**< */,
+                                             xcb_render_create_picture_value_list_t  *_aux  /**< */)
 {
     char *xcb_tmp = (char *)_buffer;
-    const xcb_render_create_picture_request_t *_aux = (xcb_render_create_picture_request_t *)_buffer;
     unsigned int xcb_buffer_len = 0;
     unsigned int xcb_block_len = 0;
     unsigned int xcb_pad = 0;
     unsigned int xcb_align_to = 0;
 
 
-    xcb_block_len += sizeof(xcb_render_create_picture_request_t);
-    xcb_tmp += xcb_block_len;
-    xcb_buffer_len += xcb_block_len;
-    xcb_block_len = 0;
-    /* value_list */
-    xcb_block_len += xcb_popcount(_aux->value_mask) * sizeof(uint32_t);
-    xcb_tmp += xcb_block_len;
-    xcb_align_to = ALIGNOF(uint32_t);
+    if(value_mask & XCB_RENDER_CP_REPEAT) {
+        /* xcb_render_create_picture_value_list_t.repeat */
+        _aux->repeat = *(uint32_t *)xcb_tmp;
+        xcb_block_len += sizeof(uint32_t);
+        xcb_tmp += sizeof(uint32_t);
+        xcb_align_to = ALIGNOF(uint32_t);
+    }
+    if(value_mask & XCB_RENDER_CP_ALPHA_MAP) {
+        /* xcb_render_create_picture_value_list_t.alphamap */
+        _aux->alphamap = *(uint32_t *)xcb_tmp;
+        xcb_block_len += sizeof(uint32_t);
+        xcb_tmp += sizeof(uint32_t);
+        xcb_align_to = ALIGNOF(uint32_t);
+    }
+    if(value_mask & XCB_RENDER_CP_ALPHA_X_ORIGIN) {
+        /* xcb_render_create_picture_value_list_t.alphaxorigin */
+        _aux->alphaxorigin = *(uint32_t *)xcb_tmp;
+        xcb_block_len += sizeof(uint32_t);
+        xcb_tmp += sizeof(uint32_t);
+        xcb_align_to = ALIGNOF(uint32_t);
+    }
+    if(value_mask & XCB_RENDER_CP_ALPHA_Y_ORIGIN) {
+        /* xcb_render_create_picture_value_list_t.alphayorigin */
+        _aux->alphayorigin = *(uint32_t *)xcb_tmp;
+        xcb_block_len += sizeof(uint32_t);
+        xcb_tmp += sizeof(uint32_t);
+        xcb_align_to = ALIGNOF(uint32_t);
+    }
+    if(value_mask & XCB_RENDER_CP_CLIP_X_ORIGIN) {
+        /* xcb_render_create_picture_value_list_t.clipxorigin */
+        _aux->clipxorigin = *(uint32_t *)xcb_tmp;
+        xcb_block_len += sizeof(uint32_t);
+        xcb_tmp += sizeof(uint32_t);
+        xcb_align_to = ALIGNOF(uint32_t);
+    }
+    if(value_mask & XCB_RENDER_CP_CLIP_Y_ORIGIN) {
+        /* xcb_render_create_picture_value_list_t.clipyorigin */
+        _aux->clipyorigin = *(uint32_t *)xcb_tmp;
+        xcb_block_len += sizeof(uint32_t);
+        xcb_tmp += sizeof(uint32_t);
+        xcb_align_to = ALIGNOF(uint32_t);
+    }
+    if(value_mask & XCB_RENDER_CP_CLIP_MASK) {
+        /* xcb_render_create_picture_value_list_t.clipmask */
+        _aux->clipmask = *(uint32_t *)xcb_tmp;
+        xcb_block_len += sizeof(uint32_t);
+        xcb_tmp += sizeof(uint32_t);
+        xcb_align_to = ALIGNOF(uint32_t);
+    }
+    if(value_mask & XCB_RENDER_CP_GRAPHICS_EXPOSURE) {
+        /* xcb_render_create_picture_value_list_t.graphicsexposure */
+        _aux->graphicsexposure = *(uint32_t *)xcb_tmp;
+        xcb_block_len += sizeof(uint32_t);
+        xcb_tmp += sizeof(uint32_t);
+        xcb_align_to = ALIGNOF(uint32_t);
+    }
+    if(value_mask & XCB_RENDER_CP_SUBWINDOW_MODE) {
+        /* xcb_render_create_picture_value_list_t.subwindowmode */
+        _aux->subwindowmode = *(uint32_t *)xcb_tmp;
+        xcb_block_len += sizeof(uint32_t);
+        xcb_tmp += sizeof(uint32_t);
+        xcb_align_to = ALIGNOF(uint32_t);
+    }
+    if(value_mask & XCB_RENDER_CP_POLY_EDGE) {
+        /* xcb_render_create_picture_value_list_t.polyedge */
+        _aux->polyedge = *(uint32_t *)xcb_tmp;
+        xcb_block_len += sizeof(uint32_t);
+        xcb_tmp += sizeof(uint32_t);
+        xcb_align_to = ALIGNOF(uint32_t);
+    }
+    if(value_mask & XCB_RENDER_CP_POLY_MODE) {
+        /* xcb_render_create_picture_value_list_t.polymode */
+        _aux->polymode = *(uint32_t *)xcb_tmp;
+        xcb_block_len += sizeof(uint32_t);
+        xcb_tmp += sizeof(uint32_t);
+        xcb_align_to = ALIGNOF(uint32_t);
+    }
+    if(value_mask & XCB_RENDER_CP_DITHER) {
+        /* xcb_render_create_picture_value_list_t.dither */
+        _aux->dither = *(uint32_t *)xcb_tmp;
+        xcb_block_len += sizeof(uint32_t);
+        xcb_tmp += sizeof(uint32_t);
+        xcb_align_to = ALIGNOF(uint32_t);
+    }
+    if(value_mask & XCB_RENDER_CP_COMPONENT_ALPHA) {
+        /* xcb_render_create_picture_value_list_t.componentalpha */
+        _aux->componentalpha = *(uint32_t *)xcb_tmp;
+        xcb_block_len += sizeof(uint32_t);
+        xcb_tmp += sizeof(uint32_t);
+        xcb_align_to = ALIGNOF(uint32_t);
+    }
     /* insert padding */
     xcb_pad = -xcb_block_len & (xcb_align_to - 1);
     xcb_buffer_len += xcb_block_len + xcb_pad;
@@ -826,22 +1059,30 @@  xcb_render_create_picture_sizeof (const void  *_buffer  /**< */)
     return xcb_buffer_len;
 }
 
+int
+xcb_render_create_picture_value_list_sizeof (const void  *_buffer  /**< */,
+                                             uint32_t     value_mask  /**< */)
+{
+    xcb_render_create_picture_value_list_t _aux;
+    return xcb_render_create_picture_value_list_unpack(_buffer, value_mask, &_aux);
+}
+
 xcb_void_cookie_t
 xcb_render_create_picture_checked (xcb_connection_t        *c  /**< */,
                                    xcb_render_picture_t     pid  /**< */,
                                    xcb_drawable_t           drawable  /**< */,
                                    xcb_render_pictformat_t  format  /**< */,
                                    uint32_t                 value_mask  /**< */,
-                                   const uint32_t          *value_list  /**< */)
+                                   const void              *value_list  /**< */)
 {
     static const xcb_protocol_request_t xcb_req = {
-        /* count */ 4,
+        /* count */ 3,
         /* ext */ &xcb_render_id,
         /* opcode */ XCB_RENDER_CREATE_PICTURE,
         /* isvoid */ 1
     };
 
-    struct iovec xcb_parts[6];
+    struct iovec xcb_parts[5];
     xcb_void_cookie_t xcb_ret;
     xcb_render_create_picture_request_t xcb_out;
 
@@ -854,11 +1095,10 @@  xcb_render_create_picture_checked (xcb_connection_t        *c  /**< */,
     xcb_parts[2].iov_len = sizeof(xcb_out);
     xcb_parts[3].iov_base = 0;
     xcb_parts[3].iov_len = -xcb_parts[2].iov_len & 3;
-    /* uint32_t value_list */
+    /* xcb_render_create_picture_value_list_t value_list */
     xcb_parts[4].iov_base = (char *) value_list;
-    xcb_parts[4].iov_len = xcb_popcount(value_mask) * sizeof(uint32_t);
-    xcb_parts[5].iov_base = 0;
-    xcb_parts[5].iov_len = -xcb_parts[4].iov_len & 3;
+    xcb_parts[4].iov_len =
+      xcb_render_create_picture_value_list_sizeof (value_list, value_mask);
 
     xcb_ret.sequence = xcb_send_request(c, XCB_REQUEST_CHECKED, xcb_parts + 2, &xcb_req);
     return xcb_ret;
@@ -870,16 +1110,16 @@  xcb_render_create_picture (xcb_connection_t        *c  /**< */,
                            xcb_drawable_t           drawable  /**< */,
                            xcb_render_pictformat_t  format  /**< */,
                            uint32_t                 value_mask  /**< */,
-                           const uint32_t          *value_list  /**< */)
+                           const void              *value_list  /**< */)
 {
     static const xcb_protocol_request_t xcb_req = {
-        /* count */ 4,
+        /* count */ 3,
         /* ext */ &xcb_render_id,
         /* opcode */ XCB_RENDER_CREATE_PICTURE,
         /* isvoid */ 1
     };
 
-    struct iovec xcb_parts[6];
+    struct iovec xcb_parts[5];
     xcb_void_cookie_t xcb_ret;
     xcb_render_create_picture_request_t xcb_out;
 
@@ -892,35 +1132,345 @@  xcb_render_create_picture (xcb_connection_t        *c  /**< */,
     xcb_parts[2].iov_len = sizeof(xcb_out);
     xcb_parts[3].iov_base = 0;
     xcb_parts[3].iov_len = -xcb_parts[2].iov_len & 3;
-    /* uint32_t value_list */
+    /* xcb_render_create_picture_value_list_t value_list */
     xcb_parts[4].iov_base = (char *) value_list;
-    xcb_parts[4].iov_len = xcb_popcount(value_mask) * sizeof(uint32_t);
-    xcb_parts[5].iov_base = 0;
-    xcb_parts[5].iov_len = -xcb_parts[4].iov_len & 3;
+    xcb_parts[4].iov_len =
+      xcb_render_create_picture_value_list_sizeof (value_list, value_mask);
+
+    xcb_ret.sequence = xcb_send_request(c, 0, xcb_parts + 2, &xcb_req);
+    return xcb_ret;
+}
+
+xcb_void_cookie_t
+xcb_render_create_picture_aux_checked (xcb_connection_t                             *c  /**< */,
+                                       xcb_render_picture_t                          pid  /**< */,
+                                       xcb_drawable_t                                drawable  /**< */,
+                                       xcb_render_pictformat_t                       format  /**< */,
+                                       uint32_t                                      value_mask  /**< */,
+                                       const xcb_render_create_picture_value_list_t *value_list  /**< */)
+{
+    static const xcb_protocol_request_t xcb_req = {
+        /* count */ 3,
+        /* ext */ &xcb_render_id,
+        /* opcode */ XCB_RENDER_CREATE_PICTURE,
+        /* isvoid */ 1
+    };
+
+    struct iovec xcb_parts[5];
+    xcb_void_cookie_t xcb_ret;
+    xcb_render_create_picture_request_t xcb_out;
+    void *xcb_aux0 = 0;
+
+    xcb_out.pid = pid;
+    xcb_out.drawable = drawable;
+    xcb_out.format = format;
+    xcb_out.value_mask = value_mask;
+
+    xcb_parts[2].iov_base = (char *) &xcb_out;
+    xcb_parts[2].iov_len = sizeof(xcb_out);
+    xcb_parts[3].iov_base = 0;
+    xcb_parts[3].iov_len = -xcb_parts[2].iov_len & 3;
+    /* xcb_render_create_picture_value_list_t value_list */
+    xcb_parts[4].iov_len =
+      xcb_render_create_picture_value_list_serialize (&xcb_aux0, value_mask, value_list);
+    xcb_parts[4].iov_base = xcb_aux0;
+
+    xcb_ret.sequence = xcb_send_request(c, XCB_REQUEST_CHECKED, xcb_parts + 2, &xcb_req);
+    free(xcb_aux0);
+    return xcb_ret;
+}
+
+xcb_void_cookie_t
+xcb_render_create_picture_aux (xcb_connection_t                             *c  /**< */,
+                               xcb_render_picture_t                          pid  /**< */,
+                               xcb_drawable_t                                drawable  /**< */,
+                               xcb_render_pictformat_t                       format  /**< */,
+                               uint32_t                                      value_mask  /**< */,
+                               const xcb_render_create_picture_value_list_t *value_list  /**< */)
+{
+    static const xcb_protocol_request_t xcb_req = {
+        /* count */ 3,
+        /* ext */ &xcb_render_id,
+        /* opcode */ XCB_RENDER_CREATE_PICTURE,
+        /* isvoid */ 1
+    };
+
+    struct iovec xcb_parts[5];
+    xcb_void_cookie_t xcb_ret;
+    xcb_render_create_picture_request_t xcb_out;
+    void *xcb_aux0 = 0;
+
+    xcb_out.pid = pid;
+    xcb_out.drawable = drawable;
+    xcb_out.format = format;
+    xcb_out.value_mask = value_mask;
+
+    xcb_parts[2].iov_base = (char *) &xcb_out;
+    xcb_parts[2].iov_len = sizeof(xcb_out);
+    xcb_parts[3].iov_base = 0;
+    xcb_parts[3].iov_len = -xcb_parts[2].iov_len & 3;
+    /* xcb_render_create_picture_value_list_t value_list */
+    xcb_parts[4].iov_len =
+      xcb_render_create_picture_value_list_serialize (&xcb_aux0, value_mask, value_list);
+    xcb_parts[4].iov_base = xcb_aux0;
 
     xcb_ret.sequence = xcb_send_request(c, 0, xcb_parts + 2, &xcb_req);
+    free(xcb_aux0);
     return xcb_ret;
 }
 
 int
-xcb_render_change_picture_sizeof (const void  *_buffer  /**< */)
+xcb_render_change_picture_value_list_serialize (void                                         **_buffer  /**< */,
+                                                uint32_t                                       value_mask  /**< */,
+                                                const xcb_render_change_picture_value_list_t  *_aux  /**< */)
+{
+    char *xcb_out = *_buffer;
+    unsigned int xcb_buffer_len = 0;
+    unsigned int xcb_align_to = 0;
+
+    unsigned int xcb_pad = 0;
+    char xcb_pad0[3] = {0, 0, 0};
+    struct iovec xcb_parts[14];
+    unsigned int xcb_parts_idx = 0;
+    unsigned int xcb_block_len = 0;
+    unsigned int i;
+    char *xcb_tmp;
+
+    if(value_mask & XCB_RENDER_CP_REPEAT) {
+        /* xcb_render_change_picture_value_list_t.repeat */
+        xcb_parts[xcb_parts_idx].iov_base = (char *) &_aux->repeat;
+        xcb_block_len += sizeof(uint32_t);
+        xcb_parts[xcb_parts_idx].iov_len = sizeof(uint32_t);
+        xcb_parts_idx++;
+        xcb_align_to = ALIGNOF(uint32_t);
+    }
+    if(value_mask & XCB_RENDER_CP_ALPHA_MAP) {
+        /* xcb_render_change_picture_value_list_t.alphamap */
+        xcb_parts[xcb_parts_idx].iov_base = (char *) &_aux->alphamap;
+        xcb_block_len += sizeof(uint32_t);
+        xcb_parts[xcb_parts_idx].iov_len = sizeof(uint32_t);
+        xcb_parts_idx++;
+        xcb_align_to = ALIGNOF(uint32_t);
+    }
+    if(value_mask & XCB_RENDER_CP_ALPHA_X_ORIGIN) {
+        /* xcb_render_change_picture_value_list_t.alphaxorigin */
+        xcb_parts[xcb_parts_idx].iov_base = (char *) &_aux->alphaxorigin;
+        xcb_block_len += sizeof(uint32_t);
+        xcb_parts[xcb_parts_idx].iov_len = sizeof(uint32_t);
+        xcb_parts_idx++;
+        xcb_align_to = ALIGNOF(uint32_t);
+    }
+    if(value_mask & XCB_RENDER_CP_ALPHA_Y_ORIGIN) {
+        /* xcb_render_change_picture_value_list_t.alphayorigin */
+        xcb_parts[xcb_parts_idx].iov_base = (char *) &_aux->alphayorigin;
+        xcb_block_len += sizeof(uint32_t);
+        xcb_parts[xcb_parts_idx].iov_len = sizeof(uint32_t);
+        xcb_parts_idx++;
+        xcb_align_to = ALIGNOF(uint32_t);
+    }
+    if(value_mask & XCB_RENDER_CP_CLIP_X_ORIGIN) {
+        /* xcb_render_change_picture_value_list_t.clipxorigin */
+        xcb_parts[xcb_parts_idx].iov_base = (char *) &_aux->clipxorigin;
+        xcb_block_len += sizeof(uint32_t);
+        xcb_parts[xcb_parts_idx].iov_len = sizeof(uint32_t);
+        xcb_parts_idx++;
+        xcb_align_to = ALIGNOF(uint32_t);
+    }
+    if(value_mask & XCB_RENDER_CP_CLIP_Y_ORIGIN) {
+        /* xcb_render_change_picture_value_list_t.clipyorigin */
+        xcb_parts[xcb_parts_idx].iov_base = (char *) &_aux->clipyorigin;
+        xcb_block_len += sizeof(uint32_t);
+        xcb_parts[xcb_parts_idx].iov_len = sizeof(uint32_t);
+        xcb_parts_idx++;
+        xcb_align_to = ALIGNOF(uint32_t);
+    }
+    if(value_mask & XCB_RENDER_CP_CLIP_MASK) {
+        /* xcb_render_change_picture_value_list_t.clipmask */
+        xcb_parts[xcb_parts_idx].iov_base = (char *) &_aux->clipmask;
+        xcb_block_len += sizeof(uint32_t);
+        xcb_parts[xcb_parts_idx].iov_len = sizeof(uint32_t);
+        xcb_parts_idx++;
+        xcb_align_to = ALIGNOF(uint32_t);
+    }
+    if(value_mask & XCB_RENDER_CP_GRAPHICS_EXPOSURE) {
+        /* xcb_render_change_picture_value_list_t.graphicsexposure */
+        xcb_parts[xcb_parts_idx].iov_base = (char *) &_aux->graphicsexposure;
+        xcb_block_len += sizeof(uint32_t);
+        xcb_parts[xcb_parts_idx].iov_len = sizeof(uint32_t);
+        xcb_parts_idx++;
+        xcb_align_to = ALIGNOF(uint32_t);
+    }
+    if(value_mask & XCB_RENDER_CP_SUBWINDOW_MODE) {
+        /* xcb_render_change_picture_value_list_t.subwindowmode */
+        xcb_parts[xcb_parts_idx].iov_base = (char *) &_aux->subwindowmode;
+        xcb_block_len += sizeof(uint32_t);
+        xcb_parts[xcb_parts_idx].iov_len = sizeof(uint32_t);
+        xcb_parts_idx++;
+        xcb_align_to = ALIGNOF(uint32_t);
+    }
+    if(value_mask & XCB_RENDER_CP_POLY_EDGE) {
+        /* xcb_render_change_picture_value_list_t.polyedge */
+        xcb_parts[xcb_parts_idx].iov_base = (char *) &_aux->polyedge;
+        xcb_block_len += sizeof(uint32_t);
+        xcb_parts[xcb_parts_idx].iov_len = sizeof(uint32_t);
+        xcb_parts_idx++;
+        xcb_align_to = ALIGNOF(uint32_t);
+    }
+    if(value_mask & XCB_RENDER_CP_POLY_MODE) {
+        /* xcb_render_change_picture_value_list_t.polymode */
+        xcb_parts[xcb_parts_idx].iov_base = (char *) &_aux->polymode;
+        xcb_block_len += sizeof(uint32_t);
+        xcb_parts[xcb_parts_idx].iov_len = sizeof(uint32_t);
+        xcb_parts_idx++;
+        xcb_align_to = ALIGNOF(uint32_t);
+    }
+    if(value_mask & XCB_RENDER_CP_DITHER) {
+        /* xcb_render_change_picture_value_list_t.dither */
+        xcb_parts[xcb_parts_idx].iov_base = (char *) &_aux->dither;
+        xcb_block_len += sizeof(uint32_t);
+        xcb_parts[xcb_parts_idx].iov_len = sizeof(uint32_t);
+        xcb_parts_idx++;
+        xcb_align_to = ALIGNOF(uint32_t);
+    }
+    if(value_mask & XCB_RENDER_CP_COMPONENT_ALPHA) {
+        /* xcb_render_change_picture_value_list_t.componentalpha */
+        xcb_parts[xcb_parts_idx].iov_base = (char *) &_aux->componentalpha;
+        xcb_block_len += sizeof(uint32_t);
+        xcb_parts[xcb_parts_idx].iov_len = sizeof(uint32_t);
+        xcb_parts_idx++;
+        xcb_align_to = ALIGNOF(uint32_t);
+    }
+    /* insert padding */
+    xcb_pad = -xcb_block_len & (xcb_align_to - 1);
+    xcb_buffer_len += xcb_block_len + xcb_pad;
+    if (0 != xcb_pad) {
+        xcb_parts[xcb_parts_idx].iov_base = xcb_pad0;
+        xcb_parts[xcb_parts_idx].iov_len = xcb_pad;
+        xcb_parts_idx++;
+        xcb_pad = 0;
+    }
+    xcb_block_len = 0;
+
+    if (NULL == xcb_out) {
+        /* allocate memory */
+        xcb_out = malloc(xcb_buffer_len);
+        *_buffer = xcb_out;
+    }
+
+    xcb_tmp = xcb_out;
+    for(i=0; i<xcb_parts_idx; i++) {
+        if (0 != xcb_parts[i].iov_base && 0 != xcb_parts[i].iov_len)
+            memcpy(xcb_tmp, xcb_parts[i].iov_base, xcb_parts[i].iov_len);
+        if (0 != xcb_parts[i].iov_len)
+            xcb_tmp += xcb_parts[i].iov_len;
+    }
+
+    return xcb_buffer_len;
+}
+
+int
+xcb_render_change_picture_value_list_unpack (const void                              *_buffer  /**< */,
+                                             uint32_t                                 value_mask  /**< */,
+                                             xcb_render_change_picture_value_list_t  *_aux  /**< */)
 {
     char *xcb_tmp = (char *)_buffer;
-    const xcb_render_change_picture_request_t *_aux = (xcb_render_change_picture_request_t *)_buffer;
     unsigned int xcb_buffer_len = 0;
     unsigned int xcb_block_len = 0;
     unsigned int xcb_pad = 0;
     unsigned int xcb_align_to = 0;
 
 
-    xcb_block_len += sizeof(xcb_render_change_picture_request_t);
-    xcb_tmp += xcb_block_len;
-    xcb_buffer_len += xcb_block_len;
-    xcb_block_len = 0;
-    /* value_list */
-    xcb_block_len += xcb_popcount(_aux->value_mask) * sizeof(uint32_t);
-    xcb_tmp += xcb_block_len;
-    xcb_align_to = ALIGNOF(uint32_t);
+    if(value_mask & XCB_RENDER_CP_REPEAT) {
+        /* xcb_render_change_picture_value_list_t.repeat */
+        _aux->repeat = *(uint32_t *)xcb_tmp;
+        xcb_block_len += sizeof(uint32_t);
+        xcb_tmp += sizeof(uint32_t);
+        xcb_align_to = ALIGNOF(uint32_t);
+    }
+    if(value_mask & XCB_RENDER_CP_ALPHA_MAP) {
+        /* xcb_render_change_picture_value_list_t.alphamap */
+        _aux->alphamap = *(uint32_t *)xcb_tmp;
+        xcb_block_len += sizeof(uint32_t);
+        xcb_tmp += sizeof(uint32_t);
+        xcb_align_to = ALIGNOF(uint32_t);
+    }
+    if(value_mask & XCB_RENDER_CP_ALPHA_X_ORIGIN) {
+        /* xcb_render_change_picture_value_list_t.alphaxorigin */
+        _aux->alphaxorigin = *(uint32_t *)xcb_tmp;
+        xcb_block_len += sizeof(uint32_t);
+        xcb_tmp += sizeof(uint32_t);
+        xcb_align_to = ALIGNOF(uint32_t);
+    }
+    if(value_mask & XCB_RENDER_CP_ALPHA_Y_ORIGIN) {
+        /* xcb_render_change_picture_value_list_t.alphayorigin */
+        _aux->alphayorigin = *(uint32_t *)xcb_tmp;
+        xcb_block_len += sizeof(uint32_t);
+        xcb_tmp += sizeof(uint32_t);
+        xcb_align_to = ALIGNOF(uint32_t);
+    }
+    if(value_mask & XCB_RENDER_CP_CLIP_X_ORIGIN) {
+        /* xcb_render_change_picture_value_list_t.clipxorigin */
+        _aux->clipxorigin = *(uint32_t *)xcb_tmp;
+        xcb_block_len += sizeof(uint32_t);
+        xcb_tmp += sizeof(uint32_t);
+        xcb_align_to = ALIGNOF(uint32_t);
+    }
+    if(value_mask & XCB_RENDER_CP_CLIP_Y_ORIGIN) {
+        /* xcb_render_change_picture_value_list_t.clipyorigin */
+        _aux->clipyorigin = *(uint32_t *)xcb_tmp;
+        xcb_block_len += sizeof(uint32_t);
+        xcb_tmp += sizeof(uint32_t);
+        xcb_align_to = ALIGNOF(uint32_t);
+    }
+    if(value_mask & XCB_RENDER_CP_CLIP_MASK) {
+        /* xcb_render_change_picture_value_list_t.clipmask */
+        _aux->clipmask = *(uint32_t *)xcb_tmp;
+        xcb_block_len += sizeof(uint32_t);
+        xcb_tmp += sizeof(uint32_t);
+        xcb_align_to = ALIGNOF(uint32_t);
+    }
+    if(value_mask & XCB_RENDER_CP_GRAPHICS_EXPOSURE) {
+        /* xcb_render_change_picture_value_list_t.graphicsexposure */
+        _aux->graphicsexposure = *(uint32_t *)xcb_tmp;
+        xcb_block_len += sizeof(uint32_t);
+        xcb_tmp += sizeof(uint32_t);
+        xcb_align_to = ALIGNOF(uint32_t);
+    }
+    if(value_mask & XCB_RENDER_CP_SUBWINDOW_MODE) {
+        /* xcb_render_change_picture_value_list_t.subwindowmode */
+        _aux->subwindowmode = *(uint32_t *)xcb_tmp;
+        xcb_block_len += sizeof(uint32_t);
+        xcb_tmp += sizeof(uint32_t);
+        xcb_align_to = ALIGNOF(uint32_t);
+    }
+    if(value_mask & XCB_RENDER_CP_POLY_EDGE) {
+        /* xcb_render_change_picture_value_list_t.polyedge */
+        _aux->polyedge = *(uint32_t *)xcb_tmp;
+        xcb_block_len += sizeof(uint32_t);
+        xcb_tmp += sizeof(uint32_t);
+        xcb_align_to = ALIGNOF(uint32_t);
+    }
+    if(value_mask & XCB_RENDER_CP_POLY_MODE) {
+        /* xcb_render_change_picture_value_list_t.polymode */
+        _aux->polymode = *(uint32_t *)xcb_tmp;
+        xcb_block_len += sizeof(uint32_t);
+        xcb_tmp += sizeof(uint32_t);
+        xcb_align_to = ALIGNOF(uint32_t);
+    }
+    if(value_mask & XCB_RENDER_CP_DITHER) {
+        /* xcb_render_change_picture_value_list_t.dither */
+        _aux->dither = *(uint32_t *)xcb_tmp;
+        xcb_block_len += sizeof(uint32_t);
+        xcb_tmp += sizeof(uint32_t);
+        xcb_align_to = ALIGNOF(uint32_t);
+    }
+    if(value_mask & XCB_RENDER_CP_COMPONENT_ALPHA) {
+        /* xcb_render_change_picture_value_list_t.componentalpha */
+        _aux->componentalpha = *(uint32_t *)xcb_tmp;
+        xcb_block_len += sizeof(uint32_t);
+        xcb_tmp += sizeof(uint32_t);
+        xcb_align_to = ALIGNOF(uint32_t);
+    }
     /* insert padding */
     xcb_pad = -xcb_block_len & (xcb_align_to - 1);
     xcb_buffer_len += xcb_block_len + xcb_pad;
@@ -933,20 +1483,28 @@  xcb_render_change_picture_sizeof (const void  *_buffer  /**< */)
     return xcb_buffer_len;
 }
 
+int
+xcb_render_change_picture_value_list_sizeof (const void  *_buffer  /**< */,
+                                             uint32_t     value_mask  /**< */)
+{
+    xcb_render_change_picture_value_list_t _aux;
+    return xcb_render_change_picture_value_list_unpack(_buffer, value_mask, &_aux);
+}
+
 xcb_void_cookie_t
 xcb_render_change_picture_checked (xcb_connection_t     *c  /**< */,
                                    xcb_render_picture_t  picture  /**< */,
                                    uint32_t              value_mask  /**< */,
-                                   const uint32_t       *value_list  /**< */)
+                                   const void           *value_list  /**< */)
 {
     static const xcb_protocol_request_t xcb_req = {
-        /* count */ 4,
+        /* count */ 3,
         /* ext */ &xcb_render_id,
         /* opcode */ XCB_RENDER_CHANGE_PICTURE,
         /* isvoid */ 1
     };
 
-    struct iovec xcb_parts[6];
+    struct iovec xcb_parts[5];
     xcb_void_cookie_t xcb_ret;
     xcb_render_change_picture_request_t xcb_out;
 
@@ -957,11 +1515,10 @@  xcb_render_change_picture_checked (xcb_connection_t     *c  /**< */,
     xcb_parts[2].iov_len = sizeof(xcb_out);
     xcb_parts[3].iov_base = 0;
     xcb_parts[3].iov_len = -xcb_parts[2].iov_len & 3;
-    /* uint32_t value_list */
+    /* xcb_render_change_picture_value_list_t value_list */
     xcb_parts[4].iov_base = (char *) value_list;
-    xcb_parts[4].iov_len = xcb_popcount(value_mask) * sizeof(uint32_t);
-    xcb_parts[5].iov_base = 0;
-    xcb_parts[5].iov_len = -xcb_parts[4].iov_len & 3;
+    xcb_parts[4].iov_len =
+      xcb_render_change_picture_value_list_sizeof (value_list, value_mask);
 
     xcb_ret.sequence = xcb_send_request(c, XCB_REQUEST_CHECKED, xcb_parts + 2, &xcb_req);
     return xcb_ret;
@@ -971,16 +1528,16 @@  xcb_void_cookie_t
 xcb_render_change_picture (xcb_connection_t     *c  /**< */,
                            xcb_render_picture_t  picture  /**< */,
                            uint32_t              value_mask  /**< */,
-                           const uint32_t       *value_list  /**< */)
+                           const void           *value_list  /**< */)
 {
     static const xcb_protocol_request_t xcb_req = {
-        /* count */ 4,
+        /* count */ 3,
         /* ext */ &xcb_render_id,
         /* opcode */ XCB_RENDER_CHANGE_PICTURE,
         /* isvoid */ 1
     };
 
-    struct iovec xcb_parts[6];
+    struct iovec xcb_parts[5];
     xcb_void_cookie_t xcb_ret;
     xcb_render_change_picture_request_t xcb_out;
 
@@ -991,13 +1548,82 @@  xcb_render_change_picture (xcb_connection_t     *c  /**< */,
     xcb_parts[2].iov_len = sizeof(xcb_out);
     xcb_parts[3].iov_base = 0;
     xcb_parts[3].iov_len = -xcb_parts[2].iov_len & 3;
-    /* uint32_t value_list */
+    /* xcb_render_change_picture_value_list_t value_list */
     xcb_parts[4].iov_base = (char *) value_list;
-    xcb_parts[4].iov_len = xcb_popcount(value_mask) * sizeof(uint32_t);
-    xcb_parts[5].iov_base = 0;
-    xcb_parts[5].iov_len = -xcb_parts[4].iov_len & 3;
+    xcb_parts[4].iov_len =
+      xcb_render_change_picture_value_list_sizeof (value_list, value_mask);
+
+    xcb_ret.sequence = xcb_send_request(c, 0, xcb_parts + 2, &xcb_req);
+    return xcb_ret;
+}
+
+xcb_void_cookie_t
+xcb_render_change_picture_aux_checked (xcb_connection_t                             *c  /**< */,
+                                       xcb_render_picture_t                          picture  /**< */,
+                                       uint32_t                                      value_mask  /**< */,
+                                       const xcb_render_change_picture_value_list_t *value_list  /**< */)
+{
+    static const xcb_protocol_request_t xcb_req = {
+        /* count */ 3,
+        /* ext */ &xcb_render_id,
+        /* opcode */ XCB_RENDER_CHANGE_PICTURE,
+        /* isvoid */ 1
+    };
+
+    struct iovec xcb_parts[5];
+    xcb_void_cookie_t xcb_ret;
+    xcb_render_change_picture_request_t xcb_out;
+    void *xcb_aux0 = 0;
+
+    xcb_out.picture = picture;
+    xcb_out.value_mask = value_mask;
+
+    xcb_parts[2].iov_base = (char *) &xcb_out;
+    xcb_parts[2].iov_len = sizeof(xcb_out);
+    xcb_parts[3].iov_base = 0;
+    xcb_parts[3].iov_len = -xcb_parts[2].iov_len & 3;
+    /* xcb_render_change_picture_value_list_t value_list */
+    xcb_parts[4].iov_len =
+      xcb_render_change_picture_value_list_serialize (&xcb_aux0, value_mask, value_list);
+    xcb_parts[4].iov_base = xcb_aux0;
+
+    xcb_ret.sequence = xcb_send_request(c, XCB_REQUEST_CHECKED, xcb_parts + 2, &xcb_req);
+    free(xcb_aux0);
+    return xcb_ret;
+}
+
+xcb_void_cookie_t
+xcb_render_change_picture_aux (xcb_connection_t                             *c  /**< */,
+                               xcb_render_picture_t                          picture  /**< */,
+                               uint32_t                                      value_mask  /**< */,
+                               const xcb_render_change_picture_value_list_t *value_list  /**< */)
+{
+    static const xcb_protocol_request_t xcb_req = {
+        /* count */ 3,
+        /* ext */ &xcb_render_id,
+        /* opcode */ XCB_RENDER_CHANGE_PICTURE,
+        /* isvoid */ 1
+    };
+
+    struct iovec xcb_parts[5];
+    xcb_void_cookie_t xcb_ret;
+    xcb_render_change_picture_request_t xcb_out;
+    void *xcb_aux0 = 0;
+
+    xcb_out.picture = picture;
+    xcb_out.value_mask = value_mask;
+
+    xcb_parts[2].iov_base = (char *) &xcb_out;
+    xcb_parts[2].iov_len = sizeof(xcb_out);
+    xcb_parts[3].iov_base = 0;
+    xcb_parts[3].iov_len = -xcb_parts[2].iov_len & 3;
+    /* xcb_render_change_picture_value_list_t value_list */
+    xcb_parts[4].iov_len =
+      xcb_render_change_picture_value_list_serialize (&xcb_aux0, value_mask, value_list);
+    xcb_parts[4].iov_base = xcb_aux0;
 
     xcb_ret.sequence = xcb_send_request(c, 0, xcb_parts + 2, &xcb_req);
+    free(xcb_aux0);
     return xcb_ret;
 }