[Mesa-dev] [PATCH 2/2] glsl: free or reuse memory allocated for TF varying
Tapani Pälli
tapani.palli at intel.com
Fri Nov 23 13:22:42 UTC 2018
Hi;
On 11/23/18 10:29 AM, Gert Wollny wrote:
> Hello Tapani,
>
> since you wrote the original code, could you have a look at this patch?
>
Sure. I was able to reproduce this leak with Piglit's
"ext_transform_feedback-points" and fix LGTM;
Reviewed-by: Tapani Pälli <tapani.palli at intel.com>
> Many thanks,
> Gert
>
> Am Freitag, den 16.11.2018, 19:12 +0100 schrieb Gert Wollny:
>> From: Gert Wollny <gert.wollny at collabora.com>
>>
>> When a shader program is de-serialized the gl_shader_program passed
>> in
>> may actually still hold memory allocations for the transform feedback
>> varyings. If that is the case, free the varying names and reallocate
>> the new storage for the names array.
>>
>> This fixes a memory leak:
>> Direct leak of 48 byte(s) in 6 object(s) allocated from:
>> in malloc (/usr/lib64/gcc/x86_64-pc-linux-
>> gnu/7.3.0/libasan.so+0xdb880)
>> in transform_feedback_varyings
>> ../../samba/mesa/src/mesa/main/transformfeedback.c:875
>> in _mesa_TransformFeedbackVaryings
>> ../../samba/mesa/src/mesa/main/transformfeedback.c:985
>> ...
>> Indirect leak of 42 byte(s) in 6 object(s) allocated from:
>> in __interceptor_strdup (/usr/lib64/gcc/x86_64-pc-linux-
>> gnu/7.3.0/libasan.so+0x761c8)
>> in transform_feedback_varyings
>> ../../samba/mesa/src/mesa/main/transformfeedback.c:887
>> in _mesa_TransformFeedbackVaryings
>> ../../samba/mesa/src/mesa/main/transformfeedback.c:985
>>
>> Fixes: ab2643e4b06f63c93a57624003679903442634a8
>> glsl: serialize data from glTransformFeedbackVaryings
>>
>> Signed-off-by: Gert Wollny <gert.wollny at collabora.com>
>> ---
>> src/compiler/glsl/serialize.cpp | 9 ++++++++-
>> 1 file changed, 8 insertions(+), 1 deletion(-)
>>
>> diff --git a/src/compiler/glsl/serialize.cpp
>> b/src/compiler/glsl/serialize.cpp
>> index 267700e7e7..26d8ec4b75 100644
>> --- a/src/compiler/glsl/serialize.cpp
>> +++ b/src/compiler/glsl/serialize.cpp
>> @@ -360,13 +360,20 @@ read_xfb(struct blob_reader *metadata, struct
>> gl_shader_program *shProg)
>> if (xfb_stage == ~0u)
>> return;
>>
>> + if (shProg->TransformFeedback.VaryingNames) {
>> + for (unsigned i = 0; i < shProg->TransformFeedback.NumVarying;
>> ++i)
>> + free(shProg->TransformFeedback.VaryingNames[i]);
>> + }
>> +
>> /* Data set by glTransformFeedbackVaryings. */
>> shProg->TransformFeedback.BufferMode =
>> blob_read_uint32(metadata);
>> blob_copy_bytes(metadata, &shProg-
>>> TransformFeedback.BufferStride,
>> sizeof(shProg->TransformFeedback.BufferStride));
>> shProg->TransformFeedback.NumVarying =
>> blob_read_uint32(metadata);
>> +
>> shProg->TransformFeedback.VaryingNames = (char **)
>> - malloc(shProg->TransformFeedback.NumVarying * sizeof(GLchar
>> *));
>> + realloc(shProg->TransformFeedback.VaryingNames,
>> + shProg->TransformFeedback.NumVarying * sizeof(GLchar
>> *));
>> /* Note, malloc used with VaryingNames. */
>> for (unsigned i = 0; i < shProg->TransformFeedback.NumVarying;
>> i++)
>> shProg->TransformFeedback.VaryingNames[i] =
More information about the mesa-dev
mailing list