From cbeba6bd48da2cbe0074cc59a857e0248e94b8fe Mon Sep 17 00:00:00 2001 From: Timothy Arceri Date: Tue, 22 Nov 2016 21:14:14 +1100 Subject: [PATCH] mesa/glsl/i965: set and get tes layouts directly to and from shader_info MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Reviewed-by: Nicolai Hähnle --- src/compiler/glsl/linker.cpp | 64 +++++++++++++++-------------- src/mesa/drivers/dri/i965/brw_tcs.c | 6 +-- src/mesa/main/shaderapi.c | 15 ++----- 3 files changed, 40 insertions(+), 45 deletions(-) diff --git a/src/compiler/glsl/linker.cpp b/src/compiler/glsl/linker.cpp index 1664c9f5fa8..6fe7054b5dd 100644 --- a/src/compiler/glsl/linker.cpp +++ b/src/compiler/glsl/linker.cpp @@ -1714,18 +1714,19 @@ link_tcs_out_layout_qualifiers(struct gl_shader_program *prog, */ static void 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, unsigned num_shaders) { - linked_shader->info.TessEval.PrimitiveMode = PRIM_UNKNOWN; - 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) + if (gl_prog->info.stage != MESA_SHADER_TESS_EVAL) 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): * * "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]; if (shader->info.TessEval.PrimitiveMode != PRIM_UNKNOWN) { - if (linked_shader->info.TessEval.PrimitiveMode != PRIM_UNKNOWN && - linked_shader->info.TessEval.PrimitiveMode != + if (gl_prog->info.tess.primitive_mode != PRIM_UNKNOWN && + gl_prog->info.tess.primitive_mode != shader->info.TessEval.PrimitiveMode) { linker_error(prog, "tessellation evaluation shader defined with " "conflicting input primitive modes.\n"); 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 (linked_shader->info.TessEval.Spacing != 0 && - linked_shader->info.TessEval.Spacing != + if (gl_prog->info.tess.spacing != 0 && gl_prog->info.tess.spacing != shader->info.TessEval.Spacing) { linker_error(prog, "tessellation evaluation shader defined with " "conflicting vertex spacing.\n"); 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 (linked_shader->info.TessEval.VertexOrder != 0 && - linked_shader->info.TessEval.VertexOrder != - shader->info.TessEval.VertexOrder) { + if (vertex_order != 0 && + vertex_order != shader->info.TessEval.VertexOrder) { linker_error(prog, "tessellation evaluation shader defined with " "conflicting ordering.\n"); return; } - linked_shader->info.TessEval.VertexOrder = - shader->info.TessEval.VertexOrder; + vertex_order = shader->info.TessEval.VertexOrder; } if (shader->info.TessEval.PointMode != -1) { - if (linked_shader->info.TessEval.PointMode != -1 && - linked_shader->info.TessEval.PointMode != - shader->info.TessEval.PointMode) { + if (point_mode != -1 && + point_mode != shader->info.TessEval.PointMode) { linker_error(prog, "tessellation evaluation shader defined with " "conflicting point modes.\n"); return; } - linked_shader->info.TessEval.PointMode = - shader->info.TessEval.PointMode; + point_mode = 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 * for doing it. */ - if (linked_shader->info.TessEval.PrimitiveMode == PRIM_UNKNOWN) { + if (gl_prog->info.tess.primitive_mode == PRIM_UNKNOWN) { linker_error(prog, "tessellation evaluation shader didn't declare input " "primitive modes.\n"); return; } - if (linked_shader->info.TessEval.Spacing == TESS_SPACING_UNSPECIFIED) - linked_shader->info.TessEval.Spacing = TESS_SPACING_EQUAL; + if (gl_prog->info.tess.spacing == TESS_SPACING_UNSPECIFIED) + gl_prog->info.tess.spacing = TESS_SPACING_EQUAL; - if (linked_shader->info.TessEval.VertexOrder == 0) - linked_shader->info.TessEval.VertexOrder = GL_CCW; + if (vertex_order == 0) + 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_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_cs_input_layout_qualifiers(prog, linked, shader_list, num_shaders); link_xfb_stride_layout_qualifiers(ctx, prog, linked, shader_list, diff --git a/src/mesa/drivers/dri/i965/brw_tcs.c b/src/mesa/drivers/dri/i965/brw_tcs.c index cafa4b4b411..858ecf99a84 100644 --- a/src/mesa/drivers/dri/i965/brw_tcs.c +++ b/src/mesa/drivers/dri/i965/brw_tcs.c @@ -386,10 +386,10 @@ brw_tcs_precompile(struct gl_context *ctx, struct brw_program *btep; if (tes) { 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 && - tes->info.TessEval.PrimitiveMode == GL_QUADS && - tes->info.TessEval.Spacing == TESS_SPACING_EQUAL; + tes->Program->info.tess.primitive_mode == GL_QUADS && + tes->Program->info.tess.spacing == TESS_SPACING_EQUAL; } else { btep = NULL; key.tes_primitive_mode = GL_TRIANGLES; diff --git a/src/mesa/main/shaderapi.c b/src/mesa/main/shaderapi.c index 889ac0fad86..5c9b06fdc66 100644 --- a/src/mesa/main/shaderapi.c +++ b/src/mesa/main/shaderapi.c @@ -829,7 +829,7 @@ get_programiv(struct gl_context *ctx, GLuint program, GLenum pname, break; if (check_tes_query(ctx, shProg)) { *params = shProg->_LinkedShaders[MESA_SHADER_TESS_EVAL]-> - info.TessEval.PrimitiveMode; + Program->info.tess.primitive_mode; } return; 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)) { const struct gl_linked_shader *tes = shProg->_LinkedShaders[MESA_SHADER_TESS_EVAL]; - switch (tes->info.TessEval.Spacing) { + switch (tes->Program->info.tess.spacing) { case TESS_SPACING_EQUAL: *params = GL_EQUAL; break; @@ -859,7 +859,7 @@ get_programiv(struct gl_context *ctx, GLuint program, GLenum pname, break; if (check_tes_query(ctx, shProg)) { *params = shProg->_LinkedShaders[MESA_SHADER_TESS_EVAL]-> - info.TessEval.VertexOrder; + Program->info.tess.ccw ? GL_CCW : GL_CW; } return; case GL_TESS_GEN_POINT_MODE: @@ -867,7 +867,7 @@ get_programiv(struct gl_context *ctx, GLuint program, GLenum pname, break; if (check_tes_query(ctx, shProg)) { *params = shProg->_LinkedShaders[MESA_SHADER_TESS_EVAL]-> - info.TessEval.PointMode; + Program->info.tess.point_mode ? GL_TRUE : GL_FALSE; } return; default: @@ -2202,13 +2202,6 @@ _mesa_copy_linked_program_data(const struct gl_shader_program *src, dst->info.separate_shader = src->SeparateShader; 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: { dst->info.gs.vertices_in = src->Geom.VerticesIn; dst->info.gs.vertices_out = dst_sh->info.Geom.VerticesOut;