[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