[Mesa-dev] [RFC PATCH 4/5] ralloc: Make the C++ macros arrange for class destructors to be called.

Eric Anholt eric at anholt.net
Sun Sep 22 11:25:59 PDT 2013


Ian Romanick <idr at freedesktop.org> writes:

> -----BEGIN PGP SIGNED MESSAGE-----
> Hash: SHA1
>
> On 09/21/2013 11:41 AM, Eric Anholt wrote:
>> Ian Romanick <idr at freedesktop.org> writes:
>> 
>>> Premature "send" strikes again...
>>> 
>>> On 09/19/2013 05:26 PM, Ian Romanick wrote:
>>>> On 09/18/2013 04:55 PM, Kenneth Graunke wrote:
>>>>> Previously, almost all classes didn't actually call their
>>>>> destructors, which is non-intuitive for C++ code.  Setting
>>>>> them up to be called was somewhat of a pain, since it
>>>>> required defining a helper function.
>>>>> 
>>>>> With the new macros, we can easily encapsulate this
>>>>> complexity, making destructors just happen automatically.
>>>>> 
>>>>> Signed-off-by: Kenneth Graunke <kenneth at whitecape.org> --- 
>>>>> src/glsl/ralloc.h | 8 ++++++++ 1 file changed, 8
>>>>> insertions(+)
>>>>> 
>>>>> diff --git a/src/glsl/ralloc.h b/src/glsl/ralloc.h index
>>>>> 799d3a9..82a3daa 100644 --- a/src/glsl/ralloc.h +++
>>>>> b/src/glsl/ralloc.h @@ -405,15 +405,23 @@ bool
>>>>> ralloc_vasprintf_append(char **str, const char *fmt, va_list
>>>>> args); #endif
>>>>> 
>>>>> #define _RALLOC_OPS(ALLOC, TYPE)
>>>>> \ +private:
>>>>> \ +   static void _ralloc_##TYPE##_destructor_callback(void
>>>>> *p)             \ +   {
>>>>> \ +      reinterpret_cast<TYPE *>(p)->~TYPE();
>>>>> \ +   }
>>>>> \ +public:
>>>>> \ static void* operator new(size_t size, void *mem_ctx)
>>>>> \ {
>>>>> \ void *p = ALLOC(mem_ctx, size);
>>>>> \ assert(p != NULL);
>>>>> \ +      ralloc_set_destructor(p,
>>>>> _ralloc_##TYPE##_destructor_callback);    \
>>> 
>>> All of the IR objects share the ir_instruction destructor:
>>> 
>>> virtual ~ir_instruction() { }
>>> 
>>> Doing this universally will add two indirect function calls when
>>> every object is released.  I wish we had a compiler benchmark so
>>> that we could know whether this is going to hurt app start up
>>> time on apps with lots of large shaders. :(
>> 
>> You can test this easily, thanks to shader_runner, "time", and 
>> shader-db.
>> 
>> For a large l4d2 shader: N           Min           Max
>> Median           Avg        Stddev x 1088      0.012401
>> 0.024984      0.017926   0.017903518  0.0018709739 + 1088
>> 0.012483      0.028997      0.017919   0.017883756  0.0019610448 No
>> difference proven at 95.0% confidence
>
> Does shader-db compile all the shaders in a single GL context?  If it
> doesn't there's probably a lot of other overhead that could mask the
> issue.  Still, this definitely means that compile times won't skyrocket...

I've used this many times to show overhead in compiling, I didn't see
any reason things would be different this time.

Of course, this time I happened to run the wrong version of the script,
which wasn't successfully compiling.  Updated numbers:

x 4636      0.029608      0.057734       0.04657   0.044289073  0.0049689317
+ 4636      0.029798      0.057689      0.046927   0.044643953  0.0049795278
Difference at 95.0% confidence
	0.00035488 +/- 0.0002025
	0.801281% +/- 0.457224%
	(Student's t, pooled s = 0.00497423)

So, yeah, there's a bit of a loss here, much more than I expected.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 835 bytes
Desc: not available
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20130922/5abbd64a/attachment.pgp>


More information about the mesa-dev mailing list