[Mesa-dev] [PATCH 22/40] glsl: make a copy of the shader source for use with cache fallback
Timothy Arceri
tarceri at itsqueeze.com
Fri Feb 10 12:06:57 UTC 2017
On 10/02/17 22:16, Nicolai Hähnle wrote:
> On 07.02.2017 04:42, Timothy Arceri wrote:
>> From: Timothy Arceri <timothy.arceri at collabora.com>
>>
>> A number of things can happen that change the shader source after it is
>> compiled or linked.
>>
>> For example:
>> - Source changed after it is first compiled
>> - Source changed after linking
>> - Shader detached after linking
>>
>> In order to be able to fallback to a full rebuild on a cache miss we
>> make a copy of the shader source and store it in the new FallbackShaders
>> field when linking.
>
> Can you explain what they're used for? It doesn't seem like this is
> really necessary: the fallback is used by st/mesa when the TGSI
> loading fails, but that's still during glLinkProgram().
Correct. But i965 needs to fallback when it has a variant that is not
cached, there is currently no NIR level cache.
>
> Thanks,
> Nicolai
>
>> ---
>> src/compiler/glsl/shader_cache.cpp | 29 +++++++++++++++++++++++++++++
>> src/mesa/main/mtypes.h | 2 ++
>> src/mesa/main/shaderobj.c | 4 ++++
>> src/mesa/program/ir_to_mesa.cpp | 8 +++++++-
>> 4 files changed, 42 insertions(+), 1 deletion(-)
>>
>> diff --git a/src/compiler/glsl/shader_cache.cpp
>> b/src/compiler/glsl/shader_cache.cpp
>> index 583db47..729dd09 100644
>> --- a/src/compiler/glsl/shader_cache.cpp
>> +++ b/src/compiler/glsl/shader_cache.cpp
>> @@ -1276,6 +1276,35 @@ shader_cache_read_program_metadata(struct
>> gl_context *ctx,
>> if (!cache || prog->data->cache_fallback)
>> return false;
>>
>> + /* Free previous fallback information */
>> + if (prog->data->FallbackShaders == NULL) {
>> + prog->data->NumFallbackShaders = 0;
>> + for (unsigned i = 0; i < prog->data->NumFallbackShaders; i++) {
>> + ralloc_free(prog->data->FallbackShaders);
>> + prog->data->FallbackShaders = NULL;
>> + }
>> + }
>> +
>> + /* Shaders could be recompiled using different source code after
>> linking,
>> + * or the shader could be detached from the program so store some
>> + * information about the shader to be used in case of fallback.
>> + */
>> + prog->data->NumFallbackShaders = prog->NumShaders;
>> + prog->data->FallbackShaders = (struct gl_shader **)
>> + reralloc(NULL, prog->data->FallbackShaders, struct gl_shader *,
>> + prog->NumShaders);
>> + for (unsigned i = 0; i < prog->NumShaders; i++) {
>> + prog->data->FallbackShaders[i] =
>> rzalloc(prog->data->FallbackShaders,
>> + struct gl_shader);
>> + memcpy(prog->data->FallbackShaders[i]->sha1,
>> prog->Shaders[i]->sha1,
>> + sizeof(prog->Shaders[i]->sha1));
>> + prog->data->FallbackShaders[i]->Stage = prog->Shaders[i]->Stage;
>> + prog->data->FallbackShaders[i]->Source =
>> + ralloc_strdup(prog->data->FallbackShaders,
>> prog->Shaders[i]->Source);
>> + prog->data->FallbackShaders[i]->InfoLog =
>> + ralloc_strdup(prog->data->FallbackShaders, "");
>> + }
>> +
>> for (unsigned i = 0; i < prog->NumShaders; i++) {
>> if (prog->Shaders[i]->Stage == MESA_SHADER_COMPUTE) {
>> compile_shaders(ctx, prog);
>> diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h
>> index c7ca182..f65cd76 100644
>> --- a/src/mesa/main/mtypes.h
>> +++ b/src/mesa/main/mtypes.h
>> @@ -2685,6 +2685,8 @@ struct gl_shader_program_data
>> union gl_constant_value *UniformDataSlots;
>>
>> bool cache_fallback;
>> + GLuint NumFallbackShaders;
>> + struct gl_shader **FallbackShaders; /**< Shaders used for cache
>> fallback */
>>
>> /** List of all active resources after linking. */
>> struct gl_program_resource *ProgramResourceList;
>> diff --git a/src/mesa/main/shaderobj.c b/src/mesa/main/shaderobj.c
>> index b41137f..6ddccd2 100644
>> --- a/src/mesa/main/shaderobj.c
>> +++ b/src/mesa/main/shaderobj.c
>> @@ -404,10 +404,14 @@ _mesa_free_shader_program_data(struct
>> gl_context *ctx,
>> _mesa_reference_shader(ctx, &shProg->Shaders[i], NULL);
>> }
>> shProg->NumShaders = 0;
>> + shProg->data->NumFallbackShaders = 0;
>>
>> free(shProg->Shaders);
>> shProg->Shaders = NULL;
>>
>> + ralloc_free(shProg->data->FallbackShaders);
>> + shProg->data->FallbackShaders = NULL;
>> +
>> /* Transform feedback varying vars */
>> for (i = 0; i < shProg->TransformFeedback.NumVarying; i++) {
>> free(shProg->TransformFeedback.VaryingNames[i]);
>> diff --git a/src/mesa/program/ir_to_mesa.cpp
>> b/src/mesa/program/ir_to_mesa.cpp
>> index 67c9267..e286408 100644
>> --- a/src/mesa/program/ir_to_mesa.cpp
>> +++ b/src/mesa/program/ir_to_mesa.cpp
>> @@ -3130,8 +3130,14 @@ _mesa_glsl_link_shader(struct gl_context *ctx,
>> struct gl_shader_program *prog)
>> }
>> }
>>
>> - if (prog->data->LinkStatus)
>> + if (prog->data->LinkStatus && !prog->data->cache_fallback) {
>> + if (prog->data->FallbackShaders) {
>> + prog->data->NumFallbackShaders = 0;
>> + ralloc_free(prog->data->FallbackShaders);
>> + prog->data->FallbackShaders = NULL;
>> + }
>> shader_cache_write_program_metadata(ctx, prog);
>> + }
>> }
>>
>> } /* extern "C" */
>>
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
More information about the mesa-dev
mailing list