[Mesa-dev] [PATCH 14/17] mesa/st: split the type_size calculation into it's own file

Brian Paul brianp at vmware.com
Fri Apr 15 16:38:42 UTC 2016


On 04/15/2016 10:30 AM, Rob Clark wrote:
> On Fri, Apr 15, 2016 at 11:06 AM, Brian Paul <brianp at vmware.com> wrote:
>> On 04/15/2016 08:49 AM, Rob Clark wrote:
>>>
>>> From: Rob Clark <robclark at freedesktop.org>
>>>
>>> We'll want to re-use this for NIR.
>>>
>>> Signed-off-by: Rob Clark <robclark at freedesktop.org>
>>> Reviewed-by: Marek Olšák <marek.olsak at amd.com>
>>> ---
>>>    src/mesa/Makefile.sources                  |  2 +
>>>    src/mesa/state_tracker/st_glsl_to_tgsi.cpp | 64 +------------------
>>>    src/mesa/state_tracker/st_glsl_types.cpp   | 98
>>> ++++++++++++++++++++++++++++++
>>>    src/mesa/state_tracker/st_glsl_types.h     | 44 ++++++++++++++
>>>    4 files changed, 147 insertions(+), 61 deletions(-)
>>>    create mode 100644 src/mesa/state_tracker/st_glsl_types.cpp
>>>    create mode 100644 src/mesa/state_tracker/st_glsl_types.h
>>>
>>> diff --git a/src/mesa/Makefile.sources b/src/mesa/Makefile.sources
>>> index 2ffbb15..14022ad 100644
>>> --- a/src/mesa/Makefile.sources
>>> +++ b/src/mesa/Makefile.sources
>>> @@ -491,6 +491,8 @@ STATETRACKER_FILES = \
>>>          state_tracker/st_gl_api.h \
>>>          state_tracker/st_glsl_to_tgsi.cpp \
>>>          state_tracker/st_glsl_to_tgsi.h \
>>> +       state_tracker/st_glsl_types.cpp \
>>> +       state_tracker/st_glsl_types.h \
>>>          state_tracker/st_manager.c \
>>>          state_tracker/st_manager.h \
>>>          state_tracker/st_mesa_to_tgsi.c \
>>> diff --git a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
>>> b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
>>> index 5f037da..dbac843 100644
>>> --- a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
>>> +++ b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
>>> @@ -52,6 +52,7 @@
>>>    #include "st_program.h"
>>>    #include "st_mesa_to_tgsi.h"
>>>    #include "st_format.h"
>>> +#include "st_glsl_types.h"
>>>
>>>
>>>    #define PROGRAM_ANY_CONST ((1 << PROGRAM_STATE_VAR) |    \
>>> @@ -1163,72 +1164,13 @@ glsl_to_tgsi_visitor::st_src_reg_for_type(int
>>> type, int val)
>>>    static int
>>>    attrib_type_size(const struct glsl_type *type, bool is_vs_input)
>>>    {
>>> -   unsigned int i;
>>> -   int size;
>>> -
>>> -   switch (type->base_type) {
>>> -   case GLSL_TYPE_UINT:
>>> -   case GLSL_TYPE_INT:
>>> -   case GLSL_TYPE_FLOAT:
>>> -   case GLSL_TYPE_BOOL:
>>> -      if (type->is_matrix()) {
>>> -         return type->matrix_columns;
>>> -      } else {
>>> -         /* Regardless of size of vector, it gets a vec4. This is bad
>>> -          * packing for things like floats, but otherwise arrays become a
>>> -          * mess.  Hopefully a later pass over the code can pack scalars
>>> -          * down if appropriate.
>>> -          */
>>> -         return 1;
>>> -      }
>>> -      break;
>>> -   case GLSL_TYPE_DOUBLE:
>>> -      if (type->is_matrix()) {
>>> -         if (type->vector_elements <= 2 || is_vs_input)
>>> -            return type->matrix_columns;
>>> -         else
>>> -            return type->matrix_columns * 2;
>>> -      } else {
>>> -         /* For doubles if we have a double or dvec2 they fit in one
>>> -          * vec4, else they need 2 vec4s.
>>> -          */
>>> -         if (type->vector_elements <= 2 || is_vs_input)
>>> -            return 1;
>>> -         else
>>> -            return 2;
>>> -      }
>>> -      break;
>>> -   case GLSL_TYPE_ARRAY:
>>> -      assert(type->length > 0);
>>> -      return attrib_type_size(type->fields.array, is_vs_input) *
>>> type->length;
>>> -   case GLSL_TYPE_STRUCT:
>>> -      size = 0;
>>> -      for (i = 0; i < type->length; i++) {
>>> -         size += attrib_type_size(type->fields.structure[i].type,
>>> is_vs_input);
>>> -      }
>>> -      return size;
>>> -   case GLSL_TYPE_SAMPLER:
>>> -   case GLSL_TYPE_IMAGE:
>>> -   case GLSL_TYPE_SUBROUTINE:
>>> -      /* Samplers take up one slot in UNIFORMS[], but they're baked in
>>> -       * at link time.
>>> -       */
>>> -      return 1;
>>> -   case GLSL_TYPE_ATOMIC_UINT:
>>> -   case GLSL_TYPE_INTERFACE:
>>> -   case GLSL_TYPE_VOID:
>>> -   case GLSL_TYPE_ERROR:
>>> -   case GLSL_TYPE_FUNCTION:
>>> -      assert(!"Invalid type in type_size");
>>> -      break;
>>> -   }
>>> -   return 0;
>>> +   return st_glsl_attrib_type_size(type, is_vs_input);
>>>    }
>>>
>>>    static int
>>>    type_size(const struct glsl_type *type)
>>>    {
>>> -  return attrib_type_size(type, false);
>>> +   return st_glsl_type_size(type);
>>>    }
>>>
>>>    /**
>>> diff --git a/src/mesa/state_tracker/st_glsl_types.cpp
>>> b/src/mesa/state_tracker/st_glsl_types.cpp
>>> new file mode 100644
>>> index 0000000..b235c8c
>>> --- /dev/null
>>> +++ b/src/mesa/state_tracker/st_glsl_types.cpp
>>> @@ -0,0 +1,98 @@
>>> +/*
>>> + * Copyright (C) 2005-2007  Brian Paul   All Rights Reserved.
>>> + * Copyright (C) 2008  VMware, Inc.   All Rights Reserved.
>>> + * Copyright © 2010 Intel Corporation
>>> + * Copyright © 2011 Bryan Cain
>>> + *
>>> + * Permission is hereby granted, free of charge, to any person obtaining
>>> a
>>> + * copy of this software and associated documentation files (the
>>> "Software"),
>>> + * to deal in the Software without restriction, including without
>>> limitation
>>> + * the rights to use, copy, modify, merge, publish, distribute,
>>> sublicense,
>>> + * and/or sell copies of the Software, and to permit persons to whom the
>>> + * Software is furnished to do so, subject to the following conditions:
>>> + *
>>> + * The above copyright notice and this permission notice (including the
>>> next
>>> + * paragraph) shall be included in all copies or substantial portions of
>>> the
>>> + * Software.
>>> + *
>>> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
>>> EXPRESS OR
>>> + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
>>> MERCHANTABILITY,
>>> + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT
>>> SHALL
>>> + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
>>> OTHER
>>> + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
>>> ARISING
>>> + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
>>> + * DEALINGS IN THE SOFTWARE.
>>> + */
>>> +
>>> +#include "st_glsl_types.h"
>>> +
>>
>>
>> While you're here, maybe you can add a comment on this function and the one
>> below indicating what units of size are returned.  Bytes, floats, etc.
>>
>> Thanks.
>
> sure, something like:
>
> /**
>   * Returns type size in units of vec4 slots.
>   */

Great.

-Brian


> int
> st_glsl_attrib_type_size(const struct glsl_type *type, bool is_vs_input)
> {
> ...
> }
>
> BR,
> -R
>
>
>> -Brian
>>
>>
>>> +int
>>> +st_glsl_attrib_type_size(const struct glsl_type *type, bool is_vs_input)
>>> +{
>>> +   unsigned int i;
>>> +   int size;
>>> +
>>> +   switch (type->base_type) {
>>> +   case GLSL_TYPE_UINT:
>>> +   case GLSL_TYPE_INT:
>>> +   case GLSL_TYPE_FLOAT:
>>> +   case GLSL_TYPE_BOOL:
>>> +      if (type->is_matrix()) {
>>> +         return type->matrix_columns;
>>> +      } else {
>>> +         /* Regardless of size of vector, it gets a vec4. This is bad
>>> +          * packing for things like floats, but otherwise arrays become a
>>> +          * mess.  Hopefully a later pass over the code can pack scalars
>>> +          * down if appropriate.
>>> +          */
>>> +         return 1;
>>> +      }
>>> +      break;
>>> +   case GLSL_TYPE_DOUBLE:
>>> +      if (type->is_matrix()) {
>>> +         if (type->vector_elements <= 2 || is_vs_input)
>>> +            return type->matrix_columns;
>>> +         else
>>> +            return type->matrix_columns * 2;
>>> +      } else {
>>> +         /* For doubles if we have a double or dvec2 they fit in one
>>> +          * vec4, else they need 2 vec4s.
>>> +          */
>>> +         if (type->vector_elements <= 2 || is_vs_input)
>>> +            return 1;
>>> +         else
>>> +            return 2;
>>> +      }
>>> +      break;
>>> +   case GLSL_TYPE_ARRAY:
>>> +      assert(type->length > 0);
>>> +      return st_glsl_attrib_type_size(type->fields.array, is_vs_input) *
>>> type->length;
>>> +   case GLSL_TYPE_STRUCT:
>>> +      size = 0;
>>> +      for (i = 0; i < type->length; i++) {
>>> +         size += st_glsl_attrib_type_size(type->fields.structure[i].type,
>>> is_vs_input);
>>> +      }
>>> +      return size;
>>> +   case GLSL_TYPE_SAMPLER:
>>> +   case GLSL_TYPE_IMAGE:
>>> +   case GLSL_TYPE_SUBROUTINE:
>>> +      /* Samplers take up one slot in UNIFORMS[], but they're baked in
>>> +       * at link time.
>>> +       */
>>> +      return 1;
>>> +   case GLSL_TYPE_ATOMIC_UINT:
>>> +   case GLSL_TYPE_INTERFACE:
>>> +   case GLSL_TYPE_VOID:
>>> +   case GLSL_TYPE_ERROR:
>>> +   case GLSL_TYPE_FUNCTION:
>>> +      assert(!"Invalid type in type_size");
>>> +      break;
>>> +   }
>>> +   return 0;
>>> +}
>>> +
>>> +int
>>> +st_glsl_type_size(const struct glsl_type *type)
>>> +{
>>> +   return st_glsl_attrib_type_size(type, false);
>>> +}
>>> diff --git a/src/mesa/state_tracker/st_glsl_types.h
>>> b/src/mesa/state_tracker/st_glsl_types.h
>>> new file mode 100644
>>> index 0000000..3a39cee
>>> --- /dev/null
>>> +++ b/src/mesa/state_tracker/st_glsl_types.h
>>> @@ -0,0 +1,44 @@
>>> +/*
>>> + * Copyright (C) 2005-2007  Brian Paul   All Rights Reserved.
>>> + * Copyright (C) 2008  VMware, Inc.   All Rights Reserved.
>>> + * Copyright © 2010 Intel Corporation
>>> + * Copyright © 2011 Bryan Cain
>>> + *
>>> + * Permission is hereby granted, free of charge, to any person obtaining
>>> a
>>> + * copy of this software and associated documentation files (the
>>> "Software"),
>>> + * to deal in the Software without restriction, including without
>>> limitation
>>> + * the rights to use, copy, modify, merge, publish, distribute,
>>> sublicense,
>>> + * and/or sell copies of the Software, and to permit persons to whom the
>>> + * Software is furnished to do so, subject to the following conditions:
>>> + *
>>> + * The above copyright notice and this permission notice (including the
>>> next
>>> + * paragraph) shall be included in all copies or substantial portions of
>>> the
>>> + * Software.
>>> + *
>>> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
>>> EXPRESS OR
>>> + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
>>> MERCHANTABILITY,
>>> + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT
>>> SHALL
>>> + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
>>> OTHER
>>> + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
>>> ARISING
>>> + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
>>> + * DEALINGS IN THE SOFTWARE.
>>> + */
>>> +
>>> +#ifndef __ST_GLSL_TYPES_H__
>>> +#define __ST_GLSL_TYPES_H__
>>> +
>>> +#include "compiler/glsl_types.h"
>>> +
>>> +#ifdef __cplusplus
>>> +extern "C" {
>>> +#endif
>>> +
>>> +int st_glsl_attrib_type_size(const struct glsl_type *type, bool
>>> is_vs_input);
>>> +int st_glsl_type_size(const struct glsl_type *type);
>>> +
>>> +
>>> +#ifdef __cplusplus
>>> +}
>>> +#endif
>>> +
>>> +#endif /* __ST_GLSL_TYPES_H__ */
>>>
>>



More information about the mesa-dev mailing list