mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-08 11:18:08 +02:00
draw: Include draw_decompose_tmp.h in draw_gs_tmp.h.
Use draw_decompose_tmp.h to replace GS primitive decomposer.
This commit is contained in:
parent
8a41b18b7d
commit
23176779f8
2 changed files with 36 additions and 168 deletions
|
|
@ -373,28 +373,14 @@ static void gs_tri_adj(struct draw_geometry_shader *shader,
|
|||
gs_flush(shader, 1);
|
||||
}
|
||||
|
||||
#define TRIANGLE(gs,i0,i1,i2) gs_tri(gs,i0,i1,i2)
|
||||
#define TRI_ADJ(gs,i0,i1,i2,i3,i4,i5) gs_tri_adj(gs,i0,i1,i2,i3,i4,i5)
|
||||
#define LINE(gs,i0,i1) gs_line(gs,i0,i1)
|
||||
#define LINE_ADJ(gs,i0,i1,i2,i3) gs_line_adj(gs,i0,i1,i2,i3)
|
||||
#define POINT(gs,i0) gs_point(gs,i0)
|
||||
#define FUNC gs_run
|
||||
#define LOCAL_VARS
|
||||
#define FUNC gs_run
|
||||
#define GET_ELT(idx) (idx)
|
||||
#include "draw_gs_tmp.h"
|
||||
|
||||
|
||||
#define TRIANGLE(gs,i0,i1,i2) gs_tri(gs,elts[i0],elts[i1],elts[i2])
|
||||
#define TRI_ADJ(gs,i0,i1,i2,i3,i4,i5) \
|
||||
gs_tri_adj(gs,elts[i0],elts[i1],elts[i2],elts[i3], \
|
||||
elts[i4],elts[i5])
|
||||
#define LINE(gs,i0,i1) gs_line(gs,elts[i0],elts[i1])
|
||||
#define LINE_ADJ(gs,i0,i1,i2,i3) gs_line_adj(gs,elts[i0], \
|
||||
elts[i1], \
|
||||
elts[i2],elts[i3])
|
||||
#define POINT(gs,i0) gs_point(gs,elts[i0])
|
||||
#define FUNC gs_run_elts
|
||||
#define LOCAL_VARS \
|
||||
const ushort *elts = input_prims->elts;
|
||||
#define FUNC gs_run_elts
|
||||
#define LOCAL_VARS const ushort *elts = input_prims->elts;
|
||||
#define GET_ELT(idx) (elts[idx])
|
||||
#include "draw_gs_tmp.h"
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -1,152 +1,34 @@
|
|||
#define FUNC_VARS struct draw_geometry_shader *gs, \
|
||||
const struct draw_prim_info *input_prims, \
|
||||
const struct draw_vertex_info *input_verts, \
|
||||
struct draw_prim_info *output_prims, \
|
||||
struct draw_vertex_info *output_verts
|
||||
|
||||
static void FUNC( struct draw_geometry_shader *shader,
|
||||
const struct draw_prim_info *input_prims,
|
||||
const struct draw_vertex_info *input_verts,
|
||||
struct draw_prim_info *output_prims,
|
||||
struct draw_vertex_info *output_verts)
|
||||
{
|
||||
struct draw_context *draw = shader->draw;
|
||||
#define FUNC_ENTER \
|
||||
/* declare more local vars */ \
|
||||
struct draw_context *draw = gs->draw; \
|
||||
const unsigned prim = input_prims->prim; \
|
||||
const unsigned count = input_prims->count; \
|
||||
const boolean last_vertex_last = \
|
||||
!(draw->rasterizer->flatshade && \
|
||||
draw->rasterizer->flatshade_first); \
|
||||
do { \
|
||||
debug_assert(input_prims->primitive_count == 1); \
|
||||
switch (prim) { \
|
||||
case PIPE_PRIM_QUADS: \
|
||||
case PIPE_PRIM_QUAD_STRIP: \
|
||||
case PIPE_PRIM_POLYGON: \
|
||||
debug_assert(!"unexpected primitive type in GS"); \
|
||||
return; \
|
||||
default: \
|
||||
break; \
|
||||
} \
|
||||
} while (0) \
|
||||
|
||||
boolean flatfirst = (draw->rasterizer->flatshade &&
|
||||
draw->rasterizer->flatshade_first);
|
||||
unsigned i, j;
|
||||
unsigned count = input_prims->count;
|
||||
LOCAL_VARS
|
||||
#define POINT(i0) gs_point(gs,i0)
|
||||
#define LINE(flags,i0,i1) gs_line(gs,i0,i1)
|
||||
#define TRIANGLE(flags,i0,i1,i2) gs_tri(gs,i0,i1,i2)
|
||||
#define LINE_ADJ(flags,i0,i1,i2,i3) gs_line_adj(gs,i0,i1,i2,i3)
|
||||
#define TRIANGLE_ADJ(flags,i0,i1,i2,i3,i4,i5) gs_tri_adj(gs,i0,i1,i2,i3,i4,i5)
|
||||
|
||||
if (0) debug_printf("%s %d\n", __FUNCTION__, count);
|
||||
|
||||
debug_assert(input_prims->primitive_count == 1);
|
||||
|
||||
switch (input_prims->prim) {
|
||||
case PIPE_PRIM_POINTS:
|
||||
for (i = 0; i < count; i++) {
|
||||
POINT( shader, i + 0 );
|
||||
}
|
||||
break;
|
||||
|
||||
case PIPE_PRIM_LINES:
|
||||
for (i = 0; i+1 < count; i += 2) {
|
||||
LINE( shader , i + 0 , i + 1 );
|
||||
}
|
||||
break;
|
||||
|
||||
case PIPE_PRIM_LINE_LOOP:
|
||||
if (count >= 2) {
|
||||
|
||||
for (i = 1; i < count; i++) {
|
||||
LINE( shader, i - 1, i );
|
||||
}
|
||||
|
||||
LINE( shader, i - 1, 0 );
|
||||
}
|
||||
break;
|
||||
|
||||
case PIPE_PRIM_LINE_STRIP:
|
||||
for (i = 1; i < count; i++) {
|
||||
LINE( shader, i - 1, i );
|
||||
}
|
||||
break;
|
||||
|
||||
case PIPE_PRIM_TRIANGLES:
|
||||
for (i = 0; i+2 < count; i += 3) {
|
||||
TRIANGLE( shader, i + 0, i + 1, i + 2 );
|
||||
}
|
||||
break;
|
||||
|
||||
case PIPE_PRIM_TRIANGLE_STRIP:
|
||||
if (flatfirst) {
|
||||
for (i = 0; i+2 < count; i++) {
|
||||
TRIANGLE( shader,
|
||||
i + 0,
|
||||
i + 1 + (i&1),
|
||||
i + 2 - (i&1) );
|
||||
}
|
||||
}
|
||||
else {
|
||||
for (i = 0; i+2 < count; i++) {
|
||||
TRIANGLE( shader,
|
||||
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( shader,
|
||||
i + 1,
|
||||
i + 2,
|
||||
0 );
|
||||
}
|
||||
}
|
||||
else {
|
||||
for (i = 0; i+2 < count; i++) {
|
||||
TRIANGLE( shader,
|
||||
0,
|
||||
i + 1,
|
||||
i + 2 );
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case PIPE_PRIM_POLYGON:
|
||||
{
|
||||
for (i = 0; i+2 < count; i++) {
|
||||
|
||||
if (flatfirst) {
|
||||
TRIANGLE( shader, 0, i + 1, i + 2 );
|
||||
}
|
||||
else {
|
||||
TRIANGLE( shader, i + 1, i + 2, 0 );
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case PIPE_PRIM_LINES_ADJACENCY:
|
||||
for (i = 0; i+3 < count; i += 4) {
|
||||
LINE_ADJ( shader , i + 0 , i + 1, i + 2, i + 3 );
|
||||
}
|
||||
break;
|
||||
case PIPE_PRIM_LINE_STRIP_ADJACENCY:
|
||||
for (i = 1; i + 2 < count; i++) {
|
||||
LINE_ADJ( shader, i - 1, i, i + 1, i + 2 );
|
||||
}
|
||||
break;
|
||||
|
||||
case PIPE_PRIM_TRIANGLES_ADJACENCY:
|
||||
for (i = 0; i+5 < count; i += 5) {
|
||||
TRI_ADJ( shader, i + 0, i + 1, i + 2,
|
||||
i + 3, i + 4, i + 5);
|
||||
}
|
||||
break;
|
||||
case PIPE_PRIM_TRIANGLE_STRIP_ADJACENCY:
|
||||
for (i = 0, j = 0; i+5 < count; i += 2, ++j) {
|
||||
TRI_ADJ( shader,
|
||||
i + 0,
|
||||
i + 1 + 2*(j&1),
|
||||
i + 2 + 2*(j&1),
|
||||
i + 3 - 2*(j&1),
|
||||
i + 4 - 2*(j&1),
|
||||
i + 5);
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
debug_assert(!"Unsupported primitive in geometry shader");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#undef TRIANGLE
|
||||
#undef TRI_ADJ
|
||||
#undef POINT
|
||||
#undef LINE
|
||||
#undef LINE_ADJ
|
||||
#undef FUNC
|
||||
#undef LOCAL_VARS
|
||||
#include "draw_decompose_tmp.h"
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue