[Mesa-dev] [PATCH] gallium: reorder fields in pipe_draw_info

Marek Olšák maraeo at gmail.com
Mon Feb 20 18:35:59 UTC 2017


From: Marek Olšák <marek.olsak at amd.com>

sizeof(struct pipe_draw_info) = 104 -> 88
---
 src/gallium/include/pipe/p_state.h | 49 ++++++++++++++++++++------------------
 1 file changed, 26 insertions(+), 23 deletions(-)

diff --git a/src/gallium/include/pipe/p_state.h b/src/gallium/include/pipe/p_state.h
index cb72310..ce19b92 100644
--- a/src/gallium/include/pipe/p_state.h
+++ b/src/gallium/include/pipe/p_state.h
@@ -629,60 +629,51 @@ struct pipe_index_buffer
    const void *user_buffer;  /**< pointer to a user buffer if buffer == NULL */
 };
 
 
 /**
  * Information to describe a draw_vbo call.
  */
 struct pipe_draw_info
 {
    boolean indexed;  /**< use index buffer */
-
    enum pipe_prim_type mode;  /**< the mode of the primitive */
+   boolean primitive_restart;
+   ubyte vertices_per_patch; /**< the number of vertices per patch */
+
    unsigned start;  /**< the index of the first vertex */
    unsigned count;  /**< number of vertices */
 
    unsigned start_instance; /**< first instance id */
    unsigned instance_count; /**< number of instances */
 
    unsigned drawid; /**< id of this draw in a multidraw */
 
-   unsigned vertices_per_patch; /**< the number of vertices per patch */
-
    /**
     * For indexed drawing, these fields apply after index lookup.
     */
    int index_bias; /**< a bias to be added to each index */
    unsigned min_index; /**< the min index */
    unsigned max_index; /**< the max index */
 
    /**
     * Primitive restart enable/index (only applies to indexed drawing)
     */
-   boolean primitive_restart;
    unsigned restart_index;
 
-   /**
-    * Stream output target. If not NULL, it's used to provide the 'count'
-    * parameter based on the number vertices captured by the stream output
-    * stage. (or generally, based on the number of bytes captured)
-    *
-    * Only 'mode', 'start_instance', and 'instance_count' are taken into
-    * account, all the other variables from pipe_draw_info are ignored.
-    *
-    * 'start' is implicitly 0 and 'count' is set as discussed above.
-    * The draw command is non-indexed.
-    *
-    * Note that this only provides the count. The vertex buffers must
-    * be set via set_vertex_buffers manually.
-    */
-   struct pipe_stream_output_target *count_from_stream_output;
+   unsigned indirect_offset; /**< must be 4 byte aligned */
+   unsigned indirect_stride; /**< must be 4 byte aligned */
+   unsigned indirect_count; /**< number of indirect draws */
+
+   unsigned indirect_params_offset; /**< must be 4 byte aligned */
+
+   /* Pointers must be at the end for an optimal structure layout on 64-bit. */
 
    /* Indirect draw parameters resource: If not NULL, most values are taken
     * from this buffer instead, which is laid out as follows:
     *
     * if indexed is TRUE:
     *  struct {
     *     uint32_t count;
     *     uint32_t instance_count;
     *     uint32_t start;
     *     int32_t index_bias;
@@ -690,30 +681,42 @@ struct pipe_draw_info
     *  };
     * otherwise:
     *  struct {
     *     uint32_t count;
     *     uint32_t instance_count;
     *     uint32_t start;
     *     uint32_t start_instance;
     *  };
     */
    struct pipe_resource *indirect;
-   unsigned indirect_offset; /**< must be 4 byte aligned */
-   unsigned indirect_stride; /**< must be 4 byte aligned */
-   unsigned indirect_count; /**< number of indirect draws */
 
    /* Indirect draw count resource: If not NULL, contains a 32-bit value which
     * is to be used as the real indirect_count. In that case indirect_count
     * becomes the maximum possible value.
     */
    struct pipe_resource *indirect_params;
-   unsigned indirect_params_offset; /**< must be 4 byte aligned */
+
+   /**
+    * Stream output target. If not NULL, it's used to provide the 'count'
+    * parameter based on the number vertices captured by the stream output
+    * stage. (or generally, based on the number of bytes captured)
+    *
+    * Only 'mode', 'start_instance', and 'instance_count' are taken into
+    * account, all the other variables from pipe_draw_info are ignored.
+    *
+    * 'start' is implicitly 0 and 'count' is set as discussed above.
+    * The draw command is non-indexed.
+    *
+    * Note that this only provides the count. The vertex buffers must
+    * be set via set_vertex_buffers manually.
+    */
+   struct pipe_stream_output_target *count_from_stream_output;
 };
 
 
 /**
  * Information to describe a blit call.
  */
 struct pipe_blit_info
 {
    struct {
       struct pipe_resource *resource;
-- 
2.7.4



More information about the mesa-dev mailing list