mesa/glsl/i965: set and get tes layouts directly to and from shader_info

Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com>
This commit is contained in:
Timothy Arceri 2016-11-22 21:14:14 +11:00
parent 64e201ab8f
commit cbeba6bd48
3 changed files with 40 additions and 45 deletions

View File

@ -1714,18 +1714,19 @@ link_tcs_out_layout_qualifiers(struct gl_shader_program *prog,
*/ */
static void static void
link_tes_in_layout_qualifiers(struct gl_shader_program *prog, link_tes_in_layout_qualifiers(struct gl_shader_program *prog,
struct gl_linked_shader *linked_shader, struct gl_program *gl_prog,
struct gl_shader **shader_list, struct gl_shader **shader_list,
unsigned num_shaders) unsigned num_shaders)
{ {
linked_shader->info.TessEval.PrimitiveMode = PRIM_UNKNOWN; if (gl_prog->info.stage != MESA_SHADER_TESS_EVAL)
linked_shader->info.TessEval.Spacing = TESS_SPACING_UNSPECIFIED;
linked_shader->info.TessEval.VertexOrder = 0;
linked_shader->info.TessEval.PointMode = -1;
if (linked_shader->Stage != MESA_SHADER_TESS_EVAL)
return; return;
int point_mode = -1;
unsigned vertex_order = 0;
gl_prog->info.tess.primitive_mode = PRIM_UNKNOWN;
gl_prog->info.tess.spacing = TESS_SPACING_UNSPECIFIED;
/* From the GLSL 4.0 spec (chapter 4.3.8.1): /* From the GLSL 4.0 spec (chapter 4.3.8.1):
* *
* "At least one tessellation evaluation shader (compilation unit) in * "At least one tessellation evaluation shader (compilation unit) in
@ -1744,49 +1745,45 @@ link_tes_in_layout_qualifiers(struct gl_shader_program *prog,
struct gl_shader *shader = shader_list[i]; struct gl_shader *shader = shader_list[i];
if (shader->info.TessEval.PrimitiveMode != PRIM_UNKNOWN) { if (shader->info.TessEval.PrimitiveMode != PRIM_UNKNOWN) {
if (linked_shader->info.TessEval.PrimitiveMode != PRIM_UNKNOWN && if (gl_prog->info.tess.primitive_mode != PRIM_UNKNOWN &&
linked_shader->info.TessEval.PrimitiveMode != gl_prog->info.tess.primitive_mode !=
shader->info.TessEval.PrimitiveMode) { shader->info.TessEval.PrimitiveMode) {
linker_error(prog, "tessellation evaluation shader defined with " linker_error(prog, "tessellation evaluation shader defined with "
"conflicting input primitive modes.\n"); "conflicting input primitive modes.\n");
return; return;
} }
linked_shader->info.TessEval.PrimitiveMode = shader->info.TessEval.PrimitiveMode; gl_prog->info.tess.primitive_mode =
shader->info.TessEval.PrimitiveMode;
} }
if (shader->info.TessEval.Spacing != 0) { if (shader->info.TessEval.Spacing != 0) {
if (linked_shader->info.TessEval.Spacing != 0 && if (gl_prog->info.tess.spacing != 0 && gl_prog->info.tess.spacing !=
linked_shader->info.TessEval.Spacing !=
shader->info.TessEval.Spacing) { shader->info.TessEval.Spacing) {
linker_error(prog, "tessellation evaluation shader defined with " linker_error(prog, "tessellation evaluation shader defined with "
"conflicting vertex spacing.\n"); "conflicting vertex spacing.\n");
return; return;
} }
linked_shader->info.TessEval.Spacing = shader->info.TessEval.Spacing; gl_prog->info.tess.spacing = shader->info.TessEval.Spacing;
} }
if (shader->info.TessEval.VertexOrder != 0) { if (shader->info.TessEval.VertexOrder != 0) {
if (linked_shader->info.TessEval.VertexOrder != 0 && if (vertex_order != 0 &&
linked_shader->info.TessEval.VertexOrder != vertex_order != shader->info.TessEval.VertexOrder) {
shader->info.TessEval.VertexOrder) {
linker_error(prog, "tessellation evaluation shader defined with " linker_error(prog, "tessellation evaluation shader defined with "
"conflicting ordering.\n"); "conflicting ordering.\n");
return; return;
} }
linked_shader->info.TessEval.VertexOrder = vertex_order = shader->info.TessEval.VertexOrder;
shader->info.TessEval.VertexOrder;
} }
if (shader->info.TessEval.PointMode != -1) { if (shader->info.TessEval.PointMode != -1) {
if (linked_shader->info.TessEval.PointMode != -1 && if (point_mode != -1 &&
linked_shader->info.TessEval.PointMode != point_mode != shader->info.TessEval.PointMode) {
shader->info.TessEval.PointMode) {
linker_error(prog, "tessellation evaluation shader defined with " linker_error(prog, "tessellation evaluation shader defined with "
"conflicting point modes.\n"); "conflicting point modes.\n");
return; return;
} }
linked_shader->info.TessEval.PointMode = point_mode = shader->info.TessEval.PointMode;
shader->info.TessEval.PointMode;
} }
} }
@ -1795,21 +1792,26 @@ link_tes_in_layout_qualifiers(struct gl_shader_program *prog,
* since we already know we're in the right type of shader program * since we already know we're in the right type of shader program
* for doing it. * for doing it.
*/ */
if (linked_shader->info.TessEval.PrimitiveMode == PRIM_UNKNOWN) { if (gl_prog->info.tess.primitive_mode == PRIM_UNKNOWN) {
linker_error(prog, linker_error(prog,
"tessellation evaluation shader didn't declare input " "tessellation evaluation shader didn't declare input "
"primitive modes.\n"); "primitive modes.\n");
return; return;
} }
if (linked_shader->info.TessEval.Spacing == TESS_SPACING_UNSPECIFIED) if (gl_prog->info.tess.spacing == TESS_SPACING_UNSPECIFIED)
linked_shader->info.TessEval.Spacing = TESS_SPACING_EQUAL; gl_prog->info.tess.spacing = TESS_SPACING_EQUAL;
if (linked_shader->info.TessEval.VertexOrder == 0) if (vertex_order == 0)
linked_shader->info.TessEval.VertexOrder = GL_CCW; gl_prog->info.tess.ccw = true;
else
gl_prog->info.tess.ccw = false;
if (linked_shader->info.TessEval.PointMode == -1)
linked_shader->info.TessEval.PointMode = GL_FALSE; if (point_mode == -1)
gl_prog->info.tess.point_mode = false;
else
gl_prog->info.tess.point_mode = true;
} }
@ -2205,7 +2207,7 @@ link_intrastage_shaders(void *mem_ctx,
link_fs_inout_layout_qualifiers(prog, linked, shader_list, num_shaders); link_fs_inout_layout_qualifiers(prog, linked, shader_list, num_shaders);
link_tcs_out_layout_qualifiers(prog, gl_prog, shader_list, num_shaders); link_tcs_out_layout_qualifiers(prog, gl_prog, shader_list, num_shaders);
link_tes_in_layout_qualifiers(prog, linked, shader_list, num_shaders); link_tes_in_layout_qualifiers(prog, gl_prog, shader_list, num_shaders);
link_gs_inout_layout_qualifiers(prog, linked, shader_list, num_shaders); link_gs_inout_layout_qualifiers(prog, linked, shader_list, num_shaders);
link_cs_input_layout_qualifiers(prog, linked, shader_list, num_shaders); link_cs_input_layout_qualifiers(prog, linked, shader_list, num_shaders);
link_xfb_stride_layout_qualifiers(ctx, prog, linked, shader_list, link_xfb_stride_layout_qualifiers(ctx, prog, linked, shader_list,

View File

@ -386,10 +386,10 @@ brw_tcs_precompile(struct gl_context *ctx,
struct brw_program *btep; struct brw_program *btep;
if (tes) { if (tes) {
btep = brw_program(tes->Program); btep = brw_program(tes->Program);
key.tes_primitive_mode = tes->info.TessEval.PrimitiveMode; key.tes_primitive_mode = tes->Program->info.tess.primitive_mode;
key.quads_workaround = brw->gen < 9 && key.quads_workaround = brw->gen < 9 &&
tes->info.TessEval.PrimitiveMode == GL_QUADS && tes->Program->info.tess.primitive_mode == GL_QUADS &&
tes->info.TessEval.Spacing == TESS_SPACING_EQUAL; tes->Program->info.tess.spacing == TESS_SPACING_EQUAL;
} else { } else {
btep = NULL; btep = NULL;
key.tes_primitive_mode = GL_TRIANGLES; key.tes_primitive_mode = GL_TRIANGLES;

View File

@ -829,7 +829,7 @@ get_programiv(struct gl_context *ctx, GLuint program, GLenum pname,
break; break;
if (check_tes_query(ctx, shProg)) { if (check_tes_query(ctx, shProg)) {
*params = shProg->_LinkedShaders[MESA_SHADER_TESS_EVAL]-> *params = shProg->_LinkedShaders[MESA_SHADER_TESS_EVAL]->
info.TessEval.PrimitiveMode; Program->info.tess.primitive_mode;
} }
return; return;
case GL_TESS_GEN_SPACING: case GL_TESS_GEN_SPACING:
@ -838,7 +838,7 @@ get_programiv(struct gl_context *ctx, GLuint program, GLenum pname,
if (check_tes_query(ctx, shProg)) { if (check_tes_query(ctx, shProg)) {
const struct gl_linked_shader *tes = const struct gl_linked_shader *tes =
shProg->_LinkedShaders[MESA_SHADER_TESS_EVAL]; shProg->_LinkedShaders[MESA_SHADER_TESS_EVAL];
switch (tes->info.TessEval.Spacing) { switch (tes->Program->info.tess.spacing) {
case TESS_SPACING_EQUAL: case TESS_SPACING_EQUAL:
*params = GL_EQUAL; *params = GL_EQUAL;
break; break;
@ -859,7 +859,7 @@ get_programiv(struct gl_context *ctx, GLuint program, GLenum pname,
break; break;
if (check_tes_query(ctx, shProg)) { if (check_tes_query(ctx, shProg)) {
*params = shProg->_LinkedShaders[MESA_SHADER_TESS_EVAL]-> *params = shProg->_LinkedShaders[MESA_SHADER_TESS_EVAL]->
info.TessEval.VertexOrder; Program->info.tess.ccw ? GL_CCW : GL_CW;
} }
return; return;
case GL_TESS_GEN_POINT_MODE: case GL_TESS_GEN_POINT_MODE:
@ -867,7 +867,7 @@ get_programiv(struct gl_context *ctx, GLuint program, GLenum pname,
break; break;
if (check_tes_query(ctx, shProg)) { if (check_tes_query(ctx, shProg)) {
*params = shProg->_LinkedShaders[MESA_SHADER_TESS_EVAL]-> *params = shProg->_LinkedShaders[MESA_SHADER_TESS_EVAL]->
info.TessEval.PointMode; Program->info.tess.point_mode ? GL_TRUE : GL_FALSE;
} }
return; return;
default: default:
@ -2202,13 +2202,6 @@ _mesa_copy_linked_program_data(const struct gl_shader_program *src,
dst->info.separate_shader = src->SeparateShader; dst->info.separate_shader = src->SeparateShader;
switch (dst_sh->Stage) { switch (dst_sh->Stage) {
case MESA_SHADER_TESS_EVAL: {
dst->info.tess.primitive_mode = dst_sh->info.TessEval.PrimitiveMode;
dst->info.tess.spacing = dst_sh->info.TessEval.Spacing;
dst->info.tess.ccw = dst_sh->info.TessEval.VertexOrder == GL_CCW;
dst->info.tess.point_mode = dst_sh->info.TessEval.PointMode;
break;
}
case MESA_SHADER_GEOMETRY: { case MESA_SHADER_GEOMETRY: {
dst->info.gs.vertices_in = src->Geom.VerticesIn; dst->info.gs.vertices_in = src->Geom.VerticesIn;
dst->info.gs.vertices_out = dst_sh->info.Geom.VerticesOut; dst->info.gs.vertices_out = dst_sh->info.Geom.VerticesOut;