[Mesa-stable] [PATCH 4/5] glsl: Optionally lower TCS gl_PatchVerticesIn to a uniform.
Ian Romanick
idr at freedesktop.org
Fri Jun 3 00:00:51 UTC 2016
On 06/02/2016 02:09 PM, Kenneth Graunke wrote:
> i965 has no special hardware for this, so the best way to implement
> this is to pass it in via a uniform.
>
> Signed-off-by: Kenneth Graunke <kenneth at whitecape.org>
> Cc: mesa-stable at lists.freedesktop.org
> ---
> src/compiler/glsl/builtin_variables.cpp | 13 ++++++++++++-
> src/mesa/main/mtypes.h | 1 +
> src/mesa/program/prog_statevars.c | 4 ++++
> src/mesa/program/prog_statevars.h | 1 +
> 4 files changed, 18 insertions(+), 1 deletion(-)
>
> diff --git a/src/compiler/glsl/builtin_variables.cpp b/src/compiler/glsl/builtin_variables.cpp
> index 05b3b0b..35a11bb 100644
> --- a/src/compiler/glsl/builtin_variables.cpp
> +++ b/src/compiler/glsl/builtin_variables.cpp
> @@ -37,6 +37,11 @@ static const struct gl_builtin_uniform_element gl_NumSamples_elements[] = {
> {NULL, {STATE_NUM_SAMPLES, 0, 0}, SWIZZLE_XXXX}
> };
>
> +/* only for TCS */
> +static const struct gl_builtin_uniform_element gl_PatchVerticesIn_elements[] = {
> + {NULL, {STATE_INTERNAL, STATE_TCS_PATCH_VERTICES_IN}, SWIZZLE_XXXX}
> +};
> +
> static const struct gl_builtin_uniform_element gl_DepthRange_elements[] = {
> {"near", {STATE_DEPTH_RANGE, 0, 0}, SWIZZLE_XXXX},
> {"far", {STATE_DEPTH_RANGE, 0, 0}, SWIZZLE_YYYY},
> @@ -234,6 +239,7 @@ static const struct gl_builtin_uniform_element gl_NormalMatrix_elements[] = {
> #define STATEVAR(name) {#name, name ## _elements, ARRAY_SIZE(name ## _elements)}
>
> static const struct gl_builtin_uniform_desc _mesa_builtin_uniform_desc[] = {
> + STATEVAR(gl_PatchVerticesIn),
> STATEVAR(gl_NumSamples),
> STATEVAR(gl_DepthRange),
> STATEVAR(gl_ClipPlane),
> @@ -1029,9 +1035,14 @@ void
> builtin_variable_generator::generate_tcs_special_vars()
> {
> add_system_value(SYSTEM_VALUE_PRIMITIVE_ID, int_t, "gl_PrimitiveID");
> - add_system_value(SYSTEM_VALUE_VERTICES_IN, int_t, "gl_PatchVerticesIn");
> add_system_value(SYSTEM_VALUE_INVOCATION_ID, int_t, "gl_InvocationID");
>
> + if (state->ctx->Const.LowerTCSPatchVerticesIn) {
> + add_uniform(int_t, "gl_PatchVerticesIn");
> + } else {
> + add_system_value(SYSTEM_VALUE_VERTICES_IN, int_t, "gl_PatchVerticesIn");
> + }
> +
There are some built-in shader inputs that can be redeclared to add
qualifiers. If gl_PatchVerticesIn is one of those (and I have no idea
whether or not it is), I think this will cause problems.
> add_output(VARYING_SLOT_TESS_LEVEL_OUTER, array(float_t, 4),
> "gl_TessLevelOuter")->data.patch = 1;
> add_output(VARYING_SLOT_TESS_LEVEL_INNER, array(float_t, 2),
> diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h
> index 8970274..f1d70fb 100644
> --- a/src/mesa/main/mtypes.h
> +++ b/src/mesa/main/mtypes.h
> @@ -3762,6 +3762,7 @@ struct gl_constants
> GLuint MaxTessPatchComponents;
> GLuint MaxTessControlTotalOutputComponents;
> bool LowerTessLevel; /**< Lower gl_TessLevel* from float[n] to vecn? */
> + bool LowerTCSPatchVerticesIn; /**< Lower gl_PatchVerticesIn to a uniform */
> bool LowerTESPatchVerticesIn; /**< Lower gl_PatchVerticesIn to a uniform */
> bool PrimitiveRestartForPatches;
> bool LowerCsDerivedVariables; /**< Lower gl_GlobalInvocationID and
> diff --git a/src/mesa/program/prog_statevars.c b/src/mesa/program/prog_statevars.c
> index 23e3015..8dddc0b 100644
> --- a/src/mesa/program/prog_statevars.c
> +++ b/src/mesa/program/prog_statevars.c
> @@ -598,6 +598,10 @@ _mesa_fetch_state(struct gl_context *ctx, const gl_state_index state[],
> }
> return;
>
> + case STATE_TCS_PATCH_VERTICES_IN:
> + val[0].i = ctx->TessCtrlProgram.patch_vertices;
> + return;
> +
> case STATE_TES_PATCH_VERTICES_IN:
> if (ctx->TessCtrlProgram._Current)
> val[0].i = ctx->TessCtrlProgram._Current->VerticesOut;
> diff --git a/src/mesa/program/prog_statevars.h b/src/mesa/program/prog_statevars.h
> index 4b27527..e716d90 100644
> --- a/src/mesa/program/prog_statevars.h
> +++ b/src/mesa/program/prog_statevars.h
> @@ -128,6 +128,7 @@ typedef enum gl_state_index_ {
> STATE_PT_BIAS, /**< Pixel transfer RGBA bias */
> STATE_FB_SIZE, /**< (width-1, height-1, 0, 0) */
> STATE_FB_WPOS_Y_TRANSFORM, /**< (1, 0, -1, height) if a FBO is bound, (-1, height, 1, 0) otherwise */
> + STATE_TCS_PATCH_VERTICES_IN, /**< gl_PatchVerticesIn for TCS (integer) */
> STATE_TES_PATCH_VERTICES_IN, /**< gl_PatchVerticesIn for TES (integer) */
> STATE_INTERNAL_DRIVER /* first available state index for drivers (must be last) */
> } gl_state_index;
>
More information about the mesa-stable
mailing list