[Mesa-dev] [PATCH] glsl: add EXT_clip_cull_distance support based on ARB_cull_distance
Tobias Klausmann
tobias.johannes.klausmann at mni.thm.de
Tue May 24 15:11:09 UTC 2016
On 24.05.2016 03:42, Ilia Mirkin wrote:
> Signed-off-by: Ilia Mirkin <imirkin at alum.mit.edu>
> ---
> src/compiler/glsl/builtin_variables.cpp | 12 +++++++----
> src/compiler/glsl/glsl_parser_extras.cpp | 1 +
> src/compiler/glsl/glsl_parser_extras.h | 2 ++
> src/compiler/glsl/linker.cpp | 35 ++++++++++++++++++--------------
> src/mesa/main/extensions_table.h | 1 +
> 5 files changed, 32 insertions(+), 19 deletions(-)
>
> diff --git a/src/compiler/glsl/builtin_variables.cpp b/src/compiler/glsl/builtin_variables.cpp
> index e899f01..3d34028 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);
Add a has_clip_distance() func?
> + }
> + 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) {
For the last series cull series in review, it was noted that a
has_cull_distance() func would be nice to for these checks (dave didn't
see that i guess). As you are touching it now again, maybe introduce
that one, when you are at it :)
Other than that i think you are missing the entry in the parser for:
#extension GL_EXT_clip_cull_distance : <behavior>
Other than that the patch looks fine to me!
> add_const("gl_MaxCullDistances", state->Const.MaxClipPlanes);
> add_const("gl_MaxCombinedClipAndCullDistances",
> state->Const.MaxClipPlanes);
> @@ -1256,11 +1259,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 2c42016..8b088ca 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_geometry_point_size, false, true, OES_geometry_shader),
> EXT(EXT_geometry_shader, false, true, OES_geometry_shader),
> EXT(EXT_gpu_shader5, false, true, ARB_gpu_shader5),
> diff --git a/src/compiler/glsl/glsl_parser_extras.h b/src/compiler/glsl/glsl_parser_extras.h
> index 59ae972..3afc9cb 100644
> --- a/src/compiler/glsl/glsl_parser_extras.h
> +++ b/src/compiler/glsl/glsl_parser_extras.h
> @@ -641,6 +641,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_geometry_point_size_enable;
> diff --git a/src/compiler/glsl/linker.cpp b/src/compiler/glsl/linker.cpp
> index ca2f060..8cf2a95 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);
>
> @@ -688,17 +687,23 @@ analyze_clip_cull_usage(struct gl_shader_program *prog,
> * This does not apply to GLSL ES shaders, since GLSL ES defines neither
> * gl_ClipVertex, gl_ClipDistance or gl_CullDistance.
> */
> - 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 296fbd8..716442e 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)
More information about the mesa-dev
mailing list