[Mesa-dev] [PATCH 1/8] glsl: optionally declare gl_FragCoord & gl_FrontFacing as system values
Ian Romanick
idr at freedesktop.org
Fri Jan 8 14:20:11 PST 2016
On 01/07/2016 05:29 PM, Marek Olšák wrote:
> From: Marek Olšák <marek.olsak at amd.com>
>
> ---
> src/glsl/ast_to_hir.cpp | 2 +-
> src/glsl/builtin_variables.cpp | 12 ++++++++++--
> src/glsl/nir/shader_enums.h | 3 ++-
> src/mesa/main/mtypes.h | 4 ++++
> src/mesa/state_tracker/st_glsl_to_tgsi.cpp | 1 +
> 5 files changed, 18 insertions(+), 4 deletions(-)
>
> diff --git a/src/glsl/ast_to_hir.cpp b/src/glsl/ast_to_hir.cpp
> index e6aec36..f3966d7 100644
> --- a/src/glsl/ast_to_hir.cpp
> +++ b/src/glsl/ast_to_hir.cpp
> @@ -3517,7 +3517,7 @@ get_variable_being_redeclared(ir_variable *var, YYLTYPE loc,
> state->is_version(150, 0))
> && strcmp(var->name, "gl_FragCoord") == 0
> && earlier->type == var->type
> - && earlier->data.mode == var->data.mode) {
> + && var->data.mode == ir_var_shader_in) {
I traced this code all the way back to 4a962170d (July 2010!). I'm not
100% sure why Eric did it this way. Since earlier->data.mode will
always (before this patch) be ir_var_shader_in, I wonder if this filters
cases like redeclaring gl_FragCoord as an out or a uniform.
Do we have any tests for that?
> /* Allow redeclaration of gl_FragCoord for ARB_fcc layout
> * qualifiers.
> */
> diff --git a/src/glsl/builtin_variables.cpp b/src/glsl/builtin_variables.cpp
> index e82c99e..221aab0 100644
> --- a/src/glsl/builtin_variables.cpp
> +++ b/src/glsl/builtin_variables.cpp
> @@ -1057,8 +1057,16 @@ builtin_variable_generator::generate_fs_special_vars()
> {
> ir_variable *var;
>
> - add_input(VARYING_SLOT_POS, vec4_t, "gl_FragCoord");
> - add_input(VARYING_SLOT_FACE, bool_t, "gl_FrontFacing");
> + if (this->state->ctx->Const.GLSLFragCoordIsSysVal)
> + add_system_value(SYSTEM_VALUE_FRAG_COORD, vec4_t, "gl_FragCoord");
> + else
> + add_input(VARYING_SLOT_POS, vec4_t, "gl_FragCoord");
> +
> + if (this->state->ctx->Const.GLSLFrontFacingIsSysVal)
> + add_system_value(SYSTEM_VALUE_FRONT_FACE, bool_t, "gl_FrontFacing");
> + else
> + add_input(VARYING_SLOT_FACE, bool_t, "gl_FrontFacing");
> +
> if (state->is_version(120, 100))
> add_input(VARYING_SLOT_PNTC, vec2_t, "gl_PointCoord");
>
> diff --git a/src/glsl/nir/shader_enums.h b/src/glsl/nir/shader_enums.h
> index 0be217c..8a2a81a 100644
> --- a/src/glsl/nir/shader_enums.h
> +++ b/src/glsl/nir/shader_enums.h
> @@ -412,7 +412,8 @@ typedef enum
> * \name Fragment shader system values
> */
> /*@{*/
> - SYSTEM_VALUE_FRONT_FACE, /**< (not done yet) */
> + SYSTEM_VALUE_FRAG_COORD,
> + SYSTEM_VALUE_FRONT_FACE,
> SYSTEM_VALUE_SAMPLE_ID,
> SYSTEM_VALUE_SAMPLE_POS,
> SYSTEM_VALUE_SAMPLE_MASK_IN,
> diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h
> index 5b9fce8..126b272 100644
> --- a/src/mesa/main/mtypes.h
> +++ b/src/mesa/main/mtypes.h
> @@ -3515,6 +3515,10 @@ struct gl_constants
> */
> GLboolean GLSLSkipStrictMaxUniformLimitCheck;
>
> + /** Whether gl_FragCoord and gl_FrontFacing are system values. */
> + bool GLSLFragCoordIsSysVal;
> + bool GLSLFrontFacingIsSysVal;
> +
> /**
> * Always use the GetTransformFeedbackVertexCount() driver hook, rather
> * than passing the transform feedback object to the drawing function.
> diff --git a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
> index 6cbc26a..9308eb4 100644
> --- a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
> +++ b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
> @@ -4459,6 +4459,7 @@ const unsigned _mesa_sysval_to_semantic[SYSTEM_VALUE_MAX] = {
>
> /* Fragment shader
> */
> + TGSI_SEMANTIC_POSITION,
> TGSI_SEMANTIC_FACE,
> TGSI_SEMANTIC_SAMPLEID,
> TGSI_SEMANTIC_SAMPLEPOS,
>
More information about the mesa-dev
mailing list