[Mesa-dev] [PATCH] mesa: Fix substitution of large shaders

Cody Northrop cody at lunarg.com
Fri Jun 6 12:04:52 PDT 2014


Whoops, yes, you're right.  ftell() of SEEK_END and strlen() are returning
the same value, which does not include the terminating zero.  Updated patch
below.

We use this quite a bit, much faster than editing large apitrace files

Thanks,

-C


Signed-off-by: Cody Northrop <cody at lunarg.com>
---
 src/mesa/main/shaderapi.c | 17 ++++++++++++++---
 1 file changed, 14 insertions(+), 3 deletions(-)

diff --git a/src/mesa/main/shaderapi.c b/src/mesa/main/shaderapi.c
index 6f84acd..4048ddf 100644
--- a/src/mesa/main/shaderapi.c
+++ b/src/mesa/main/shaderapi.c
@@ -1392,7 +1392,7 @@ _mesa_LinkProgram(GLhandleARB programObj)
 static GLcharARB *
 read_shader(const char *fname)
 {
-   const int max = 50*1000;
+   int shader_size = 0;
    FILE *f = fopen(fname, "r");
    GLcharARB *buffer, *shader;
    int len;
@@ -1401,8 +1401,19 @@ read_shader(const char *fname)
       return NULL;
    }

-   buffer = malloc(max);
-   len = fread(buffer, 1, max, f);
+   /* 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);
-- 
1.8.3.2






On Thu, Jun 5, 2014 at 7:13 PM, Brian Paul <brianp at vmware.com> wrote:

> On 06/05/2014 10:47 AM, Cody Northrop wrote:
>
>> The fixed size is insufficient for shaders I'm debugging.  Rather than
>> just bump it up, make it dynamic.
>>
>> Thanks,
>>
>> -C
>>
>> Signed-off-by: Cody Northrop <cody at lunarg.com <mailto:cody at lunarg.com>>
>>
>> ---
>>   src/mesa/main/shaderapi.c | 14 +++++++++++---
>>   1 file changed, 11 insertions(+), 3 deletions(-)
>>
>> diff --git a/src/mesa/main/shaderapi.c b/src/mesa/main/shaderapi.c
>> index 6f84acd..e63c124 100644
>> --- a/src/mesa/main/shaderapi.c
>> +++ b/src/mesa/main/shaderapi.c
>> @@ -1392,7 +1392,7 @@ _mesa_LinkProgram(GLhandleARB programObj)
>>   static GLcharARB *
>>   read_shader(const char *fname)
>>   {
>> -   const int max = 50*1000;
>> +   int shader_size = 0;
>>      FILE *f = fopen(fname, "r");
>>      GLcharARB *buffer, *shader;
>>      int len;
>> @@ -1401,8 +1401,16 @@ read_shader(const char *fname)
>>         return NULL;
>>      }
>>
>> -   buffer = malloc(max);
>> -   len = fread(buffer, 1, max, f);
>> +   /* allocate enough room for the entire shader */
>> +   fseek(f, 0, SEEK_END);
>> +   shader_size = ftell(f);
>> +   rewind(f);
>> +   assert(shader_size);
>> +
>> +   buffer = malloc(shader_size);
>>
>
> Do you have to add one for the terminating zero?
>
>
>
>  +   assert(buffer);
>> +
>> +   len = fread(buffer, 1, shader_size, f);
>>      buffer[len] = 0;
>>
>>      fclose(f);
>> --
>>
>
> I thought I was the only person who ever used this code!
>
> Other than the one question above this looks alright.
>
> Reviewed-by: Brian Paul <brianp at vmware.com>
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
>



-- 
 Cody Northrop
 Graphics Software Engineer
 LunarG, Inc.- 3D Driver Innovations
 Email: cody at lunarg.com
 Website: http://www.lunarg.com
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20140606/db808e66/attachment.html>


More information about the mesa-dev mailing list