diff options
-rw-r--r-- | src/compiler/glsl_types.cpp | 4 | ||||
-rw-r--r-- | src/gallium/drivers/freedreno/ir3/ir3_cmdline.c | 15 | ||||
-rw-r--r-- | src/gallium/drivers/freedreno/ir3/ir3_shader.c | 6 | ||||
-rw-r--r-- | src/gallium/drivers/freedreno/ir3/ir3_shader.h | 5 | ||||
-rw-r--r-- | src/gallium/drivers/vc4/vc4_program.c | 10 | ||||
-rw-r--r-- | src/mesa/Makefile.sources | 2 | ||||
-rw-r--r-- | src/mesa/state_tracker/st_glsl_to_nir.cpp | 17 | ||||
-rw-r--r-- | src/mesa/state_tracker/st_glsl_to_tgsi.cpp | 5 | ||||
-rw-r--r-- | src/mesa/state_tracker/st_glsl_types.cpp | 107 | ||||
-rw-r--r-- | src/mesa/state_tracker/st_glsl_types.h | 44 |
10 files changed, 42 insertions, 173 deletions
diff --git a/src/compiler/glsl_types.cpp b/src/compiler/glsl_types.cpp index 188b72f345a..99cc696c19b 100644 --- a/src/compiler/glsl_types.cpp +++ b/src/compiler/glsl_types.cpp @@ -1999,10 +1999,12 @@ glsl_type::count_attribute_slots(bool is_vertex_input) const case GLSL_TYPE_ARRAY: return this->length * this->fields.array->count_attribute_slots(is_vertex_input); + case GLSL_TYPE_SUBROUTINE: + return 1; + case GLSL_TYPE_FUNCTION: case GLSL_TYPE_ATOMIC_UINT: case GLSL_TYPE_VOID: - case GLSL_TYPE_SUBROUTINE: case GLSL_TYPE_ERROR: break; } diff --git a/src/gallium/drivers/freedreno/ir3/ir3_cmdline.c b/src/gallium/drivers/freedreno/ir3/ir3_cmdline.c index fdec3f20b0d..cfcb807de31 100644 --- a/src/gallium/drivers/freedreno/ir3/ir3_cmdline.c +++ b/src/gallium/drivers/freedreno/ir3/ir3_cmdline.c @@ -46,6 +46,7 @@ #include "compiler/glsl/standalone.h" #include "compiler/glsl/glsl_to_nir.h" +#include "compiler/nir_types.h" static void dump_info(struct ir3_shader_variant *so, const char *str) { @@ -57,8 +58,6 @@ static void dump_info(struct ir3_shader_variant *so, const char *str) free(bin); } -int st_glsl_type_size(const struct glsl_type *type); - static void insert_sorted(struct exec_list *var_list, nir_variable *new_var) { @@ -131,7 +130,7 @@ load_glsl(unsigned num_files, char* const* files, gl_shader_stage stage) case MESA_SHADER_VERTEX: nir_assign_var_locations(&nir->inputs, &nir->num_inputs, - st_glsl_type_size); + ir3_glsl_type_size); /* Re-lower global vars, to deal with any dead VS inputs. */ NIR_PASS_V(nir, nir_lower_global_vars_to_local); @@ -139,18 +138,18 @@ load_glsl(unsigned num_files, char* const* files, gl_shader_stage stage) sort_varyings(&nir->outputs); nir_assign_var_locations(&nir->outputs, &nir->num_outputs, - st_glsl_type_size); + ir3_glsl_type_size); fixup_varying_slots(&nir->outputs); break; case MESA_SHADER_FRAGMENT: sort_varyings(&nir->inputs); nir_assign_var_locations(&nir->inputs, &nir->num_inputs, - st_glsl_type_size); + ir3_glsl_type_size); fixup_varying_slots(&nir->inputs); nir_assign_var_locations(&nir->outputs, &nir->num_outputs, - st_glsl_type_size); + ir3_glsl_type_size); break; default: errx(1, "unhandled shader stage: %d", stage); @@ -158,10 +157,10 @@ load_glsl(unsigned num_files, char* const* files, gl_shader_stage stage) nir_assign_var_locations(&nir->uniforms, &nir->num_uniforms, - st_glsl_type_size); + ir3_glsl_type_size); NIR_PASS_V(nir, nir_lower_system_values); - NIR_PASS_V(nir, nir_lower_io, nir_var_all, st_glsl_type_size, 0); + NIR_PASS_V(nir, nir_lower_io, nir_var_all, ir3_glsl_type_size, 0); NIR_PASS_V(nir, nir_lower_samplers, prog); return nir; diff --git a/src/gallium/drivers/freedreno/ir3/ir3_shader.c b/src/gallium/drivers/freedreno/ir3/ir3_shader.c index a176f16e722..636111b1036 100644 --- a/src/gallium/drivers/freedreno/ir3/ir3_shader.c +++ b/src/gallium/drivers/freedreno/ir3/ir3_shader.c @@ -41,6 +41,12 @@ #include "ir3_compiler.h" #include "ir3_nir.h" +int +ir3_glsl_type_size(const struct glsl_type *type) +{ + return glsl_count_attribute_slots(type, false); +} + static void delete_variant(struct ir3_shader_variant *v) { diff --git a/src/gallium/drivers/freedreno/ir3/ir3_shader.h b/src/gallium/drivers/freedreno/ir3/ir3_shader.h index 6c2af6d3664..9984809ea24 100644 --- a/src/gallium/drivers/freedreno/ir3/ir3_shader.h +++ b/src/gallium/drivers/freedreno/ir3/ir3_shader.h @@ -36,6 +36,8 @@ #include "ir3.h" #include "disasm.h" +struct glsl_type; + /* driver param indices: */ enum ir3_driver_param { /* compute shader driver params: */ @@ -339,6 +341,9 @@ void ir3_emit_fs_consts(const struct ir3_shader_variant *v, struct fd_ringbuffer void ir3_emit_cs_consts(const struct ir3_shader_variant *v, struct fd_ringbuffer *ring, struct fd_context *ctx, const struct pipe_grid_info *info); +int +ir3_glsl_type_size(const struct glsl_type *type); + static inline const char * ir3_shader_stage(struct ir3_shader *shader) { diff --git a/src/gallium/drivers/vc4/vc4_program.c b/src/gallium/drivers/vc4/vc4_program.c index 60eb68e847b..3beac61f313 100644 --- a/src/gallium/drivers/vc4/vc4_program.c +++ b/src/gallium/drivers/vc4/vc4_program.c @@ -33,17 +33,23 @@ #include "tgsi/tgsi_parse.h" #include "compiler/nir/nir.h" #include "compiler/nir/nir_builder.h" +#include "compiler/nir_types.h" #include "nir/tgsi_to_nir.h" #include "vc4_context.h" #include "vc4_qpu.h" #include "vc4_qir.h" -#include "mesa/state_tracker/st_glsl_types.h" static struct qreg ntq_get_src(struct vc4_compile *c, nir_src src, int i); static void ntq_emit_cf_list(struct vc4_compile *c, struct exec_list *list); +static int +type_size(const struct glsl_type *type) +{ + return glsl_count_attribute_slots(type, false); +} + static void resize_qreg_array(struct vc4_compile *c, struct qreg **regs, @@ -1653,7 +1659,7 @@ static void ntq_setup_uniforms(struct vc4_compile *c) { nir_foreach_variable(var, &c->s->uniforms) { - uint32_t vec4_count = st_glsl_type_size(var->type); + uint32_t vec4_count = type_size(var->type); unsigned vec4_size = 4 * sizeof(float); declare_uniform_range(c, var->data.driver_location * vec4_size, diff --git a/src/mesa/Makefile.sources b/src/mesa/Makefile.sources index a21c9084c4c..97c8287acbc 100644 --- a/src/mesa/Makefile.sources +++ b/src/mesa/Makefile.sources @@ -507,8 +507,6 @@ STATETRACKER_FILES = \ state_tracker/st_glsl_to_nir.cpp \ 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_nir.cpp b/src/mesa/state_tracker/st_glsl_to_nir.cpp index c8a7464a008..dd3d6faa753 100644 --- a/src/mesa/state_tracker/st_glsl_to_nir.cpp +++ b/src/mesa/state_tracker/st_glsl_to_nir.cpp @@ -39,7 +39,6 @@ #include "st_context.h" #include "st_program.h" -#include "st_glsl_types.h" #include "compiler/nir/nir.h" #include "compiler/glsl_types.h" @@ -47,6 +46,12 @@ #include "compiler/glsl/ir.h" +static int +type_size(const struct glsl_type *type) +{ + return type->count_attribute_slots(false); +} + /* Depending on PIPE_CAP_TGSI_TEXCOORD (st->needs_texcoord_semantic) we * may need to fix up varying slots so the glsl->nir path is aligned * with the anything->tgsi->nir path. @@ -205,7 +210,7 @@ st_nir_assign_uniform_locations(struct gl_program *prog, uniform->data.driver_location = loc; - max = MAX2(max, loc + st_glsl_type_size(uniform->type)); + max = MAX2(max, loc + type_size(uniform->type)); } *size = max; } @@ -332,17 +337,17 @@ st_finalize_nir(struct st_context *st, struct gl_program *prog, nir_shader *nir) sort_varyings(&nir->outputs); nir_assign_var_locations(&nir->outputs, &nir->num_outputs, - st_glsl_type_size); + type_size); st_nir_fixup_varying_slots(st, &nir->outputs); } else if (nir->stage == MESA_SHADER_FRAGMENT) { sort_varyings(&nir->inputs); nir_assign_var_locations(&nir->inputs, &nir->num_inputs, - st_glsl_type_size); + type_size); st_nir_fixup_varying_slots(st, &nir->inputs); nir_assign_var_locations(&nir->outputs, &nir->num_outputs, - st_glsl_type_size); + type_size); } else if (nir->stage == MESA_SHADER_COMPUTE) { /* TODO? */ } else { @@ -372,7 +377,7 @@ st_finalize_nir(struct st_context *st, struct gl_program *prog, nir_shader *nir) &nir->uniforms, &nir->num_uniforms); NIR_PASS_V(nir, nir_lower_system_values); - NIR_PASS_V(nir, nir_lower_io, nir_var_all, st_glsl_type_size, + NIR_PASS_V(nir, nir_lower_io, nir_var_all, type_size, (nir_lower_io_options)0); if (screen->get_param(screen, PIPE_CAP_NIR_SAMPLERS_AS_DEREF)) NIR_PASS_V(nir, nir_lower_samplers_as_deref, shader_program); diff --git a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp index 3983fe75b8d..2fca398a517 100644 --- a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp +++ b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp @@ -52,7 +52,6 @@ #include "st_program.h" #include "st_mesa_to_tgsi.h" #include "st_format.h" -#include "st_glsl_types.h" #include "st_nir.h" #include "st_shader_cache.h" @@ -1238,13 +1237,13 @@ glsl_to_tgsi_visitor::st_src_reg_for_type(enum glsl_base_type type, int val) static int attrib_type_size(const struct glsl_type *type, bool is_vs_input) { - return st_glsl_attrib_type_size(type, is_vs_input); + return type->count_attribute_slots(is_vs_input); } static int type_size(const struct glsl_type *type) { - return st_glsl_type_size(type); + return type->count_attribute_slots(false); } /** diff --git a/src/mesa/state_tracker/st_glsl_types.cpp b/src/mesa/state_tracker/st_glsl_types.cpp deleted file mode 100644 index 37c3164254a..00000000000 --- a/src/mesa/state_tracker/st_glsl_types.cpp +++ /dev/null @@ -1,107 +0,0 @@ -/* - * 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_UINT64: - case GLSL_TYPE_INT64: - if (type->vector_elements <= 2 || is_vs_input) - return 1; - else - return 2; - 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 deleted file mode 100644 index 3a39ceefea4..00000000000 --- a/src/mesa/state_tracker/st_glsl_types.h +++ /dev/null @@ -1,44 +0,0 @@ -/* - * 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__ */ |