Thanks for reviewing!

Am 17.05.2018 um 08:42 schrieb Tapani Pälli:
> 
> 
> On 05/10/2018 12:05 PM, Benedikt Schemmer wrote:
>> Move shader-cache code from back to front and make generate_sha1() usable
>> unconditionally to avoid code duplication in the following patch
>>
>> ---
>>   src/mesa/main/shaderapi.c | 228 
>> +++++++++++++++++++++++-----------------------
>>   1 file changed, 116 insertions(+), 112 deletions(-)
>>
>> diff --git a/src/mesa/main/shaderapi.c b/src/mesa/main/shaderapi.c
>> index 44b18af492..e8acca4490 100644
>> --- a/src/mesa/main/shaderapi.c
>> +++ b/src/mesa/main/shaderapi.c
>> @@ -64,6 +64,122 @@
>>   #include "util/mesa-sha1.h"
>>   #include "util/crc32.h"
>>
>> +
>> +/**
>> + * Generate a SHA-1 hash value string for given source string.
>> + */
>> +static void
>> +generate_sha1(const char *source, char sha_str[64])
>> +{
>> +   unsigned char sha[20];
>> +   _mesa_sha1_compute(source, strlen(source), sha);
>> +   _mesa_sha1_format(sha_str, sha);
>> +}
> 
> There is one potential problem here. The 'ENABLE_SHADER_CACHE' guard for 
> generate_sha1 and others was placed there because the imported sha1 code 
> broke windows build, I'm wondering if this is still
> the case? If so, then generate_sha1 should be inside ENABLE_SHADER_CACHE 
> guard.
> 

I did a quick
gedit $(grep -Rlsi "_mesa_sha1_compute" | grep -E "\.c|\.h")

and it seems radv and anv use _mesa_sha1_compute (and _mesa_sha1_format) 
without a guard
best example from Intel seems to be brw_disk_cache.c which uses it alot outside 
of the ENABLE_SHADER_CACHE guard

so probably safe?

>> +
>> +
>> +#ifdef ENABLE_SHADER_CACHE
>> +/**
>> + * Construct a full path for shader replacement functionality using
>> + * following format:
>> + *
>> + * <path>/<stage prefix>_<CHECKSUM>.glsl
>> + */
>> +static char *
>> +construct_name(const gl_shader_stage stage, const char *source,
>> +               const char *path)
>> +{
>> +   char sha[64];
>> +   static const char *types[] = {
>> +      "VS", "TC", "TE", "GS", "FS", "CS",
>> +   };
>> +
>> +   generate_sha1(source, sha);
>> +   return ralloc_asprintf(NULL, "%s/%s_%s.glsl", path, types[stage], sha);
>> +}
>> +
>> +/**
>> + * Write given shader source to a file in MESA_SHADER_DUMP_PATH.
>> + */
>> +static void
>> +dump_shader(const gl_shader_stage stage, const char *source)
>> +{
>> +   static bool path_exists = true;
>> +   char *dump_path;
>> +   FILE *f;
>> +
>> +   if (!path_exists)
>> +      return;
>> +
>> +   dump_path = getenv("MESA_SHADER_DUMP_PATH");
>> +   if (!dump_path) {
>> +      path_exists = false;
>> +      return;
>> +   }
>> +
>> +   char *name = construct_name(stage, source, dump_path);
>> +
>> +   f = fopen(name, "w");
>> +   if (f) {
>> +      fputs(source, f);
>> +      fclose(f);
>> +   } else {
>> +      GET_CURRENT_CONTEXT(ctx);
>> +      _mesa_warning(ctx, "could not open %s for dumping shader (%s)", name,
>> +                    strerror(errno));
>> +   }
>> +   ralloc_free(name);
>> +}
>> +
>> +/**
>> + * Read shader source code from a file.
>> + * Useful for debugging to override an app's shader.
>> + */
>> +static GLcharARB *
>> +read_shader(const gl_shader_stage stage, const char *source)
>> +{
>> +   char *read_path;
>> +   static bool path_exists = true;
>> +   int len, shader_size = 0;
>> +   GLcharARB *buffer;
>> +   FILE *f;
>> +
>> +   if (!path_exists)
>> +      return NULL;
>> +
>> +   read_path = getenv("MESA_SHADER_READ_PATH");
>> +   if (!read_path) {
>> +      path_exists = false;
>> +      return NULL;
>> +   }
>> +
>> +   char *name = construct_name(stage, source, read_path);
>> +   f = fopen(name, "r");
>> +   ralloc_free(name);
>> +   if (!f)
>> +      return NULL;
>> +
>> +   /* allocate enough room for the entire shader */
>> +   fseek(f, 0, SEEK_END);
>> +   shader_size = ftell(f);
>> +   rewind(f);
>> +   assert(shader_size);
>> +
>> +   /* add one for terminating zero */
>> +   shader_size++;
>> +
>> +   buffer = malloc(shader_size);
>> +   assert(buffer);
>> +
>> +   len = fread(buffer, 1, shader_size, f);
>> +   buffer[len] = 0;
>> +
>> +   fclose(f);
>> +
>> +   return buffer;
>> +}
>> +
>> +#endif /* ENABLE_SHADER_CACHE */
>> +
>>   /**
>>    * Return mask of GLSL_x flags by examining the MESA_GLSL env var.
>>    */
>> @@ -1775,119 +1891,7 @@ _mesa_LinkProgram(GLuint programObj)
>>      link_program_error(ctx, shProg);
>>   }
>>
>> -#ifdef ENABLE_SHADER_CACHE
>> -/**
>> - * Generate a SHA-1 hash value string for given source string.
>> - */
>> -static void
>> -generate_sha1(const char *source, char sha_str[64])
>> -{
>> -   unsigned char sha[20];
>> -   _mesa_sha1_compute(source, strlen(source), sha);
>> -   _mesa_sha1_format(sha_str, sha);
>> -}
>> -
>> -/**
>> - * Construct a full path for shader replacement functionality using
>> - * following format:
>> - *
>> - * <path>/<stage prefix>_<CHECKSUM>.glsl
>> - */
>> -static char *
>> -construct_name(const gl_shader_stage stage, const char *source,
>> -               const char *path)
>> -{
>> -   char sha[64];
>> -   static const char *types[] = {
>> -      "VS", "TC", "TE", "GS", "FS", "CS",
>> -   };
>> -
>> -   generate_sha1(source, sha);
>> -   return ralloc_asprintf(NULL, "%s/%s_%s.glsl", path, types[stage], sha);
>> -}
>> -
>> -/**
>> - * Write given shader source to a file in MESA_SHADER_DUMP_PATH.
>> - */
>> -static void
>> -dump_shader(const gl_shader_stage stage, const char *source)
>> -{
>> -   static bool path_exists = true;
>> -   char *dump_path;
>> -   FILE *f;
>> -
>> -   if (!path_exists)
>> -      return;
>> -
>> -   dump_path = getenv("MESA_SHADER_DUMP_PATH");
>> -   if (!dump_path) {
>> -      path_exists = false;
>> -      return;
>> -   }
>> -
>> -   char *name = construct_name(stage, source, dump_path);
>> -
>> -   f = fopen(name, "w");
>> -   if (f) {
>> -      fputs(source, f);
>> -      fclose(f);
>> -   } else {
>> -      GET_CURRENT_CONTEXT(ctx);
>> -      _mesa_warning(ctx, "could not open %s for dumping shader (%s)", name,
>> -                    strerror(errno));
>> -   }
>> -   ralloc_free(name);
>> -}
>> -
>> -/**
>> - * Read shader source code from a file.
>> - * Useful for debugging to override an app's shader.
>> - */
>> -static GLcharARB *
>> -read_shader(const gl_shader_stage stage, const char *source)
>> -{
>> -   char *read_path;
>> -   static bool path_exists = true;
>> -   int len, shader_size = 0;
>> -   GLcharARB *buffer;
>> -   FILE *f;
>> -
>> -   if (!path_exists)
>> -      return NULL;
>>
>> -   read_path = getenv("MESA_SHADER_READ_PATH");
>> -   if (!read_path) {
>> -      path_exists = false;
>> -      return NULL;
>> -   }
>> -
>> -   char *name = construct_name(stage, source, read_path);
>> -   f = fopen(name, "r");
>> -   ralloc_free(name);
>> -   if (!f)
>> -      return NULL;
>> -
>> -   /* allocate enough room for the entire shader */
>> -   fseek(f, 0, SEEK_END);
>> -   shader_size = ftell(f);
>> -   rewind(f);
>> -   assert(shader_size);
>> -
>> -   /* add one for terminating zero */
>> -   shader_size++;
>> -
>> -   buffer = malloc(shader_size);
>> -   assert(buffer);
>> -
>> -   len = fread(buffer, 1, shader_size, f);
>> -   buffer[len] = 0;
>> -
>> -   fclose(f);
>> -
>> -   return buffer;
>> -}
>> -
>> -#endif /* ENABLE_SHADER_CACHE */
>>
>>   /**
>>    * Called via glShaderSource() and glShaderSourceARB() API functions.
>>
_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to