util/indices: implement unfilled (tri->line) conversion for adjacency prims

Tested with new piglit gl-3.2-adj-prims test.

v2: re-order trisadj and tristripadj code, per Roland.

Reviewed-by: Roland Scheidegger <sroland@vmware.com>
This commit is contained in:
Brian Paul 2016-05-25 11:58:29 -06:00
parent d6c2c7d710
commit 0f983e1793
2 changed files with 38 additions and 2 deletions

View File

@ -35,14 +35,18 @@ PRIMS=('tris',
'tristrip',
'quads',
'quadstrip',
'polygon')
'polygon',
'trisadj',
'tristripadj')
LONGPRIMS=('PIPE_PRIM_TRIANGLES',
'PIPE_PRIM_TRIANGLE_FAN',
'PIPE_PRIM_TRIANGLE_STRIP',
'PIPE_PRIM_QUADS',
'PIPE_PRIM_QUAD_STRIP',
'PIPE_PRIM_POLYGON')
'PIPE_PRIM_POLYGON',
'PIPE_PRIM_TRIANGLES_ADJACENCY',
'PIPE_PRIM_TRIANGLE_STRIP_ADJACENCY')
longprim = dict(zip(PRIMS, LONGPRIMS))
intype_idx = dict(ubyte='IN_UBYTE', ushort='IN_USHORT', uint='IN_UINT')
@ -194,6 +198,22 @@ def quadstrip(intype, outtype):
postamble()
def trisadj(intype, outtype):
preamble(intype, outtype, prim='trisadj')
print ' for (i = start, j = 0; j < out_nr; j+=6, i+=6) { '
do_tri( intype, outtype, 'out+j', 'i', 'i+2', 'i+4' );
print ' }'
postamble()
def tristripadj(intype, outtype):
preamble(intype, outtype, prim='tristripadj')
print ' for (i = start, j = 0; j < out_nr; j+=6, i+=2) { '
do_tri( intype, outtype, 'out+j', 'i', 'i+2', 'i+4' );
print ' }'
postamble()
def emit_funcs():
for intype in INTYPES:
for outtype in OUTTYPES:
@ -203,6 +223,8 @@ def emit_funcs():
quads(intype, outtype)
quadstrip(intype, outtype)
polygon(intype, outtype)
trisadj(intype, outtype)
tristripadj(intype, outtype)
def init(intype, outtype, prim):
if intype == GENERATE:

View File

@ -22,6 +22,12 @@
* USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
/*
* NOTE: This file is not compiled by itself. It's actually #included
* by the generated u_unfilled_gen.c file!
*/
#include "u_indices.h"
#include "u_indices_priv.h"
#include "util/u_prim.h"
@ -104,6 +110,14 @@ nr_lines(unsigned prim, unsigned nr)
return (nr - 2) / 2 * 8;
case PIPE_PRIM_POLYGON:
return 2 * nr; /* a line (two verts) for each polygon edge */
/* Note: these cases can't really be handled since drawing lines instead
* of triangles would also require changing the GS. But if there's no GS,
* this should work.
*/
case PIPE_PRIM_TRIANGLES_ADJACENCY:
return (nr / 6) * 6;
case PIPE_PRIM_TRIANGLE_STRIP_ADJACENCY:
return ((nr - 4) / 2) * 6;
default:
assert(0);
return 0;