From: Timothy Arceri Date: Wed, 22 Jun 2016 02:41:28 +0000 (+1000) Subject: glsl/mesa: stop duplicating geom and tcs layout values X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=ab99196b6bc5b0170db20db6cc3837ce7642d22a;p=mesa.git glsl/mesa: stop duplicating geom and tcs layout values We already store these in gl_shader and gl_program here we remove it from gl_shader_program and just use the values from gl_shader. This will allow us to keep the shader cache restore code as simple as it can be while making it somewhat clearer where these values originate from. Reviewed-by: Iago Toral Quiroga --- diff --git a/src/compiler/glsl/glsl_to_nir.cpp b/src/compiler/glsl/glsl_to_nir.cpp index daf237eee6b..16d0c1d54d2 100644 --- a/src/compiler/glsl/glsl_to_nir.cpp +++ b/src/compiler/glsl/glsl_to_nir.cpp @@ -166,7 +166,7 @@ glsl_to_nir(const struct gl_shader_program *shader_prog, switch (stage) { case MESA_SHADER_TESS_CTRL: - shader->info.tcs.vertices_out = shader_prog->TessCtrl.VerticesOut; + shader->info.tcs.vertices_out = sh->TessCtrl.VerticesOut; break; case MESA_SHADER_GEOMETRY: diff --git a/src/compiler/glsl/linker.cpp b/src/compiler/glsl/linker.cpp index bf70f29039f..c7cf56eaa0b 100644 --- a/src/compiler/glsl/linker.cpp +++ b/src/compiler/glsl/linker.cpp @@ -857,7 +857,7 @@ validate_geometry_shader_executable(struct gl_shader_program *prog, if (shader == NULL) return; - unsigned num_vertices = vertices_per_prim(prog->Geom.InputType); + unsigned num_vertices = vertices_per_prim(shader->Geom.InputType); prog->Geom.VerticesIn = num_vertices; analyze_clip_cull_usage(prog, shader, ctx, @@ -873,9 +873,11 @@ static void validate_geometry_shader_emissions(struct gl_context *ctx, struct gl_shader_program *prog) { - if (prog->_LinkedShaders[MESA_SHADER_GEOMETRY] != NULL) { + struct gl_shader *sh = prog->_LinkedShaders[MESA_SHADER_GEOMETRY]; + + if (sh != NULL) { find_emit_vertex_visitor emit_vertex(ctx->Const.MaxVertexStreams - 1); - emit_vertex.run(prog->_LinkedShaders[MESA_SHADER_GEOMETRY]->ir); + emit_vertex.run(sh->ir); if (emit_vertex.error()) { linker_error(prog, "Invalid call %s(%d). Accepted values for the " "stream parameter are in the range [0, %d].\n", @@ -910,7 +912,7 @@ validate_geometry_shader_emissions(struct gl_context *ctx, * EmitStreamVertex() or EmitEndPrimitive() are called with a non-zero * stream. */ - if (prog->Geom.UsesStreams && prog->Geom.OutputType != GL_POINTS) { + if (prog->Geom.UsesStreams && sh->Geom.OutputType != GL_POINTS) { linker_error(prog, "EmitStreamVertex(n) and EndStreamPrimitive(n) " "with n>0 requires point output\n"); } @@ -1793,7 +1795,6 @@ link_tcs_out_layout_qualifiers(struct gl_shader_program *prog, "vertices out layout qualifier\n"); return; } - prog->TessCtrl.VerticesOut = linked_shader->TessCtrl.VerticesOut; } @@ -2055,26 +2056,21 @@ link_gs_inout_layout_qualifiers(struct gl_shader_program *prog, "geometry shader didn't declare primitive input type\n"); return; } - prog->Geom.InputType = linked_shader->Geom.InputType; if (linked_shader->Geom.OutputType == PRIM_UNKNOWN) { linker_error(prog, "geometry shader didn't declare primitive output type\n"); return; } - prog->Geom.OutputType = linked_shader->Geom.OutputType; if (linked_shader->Geom.VerticesOut == -1) { linker_error(prog, "geometry shader didn't declare max_vertices\n"); return; } - prog->Geom.VerticesOut = linked_shader->Geom.VerticesOut; if (linked_shader->Geom.Invocations == 0) linked_shader->Geom.Invocations = 1; - - prog->Geom.Invocations = linked_shader->Geom.Invocations; } @@ -2349,7 +2345,7 @@ link_intrastage_shaders(void *mem_ctx, /* Set the size of geometry shader input arrays */ if (linked->Stage == MESA_SHADER_GEOMETRY) { - unsigned num_vertices = vertices_per_prim(prog->Geom.InputType); + unsigned num_vertices = vertices_per_prim(linked->Geom.InputType); geom_array_resize_visitor input_resize_visitor(num_vertices, prog); foreach_in_list(ir_instruction, ir, linked->ir) { ir->accept(&input_resize_visitor); diff --git a/src/mesa/drivers/dri/i965/brw_tcs.c b/src/mesa/drivers/dri/i965/brw_tcs.c index 548dc75276c..d488715cac3 100644 --- a/src/mesa/drivers/dri/i965/brw_tcs.c +++ b/src/mesa/drivers/dri/i965/brw_tcs.c @@ -390,8 +390,10 @@ brw_tcs_precompile(struct gl_context *ctx, brw_setup_tex_for_precompile(brw, &key.tex, prog); /* Guess that the input and output patches have the same dimensionality. */ - if (brw->gen < 8) - key.input_vertices = shader_prog->TessCtrl.VerticesOut; + if (brw->gen < 8) { + key.input_vertices = shader_prog-> + _LinkedShaders[MESA_SHADER_TESS_CTRL]->TessCtrl.VerticesOut; + } key.tes_primitive_mode = brw->tess_eval_program ? brw->tess_eval_program->PrimitiveMode : GL_TRIANGLES; diff --git a/src/mesa/main/api_validate.c b/src/mesa/main/api_validate.c index ab34d99834c..8efbf50c092 100644 --- a/src/mesa/main/api_validate.c +++ b/src/mesa/main/api_validate.c @@ -200,7 +200,8 @@ _mesa_valid_prim_mode(struct gl_context *ctx, GLenum mode, const char *name) */ if (ctx->_Shader->CurrentProgram[MESA_SHADER_GEOMETRY]) { const GLenum geom_mode = - ctx->_Shader->CurrentProgram[MESA_SHADER_GEOMETRY]->Geom.InputType; + ctx->_Shader->CurrentProgram[MESA_SHADER_GEOMETRY]-> + _LinkedShaders[MESA_SHADER_GEOMETRY]->Geom.InputType; struct gl_shader_program *tes = ctx->_Shader->CurrentProgram[MESA_SHADER_TESS_EVAL]; GLenum mode_before_gs = mode; @@ -305,7 +306,8 @@ _mesa_valid_prim_mode(struct gl_context *ctx, GLenum mode, const char *name) GLboolean pass = GL_TRUE; if(ctx->_Shader->CurrentProgram[MESA_SHADER_GEOMETRY]) { - switch (ctx->_Shader->CurrentProgram[MESA_SHADER_GEOMETRY]->Geom.OutputType) { + switch (ctx->_Shader->CurrentProgram[MESA_SHADER_GEOMETRY]-> + _LinkedShaders[MESA_SHADER_GEOMETRY]->Geom.OutputType) { case GL_POINTS: pass = ctx->TransformFeedback.Mode == GL_POINTS; break; diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h index 99fa779a807..73ae55d83eb 100644 --- a/src/mesa/main/mtypes.h +++ b/src/mesa/main/mtypes.h @@ -2711,17 +2711,6 @@ struct gl_shader_program /** Post-link gl_FragDepth layout for ARB_conservative_depth. */ enum gl_frag_depth_layout FragDepthLayout; - /** - * Tessellation Control shader state from layout qualifiers. - */ - struct { - /** - * 0 - vertices not declared in shader, or - * 1 .. GL_MAX_PATCH_VERTICES - */ - GLint VerticesOut; - } TessCtrl; - /** * Tessellation Evaluation shader state from layout qualifiers. */ @@ -2742,14 +2731,7 @@ struct gl_shader_program */ struct { GLint VerticesIn; - GLint VerticesOut; - /** - * 1 .. MAX_GEOMETRY_SHADER_INVOCATIONS - */ - GLint Invocations; - GLenum InputType; /**< GL_POINTS, GL_LINES, GL_LINES_ADJACENCY_ARB, - GL_TRIANGLES, or GL_TRIANGLES_ADJACENCY_ARB */ - GLenum OutputType; /**< GL_POINTS, GL_LINE_STRIP or GL_TRIANGLE_STRIP */ + /** * True if gl_ClipDistance is written to. Copied into * gl_geometry_program by _mesa_copy_linked_program_data(). diff --git a/src/mesa/main/shaderapi.c b/src/mesa/main/shaderapi.c index b65c0dc6c37..07250cd768c 100644 --- a/src/mesa/main/shaderapi.c +++ b/src/mesa/main/shaderapi.c @@ -731,26 +731,34 @@ get_programiv(struct gl_context *ctx, GLuint program, GLenum pname, case GL_GEOMETRY_VERTICES_OUT: if (!has_core_gs) break; - if (check_gs_query(ctx, shProg)) - *params = shProg->Geom.VerticesOut; + if (check_gs_query(ctx, shProg)) { + *params = shProg->_LinkedShaders[MESA_SHADER_GEOMETRY]-> + Geom.VerticesOut; + } return; case GL_GEOMETRY_SHADER_INVOCATIONS: if (!has_core_gs || !ctx->Extensions.ARB_gpu_shader5) break; - if (check_gs_query(ctx, shProg)) - *params = shProg->Geom.Invocations; + if (check_gs_query(ctx, shProg)) { + *params = shProg->_LinkedShaders[MESA_SHADER_GEOMETRY]-> + Geom.Invocations; + } return; case GL_GEOMETRY_INPUT_TYPE: if (!has_core_gs) break; - if (check_gs_query(ctx, shProg)) - *params = shProg->Geom.InputType; + if (check_gs_query(ctx, shProg)) { + *params = shProg->_LinkedShaders[MESA_SHADER_GEOMETRY]-> + Geom.InputType; + } return; case GL_GEOMETRY_OUTPUT_TYPE: if (!has_core_gs) break; - if (check_gs_query(ctx, shProg)) - *params = shProg->Geom.OutputType; + if (check_gs_query(ctx, shProg)) { + *params = shProg->_LinkedShaders[MESA_SHADER_GEOMETRY]-> + Geom.OutputType; + } return; case GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH: { unsigned i; @@ -825,8 +833,10 @@ get_programiv(struct gl_context *ctx, GLuint program, GLenum pname, case GL_TESS_CONTROL_OUTPUT_VERTICES: if (!has_tess) break; - if (check_tcs_query(ctx, shProg)) - *params = shProg->TessCtrl.VerticesOut; + if (check_tcs_query(ctx, shProg)) { + *params = shProg->_LinkedShaders[MESA_SHADER_TESS_CTRL]-> + TessCtrl.VerticesOut; + } return; case GL_TESS_GEN_MODE: if (!has_tess) @@ -2159,7 +2169,8 @@ _mesa_copy_linked_program_data(gl_shader_stage type, case MESA_SHADER_TESS_CTRL: { struct gl_tess_ctrl_program *dst_tcp = (struct gl_tess_ctrl_program *) dst; - dst_tcp->VerticesOut = src->TessCtrl.VerticesOut; + dst_tcp->VerticesOut = + src->_LinkedShaders[MESA_SHADER_TESS_CTRL]->TessCtrl.VerticesOut; break; } case MESA_SHADER_TESS_EVAL: { @@ -2177,11 +2188,13 @@ _mesa_copy_linked_program_data(gl_shader_stage type, } case MESA_SHADER_GEOMETRY: { struct gl_geometry_program *dst_gp = (struct gl_geometry_program *) dst; + struct gl_shader *geom_sh = src->_LinkedShaders[MESA_SHADER_GEOMETRY]; + dst_gp->VerticesIn = src->Geom.VerticesIn; - dst_gp->VerticesOut = src->Geom.VerticesOut; - dst_gp->Invocations = src->Geom.Invocations; - dst_gp->InputType = src->Geom.InputType; - dst_gp->OutputType = src->Geom.OutputType; + dst_gp->VerticesOut = geom_sh->Geom.VerticesOut; + dst_gp->Invocations = geom_sh->Geom.Invocations; + dst_gp->InputType = geom_sh->Geom.InputType; + dst_gp->OutputType = geom_sh->Geom.OutputType; dst->ClipDistanceArraySize = src->Geom.ClipDistanceArraySize; dst->CullDistanceArraySize = src->Geom.CullDistanceArraySize; dst_gp->UsesEndPrimitive = src->Geom.UsesEndPrimitive; diff --git a/src/mesa/main/shaderobj.c b/src/mesa/main/shaderobj.c index 8283555740b..f3d5c2ee5ba 100644 --- a/src/mesa/main/shaderobj.c +++ b/src/mesa/main/shaderobj.c @@ -92,6 +92,9 @@ void _mesa_init_shader(struct gl_context *ctx, struct gl_shader *shader) { shader->RefCount = 1; + shader->Geom.VerticesOut = -1; + shader->Geom.InputType = GL_TRIANGLES; + shader->Geom.OutputType = GL_TRIANGLE_STRIP; } /** @@ -230,9 +233,6 @@ init_shader_program(struct gl_shader_program *prog) prog->FragDataBindings = string_to_uint_map_ctor(); prog->FragDataIndexBindings = string_to_uint_map_ctor(); - prog->Geom.VerticesOut = -1; - prog->Geom.InputType = GL_TRIANGLES; - prog->Geom.OutputType = GL_TRIANGLE_STRIP; prog->Geom.UsesEndPrimitive = false; prog->Geom.UsesStreams = false;