From 3870f2903f030969491fa287b7f8d7eaf1d2f4f9 Mon Sep 17 00:00:00 2001 From: Paul Berry Date: Wed, 12 Dec 2012 14:14:12 -0800 Subject: [PATCH] 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 v2: Eliminate C++-style variable declarations, since these won't work with MSVC. Reviewed-by: Jordan Justen Reviewed-by: Brian Paul --- 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 07316c869a9..7aa6140bd97 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 22060c34c97..d9c6e514e8f 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" @@ -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 **/ diff --git a/src/mesa/main/transformfeedback.h b/src/mesa/main/transformfeedback.h index 01c2af3599b..3c03b7a2413 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 ***/ -- 2.30.2