From: Kenneth Graunke Date: Sat, 13 Sep 2014 18:13:26 +0000 (-0700) Subject: glsl: Track whether uniforms are active per stage X-Git-Tag: upstream/18.1.0~8538 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=b7ba745032900643af7bcfdc773a783b73e2735a;p=platform%2Fupstream%2Fmesa.git glsl: Track whether uniforms are active per stage for finer granularity state flagging v2: Marek - use a bitmask, add shader cache support Reviewed-by: Nicolai Hähnle Reviewed-by: Brian Paul Reviewed-by: Timothy Arceri --- diff --git a/src/compiler/glsl/ir_uniform.h b/src/compiler/glsl/ir_uniform.h index 9841df8..9545c49 100644 --- a/src/compiler/glsl/ir_uniform.h +++ b/src/compiler/glsl/ir_uniform.h @@ -107,6 +107,11 @@ struct gl_uniform_storage { struct gl_opaque_uniform_index opaque[MESA_SHADER_STAGES]; /** + * Mask of shader stages (1 << MESA_SHADER_xxx) where this uniform is used. + */ + unsigned active_shader_mask; + + /** * Storage used by the driver for the uniform */ unsigned num_driver_storage; diff --git a/src/compiler/glsl/link_uniforms.cpp b/src/compiler/glsl/link_uniforms.cpp index d2cb22c..1b87c58 100644 --- a/src/compiler/glsl/link_uniforms.cpp +++ b/src/compiler/glsl/link_uniforms.cpp @@ -766,6 +766,8 @@ private: this->uniforms[id].opaque[shader_type].index = ~0; this->uniforms[id].opaque[shader_type].active = false; + this->uniforms[id].active_shader_mask |= 1 << shader_type; + /* This assigns uniform indices to sampler and image uniforms. */ handle_samplers(base_type, &this->uniforms[id], name); handle_images(base_type, &this->uniforms[id], name); diff --git a/src/compiler/glsl/shader_cache.cpp b/src/compiler/glsl/shader_cache.cpp index fdeab8e..cc4d244 100644 --- a/src/compiler/glsl/shader_cache.cpp +++ b/src/compiler/glsl/shader_cache.cpp @@ -576,6 +576,7 @@ write_uniforms(struct blob *metadata, struct gl_shader_program *prog) blob_write_uint32(metadata, prog->data->UniformStorage[i].array_stride); blob_write_uint32(metadata, prog->data->UniformStorage[i].hidden); blob_write_uint32(metadata, prog->data->UniformStorage[i].is_shader_storage); + blob_write_uint32(metadata, prog->data->UniformStorage[i].active_shader_mask); blob_write_uint32(metadata, prog->data->UniformStorage[i].matrix_stride); blob_write_uint32(metadata, prog->data->UniformStorage[i].row_major); blob_write_uint32(metadata, prog->data->UniformStorage[i].is_bindless); @@ -641,6 +642,7 @@ read_uniforms(struct blob_reader *metadata, struct gl_shader_program *prog) uniforms[i].array_stride = blob_read_uint32(metadata); uniforms[i].hidden = blob_read_uint32(metadata); uniforms[i].is_shader_storage = blob_read_uint32(metadata); + uniforms[i].active_shader_mask = blob_read_uint32(metadata); uniforms[i].matrix_stride = blob_read_uint32(metadata); uniforms[i].row_major = blob_read_uint32(metadata); uniforms[i].is_bindless = blob_read_uint32(metadata);