mesa: Introduce a compiler enum for tessellation spacing.

It feels weird using GL_* enums in a Vulkan driver.

v2: Fix the TESS_SPACING -> PIPE_TESS_SPACING conversion.

Signed-off-by: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Timothy Arceri <timothy.arceri@collabora.com>
Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
This commit is contained in:
Kenneth Graunke
2016-09-24 17:59:55 -07:00
parent 9bb89175e6
commit a4fd84ef5f
11 changed files with 54 additions and 47 deletions

View File

@@ -704,7 +704,7 @@ struct ast_type_qualifier {
ast_layout_expression *local_size[3]; ast_layout_expression *local_size[3];
/** Tessellation evaluation shader: vertex spacing (equal, fractional even/odd) */ /** Tessellation evaluation shader: vertex spacing (equal, fractional even/odd) */
GLenum vertex_spacing; enum gl_tess_spacing vertex_spacing;
/** Tessellation evaluation shader: vertex ordering (CW or CCW) */ /** Tessellation evaluation shader: vertex ordering (CW or CCW) */
GLenum ordering; GLenum ordering;

View File

@@ -1463,11 +1463,11 @@ layout_qualifier_id:
if (!$$.flags.i) { if (!$$.flags.i) {
static const struct { static const struct {
const char *s; const char *s;
GLenum e; enum gl_tess_spacing e;
} map[] = { } map[] = {
{ "equal_spacing", GL_EQUAL }, { "equal_spacing", TESS_SPACING_EQUAL },
{ "fractional_odd_spacing", GL_FRACTIONAL_ODD }, { "fractional_odd_spacing", TESS_SPACING_FRACTIONAL_ODD },
{ "fractional_even_spacing", GL_FRACTIONAL_EVEN }, { "fractional_even_spacing", TESS_SPACING_FRACTIONAL_EVEN },
}; };
for (unsigned i = 0; i < ARRAY_SIZE(map); i++) { for (unsigned i = 0; i < ARRAY_SIZE(map); i++) {
if (match_layout_qualifier($1, map[i].s, state) == 0) { if (match_layout_qualifier($1, map[i].s, state) == 0) {

View File

@@ -1732,7 +1732,7 @@ set_shader_inout_layout(struct gl_shader *shader,
if (state->in_qualifier->flags.q.prim_type) if (state->in_qualifier->flags.q.prim_type)
shader->info.TessEval.PrimitiveMode = state->in_qualifier->prim_type; shader->info.TessEval.PrimitiveMode = state->in_qualifier->prim_type;
shader->info.TessEval.Spacing = 0; shader->info.TessEval.Spacing = TESS_SPACING_UNSPECIFIED;
if (state->in_qualifier->flags.q.vertex_spacing) if (state->in_qualifier->flags.q.vertex_spacing)
shader->info.TessEval.Spacing = state->in_qualifier->vertex_spacing; shader->info.TessEval.Spacing = state->in_qualifier->vertex_spacing;

View File

@@ -1721,7 +1721,7 @@ link_tes_in_layout_qualifiers(struct gl_shader_program *prog,
unsigned num_shaders) unsigned num_shaders)
{ {
linked_shader->info.TessEval.PrimitiveMode = PRIM_UNKNOWN; linked_shader->info.TessEval.PrimitiveMode = PRIM_UNKNOWN;
linked_shader->info.TessEval.Spacing = 0; linked_shader->info.TessEval.Spacing = TESS_SPACING_UNSPECIFIED;
linked_shader->info.TessEval.VertexOrder = 0; linked_shader->info.TessEval.VertexOrder = 0;
linked_shader->info.TessEval.PointMode = -1; linked_shader->info.TessEval.PointMode = -1;
@@ -1804,8 +1804,8 @@ link_tes_in_layout_qualifiers(struct gl_shader_program *prog,
return; return;
} }
if (linked_shader->info.TessEval.Spacing == 0) if (linked_shader->info.TessEval.Spacing == TESS_SPACING_UNSPECIFIED)
linked_shader->info.TessEval.Spacing = GL_EQUAL; linked_shader->info.TessEval.Spacing = TESS_SPACING_EQUAL;
if (linked_shader->info.TessEval.VertexOrder == 0) if (linked_shader->info.TessEval.VertexOrder == 0)
linked_shader->info.TessEval.VertexOrder = GL_CCW; linked_shader->info.TessEval.VertexOrder = GL_CCW;

View File

@@ -591,6 +591,14 @@ enum gl_advanced_blend_mode
BLEND_ALL = 0x7fff, BLEND_ALL = 0x7fff,
}; };
enum gl_tess_spacing
{
TESS_SPACING_UNSPECIFIED,
TESS_SPACING_EQUAL,
TESS_SPACING_FRACTIONAL_ODD,
TESS_SPACING_FRACTIONAL_EVEN,
};
#ifdef __cplusplus #ifdef __cplusplus
} /* extern "C" */ } /* extern "C" */
#endif #endif

View File

@@ -149,7 +149,7 @@ typedef struct shader_info {
struct { struct {
uint32_t primitive_mode; /* GL_TRIANGLES, GL_QUADS or GL_ISOLINES */ uint32_t primitive_mode; /* GL_TRIANGLES, GL_QUADS or GL_ISOLINES */
uint32_t spacing; /* GL_EQUAL, GL_FRACTIONAL_EVEN, GL_FRACTIONAL_ODD */ enum gl_tess_spacing spacing;
/** Is the vertex order counterclockwise? */ /** Is the vertex order counterclockwise? */
bool ccw; bool ccw;
bool point_mode; bool point_mode;

View File

@@ -331,7 +331,7 @@ brw_tcs_populate_key(struct brw_context *brw,
key->tes_primitive_mode = tep->program.info.tes.primitive_mode; key->tes_primitive_mode = tep->program.info.tes.primitive_mode;
key->quads_workaround = brw->gen < 9 && key->quads_workaround = brw->gen < 9 &&
tep->program.info.tes.primitive_mode == GL_QUADS && tep->program.info.tes.primitive_mode == GL_QUADS &&
tep->program.info.tes.spacing == GL_EQUAL; tep->program.info.tes.spacing == TESS_SPACING_EQUAL;
if (tcp) { if (tcp) {
key->program_string_id = tcp->id; key->program_string_id = tcp->id;
@@ -403,7 +403,7 @@ brw_tcs_precompile(struct gl_context *ctx,
key.tes_primitive_mode = tes->info.TessEval.PrimitiveMode; key.tes_primitive_mode = tes->info.TessEval.PrimitiveMode;
key.quads_workaround = brw->gen < 9 && key.quads_workaround = brw->gen < 9 &&
tes->info.TessEval.PrimitiveMode == GL_QUADS && tes->info.TessEval.PrimitiveMode == GL_QUADS &&
tes->info.TessEval.Spacing == GL_EQUAL; tes->info.TessEval.Spacing == TESS_SPACING_EQUAL;
} else { } else {
btep = NULL; btep = NULL;
key.tes_primitive_mode = GL_TRIANGLES; key.tes_primitive_mode = GL_TRIANGLES;

View File

@@ -93,19 +93,13 @@ brw_codegen_tes_prog(struct brw_context *brw,
brw_assign_common_binding_table_offsets(devinfo, &tep->program, brw_assign_common_binding_table_offsets(devinfo, &tep->program,
&prog_data.base.base, 0); &prog_data.base.base, 0);
switch (tep->program.info.tes.spacing) { STATIC_ASSERT(BRW_TESS_PARTITIONING_INTEGER == TESS_SPACING_EQUAL - 1);
case GL_EQUAL: STATIC_ASSERT(BRW_TESS_PARTITIONING_ODD_FRACTIONAL ==
prog_data.partitioning = BRW_TESS_PARTITIONING_INTEGER; TESS_SPACING_FRACTIONAL_ODD - 1);
break; STATIC_ASSERT(BRW_TESS_PARTITIONING_EVEN_FRACTIONAL ==
case GL_FRACTIONAL_ODD: TESS_SPACING_FRACTIONAL_EVEN - 1);
prog_data.partitioning = BRW_TESS_PARTITIONING_ODD_FRACTIONAL;
break; prog_data.partitioning = tep->program.info.tes.spacing - 1;
case GL_FRACTIONAL_EVEN:
prog_data.partitioning = BRW_TESS_PARTITIONING_EVEN_FRACTIONAL;
break;
default:
unreachable("invalid domain shader spacing");
}
switch (tep->program.info.tes.primitive_mode) { switch (tep->program.info.tes.primitive_mode) {
case GL_QUADS: case GL_QUADS:

View File

@@ -2279,11 +2279,9 @@ struct gl_shader_info
* in this shader. * in this shader.
*/ */
GLenum PrimitiveMode; GLenum PrimitiveMode;
/**
* GL_EQUAL, GL_FRACTIONAL_ODD, GL_FRACTIONAL_EVEN, or 0 if it's not set enum gl_tess_spacing Spacing;
* in this shader.
*/
GLenum Spacing;
/** /**
* GL_CW, GL_CCW, or 0 if it's not set in this shader. * GL_CW, GL_CCW, or 0 if it's not set in this shader.
*/ */

View File

@@ -838,8 +838,22 @@ get_programiv(struct gl_context *ctx, GLuint program, GLenum pname,
if (!has_tess) if (!has_tess)
break; break;
if (check_tes_query(ctx, shProg)) { if (check_tes_query(ctx, shProg)) {
*params = shProg->_LinkedShaders[MESA_SHADER_TESS_EVAL]-> const struct gl_linked_shader *tes =
info.TessEval.Spacing; shProg->_LinkedShaders[MESA_SHADER_TESS_EVAL];
switch (tes->info.TessEval.Spacing) {
case TESS_SPACING_EQUAL:
*params = GL_EQUAL;
break;
case TESS_SPACING_FRACTIONAL_ODD:
*params = GL_FRACTIONAL_ODD;
break;
case TESS_SPACING_FRACTIONAL_EVEN:
*params = GL_FRACTIONAL_EVEN;
break;
case TESS_SPACING_UNSPECIFIED:
*params = 0;
break;
}
} }
return; return;
case GL_TESS_GEN_VERTEX_ORDER: case GL_TESS_GEN_VERTEX_ORDER:

View File

@@ -1607,21 +1607,14 @@ st_translate_tesseval_program(struct st_context *st,
ureg_property(ureg, TGSI_PROPERTY_TES_PRIM_MODE, ureg_property(ureg, TGSI_PROPERTY_TES_PRIM_MODE,
sttep->Base.info.tes.primitive_mode); sttep->Base.info.tes.primitive_mode);
switch (sttep->Base.info.tes.spacing) { STATIC_ASSERT((TESS_SPACING_EQUAL + 1) % 3 == PIPE_TESS_SPACING_EQUAL);
case GL_EQUAL: STATIC_ASSERT((TESS_SPACING_FRACTIONAL_ODD + 1) % 3 ==
ureg_property(ureg, TGSI_PROPERTY_TES_SPACING, PIPE_TESS_SPACING_EQUAL); PIPE_TESS_SPACING_FRACTIONAL_ODD);
break; STATIC_ASSERT((TESS_SPACING_FRACTIONAL_EVEN + 1) % 3 ==
case GL_FRACTIONAL_EVEN: PIPE_TESS_SPACING_FRACTIONAL_EVEN);
ureg_property(ureg, TGSI_PROPERTY_TES_SPACING,
PIPE_TESS_SPACING_FRACTIONAL_EVEN); ureg_property(ureg, TGSI_PROPERTY_TES_SPACING,
break; (sttep->Base.info.tes.spacing + 1) % 3);
case GL_FRACTIONAL_ODD:
ureg_property(ureg, TGSI_PROPERTY_TES_SPACING,
PIPE_TESS_SPACING_FRACTIONAL_ODD);
break;
default:
assert(0);
}
ureg_property(ureg, TGSI_PROPERTY_TES_VERTEX_ORDER_CW, ureg_property(ureg, TGSI_PROPERTY_TES_VERTEX_ORDER_CW,
!sttep->Base.info.tes.ccw); !sttep->Base.info.tes.ccw);