On 16 December 2012 07:43, Brian Paul <span dir="ltr"><<a href="mailto:brian.e.paul@gmail.com" target="_blank">brian.e.paul@gmail.com</a>></span> wrote:<br><div class="gmail_extra"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div class="HOEnZb"><div class="h5">On Sat, Dec 15, 2012 at 11:09 PM, Paul Berry <<a href="mailto:stereotype441@gmail.com">stereotype441@gmail.com</a>> wrote:<br>
> Previously, the i965 driver contained code to compute the maximum<br>
> number of vertices that could be written without overflowing any<br>
> transform feedback buffers.  This code wasn't driver-specific, and for<br>
> GLES3 support we're going to need to use it in core mesa.  So this<br>
> patch moves the code into a core mesa function,<br>
> _mesa_compute_max_transform_feedback_vertices().<br>
><br>
> Reviewed-by: Ian Romanick <<a href="mailto:ian.d.romanick@intel.com">ian.d.romanick@intel.com</a>><br>
><br>
> v2: Eliminate C++-style variable declarations, since these won't work<br>
> with MSVC.<br>
> ---<br>
>  src/mesa/drivers/dri/i965/gen6_sol.c | 16 ++++------------<br>
>  src/mesa/main/transformfeedback.c    | 28 ++++++++++++++++++++++++++++<br>
>  src/mesa/main/transformfeedback.h    |  5 +++++<br>
>  3 files changed, 37 insertions(+), 12 deletions(-)<br>
><br>
> diff --git a/src/mesa/drivers/dri/i965/gen6_sol.c b/src/mesa/drivers/dri/i965/gen6_sol.c<br>
> index 07316c8..7aa6140 100644<br>
> --- a/src/mesa/drivers/dri/i965/gen6_sol.c<br>
> +++ b/src/mesa/drivers/dri/i965/gen6_sol.c<br>
> @@ -31,6 +31,7 @@<br>
>  #include "intel_batchbuffer.h"<br>
>  #include "brw_defines.h"<br>
>  #include "brw_state.h"<br>
> +#include "main/transformfeedback.h"<br>
><br>
>  static void<br>
>  gen6_update_sol_surfaces(struct brw_context *brw)<br>
> @@ -165,21 +166,12 @@ brw_begin_transform_feedback(struct gl_context *ctx, GLenum mode,<br>
>     struct gl_transform_feedback_object *xfb_obj =<br>
>        ctx->TransformFeedback.CurrentObject;<br>
><br>
> -   unsigned max_index = 0xffffffff;<br>
> -<br>
>     /* Compute the maximum number of vertices that we can write without<br>
>      * overflowing any of the buffers currently being used for feedback.<br>
>      */<br>
> -   for (int i = 0; i < BRW_MAX_SOL_BUFFERS; ++i) {<br>
> -      unsigned stride = linked_xfb_info->BufferStride[i];<br>
> -<br>
> -      /* Skip any inactive buffers, which have a stride of 0. */<br>
> -      if (stride == 0)<br>
> -        continue;<br>
> -<br>
> -      unsigned max_for_this_buffer = xfb_obj->Size[i] / (4 * stride);<br>
> -      max_index = MIN2(max_index, max_for_this_buffer);<br>
> -   }<br>
> +   unsigned max_index<br>
> +      = _mesa_compute_max_transform_feedback_vertices(xfb_obj,<br>
> +                                                      linked_xfb_info);<br>
><br>
>     /* Initialize the SVBI 0 register to zero and set the maximum index.<br>
>      * These values will be sent to the hardware on the next draw.<br>
> diff --git a/src/mesa/main/transformfeedback.c b/src/mesa/main/transformfeedback.c<br>
> index 22060c3..bf161bb 100644<br>
> --- a/src/mesa/main/transformfeedback.c<br>
> +++ b/src/mesa/main/transformfeedback.c<br>
> @@ -34,6 +34,7 @@<br>
>  #include "bufferobj.h"<br>
>  #include "context.h"<br>
>  #include "hash.h"<br>
> +#include "macros.h"<br>
>  #include "mfeatures.h"<br>
>  #include "mtypes.h"<br>
>  #include "transformfeedback.h"<br>
> @@ -246,6 +247,33 @@ _mesa_init_transform_feedback_functions(struct dd_function_table *driver)<br>
><br>
><br>
>  /**<br>
> + * Compute the maximum number of vertices that can be written to the currently<br>
> + * enabled transform feedback buffers without overflowing any of them.<br>
> + */<br>
> +unsigned<br>
> +_mesa_compute_max_transform_feedback_vertices(<br>
> +      const struct gl_transform_feedback_object *obj,<br>
> +      const struct gl_transform_feedback_info *info)<br>
> +{<br>
> +   unsigned max_index = 0xffffffff;<br>
> +<br>
> +   for (int i = 0; i < info->NumBuffers; ++i) {<br>
<br>
</div></div>You'll have to move the 'int i' decl before the loop.  And it should<br>
be unsigned.<br></blockquote><div><br></div><div>Ah, whoops.  Thank you.  Will do before pushing.</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div><div class="h5"><br>
<br>
> +      unsigned stride = info->BufferStride[i];<br>
> +      unsigned max_for_this_buffer;<br>
> +<br>
> +      /* Skip any inactive buffers, which have a stride of 0. */<br>
> +      if (stride == 0)<br>
> +        continue;<br>
> +<br>
> +      max_for_this_buffer = obj->Size[i] / (4 * stride);<br>
> +      max_index = MIN2(max_index, max_for_this_buffer);<br>
> +   }<br>
> +<br>
> +   return max_index;<br>
> +}<br>
> +<br>
> +<br>
> +/**<br>
>   ** Begin API functions<br>
>   **/<br>
><br>
> diff --git a/src/mesa/main/transformfeedback.h b/src/mesa/main/transformfeedback.h<br>
> index 01c2af3..3c03b7a 100644<br>
> --- a/src/mesa/main/transformfeedback.h<br>
> +++ b/src/mesa/main/transformfeedback.h<br>
> @@ -46,6 +46,11 @@ _mesa_validate_transform_feedback_buffers(struct gl_context *ctx);<br>
>  extern void<br>
>  _mesa_init_transform_feedback_functions(struct dd_function_table *driver);<br>
><br>
> +extern unsigned<br>
> +_mesa_compute_max_transform_feedback_vertices(<br>
> +      const struct gl_transform_feedback_object *obj,<br>
> +      const struct gl_transform_feedback_info *info);<br>
> +<br>
><br>
>  /*** GL_EXT_transform_feedback ***/<br>
><br>
<br>
</div></div>Reviewed-by: Brian Paul <<a href="mailto:brianp@vmware.com">brianp@vmware.com</a>><br>
</blockquote></div><br></div>