OSDN Git Service

gallium: reorder fields in pipe_draw_info
authorMarek Olšák <marek.olsak@amd.com>
Mon, 20 Feb 2017 18:34:02 +0000 (19:34 +0100)
committerMarek Olšák <marek.olsak@amd.com>
Wed, 22 Feb 2017 19:36:40 +0000 (20:36 +0100)
sizeof(struct pipe_draw_info) = 104 -> 88

Also, vertices_per_patch is switched to ubyte, because it can't be more
than 32.

Seemed-reasonable-to: Roland Scheidegger

src/gallium/include/pipe/p_state.h

index cb72310..ce19b92 100644 (file)
@@ -636,8 +636,10 @@ struct pipe_index_buffer
 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 */
 
@@ -646,8 +648,6 @@ struct pipe_draw_info
 
    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.
     */
@@ -658,24 +658,15 @@ struct pipe_draw_info
    /**
     * 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:
@@ -697,16 +688,28 @@ struct pipe_draw_info
     *  };
     */
    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;
 };