From eccf0bf5f2e261b315b2a473667f71cae50c6001 Mon Sep 17 00:00:00 2001 From: Ian Romanick Date: Tue, 9 Mar 2010 15:17:37 -0800 Subject: [PATCH] Make glsl_type a class Among other benefits, this cleans up a the hackery invovled in initializing the union field in builtin_types.h. --- Makefile.am | 2 +- builtin_types.sh | 13 ++++----- glsl_types.c => glsl_types.cpp | 15 ---------- glsl_types.h | 53 ++++++++++++++++++++++++++++++---- 4 files changed, 54 insertions(+), 29 deletions(-) rename glsl_types.c => glsl_types.cpp (92%) diff --git a/Makefile.am b/Makefile.am index 1fc8aa97a27..77b401357a2 100644 --- a/Makefile.am +++ b/Makefile.am @@ -23,7 +23,7 @@ AUTOMAKE_OPTIONS = foreign bin_PROGRAMS = glsl -glsl_SOURCES = symbol_table.c hash_table.c glsl_types.c \ +glsl_SOURCES = symbol_table.c hash_table.c glsl_types.cpp \ glsl_parser.ypp glsl_lexer.lpp glsl_parser_extras.cpp \ ast_expr.cpp ast_to_hir.cpp ir.cpp hir_field_selection.cpp diff --git a/builtin_types.sh b/builtin_types.sh index 19dcbaf124e..3c8fd879e32 100755 --- a/builtin_types.sh +++ b/builtin_types.sh @@ -24,7 +24,7 @@ # gen_integral_type function gen_integral_type { - printf ' { %17s, 0, 0, 0, 0, %u, %u, "%s", 0, {NULL} },\n' $2 $3 $4 $1 + printf ' glsl_type( %17s, %u, %u, "%s"),\n' $2 $3 $4 $1 index=$((index + 1)) } @@ -32,8 +32,8 @@ function gen_integral_type function gen_struct_type { elements=$(printf "%s_fields" $1) - printf ' {\n GLSL_TYPE_STRUCT, 0, 0, 0, 0, 0, 0, "%s",\n Elements(%s),\n {(void *) %s}\n },\n' \ - $1 $elements $elements + printf ' glsl_type(%s,\n Elements(%s),\n "%s"),\n' \ + $elements $elements $1 } # gen_sampler_type @@ -55,7 +55,7 @@ function gen_sampler_type name=$(printf "u%s" $name) fi - printf ' { GLSL_TYPE_SAMPLER, %21s, %u, %u, %15s, 0, 0,\n "%s", 0, {NULL} },\n' \ + printf ' glsl_type(%21s, %u, %u, %15s, "%s"),\n' \ $2 $3 $4 $5 $name } @@ -119,9 +119,8 @@ cat <base_type = GLSL_TYPE_ARRAY; - type->name = name; - type->length = length; - type->fields.array = base; - - return type; -} - - static void add_types_to_symbol_table(struct _mesa_symbol_table *symtab, const struct glsl_type *types, diff --git a/glsl_types.h b/glsl_types.h index c69da956224..9a70b8bfd4d 100644 --- a/glsl_types.h +++ b/glsl_types.h @@ -25,6 +25,8 @@ #ifndef GLSL_TYPES_H #define GLSL_TYPES_H +#include + #define GLSL_TYPE_UINT 0 #define GLSL_TYPE_INT 1 #define GLSL_TYPE_FLOAT 2 @@ -44,12 +46,14 @@ #define is_error_type(t) ((t)->base_type == GLSL_TYPE_ERROR) -#define GLSL_SAMPLER_DIM_1D 0 -#define GLSL_SAMPLER_DIM_2D 1 -#define GLSL_SAMPLER_DIM_3D 2 -#define GLSL_SAMPLER_DIM_CUBE 3 -#define GLSL_SAMPLER_DIM_RECT 4 -#define GLSL_SAMPLER_DIM_BUF 5 +enum glsl_sampler_dim { + GLSL_SAMPLER_DIM_1D = 0, + GLSL_SAMPLER_DIM_2D, + GLSL_SAMPLER_DIM_3D, + GLSL_SAMPLER_DIM_CUBE, + GLSL_SAMPLER_DIM_RECT, + GLSL_SAMPLER_DIM_BUF +}; struct glsl_type { @@ -94,6 +98,43 @@ struct glsl_type { const struct glsl_type *parameters; /**< Parameters to function. */ const struct glsl_struct_field *structure;/**< List of struct fields. */ } fields; + + + glsl_type(unsigned base_type, unsigned vector_elements, + unsigned matrix_rows, const char *name) : + base_type(base_type), + sampler_dimensionality(0), sampler_shadow(0), sampler_array(0), + sampler_type(0), + vector_elements(vector_elements), matrix_rows(matrix_rows), + name(name), + length(0) + { + memset(& fields, 0, sizeof(fields)); + } + + glsl_type(enum glsl_sampler_dim dim, bool shadow, bool array, + unsigned type, const char *name) : + base_type(GLSL_TYPE_SAMPLER), + sampler_dimensionality(dim), sampler_shadow(shadow), + sampler_array(array), sampler_type(type), + vector_elements(0), matrix_rows(0), + name(name), + length(0) + { + memset(& fields, 0, sizeof(fields)); + } + + glsl_type(const glsl_struct_field *fields, unsigned num_fields, + const char *name) : + base_type(GLSL_TYPE_STRUCT), + sampler_dimensionality(0), sampler_shadow(0), sampler_array(0), + sampler_type(0), + vector_elements(0), matrix_rows(0), + name(name), + length(num_fields) + { + this->fields.structure = fields; + } }; #define is_glsl_type_scalar(t) \ -- 2.30.2