Mesa (master): mesa: refactor _mesa_compute_max_transform_feedback_vertices from i965.
Paul Berry
stereotype441 at kemper.freedesktop.org
Tue Dec 18 17:04:33 UTC 2012
Module: Mesa
Branch: master
Commit: 3870f2903f030969491fa287b7f8d7eaf1d2f4f9
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=3870f2903f030969491fa287b7f8d7eaf1d2f4f9
Author: Paul Berry <stereotype441 at gmail.com>
Date: Wed Dec 12 14:14:12 2012 -0800
mesa: refactor _mesa_compute_max_transform_feedback_vertices from i965.
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 at intel.com>
v2: Eliminate C++-style variable declarations, since these won't work
with MSVC.
Reviewed-by: Jordan Justen <jordan.l.justen at intel.com>
Reviewed-by: Brian Paul <brianp at vmware.com>
---
src/mesa/drivers/dri/i965/gen6_sol.c | 16 ++++------------
src/mesa/main/transformfeedback.c | 29 +++++++++++++++++++++++++++++
src/mesa/main/transformfeedback.h | 5 +++++
3 files changed, 38 insertions(+), 12 deletions(-)
diff --git a/src/mesa/drivers/dri/i965/gen6_sol.c b/src/mesa/drivers/dri/i965/gen6_sol.c
index 07316c8..7aa6140 100644
--- a/src/mesa/drivers/dri/i965/gen6_sol.c
+++ b/src/mesa/drivers/dri/i965/gen6_sol.c
@@ -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.
diff --git a/src/mesa/main/transformfeedback.c b/src/mesa/main/transformfeedback.c
index 22060c3..d9c6e51 100644
--- a/src/mesa/main/transformfeedback.c
+++ b/src/mesa/main/transformfeedback.c
@@ -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"
@@ -246,6 +247,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
**/
diff --git a/src/mesa/main/transformfeedback.h b/src/mesa/main/transformfeedback.h
index 01c2af3..3c03b7a 100644
--- a/src/mesa/main/transformfeedback.h
+++ b/src/mesa/main/transformfeedback.h
@@ -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 ***/
More information about the mesa-commit
mailing list