Support for QUAD_STRIP and POLYGON (Fill and point rendering only)

This commit is contained in:
Jannik Vogel 2015-09-04 14:02:50 +02:00
parent ad8215cfbd
commit 2366b9bc9c
2 changed files with 24 additions and 4 deletions

View File

@ -1101,9 +1101,9 @@ static const GLenum kelvin_primitive_map[] = {
GL_TRIANGLES,
GL_TRIANGLE_STRIP,
GL_TRIANGLE_FAN,
GL_LINES_ADJACENCY, // GL_QUADS,
// GL_QUAD_STRIP,
// GL_POLYGON,
GL_LINES_ADJACENCY, /* QUADS */
GL_LINE_STRIP_ADJACENCY, /* QUAD_STRIP */
GL_TRIANGLE_FAN /* POLYGON */
};
static const GLenum pgraph_texture_min_filter_map[] = {
@ -5329,6 +5329,15 @@ static void pgraph_method(NV2AState *d,
assert(front_mode < ARRAYSIZE(pgraph_polygon_mode_map));
glPolygonMode(GL_FRONT_AND_BACK,
pgraph_polygon_mode_map[front_mode]);
/* FIXME: Line rendering for POLYGON can be done using line loop,
* QUADS and QUAD_STRIP need a geometry shader. Also what
* about the interpolation / provoking vertex for flat
* shaded points / lines?
*/
assert(!((pg->primitive_mode == PRIM_TYPE_QUADS ||
pg->primitive_mode == PRIM_TYPE_QUAD_STRIP ||
pg->primitive_mode == PRIM_TYPE_POLYGON) &&
front_mode == NV_PGRAPH_SETUPRASTER_FRONTFACEMODE_LINE));
/* Polygon offset */
/* FIXME: GL implementation-specific, maybe do this in VS? */

View File

@ -39,6 +39,7 @@ static QString* generate_geometry_shader(enum ShaderPrimitiveMode primitive_mode
qstring_append(s, "\n");
switch (primitive_mode) {
case PRIM_TYPE_QUADS:
case PRIM_TYPE_QUAD_STRIP:
qstring_append(s, "layout(lines_adjacency) in;\n");
qstring_append(s, "layout(triangle_strip, max_vertices = 4) out;\n");
break;
@ -63,6 +64,15 @@ static QString* generate_geometry_shader(enum ShaderPrimitiveMode primitive_mode
generate_geometry_shader_pass_vertex(s, "2");
qstring_append(s, "EndPrimitive();\n");
break;
case PRIM_TYPE_QUAD_STRIP:
qstring_append(s, "if ((gl_PrimitiveIDIn & 1) == 0) {\n");
generate_geometry_shader_pass_vertex(s, "0");
generate_geometry_shader_pass_vertex(s, "1");
generate_geometry_shader_pass_vertex(s, "2");
generate_geometry_shader_pass_vertex(s, "3");
qstring_append(s, " EndPrimitive();\n"
"}");
break;
default:
assert(false);
break;
@ -593,7 +603,8 @@ ShaderBinding* generate_shaders(const ShaderState state)
{
int i, j;
bool with_geom = state.primitive_mode == PRIM_TYPE_QUADS;
bool with_geom = state.primitive_mode == PRIM_TYPE_QUADS ||
state.primitive_mode == PRIM_TYPE_QUAD_STRIP;
char vtx_prefix = with_geom ? 'v' : 'g';
GLuint program = glCreateProgram();