mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-01 05:58:05 +02:00
draw: Include draw_decompose_tmp.h in draw_pt_decompose.h.
Use draw_decompose_tmp.h to replace pipeline primitive decomposer.
This commit is contained in:
parent
94d256591d
commit
eb3c6ddafb
2 changed files with 36 additions and 296 deletions
|
|
@ -169,77 +169,41 @@ static void do_triangle( struct draw_context *draw,
|
|||
/*
|
||||
* Set up macros for draw_pt_decompose.h template code.
|
||||
* This code uses vertex indexes / elements.
|
||||
*
|
||||
* Flags are needed by the stipple and unfilled stages. When the two stages
|
||||
* are active, vcache_run_extras is called and the flags are stored in the
|
||||
* higher bits of i0. Otherwise, flags do not matter.
|
||||
*/
|
||||
|
||||
/* emit first quad vertex as first vertex in triangles */
|
||||
#define QUAD_FIRST_PV(i0,i1,i2,i3) \
|
||||
do_triangle( draw, \
|
||||
( DRAW_PIPE_RESET_STIPPLE | \
|
||||
DRAW_PIPE_EDGE_FLAG_0 | \
|
||||
DRAW_PIPE_EDGE_FLAG_1 ), \
|
||||
verts + stride * (elts[i0] & ~DRAW_PIPE_FLAG_MASK), \
|
||||
verts + stride * (elts[i1] & ~DRAW_PIPE_FLAG_MASK), \
|
||||
verts + stride * (elts[i2] & ~DRAW_PIPE_FLAG_MASK)); \
|
||||
do_triangle( draw, \
|
||||
( DRAW_PIPE_EDGE_FLAG_1 | \
|
||||
DRAW_PIPE_EDGE_FLAG_2 ), \
|
||||
verts + stride * (elts[i0] & ~DRAW_PIPE_FLAG_MASK), \
|
||||
verts + stride * (elts[i2] & ~DRAW_PIPE_FLAG_MASK), \
|
||||
verts + stride * (elts[i3] & ~DRAW_PIPE_FLAG_MASK))
|
||||
#define TRIANGLE(flags,i0,i1,i2) \
|
||||
do_triangle( draw, \
|
||||
i0, /* flags */ \
|
||||
verts + stride * (i0 & ~DRAW_PIPE_FLAG_MASK), \
|
||||
verts + stride * (i1 & ~DRAW_PIPE_FLAG_MASK), \
|
||||
verts + stride * (i2 & ~DRAW_PIPE_FLAG_MASK) )
|
||||
|
||||
/* emit last quad vertex as last vertex in triangles */
|
||||
#define QUAD_LAST_PV(i0,i1,i2,i3) \
|
||||
do_triangle( draw, \
|
||||
( DRAW_PIPE_RESET_STIPPLE | \
|
||||
DRAW_PIPE_EDGE_FLAG_0 | \
|
||||
DRAW_PIPE_EDGE_FLAG_2 ), \
|
||||
verts + stride * (elts[i0] & ~DRAW_PIPE_FLAG_MASK), \
|
||||
verts + stride * (elts[i1] & ~DRAW_PIPE_FLAG_MASK), \
|
||||
verts + stride * (elts[i3] & ~DRAW_PIPE_FLAG_MASK)); \
|
||||
do_triangle( draw, \
|
||||
( DRAW_PIPE_EDGE_FLAG_0 | \
|
||||
DRAW_PIPE_EDGE_FLAG_1 ), \
|
||||
verts + stride * (elts[i1] & ~DRAW_PIPE_FLAG_MASK), \
|
||||
verts + stride * (elts[i2] & ~DRAW_PIPE_FLAG_MASK), \
|
||||
verts + stride * (elts[i3] & ~DRAW_PIPE_FLAG_MASK))
|
||||
|
||||
#define TRIANGLE(flags,i0,i1,i2) \
|
||||
do_triangle( draw, \
|
||||
elts[i0], /* flags */ \
|
||||
verts + stride * (elts[i0] & ~DRAW_PIPE_FLAG_MASK), \
|
||||
verts + stride * (elts[i1] & ~DRAW_PIPE_FLAG_MASK), \
|
||||
verts + stride * (elts[i2] & ~DRAW_PIPE_FLAG_MASK) );
|
||||
|
||||
#define LINE(flags,i0,i1) \
|
||||
do_line( draw, \
|
||||
elts[i0], \
|
||||
verts + stride * (elts[i0] & ~DRAW_PIPE_FLAG_MASK), \
|
||||
verts + stride * (elts[i1] & ~DRAW_PIPE_FLAG_MASK) );
|
||||
#define LINE(flags,i0,i1) \
|
||||
do_line( draw, \
|
||||
i0, /* flags */ \
|
||||
verts + stride * (i0 & ~DRAW_PIPE_FLAG_MASK), \
|
||||
verts + stride * (i1 & ~DRAW_PIPE_FLAG_MASK) )
|
||||
|
||||
#define POINT(i0) \
|
||||
do_point( draw, \
|
||||
verts + stride * (elts[i0] & ~DRAW_PIPE_FLAG_MASK) )
|
||||
verts + stride * (i0 & ~DRAW_PIPE_FLAG_MASK) )
|
||||
|
||||
#define GET_ELT(idx) (elts[idx])
|
||||
|
||||
#define FUNC pipe_run_elts
|
||||
#define ARGS \
|
||||
#define FUNC_VARS \
|
||||
struct draw_context *draw, \
|
||||
unsigned prim, \
|
||||
struct vertex_header *vertices, \
|
||||
unsigned stride, \
|
||||
const ushort *elts
|
||||
|
||||
#define LOCAL_VARS \
|
||||
char *verts = (char *)vertices; \
|
||||
boolean flatfirst = (draw->rasterizer->flatshade && \
|
||||
draw->rasterizer->flatshade_first); \
|
||||
unsigned i; \
|
||||
ushort flags
|
||||
|
||||
#define FLUSH
|
||||
const ushort *elts, \
|
||||
unsigned count
|
||||
|
||||
#include "draw_pt_decompose.h"
|
||||
#undef ARGS
|
||||
#undef LOCAL_VARS
|
||||
|
||||
|
||||
|
||||
|
|
@ -304,38 +268,6 @@ void draw_pipeline_run( struct draw_context *draw,
|
|||
* This code is for non-indexed (aka linear) rendering (no elts).
|
||||
*/
|
||||
|
||||
/* emit first quad vertex as first vertex in triangles */
|
||||
#define QUAD_FIRST_PV(i0,i1,i2,i3) \
|
||||
do_triangle( draw, \
|
||||
( DRAW_PIPE_RESET_STIPPLE | \
|
||||
DRAW_PIPE_EDGE_FLAG_0 | \
|
||||
DRAW_PIPE_EDGE_FLAG_1 ), \
|
||||
verts + stride * ((i0) & ~DRAW_PIPE_FLAG_MASK), \
|
||||
verts + stride * ((i1) & ~DRAW_PIPE_FLAG_MASK), \
|
||||
verts + stride * ((i2) & ~DRAW_PIPE_FLAG_MASK)); \
|
||||
do_triangle( draw, \
|
||||
( DRAW_PIPE_EDGE_FLAG_1 | \
|
||||
DRAW_PIPE_EDGE_FLAG_2 ), \
|
||||
verts + stride * ((i0) & ~DRAW_PIPE_FLAG_MASK), \
|
||||
verts + stride * ((i2) & ~DRAW_PIPE_FLAG_MASK), \
|
||||
verts + stride * ((i3) & ~DRAW_PIPE_FLAG_MASK))
|
||||
|
||||
/* emit last quad vertex as last vertex in triangles */
|
||||
#define QUAD_LAST_PV(i0,i1,i2,i3) \
|
||||
do_triangle( draw, \
|
||||
( DRAW_PIPE_RESET_STIPPLE | \
|
||||
DRAW_PIPE_EDGE_FLAG_0 | \
|
||||
DRAW_PIPE_EDGE_FLAG_2 ), \
|
||||
verts + stride * ((i0) & ~DRAW_PIPE_FLAG_MASK), \
|
||||
verts + stride * ((i1) & ~DRAW_PIPE_FLAG_MASK), \
|
||||
verts + stride * ((i3) & ~DRAW_PIPE_FLAG_MASK)); \
|
||||
do_triangle( draw, \
|
||||
( DRAW_PIPE_EDGE_FLAG_0 | \
|
||||
DRAW_PIPE_EDGE_FLAG_1 ), \
|
||||
verts + stride * ((i1) & ~DRAW_PIPE_FLAG_MASK), \
|
||||
verts + stride * ((i2) & ~DRAW_PIPE_FLAG_MASK), \
|
||||
verts + stride * ((i3) & ~DRAW_PIPE_FLAG_MASK))
|
||||
|
||||
#define TRIANGLE(flags,i0,i1,i2) \
|
||||
do_triangle( draw, \
|
||||
flags, /* flags */ \
|
||||
|
|
@ -353,21 +285,16 @@ void draw_pipeline_run( struct draw_context *draw,
|
|||
do_point( draw, \
|
||||
verts + stride * ((i0) & ~DRAW_PIPE_FLAG_MASK) )
|
||||
|
||||
|
||||
#define GET_ELT(idx) (idx)
|
||||
|
||||
#define FUNC pipe_run_linear
|
||||
#define ARGS \
|
||||
struct draw_context *draw, \
|
||||
unsigned prim, \
|
||||
struct vertex_header *vertices, \
|
||||
unsigned stride
|
||||
|
||||
#define LOCAL_VARS \
|
||||
char *verts = (char *)vertices; \
|
||||
boolean flatfirst = (draw->rasterizer->flatshade && \
|
||||
draw->rasterizer->flatshade_first); \
|
||||
unsigned i; \
|
||||
ushort flags
|
||||
|
||||
#define FLUSH
|
||||
#define FUNC_VARS \
|
||||
struct draw_context *draw, \
|
||||
unsigned prim, \
|
||||
struct vertex_header *vertices, \
|
||||
unsigned stride, \
|
||||
unsigned count
|
||||
|
||||
#include "draw_pt_decompose.h"
|
||||
|
||||
|
|
|
|||
|
|
@ -1,194 +1,7 @@
|
|||
#define LOCAL_VARS \
|
||||
char *verts = (char *) vertices; \
|
||||
const boolean last_vertex_last = \
|
||||
!(draw->rasterizer->flatshade && \
|
||||
draw->rasterizer->flatshade_first)
|
||||
|
||||
|
||||
static void FUNC( ARGS,
|
||||
unsigned count )
|
||||
{
|
||||
LOCAL_VARS;
|
||||
|
||||
switch (prim) {
|
||||
case PIPE_PRIM_POINTS:
|
||||
for (i = 0; i < count; i ++) {
|
||||
POINT( (i + 0) );
|
||||
}
|
||||
break;
|
||||
|
||||
case PIPE_PRIM_LINES:
|
||||
for (i = 0; i+1 < count; i += 2) {
|
||||
LINE( DRAW_PIPE_RESET_STIPPLE,
|
||||
(i + 0),
|
||||
(i + 1));
|
||||
}
|
||||
break;
|
||||
|
||||
case PIPE_PRIM_LINE_LOOP:
|
||||
if (count >= 2) {
|
||||
flags = DRAW_PIPE_RESET_STIPPLE;
|
||||
|
||||
for (i = 1; i < count; i++, flags = 0) {
|
||||
LINE( flags,
|
||||
(i - 1),
|
||||
(i ));
|
||||
}
|
||||
|
||||
LINE( flags,
|
||||
(i - 1),
|
||||
(0 ));
|
||||
}
|
||||
break;
|
||||
|
||||
case PIPE_PRIM_LINE_STRIP:
|
||||
flags = DRAW_PIPE_RESET_STIPPLE;
|
||||
for (i = 1; i < count; i++, flags = 0) {
|
||||
LINE( flags,
|
||||
(i - 1),
|
||||
(i ));
|
||||
}
|
||||
break;
|
||||
|
||||
case PIPE_PRIM_TRIANGLES:
|
||||
for (i = 0; i+2 < count; i += 3) {
|
||||
TRIANGLE( DRAW_PIPE_RESET_STIPPLE | DRAW_PIPE_EDGE_FLAG_ALL,
|
||||
(i + 0),
|
||||
(i + 1),
|
||||
(i + 2 ));
|
||||
}
|
||||
break;
|
||||
|
||||
case PIPE_PRIM_TRIANGLE_STRIP:
|
||||
if (flatfirst) {
|
||||
for (i = 0; i+2 < count; i++) {
|
||||
/* Emit first triangle vertex as first triangle vertex */
|
||||
TRIANGLE( DRAW_PIPE_RESET_STIPPLE | DRAW_PIPE_EDGE_FLAG_ALL,
|
||||
(i + 0),
|
||||
(i + 1 + (i&1)),
|
||||
(i + 2 - (i&1)) );
|
||||
}
|
||||
}
|
||||
else {
|
||||
for (i = 0; i+2 < count; i++) {
|
||||
/* Emit last triangle vertex as last triangle vertex */
|
||||
TRIANGLE( DRAW_PIPE_RESET_STIPPLE | DRAW_PIPE_EDGE_FLAG_ALL,
|
||||
(i + 0 + (i&1)),
|
||||
(i + 1 - (i&1)),
|
||||
(i + 2 ));
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case PIPE_PRIM_TRIANGLE_FAN:
|
||||
if (count >= 3) {
|
||||
if (flatfirst) {
|
||||
for (i = 0; i+2 < count; i++) {
|
||||
TRIANGLE( DRAW_PIPE_RESET_STIPPLE | DRAW_PIPE_EDGE_FLAG_ALL,
|
||||
(i + 1),
|
||||
(i + 2),
|
||||
0 );
|
||||
}
|
||||
}
|
||||
else {
|
||||
for (i = 0; i+2 < count; i++) {
|
||||
TRIANGLE( DRAW_PIPE_RESET_STIPPLE | DRAW_PIPE_EDGE_FLAG_ALL,
|
||||
(0),
|
||||
(i + 1),
|
||||
(i + 2 ));
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
|
||||
case PIPE_PRIM_QUADS:
|
||||
/* GL quads don't follow provoking vertex convention */
|
||||
if (flatfirst) {
|
||||
for (i = 0; i+3 < count; i += 4) {
|
||||
/* emit last quad vertex as first triangle vertex */
|
||||
QUAD_FIRST_PV( (i + 3),
|
||||
(i + 0),
|
||||
(i + 1),
|
||||
(i + 2) );
|
||||
}
|
||||
}
|
||||
else {
|
||||
for (i = 0; i+3 < count; i += 4) {
|
||||
/* emit last quad vertex as last triangle vertex */
|
||||
QUAD_LAST_PV( (i + 0),
|
||||
(i + 1),
|
||||
(i + 2),
|
||||
(i + 3) );
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case PIPE_PRIM_QUAD_STRIP:
|
||||
/* GL quad strips don't follow provoking vertex convention */
|
||||
if (flatfirst) {
|
||||
for (i = 0; i+3 < count; i += 2) {
|
||||
/* emit last quad vertex as first triangle vertex */
|
||||
QUAD_FIRST_PV( (i + 3),
|
||||
(i + 2),
|
||||
(i + 0),
|
||||
(i + 1) );
|
||||
|
||||
}
|
||||
}
|
||||
else {
|
||||
for (i = 0; i+3 < count; i += 2) {
|
||||
/* emit last quad vertex as last triangle vertex */
|
||||
QUAD_LAST_PV( (i + 2),
|
||||
(i + 0),
|
||||
(i + 1),
|
||||
(i + 3) );
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case PIPE_PRIM_POLYGON:
|
||||
/* GL polygons don't follow provoking vertex convention */
|
||||
{
|
||||
/* These bitflags look a little odd because we submit the
|
||||
* vertices as (1,2,0) to satisfy flatshade requirements.
|
||||
*/
|
||||
const ushort edge_first = DRAW_PIPE_EDGE_FLAG_2;
|
||||
const ushort edge_middle = DRAW_PIPE_EDGE_FLAG_0;
|
||||
const ushort edge_last = DRAW_PIPE_EDGE_FLAG_1;
|
||||
|
||||
flags = DRAW_PIPE_RESET_STIPPLE | edge_first | edge_middle;
|
||||
|
||||
for (i = 0; i+2 < count; i++, flags = edge_middle) {
|
||||
|
||||
if (i + 3 == count)
|
||||
flags |= edge_last;
|
||||
|
||||
if (flatfirst) {
|
||||
/* emit first polygon vertex as first triangle vertex */
|
||||
TRIANGLE( flags,
|
||||
(0),
|
||||
(i + 1),
|
||||
(i + 2) );
|
||||
}
|
||||
else {
|
||||
/* emit first polygon vertex as last triangle vertex */
|
||||
TRIANGLE( flags,
|
||||
(i + 1),
|
||||
(i + 2),
|
||||
(0));
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
assert(0);
|
||||
break;
|
||||
}
|
||||
|
||||
FLUSH;
|
||||
}
|
||||
|
||||
|
||||
#undef TRIANGLE
|
||||
#undef QUAD_FIRST_PV
|
||||
#undef QUAD_LAST_PV
|
||||
#undef POINT
|
||||
#undef LINE
|
||||
#undef FUNC
|
||||
#include "draw_decompose_tmp.h"
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue