Among other benefits, this cleans up a the hackery invovled in initializing the union field in builtin_types.h.tags/mesa-7.9-rc1
@@ -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 | |||
@@ -24,7 +24,7 @@ | |||
# gen_integral_type <name> <base_type> <vector elements> <matrix rows> | |||
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 <name> <dimensions> <shadow> <array> <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 <<EOF | |||
#define Elements(x) (sizeof(x)/sizeof(*(x))) | |||
#endif | |||
static const struct glsl_type error_type = { | |||
GLSL_TYPE_ERROR, 0, 0, 0, 0, 0, 0, "", 0, {NULL} | |||
}; | |||
static const struct glsl_type error_type = | |||
glsl_type(GLSL_TYPE_ERROR, 0, 0, ""); | |||
const struct glsl_type *const glsl_error_type = & error_type; | |||
@@ -28,21 +28,6 @@ | |||
#include "builtin_types.h" | |||
struct glsl_type * | |||
_mesa_glsl_array_type_ctor(struct glsl_type *base, unsigned length, | |||
const char *name) | |||
{ | |||
struct glsl_type *type = calloc(1, sizeof(*type)); | |||
type->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, |
@@ -25,6 +25,8 @@ | |||
#ifndef GLSL_TYPES_H | |||
#define GLSL_TYPES_H | |||
#include <cstring> | |||
#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) \ |