[Mesa-dev] [PATCH 22/40] glsl: make a copy of the shader source for use with cache fallback
Nicolai Hähnle
nhaehnle at gmail.com
Fri Feb 10 12:15:16 UTC 2017
On 10.02.2017 13:06, Timothy Arceri wrote:
>
>
> 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.
Ah, thanks for the explanation!
Cheers,
Nicolai
>>
>> 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