[Mesa-dev] [PATCH 02/11] softpipe: Handle adjacency primitives.
Jose Fonseca
jfonseca at vmware.com
Wed Nov 7 09:08:09 PST 2012
----- Original Message -----
> On 11/07/2012 08:26 AM, jfonseca at vmware.com wrote:
> > 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;
> > +
>
>
> Shouldn't we increment with i+=2 since we emit need to emit a
> triangle
> for every other vertex?
I think you're right. Thanks for the detailed investigation.
Jose
> I wrote a test program to generate and print the indexes for
> adjacency
> triangles based on your arithmetic:
>
>
> #include <stdio.h>
>
> int main(int argc, char *argv[])
> {
> int i, nr = 14;
> for (i = 5; i < nr; i++) {
> int a = i-5;
> int b = i+(i&1)-3;
> int c = i-(i&1)-1;
> printf("%d: %d, %d, %d\n", i, a, b, c);
> }
> return 0;
> }
>
> The output is:
>
> 5: 0, 3, 3
> 6: 1, 3, 5
> 7: 2, 5, 5
> 8: 3, 5, 7
> 9: 4, 7, 7
> 10: 5, 7, 9
> 11: 6, 9, 9
> 12: 7, 9, 11
> 13: 8, 11, 11
>
> There's too many triangles and duplicated vertex indexes.
>
> This seems to work:
>
> int main(int argc, char *argv[])
> {
> int i, nr = 14;
> for (i = 5; i < nr; i+=2) {
> int a = i-5;
> int b = (i&2) ? i-1 : i-3;
> int c = (i&2) ? i-3 : i-1;
> printf("%d: %d, %d, %d\n", i, a, b, c);
> }
> return 0;
> }
>
> -Brian
>
More information about the mesa-dev
mailing list