[Mesa-dev] [PATCH 11/21] glsl: Store ir_variable::ir_type in 8 bits instead of 32
Ian Romanick
idr at freedesktop.org
Wed May 28 17:20:43 PDT 2014
On 05/28/2014 12:44 PM, Ilia Mirkin wrote:
> On Wed, May 28, 2014 at 3:39 PM, Ian Romanick <idr at freedesktop.org> wrote:
>> On 05/28/2014 12:17 PM, Ian Romanick wrote:
>>> On 05/27/2014 08:28 PM, Matt Turner wrote:
>>>> On Tue, May 27, 2014 at 7:49 PM, Ian Romanick <idr at freedesktop.org> wrote:
>>>>> From: Ian Romanick <ian.d.romanick at intel.com>
>>>>>
>>>>> No change in the peak ir_variable memory usage in a trimmed apitrace of
>>>>> dota2 on 64-bit.
>>>>>
>>>>> No change in the peak ir_variable memory usage in a trimmed apitrace of
>>>>> dota2 on 32-bit.
>>>>>
>>>>> Signed-off-by: Ian Romanick <ian.d.romanick at intel.com>
>>>>> ---
>>>>> src/glsl/ir.h | 5 +++--
>>>>> 1 file changed, 3 insertions(+), 2 deletions(-)
>>>>>
>>>>> diff --git a/src/glsl/ir.h b/src/glsl/ir.h
>>>>> index 7faee74..bc02f6e 100644
>>>>> --- a/src/glsl/ir.h
>>>>> +++ b/src/glsl/ir.h
>>>>> @@ -92,12 +92,13 @@ enum ir_node_type {
>>>>> */
>>>>> class ir_instruction : public exec_node {
>>>>> private:
>>>>> - enum ir_node_type ir_type;
>>>>> + uint8_t ir_type;
>>>>>
>>>>> public:
>>>>> inline enum ir_node_type get_ir_type() const
>>>>> {
>>>>> - return this->ir_type;
>>>>> + STATIC_ASSERT(ir_type_max < 256);
>>>>> + return (enum ir_node_type) this->ir_type;
>>>>> }
>>>>>
>>>>> /**
>>>>> --
>>>>> 1.8.1.4
>>>>
>>>> Instead of doing this, you can mark the enum type with the PACKED
>>>> attribute. I did this in a similar change in i965 already. See
>>>> http://lists.freedesktop.org/archives/mesa-dev/2014-February/054643.html
>>>>
>>>> This way we still get enum type checking and warnings out of switch
>>>> statements and such.
>>>
>>> Hmm... that would mean that patch 10 wouldn't strictly be necessary.
>>> The disadvantage is that the next patch would need (right?) some changes
>>> for MSVC, especially on 32-bit. I think it would need to be
>>>
>>> #if sizeof(ir_node_type) < sizeof(void *)
>>> # define PADDING_BYTES (sizeof(void *) - sizeof(ir_node_type))
>>> #else
>>> # define PADDING_BYTES sizeof(void *)
>>> # if (__GNUC__ >= 3)
>>> # error "GCC did us wrong."
>>> # endif
>>> #endif
>>>
>>> uint8_t padding[PADDING_BYTES];
>>
>> After Patrick pointed out my obvious lack of C preprocessor skills, I
>> think the only alternative is:
>>
>> uint8_t padding[sizeof(ir_node_type) < sizeof(void *)
>> ? sizeof(void *) - sizeof(ir_node_type)
>> : sizeof(void *)];
>>
>> I'd probably hide that with a #define and a big comment, but it's
>> still a bit ugly.
>
> Just a thought:
>
> union {
> enum ir_node_type type;
> char *padding;
> }
>
> And start at padding[sizeof(type)]. Or you could do something a little
> uglier like
>
> union {
> struct {
> enum ir_node_type type;
> char data[0];
I don't think C++ lets you do data[0], but data[1] should also work.
> }
> void *padding;
> }
>
> And then I think that data should point at the right place. BTW, all
> of the above is untested... I could imagine that e.g. struct creates
> funny alignment requirements... but you could pack it.
On 32-bit Windows, sizeof(void*) == sizeof(enum ir_node_type). In that
case, you can't rely on data having any usable storage. I believe that
would severly complicate any potential users of this storage... and
seems ripe for build breaks (or worse).
The idea with my crazy code above is that when sizeof(void*) ==
sizeof(enum ir_node_type) you get sizeof(void*) for the padding space.
That wastes some space on 32-bit Windows, but it keeps all the rest of
the code simple.
> -ilia
More information about the mesa-dev
mailing list