[Mesa-dev] [PATCH 1/3] st/mesa: use MIN2 macro in favour of custom _min function

Emil Velikov emil.l.velikov at gmail.com
Fri Feb 21 16:42:21 PST 2014


On 22/02/14 00:34, Ian Romanick wrote:
> On 02/21/2014 03:15 PM, Marek Olšák wrote:
>> The main reason _min exists is that it evaluates each parameter once,
>> while MIN2 evaluates each parameter twice, so in this case, MIN2 calls
>> the get_param function twice, which may not be desirable. The same for
>> the other macros.
> 
> There is a GCC extension that cope with this, but I don't know if other
> compilers support it.  It has existed in GCC for a decade or more.
> Directly from the GCC documentation:
> 
>      #define max(a,b) \
>        ({ typeof (a) _a = (a); \
>            typeof (b) _b = (b); \
>          _a > _b ? _a : _b; })
> 
> If some variation of this works with MSVC, maybe we could just "fix" our
> MIN2 and MAX2 macros.
> 
> Perhaps Vinson could research our options here...
> 
> If nothing else, this is the Nth time I've seen patches like this
> rejected.  Perhaps the _min and _maxf functions could get a comment
> explaining why they exist?
> 
As Ian said, if there is a reason for those to exist a single line of
comment would be greatly beneficial. IMHO all of those could be "flexed"
into some common(read mesa + gallium) headers, that handle the gcc
extension or fall-back to something suitable in case it's missing.

There are a bit too many cases in mesa that have duplication so pardon
if I'm not picking the correct one during my clean-up :)

-Emil
>> Marek
>>
>> On Fri, Feb 21, 2014 at 11:59 PM, Emil Velikov
>> <emil.l.velikov at gmail.com> wrote:
>>> Signed-off-by: Emil Velikov <emil.l.velikov at gmail.com>
>>> ---
>>>   src/mesa/state_tracker/st_extensions.c | 27
>>> +++++++++++----------------
>>>   1 file changed, 11 insertions(+), 16 deletions(-)
>>>
>>> diff --git a/src/mesa/state_tracker/st_extensions.c
>>> b/src/mesa/state_tracker/st_extensions.c
>>> index e43e7b4..a909b71 100644
>>> --- a/src/mesa/state_tracker/st_extensions.c
>>> +++ b/src/mesa/state_tracker/st_extensions.c
>>> @@ -39,11 +39,6 @@
>>>   #include "st_extensions.h"
>>>   #include "st_format.h"
>>>
>>> -static unsigned _min(unsigned a, unsigned b)
>>> -{
>>> -   return (a < b) ? a : b;
>>> -}
>>> -
>>>   static float _maxf(float a, float b)
>>>   {
>>>      return (a > b) ? a : b;
>>> @@ -72,19 +67,19 @@ void st_init_limits(struct st_context *st)
>>>      boolean can_ubo = TRUE;
>>>
>>>      c->MaxTextureLevels
>>> -      = _min(screen->get_param(screen, PIPE_CAP_MAX_TEXTURE_2D_LEVELS),
>>> +      = MIN2(screen->get_param(screen, PIPE_CAP_MAX_TEXTURE_2D_LEVELS),
>>>               MAX_TEXTURE_LEVELS);
>>>
>>>      c->Max3DTextureLevels
>>> -      = _min(screen->get_param(screen, PIPE_CAP_MAX_TEXTURE_3D_LEVELS),
>>> +      = MIN2(screen->get_param(screen, PIPE_CAP_MAX_TEXTURE_3D_LEVELS),
>>>               MAX_3D_TEXTURE_LEVELS);
>>>
>>>      c->MaxCubeTextureLevels
>>> -      = _min(screen->get_param(screen,
>>> PIPE_CAP_MAX_TEXTURE_CUBE_LEVELS),
>>> +      = MIN2(screen->get_param(screen,
>>> PIPE_CAP_MAX_TEXTURE_CUBE_LEVELS),
>>>               MAX_CUBE_TEXTURE_LEVELS);
>>>
>>>      c->MaxTextureRectSize
>>> -      = _min(1 << (c->MaxTextureLevels - 1), MAX_TEXTURE_RECT_SIZE);
>>> +      = MIN2(1 << (c->MaxTextureLevels - 1), MAX_TEXTURE_RECT_SIZE);
>>>
>>>      c->MaxArrayTextureLayers
>>>         = screen->get_param(screen, PIPE_CAP_MAX_TEXTURE_ARRAY_LAYERS);
>>> @@ -168,7 +163,7 @@ void st_init_limits(struct st_context *st)
>>>         }
>>>
>>>         pc->MaxTextureImageUnits =
>>> -         _min(screen->get_shader_param(screen, sh,
>>> +         MIN2(screen->get_shader_param(screen, sh,
>>>                                         
>>> PIPE_SHADER_CAP_MAX_TEXTURE_SAMPLERS),
>>>                 MAX_TEXTURE_IMAGE_UNITS);
>>>
>>> @@ -185,7 +180,7 @@ void st_init_limits(struct st_context *st)
>>>         pc->MaxTemps           = pc->MaxNativeTemps           =
>>>            screen->get_shader_param(screen, sh,
>>> PIPE_SHADER_CAP_MAX_TEMPS);
>>>         pc->MaxAddressRegs     = pc->MaxNativeAddressRegs     =
>>> -         _min(screen->get_shader_param(screen, sh,
>>> PIPE_SHADER_CAP_MAX_ADDRS),
>>> +         MIN2(screen->get_shader_param(screen, sh,
>>> PIPE_SHADER_CAP_MAX_ADDRS),
>>>                 MAX_PROGRAM_ADDRESS_REGS);
>>>         pc->MaxParameters      = pc->MaxNativeParameters      =
>>>            screen->get_shader_param(screen, sh,
>>> PIPE_SHADER_CAP_MAX_CONSTS);
>>> @@ -196,7 +191,7 @@ void st_init_limits(struct st_context *st)
>>>            screen->get_shader_param(screen, sh,
>>> PIPE_SHADER_CAP_MAX_CONST_BUFFERS);
>>>         if (pc->MaxUniformBlocks)
>>>            pc->MaxUniformBlocks -= 1; /* The first one is for
>>> ordinary uniforms. */
>>> -      pc->MaxUniformBlocks = _min(pc->MaxUniformBlocks,
>>> MAX_UNIFORM_BUFFERS);
>>> +      pc->MaxUniformBlocks = MIN2(pc->MaxUniformBlocks,
>>> MAX_UNIFORM_BUFFERS);
>>>
>>>         pc->MaxCombinedUniformComponents = (pc->MaxUniformComponents +
>>>                                             c->MaxUniformBlockSize / 4 *
>>> @@ -240,16 +235,16 @@ void st_init_limits(struct st_context *st)
>>>      }
>>>
>>>      c->MaxCombinedTextureImageUnits =
>>> -         _min(c->Program[MESA_SHADER_VERTEX].MaxTextureImageUnits +
>>> +         MIN2(c->Program[MESA_SHADER_VERTEX].MaxTextureImageUnits +
>>>                 c->Program[MESA_SHADER_GEOMETRY].MaxTextureImageUnits +
>>>                 c->Program[MESA_SHADER_FRAGMENT].MaxTextureImageUnits,
>>>                 MAX_COMBINED_TEXTURE_IMAGE_UNITS);
>>>
>>>      /* This depends on program constants. */
>>>      c->MaxTextureCoordUnits
>>> -      = _min(c->Program[MESA_SHADER_FRAGMENT].MaxTextureImageUnits,
>>> MAX_TEXTURE_COORD_UNITS);
>>> +      = MIN2(c->Program[MESA_SHADER_FRAGMENT].MaxTextureImageUnits,
>>> MAX_TEXTURE_COORD_UNITS);
>>>
>>> -   c->MaxTextureUnits =
>>> _min(c->Program[MESA_SHADER_FRAGMENT].MaxTextureImageUnits,
>>> c->MaxTextureCoordUnits);
>>> +   c->MaxTextureUnits =
>>> MIN2(c->Program[MESA_SHADER_FRAGMENT].MaxTextureImageUnits,
>>> c->MaxTextureCoordUnits);
>>>
>>>      c->Program[MESA_SHADER_VERTEX].MaxAttribs =
>>> MIN2(c->Program[MESA_SHADER_VERTEX].MaxAttribs, 16);
>>>
>>> @@ -749,7 +744,7 @@ void st_init_extensions(struct st_context *st)
>>>         ctx->Extensions.ARB_texture_buffer_object = GL_TRUE;
>>>
>>>         ctx->Const.MaxTextureBufferSize =
>>> -         _min(screen->get_param(screen,
>>> PIPE_CAP_MAX_TEXTURE_BUFFER_SIZE),
>>> +         MIN2(screen->get_param(screen,
>>> PIPE_CAP_MAX_TEXTURE_BUFFER_SIZE),
>>>                 (1u << 31) - 1);
>>>         ctx->Const.TextureBufferOffsetAlignment =
>>>            screen->get_param(screen,
>>> PIPE_CAP_TEXTURE_BUFFER_OFFSET_ALIGNMENT);
>>> -- 
>>> 1.9.0
>>>
>>> _______________________________________________
>>> mesa-dev mailing list
>>> mesa-dev at lists.freedesktop.org
>>> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
>> _______________________________________________
>> mesa-dev mailing list
>> mesa-dev at lists.freedesktop.org
>> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
>>
> 



More information about the mesa-dev mailing list