mesa: refactor _mesa_compute_max_transform_feedback_vertices from i965.
authorPaul Berry <stereotype441@gmail.com>
Wed, 12 Dec 2012 22:14:12 +0000 (14:14 -0800)
committerPaul Berry <stereotype441@gmail.com>
Tue, 18 Dec 2012 16:31:26 +0000 (08:31 -0800)
Previously, the i965 driver contained code to compute the maximum
number of vertices that could be written without overflowing any
transform feedback buffers.  This code wasn't driver-specific, and for
GLES3 support we're going to need to use it in core mesa.  So this
patch moves the code into a core mesa function,
_mesa_compute_max_transform_feedback_vertices().

Reviewed-by: Ian Romanick <ian.d.romanick@intel.com>
v2: Eliminate C++-style variable declarations, since these won't work
with MSVC.

Reviewed-by: Jordan Justen <jordan.l.justen@intel.com>
Reviewed-by: Brian Paul <brianp@vmware.com>
src/mesa/drivers/dri/i965/gen6_sol.c
src/mesa/main/transformfeedback.c
src/mesa/main/transformfeedback.h

index 07316c869a93ce622d9877101c687b01561b4e8f..7aa6140bd978ea9af30627aed14aee478b6345b0 100644 (file)
@@ -31,6 +31,7 @@
 #include "intel_batchbuffer.h"
 #include "brw_defines.h"
 #include "brw_state.h"
+#include "main/transformfeedback.h"
 
 static void
 gen6_update_sol_surfaces(struct brw_context *brw)
@@ -165,21 +166,12 @@ brw_begin_transform_feedback(struct gl_context *ctx, GLenum mode,
    struct gl_transform_feedback_object *xfb_obj =
       ctx->TransformFeedback.CurrentObject;
 
-   unsigned max_index = 0xffffffff;
-
    /* Compute the maximum number of vertices that we can write without
     * overflowing any of the buffers currently being used for feedback.
     */
-   for (int i = 0; i < BRW_MAX_SOL_BUFFERS; ++i) {
-      unsigned stride = linked_xfb_info->BufferStride[i];
-
-      /* Skip any inactive buffers, which have a stride of 0. */
-      if (stride == 0)
-        continue;
-
-      unsigned max_for_this_buffer = xfb_obj->Size[i] / (4 * stride);
-      max_index = MIN2(max_index, max_for_this_buffer);
-   }
+   unsigned max_index
+      = _mesa_compute_max_transform_feedback_vertices(xfb_obj,
+                                                      linked_xfb_info);
 
    /* Initialize the SVBI 0 register to zero and set the maximum index.
     * These values will be sent to the hardware on the next draw.
index 22060c34c97d55509382e6b5fd5ee54e34c91011..d9c6e514e8ff773e7c182ee0827f9360ff23eec4 100644 (file)
@@ -34,6 +34,7 @@
 #include "bufferobj.h"
 #include "context.h"
 #include "hash.h"
+#include "macros.h"
 #include "mfeatures.h"
 #include "mtypes.h"
 #include "transformfeedback.h"
@@ -245,6 +246,34 @@ _mesa_init_transform_feedback_functions(struct dd_function_table *driver)
 }
 
 
+/**
+ * Compute the maximum number of vertices that can be written to the currently
+ * enabled transform feedback buffers without overflowing any of them.
+ */
+unsigned
+_mesa_compute_max_transform_feedback_vertices(
+      const struct gl_transform_feedback_object *obj,
+      const struct gl_transform_feedback_info *info)
+{
+   unsigned max_index = 0xffffffff;
+   unsigned i;
+
+   for (i = 0; i < info->NumBuffers; ++i) {
+      unsigned stride = info->BufferStride[i];
+      unsigned max_for_this_buffer;
+
+      /* Skip any inactive buffers, which have a stride of 0. */
+      if (stride == 0)
+        continue;
+
+      max_for_this_buffer = obj->Size[i] / (4 * stride);
+      max_index = MIN2(max_index, max_for_this_buffer);
+   }
+
+   return max_index;
+}
+
+
 /**
  ** Begin API functions
  **/
index 01c2af3599be63660a8f31563b579bd15058d21b..3c03b7a241329ac53bfd7f1c5923b908ebdd37ad 100644 (file)
@@ -46,6 +46,11 @@ _mesa_validate_transform_feedback_buffers(struct gl_context *ctx);
 extern void
 _mesa_init_transform_feedback_functions(struct dd_function_table *driver);
 
+extern unsigned
+_mesa_compute_max_transform_feedback_vertices(
+      const struct gl_transform_feedback_object *obj,
+      const struct gl_transform_feedback_info *info);
+
 
 /*** GL_EXT_transform_feedback ***/