diff options
author | Ilia Mirkin <[email protected]> | 2016-05-23 21:38:38 -0400 |
---|---|---|
committer | Ilia Mirkin <[email protected]> | 2016-05-23 22:22:06 -0400 |
commit | 979bcb9f4288564fb6c5807bcfbfd0a78176c3ef (patch) | |
tree | 3745984ea430424246cf087b03565f6a4dfb51ca | |
parent | f236f1f506f06440886450392f01992998fca7af (diff) |
glsl: add EXT_clip_cull_distance support based on ARB_cull_distance
Signed-off-by: Ilia Mirkin <[email protected]>
Reviewed-by: Dave Airlie <[email protected]>
-rw-r--r-- | src/compiler/glsl/builtin_variables.cpp | 12 | ||||
-rw-r--r-- | src/compiler/glsl/glsl_parser_extras.cpp | 1 | ||||
-rw-r--r-- | src/compiler/glsl/glsl_parser_extras.h | 2 | ||||
-rw-r--r-- | src/compiler/glsl/linker.cpp | 39 | ||||
-rw-r--r-- | src/mesa/main/extensions_table.h | 1 |
5 files changed, 34 insertions, 21 deletions
diff --git a/src/compiler/glsl/builtin_variables.cpp b/src/compiler/glsl/builtin_variables.cpp index ff8a7e2db5e..c6668e86517 100644 --- a/src/compiler/glsl/builtin_variables.cpp +++ b/src/compiler/glsl/builtin_variables.cpp @@ -674,11 +674,14 @@ builtin_variable_generator::generate_constants() state->Const.MaxProgramTexelOffset); } - if (state->is_version(130, 0)) { + if (state->is_version(130, 0) || state->EXT_clip_cull_distance_enable) { add_const("gl_MaxClipDistances", state->Const.MaxClipPlanes); + } + if (state->is_version(130, 0)) { add_const("gl_MaxVaryingComponents", state->ctx->Const.MaxVarying * 4); } - if (state->is_version(450, 0) || state->ARB_cull_distance_enable) { + if (state->is_version(450, 0) || state->ARB_cull_distance_enable || + state->EXT_clip_cull_distance_enable) { add_const("gl_MaxCullDistances", state->Const.MaxClipPlanes); add_const("gl_MaxCombinedClipAndCullDistances", state->Const.MaxClipPlanes); @@ -1250,11 +1253,12 @@ builtin_variable_generator::generate_varyings() } } - if (state->is_version(130, 0)) { + if (state->is_version(130, 0) || state->EXT_clip_cull_distance_enable) { add_varying(VARYING_SLOT_CLIP_DIST0, array(float_t, 0), "gl_ClipDistance"); } - if (state->is_version(450, 0) || state->ARB_cull_distance_enable) { + if (state->is_version(450, 0) || state->ARB_cull_distance_enable || + state->EXT_clip_cull_distance_enable) { add_varying(VARYING_SLOT_CULL_DIST0, array(float_t, 0), "gl_CullDistance"); } diff --git a/src/compiler/glsl/glsl_parser_extras.cpp b/src/compiler/glsl/glsl_parser_extras.cpp index 1d0110b0770..1d9b4c56808 100644 --- a/src/compiler/glsl/glsl_parser_extras.cpp +++ b/src/compiler/glsl/glsl_parser_extras.cpp @@ -641,6 +641,7 @@ static const _mesa_glsl_extension _mesa_glsl_supported_extensions[] = { EXT(AMD_vertex_shader_viewport_index, true, false, AMD_vertex_shader_viewport_index), EXT(EXT_blend_func_extended, false, true, ARB_blend_func_extended), EXT(EXT_draw_buffers, false, true, dummy_true), + EXT(EXT_clip_cull_distance, false, true, ARB_cull_distance), EXT(EXT_gpu_shader5, false, true, ARB_gpu_shader5), EXT(EXT_separate_shader_objects, false, true, dummy_true), EXT(EXT_shader_integer_mix, true, true, EXT_shader_integer_mix), diff --git a/src/compiler/glsl/glsl_parser_extras.h b/src/compiler/glsl/glsl_parser_extras.h index aaf12dddff0..3ae3c82a70d 100644 --- a/src/compiler/glsl/glsl_parser_extras.h +++ b/src/compiler/glsl/glsl_parser_extras.h @@ -639,6 +639,8 @@ struct _mesa_glsl_parse_state { bool AMD_vertex_shader_viewport_index_warn; bool EXT_blend_func_extended_enable; bool EXT_blend_func_extended_warn; + bool EXT_clip_cull_distance_enable; + bool EXT_clip_cull_distance_warn; bool EXT_draw_buffers_enable; bool EXT_draw_buffers_warn; bool EXT_gpu_shader5_enable; diff --git a/src/compiler/glsl/linker.cpp b/src/compiler/glsl/linker.cpp index 3d95540256c..81a683e9423 100644 --- a/src/compiler/glsl/linker.cpp +++ b/src/compiler/glsl/linker.cpp @@ -661,7 +661,7 @@ analyze_clip_cull_usage(struct gl_shader_program *prog, *clip_distance_array_size = 0; *cull_distance_array_size = 0; - if (!prog->IsES && prog->Version >= 130) { + if (prog->Version >= (prog->IsES ? 300 : 130)) { /* From section 7.1 (Vertex Shader Special Variables) of the * GLSL 1.30 spec: * @@ -669,13 +669,12 @@ analyze_clip_cull_usage(struct gl_shader_program *prog, * gl_ClipVertex and gl_ClipDistance." * * This does not apply to GLSL ES shaders, since GLSL ES defines neither - * gl_ClipVertex nor gl_ClipDistance. + * gl_ClipVertex nor gl_ClipDistance. However with + * GL_EXT_clip_cull_distance, this functionality is exposed in ES 3.0. */ - find_assignment_visitor clip_vertex("gl_ClipVertex"); find_assignment_visitor clip_distance("gl_ClipDistance"); find_assignment_visitor cull_distance("gl_CullDistance"); - clip_vertex.run(shader->ir); clip_distance.run(shader->ir); cull_distance.run(shader->ir); @@ -685,20 +684,26 @@ analyze_clip_cull_usage(struct gl_shader_program *prog, * a program to statically read or write both gl_ClipVertex and either * gl_ClipDistance or gl_CullDistance. * - * This does not apply to GLSL ES shaders, since GLSL ES defines neither - * gl_ClipVertex, gl_ClipDistance or gl_CullDistance. + * This does not apply to GLSL ES shaders, since GLSL ES doesn't define + * gl_ClipVertex. */ - if (clip_vertex.variable_found() && clip_distance.variable_found()) { - linker_error(prog, "%s shader writes to both `gl_ClipVertex' " - "and `gl_ClipDistance'\n", - _mesa_shader_stage_to_string(shader->Stage)); - return; - } - if (clip_vertex.variable_found() && cull_distance.variable_found()) { - linker_error(prog, "%s shader writes to both `gl_ClipVertex' " - "and `gl_CullDistance'\n", - _mesa_shader_stage_to_string(shader->Stage)); - return; + if (!prog->IsES) { + find_assignment_visitor clip_vertex("gl_ClipVertex"); + + clip_vertex.run(shader->ir); + + if (clip_vertex.variable_found() && clip_distance.variable_found()) { + linker_error(prog, "%s shader writes to both `gl_ClipVertex' " + "and `gl_ClipDistance'\n", + _mesa_shader_stage_to_string(shader->Stage)); + return; + } + if (clip_vertex.variable_found() && cull_distance.variable_found()) { + linker_error(prog, "%s shader writes to both `gl_ClipVertex' " + "and `gl_CullDistance'\n", + _mesa_shader_stage_to_string(shader->Stage)); + return; + } } if (clip_distance.variable_found()) { diff --git a/src/mesa/main/extensions_table.h b/src/mesa/main/extensions_table.h index 8bf716351d8..0e78ee7b4c5 100644 --- a/src/mesa/main/extensions_table.h +++ b/src/mesa/main/extensions_table.h @@ -189,6 +189,7 @@ EXT(EXT_blend_func_separate , EXT_blend_func_separate EXT(EXT_blend_minmax , EXT_blend_minmax , GLL, x , ES1, ES2, 1995) EXT(EXT_blend_subtract , dummy_true , GLL, x , x , x , 1995) EXT(EXT_buffer_storage , ARB_buffer_storage , x , x , x , 31, 2015) +EXT(EXT_clip_cull_distance , ARB_cull_distance , x , x , x , 30, 2016) EXT(EXT_color_buffer_float , dummy_true , x , x , ES1, 30, 2013) EXT(EXT_compiled_vertex_array , dummy_true , GLL, x , x , x , 1996) EXT(EXT_copy_image , OES_copy_image , x , x , x , 30, 2014) |