diff options
author | Chris Forbes <[email protected]> | 2014-09-09 19:25:02 +1200 |
---|---|---|
committer | Marek Olšák <[email protected]> | 2015-07-23 00:59:28 +0200 |
commit | df16e0dd63dfeb7d5086339113ff7d7197010847 (patch) | |
tree | 4636b7e514b3c424f35c76e7db17348ffeb77fbd | |
parent | 0e94f350eeecd84cd5f15b10837b285bc9120684 (diff) |
glsl: analyze TES usage of gl_ClipDistance
Reviewed-by: Kenneth Graunke <[email protected]>
-rw-r--r-- | src/glsl/linker.cpp | 19 | ||||
-rw-r--r-- | src/mesa/main/mtypes.h | 7 | ||||
-rw-r--r-- | src/mesa/main/shaderapi.c | 1 |
3 files changed, 27 insertions, 0 deletions
diff --git a/src/glsl/linker.cpp b/src/glsl/linker.cpp index c74ec56f3a2..eeab3a3ca91 100644 --- a/src/glsl/linker.cpp +++ b/src/glsl/linker.cpp @@ -666,6 +666,17 @@ validate_vertex_shader_executable(struct gl_shader_program *prog, &prog->Vert.ClipDistanceArraySize); } +void +validate_tess_eval_shader_executable(struct gl_shader_program *prog, + struct gl_shader *shader) +{ + if (shader == NULL) + return; + + analyze_clip_usage(prog, shader, &prog->TessEval.UsesClipDistance, + &prog->TessEval.ClipDistanceArraySize); +} + /** * Verify that a fragment shader executable meets all semantic requirements @@ -3215,6 +3226,12 @@ link_shaders(struct gl_context *ctx, struct gl_shader_program *prog) case MESA_SHADER_VERTEX: validate_vertex_shader_executable(prog, sh); break; + case MESA_SHADER_TESS_CTRL: + /* nothing to be done */ + break; + case MESA_SHADER_TESS_EVAL: + validate_tess_eval_shader_executable(prog, sh); + break; case MESA_SHADER_GEOMETRY: validate_geometry_shader_executable(prog, sh); break; @@ -3234,6 +3251,8 @@ link_shaders(struct gl_context *ctx, struct gl_shader_program *prog) if (num_shaders[MESA_SHADER_GEOMETRY] > 0) prog->LastClipDistanceArraySize = prog->Geom.ClipDistanceArraySize; + else if (num_shaders[MESA_SHADER_TESS_EVAL] > 0) + prog->LastClipDistanceArraySize = prog->TessEval.ClipDistanceArraySize; else if (num_shaders[MESA_SHADER_VERTEX] > 0) prog->LastClipDistanceArraySize = prog->Vert.ClipDistanceArraySize; else diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h index f97468d2db7..85e04b5f18b 100644 --- a/src/mesa/main/mtypes.h +++ b/src/mesa/main/mtypes.h @@ -2781,6 +2781,13 @@ struct gl_shader_program /** GL_CW or GL_CCW */ GLenum VertexOrder; bool PointMode; + /** + * True if gl_ClipDistance is written to. Copied into + * gl_tess_eval_program by _mesa_copy_linked_program_data(). + */ + GLboolean UsesClipDistance; + GLuint ClipDistanceArraySize; /**< Size of the gl_ClipDistance array, or + 0 if not present. */ } TessEval; /** diff --git a/src/mesa/main/shaderapi.c b/src/mesa/main/shaderapi.c index 40b4d417c22..38365908a86 100644 --- a/src/mesa/main/shaderapi.c +++ b/src/mesa/main/shaderapi.c @@ -2057,6 +2057,7 @@ _mesa_copy_linked_program_data(gl_shader_stage type, dst_tep->Spacing = src->TessEval.Spacing; dst_tep->VertexOrder = src->TessEval.VertexOrder; dst_tep->PointMode = src->TessEval.PointMode; + dst->UsesClipDistanceOut = src->TessEval.UsesClipDistance; break; } case MESA_SHADER_GEOMETRY: { |