[Mesa-dev] [PATCH 30/31] mesa: don't flag _NEW_PROGRAM_CONSTANTS for GLSL programs for st/mesa
Samuel Pitoiset
samuel.pitoiset at gmail.com
Tue Jun 20 18:44:09 UTC 2017
You need to update _mesa_uniform_handle() as well because the handles
won't be propagated if you don't do that.
With that fixed, patch is:
Reviewed-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>
On 06/12/2017 06:55 PM, Marek Olšák wrote:
> From: Marek Olšák <marek.olsak at amd.com>
>
> ---
> src/mesa/main/shaderapi.c | 8 ++++++--
> src/mesa/main/uniform_query.cpp | 21 +++++++++++++++++++--
> src/mesa/main/uniforms.h | 4 ++++
> src/mesa/state_tracker/st_context.c | 3 ---
> 4 files changed, 29 insertions(+), 7 deletions(-)
>
> diff --git a/src/mesa/main/shaderapi.c b/src/mesa/main/shaderapi.c
> index 9f0122a..5a71240 100644
> --- a/src/mesa/main/shaderapi.c
> +++ b/src/mesa/main/shaderapi.c
> @@ -2579,27 +2579,33 @@ _mesa_UniformSubroutinesuiv(GLenum shadertype, GLsizei count,
> _mesa_error(ctx, GL_INVALID_OPERATION, "%s", api_name);
> return;
> }
>
> if (count != p->sh.NumSubroutineUniformRemapTable) {
> _mesa_error(ctx, GL_INVALID_VALUE, "%s", api_name);
> return;
> }
>
> i = 0;
> + bool flushed = false;
> do {
> struct gl_uniform_storage *uni = p->sh.SubroutineUniformRemapTable[i];
> if (uni == NULL) {
> i++;
> continue;
> }
>
> + if (!flushed) {
> + _mesa_flush_vertices_for_uniforms(ctx, uni);
> + flushed = true;
> + }
> +
> int uni_count = uni->array_elements ? uni->array_elements : 1;
> int j, k, f;
>
> for (j = i; j < i + uni_count; j++) {
> struct gl_subroutine_function *subfn = NULL;
> if (indices[j] > p->sh.MaxSubroutineFunctionIndex) {
> _mesa_error(ctx, GL_INVALID_VALUE, "%s", api_name);
> return;
> }
>
> @@ -2618,22 +2624,20 @@ _mesa_UniformSubroutinesuiv(GLenum shadertype, GLsizei count,
> }
> if (k == subfn->num_compat_types) {
> _mesa_error(ctx, GL_INVALID_OPERATION, "%s", api_name);
> return;
> }
>
> ctx->SubroutineIndex[p->info.stage].IndexPtr[j] = indices[j];
> }
> i += uni_count;
> } while(i < count);
> -
> - FLUSH_VERTICES(ctx, _NEW_PROGRAM_CONSTANTS);
> }
>
>
> GLvoid GLAPIENTRY
> _mesa_GetUniformSubroutineuiv(GLenum shadertype, GLint location,
> GLuint *params)
> {
> GET_CURRENT_CONTEXT(ctx);
> const char *api_name = "glGetUniformSubroutineuiv";
> gl_shader_stage stage;
> diff --git a/src/mesa/main/uniform_query.cpp b/src/mesa/main/uniform_query.cpp
> index e6c78bf..f9ea492 100644
> --- a/src/mesa/main/uniform_query.cpp
> +++ b/src/mesa/main/uniform_query.cpp
> @@ -991,20 +991,37 @@ validate_uniform(GLint location, GLsizei count, const GLvoid *values,
> "glUniform1i(invalid image unit index for uniform %d)",
> location);
> return NULL;
> }
> }
> }
>
> return uni;
> }
>
> +void
> +_mesa_flush_vertices_for_uniforms(struct gl_context *ctx,
> + const struct gl_uniform_storage *uni)
> +{
> + uint64_t new_driver_state = 0;
> + unsigned mask = uni->active_shader_mask;
> +
> + while (mask) {
> + unsigned index = u_bit_scan(&mask);
> +
> + assert(index < MESA_SHADER_STAGES);
> + new_driver_state |= ctx->DriverFlags.NewShaderConstants[index];
> + }
> +
> + FLUSH_VERTICES(ctx, new_driver_state ? 0 : _NEW_PROGRAM_CONSTANTS);
> + ctx->NewDriverState |= new_driver_state;
> +}
>
> /**
> * Called via glUniform*() functions.
> */
> extern "C" void
> _mesa_uniform(GLint location, GLsizei count, const GLvoid *values,
> struct gl_context *ctx, struct gl_shader_program *shProg,
> enum glsl_base_type basicType, unsigned src_components)
> {
> unsigned offset;
> @@ -1045,21 +1062,21 @@ _mesa_uniform(GLint location, GLsizei count, const GLvoid *values,
> * element that exceeds the highest array element index used, as
> * reported by GetActiveUniform, will be ignored by the GL."
> *
> * Clamp 'count' to a valid value. Note that for non-arrays a count > 1
> * will have already generated an error.
> */
> if (uni->array_elements != 0) {
> count = MIN2(count, (int) (uni->array_elements - offset));
> }
>
> - FLUSH_VERTICES(ctx, _NEW_PROGRAM_CONSTANTS);
> + _mesa_flush_vertices_for_uniforms(ctx, uni);
>
> /* Store the data in the "actual type" backing storage for the uniform.
> */
> if (!uni->type->is_boolean()) {
> memcpy(&uni->storage[size_mul * components * offset], values,
> sizeof(uni->storage[0]) * components * count * size_mul);
> } else {
> const union gl_constant_value *src =
> (const union gl_constant_value *) values;
> union gl_constant_value *dst = &uni->storage[components * offset];
> @@ -1222,21 +1239,21 @@ _mesa_uniform_matrix(GLint location, GLsizei count,
> * element that exceeds the highest array element index used, as
> * reported by GetActiveUniform, will be ignored by the GL."
> *
> * Clamp 'count' to a valid value. Note that for non-arrays a count > 1
> * will have already generated an error.
> */
> if (uni->array_elements != 0) {
> count = MIN2(count, (int) (uni->array_elements - offset));
> }
>
> - FLUSH_VERTICES(ctx, _NEW_PROGRAM_CONSTANTS);
> + _mesa_flush_vertices_for_uniforms(ctx, uni);
>
> /* Store the data in the "actual type" backing storage for the uniform.
> */
> const unsigned elements = components * vectors;
>
> if (!transpose) {
> memcpy(&uni->storage[size_mul * elements * offset], values,
> sizeof(uni->storage[0]) * elements * count * size_mul);
> } else if (basicType == GLSL_TYPE_FLOAT) {
> /* Copy and transpose the matrix.
> diff --git a/src/mesa/main/uniforms.h b/src/mesa/main/uniforms.h
> index 21d8571..7fd1aac 100644
> --- a/src/mesa/main/uniforms.h
> +++ b/src/mesa/main/uniforms.h
> @@ -463,20 +463,24 @@ _mesa_propagate_uniforms_to_driver_storage(struct gl_uniform_storage *uni,
> extern void
> _mesa_update_shader_textures_used(struct gl_shader_program *shProg,
> struct gl_program *prog);
>
> extern bool
> _mesa_sampler_uniforms_are_valid(const struct gl_shader_program *shProg,
> char *errMsg, size_t errMsgLength);
> extern bool
> _mesa_sampler_uniforms_pipeline_are_valid(struct gl_pipeline_object *);
>
> +extern void
> +_mesa_flush_vertices_for_uniforms(struct gl_context *ctx,
> + const struct gl_uniform_storage *uni);
> +
> struct gl_builtin_uniform_element {
> const char *field;
> int tokens[STATE_LENGTH];
> int swizzle;
> };
>
> struct gl_builtin_uniform_desc {
> const char *name;
> const struct gl_builtin_uniform_element *elements;
> unsigned int num_elements;
> diff --git a/src/mesa/state_tracker/st_context.c b/src/mesa/state_tracker/st_context.c
> index e676a48..a81b2c2 100644
> --- a/src/mesa/state_tracker/st_context.c
> +++ b/src/mesa/state_tracker/st_context.c
> @@ -236,23 +236,20 @@ st_invalidate_state(struct gl_context * ctx)
> if (new_state & _NEW_TEXTURE_OBJECT) {
> st->dirty |= st->active_states &
> (ST_NEW_SAMPLER_VIEWS |
> ST_NEW_SAMPLERS |
> ST_NEW_IMAGE_UNITS);
> if (ctx->FragmentProgram._Current &&
> ctx->FragmentProgram._Current->ExternalSamplersUsed) {
> st->dirty |= ST_NEW_FS_STATE;
> }
> }
> -
> - if (new_state & _NEW_PROGRAM_CONSTANTS)
> - st->dirty |= st->active_states & ST_NEW_CONSTANTS;
> }
>
>
> static void
> st_destroy_context_priv(struct st_context *st, bool destroy_pipe)
> {
> uint shader, i;
>
> st_destroy_atoms( st );
> st_destroy_draw( st );
>
More information about the mesa-dev
mailing list