From 697382eb61a9091ea0fa8b5836c9e7d281e9e1c5 Mon Sep 17 00:00:00 2001 From: Rob Clark Date: Thu, 24 Mar 2016 14:14:36 -0400 Subject: [PATCH] mesa/st: split the type_size calculation into it's own file MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit We'll want to re-use this for NIR. Signed-off-by: Rob Clark Reviewed-by: Marek Olšák --- src/mesa/Makefile.sources | 2 + src/mesa/state_tracker/st_glsl_to_tgsi.cpp | 64 +------------ src/mesa/state_tracker/st_glsl_types.cpp | 101 +++++++++++++++++++++ src/mesa/state_tracker/st_glsl_types.h | 44 +++++++++ 4 files changed, 150 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 2ffbb152e3c..14022adba34 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 9cf204a3cac..58b66340202 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) | \ @@ -1165,72 +1166,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 00000000000..857e143287f --- /dev/null +++ b/src/mesa/state_tracker/st_glsl_types.cpp @@ -0,0 +1,101 @@ +/* + * 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" + +/** + * Returns type size in units of vec4 slots. + */ +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 00000000000..3a39ceefea4 --- /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__ */ -- 2.30.2