[Mesa-dev] [PATCH 02/11] softpipe: Handle adjacency primitives.

Roland Scheidegger sroland at vmware.com
Wed Nov 7 08:35:43 PST 2012


I think that probably needs a test to make sure the right vertices are
used, I can't quite tell if it's right. This is hit when adjacent
primitives are used but not geometry shader is active right?

The rest of the series looks good to me.

Roland

Am 07.11.2012 16:26, schrieb jfonseca at vmware.com:
> From: José Fonseca <jfonseca at vmware.com>
> 
> Not fully tested.
> 
> Based on diagrams from
> http://msdn.microsoft.com/en-us/library/windows/desktop/bb205124.aspx#Primitive_Adjacency
> ---
>  src/gallium/drivers/softpipe/sp_prim_vbuf.c |   46 +++++++++++++++++++++++++++
>  1 file changed, 46 insertions(+)
> 
> diff --git a/src/gallium/drivers/softpipe/sp_prim_vbuf.c b/src/gallium/drivers/softpipe/sp_prim_vbuf.c
> index a142118..593a4fc 100644
> --- a/src/gallium/drivers/softpipe/sp_prim_vbuf.c
> +++ b/src/gallium/drivers/softpipe/sp_prim_vbuf.c
> @@ -380,6 +380,14 @@ sp_vbuf_draw_arrays(struct vbuf_render *vbr, uint start, uint nr)
>        }
>        break;
>  
> +   case PIPE_PRIM_LINES_ADJACENCY:
> +      for (i = 3; i < nr; i += 4) {
> +         sp_setup_line( setup,
> +                        get_vert(vertex_buffer, i-2, stride),
> +                        get_vert(vertex_buffer, i-1, stride) );
> +      }
> +      break;
> +
>     case PIPE_PRIM_LINE_STRIP:
>        for (i = 1; i < nr; i ++) {
>           sp_setup_line( setup,
> @@ -388,6 +396,14 @@ sp_vbuf_draw_arrays(struct vbuf_render *vbr, uint start, uint nr)
>        }
>        break;
>  
> +   case PIPE_PRIM_LINE_STRIP_ADJACENCY:
> +      for (i = 3; i < nr; i++) {
> +         sp_setup_line( setup,
> +                     get_vert(vertex_buffer, i-2, stride),
> +                     get_vert(vertex_buffer, i-1, stride) );
> +      }
> +      break;
> +
>     case PIPE_PRIM_LINE_LOOP:
>        for (i = 1; i < nr; i ++) {
>           sp_setup_line( setup,
> @@ -410,6 +426,15 @@ sp_vbuf_draw_arrays(struct vbuf_render *vbr, uint start, uint nr)
>        }
>        break;
>  
> +   case PIPE_PRIM_TRIANGLES_ADJACENCY:
> +      for (i = 5; i < nr; i += 6) {
> +         sp_setup_tri( setup,
> +                       get_vert(vertex_buffer, i-5, stride),
> +                       get_vert(vertex_buffer, i-3, stride),
> +                       get_vert(vertex_buffer, i-1, stride) );
> +      }
> +      break;
> +
>     case PIPE_PRIM_TRIANGLE_STRIP:
>        if (flatshade_first) {
>           for (i = 2; i < nr; i++) {
> @@ -431,6 +456,27 @@ sp_vbuf_draw_arrays(struct vbuf_render *vbr, uint start, uint nr)
>        }
>        break;
>  
> +   case PIPE_PRIM_TRIANGLE_STRIP_ADJACENCY:
> +      if (flatshade_first) {
> +         for (i = 5; i < nr; i++) {
> +            /* emit first triangle vertex as first triangle vertex */
> +            sp_setup_tri( setup,
> +                          get_vert(vertex_buffer, i-5, stride),
> +                          get_vert(vertex_buffer, i+(i&1)-3, stride),
> +                          get_vert(vertex_buffer, i-(i&1)-1, stride) );
> +         }
> +      }
> +      else {
> +         for (i = 5; i < nr; i++) {
> +            /* emit last triangle vertex as last triangle vertex */
> +            sp_setup_tri( setup,
> +                          get_vert(vertex_buffer, i+(i&1)-5, stride),
> +                          get_vert(vertex_buffer, i-(i&1)-3, stride),
> +                          get_vert(vertex_buffer, i-1, stride) );
> +         }
> +      }
> +      break;
> +
>     case PIPE_PRIM_TRIANGLE_FAN:
>        if (flatshade_first) {
>           for (i = 2; i < nr; i += 1) {
> 



More information about the mesa-dev mailing list