On 16 December 2012 07:43, Brian Paul <brian.e.p...@gmail.com> wrote:
> On Sat, Dec 15, 2012 at 11:09 PM, Paul Berry <stereotype...@gmail.com> > wrote: > > 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.roman...@intel.com> > > > > v2: Eliminate C++-style variable declarations, since these won't work > > with MSVC. > > --- > > src/mesa/drivers/dri/i965/gen6_sol.c | 16 ++++------------ > > src/mesa/main/transformfeedback.c | 28 ++++++++++++++++++++++++++++ > > src/mesa/main/transformfeedback.h | 5 +++++ > > 3 files changed, 37 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..bf161bb 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,33 @@ _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; > > + > > + for (int i = 0; i < info->NumBuffers; ++i) { > > You'll have to move the 'int i' decl before the loop. And it should > be unsigned. > Ah, whoops. Thank you. Will do before pushing. > > > > + 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 ***/ > > > > Reviewed-by: Brian Paul <bri...@vmware.com> >
_______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev