[Mesa-dev] [PATCH v2 2/6] mesa: refactor _mesa_compute_max_transform_feedback_vertices from i965.

Paul Berry stereotype441 at gmail.com
Sun Dec 16 08:16:40 PST 2012


On 16 December 2012 07:43, Brian Paul <brian.e.paul at gmail.com> wrote:

> On Sat, Dec 15, 2012 at 11:09 PM, Paul Berry <stereotype441 at 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.romanick at 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 <brianp at vmware.com>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20121216/f50ab245/attachment.html>


More information about the mesa-dev mailing list