mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-08 15:38:09 +02:00
mesa: fix some more GLSL 1.20 array things.
Function that return arrays should work now.
This commit is contained in:
parent
d5367622a3
commit
8571401d7d
2 changed files with 33 additions and 12 deletions
|
|
@ -67,9 +67,9 @@ _slang_gen_operation(slang_assemble_ctx * A, slang_operation *oper);
|
|||
* Returns GL_FALSE otherwise.
|
||||
*/
|
||||
static GLboolean
|
||||
typeof_operation(const struct slang_assemble_ctx_ * A,
|
||||
slang_operation * op,
|
||||
slang_typeinfo * ti)
|
||||
typeof_operation(const struct slang_assemble_ctx_ *A,
|
||||
slang_operation *op,
|
||||
slang_typeinfo *ti)
|
||||
{
|
||||
return _slang_typeof_operation(op, &A->space, ti, A->atoms, A->log);
|
||||
}
|
||||
|
|
@ -2559,6 +2559,14 @@ _slang_gen_var_decl(slang_assemble_ctx *A, slang_variable *var,
|
|||
(void *) store, store->Index, store->Size);
|
||||
#endif
|
||||
|
||||
if (var->type.array_len > 0) {
|
||||
/* the type is an array, ex: float[4] x; */
|
||||
GLint sz = (store->Size + 3) & ~3;
|
||||
/* total size = element size * array length */
|
||||
sz *= var->type.array_len;
|
||||
store->Size = sz;
|
||||
}
|
||||
|
||||
if (var->array_len > 0) {
|
||||
/* this is an array */
|
||||
/* round up the element size to a multiple of 4 */
|
||||
|
|
|
|||
|
|
@ -345,6 +345,20 @@ calculate_var_size(slang_parse_ctx * C, slang_output_ctx * O,
|
|||
return GL_TRUE;
|
||||
}
|
||||
|
||||
static void
|
||||
promote_type_to_array(slang_parse_ctx *C,
|
||||
slang_fully_specified_type *type,
|
||||
GLint array_len)
|
||||
{
|
||||
slang_type_specifier *baseType =
|
||||
slang_type_specifier_new(type->specifier.type, NULL, NULL);
|
||||
|
||||
type->specifier.type = SLANG_SPEC_ARRAY;
|
||||
type->specifier._array = baseType;
|
||||
type->array_len = array_len;
|
||||
}
|
||||
|
||||
|
||||
static GLboolean
|
||||
convert_to_array(slang_parse_ctx * C, slang_variable * var,
|
||||
const slang_type_specifier * sp)
|
||||
|
|
@ -889,6 +903,11 @@ parse_fully_specified_type(slang_parse_ctx * C, slang_output_ctx * O,
|
|||
RETURN0;
|
||||
}
|
||||
|
||||
if (type->array_len >= 0) {
|
||||
/* convert type to array type (ex: convert "int" to "array of int" */
|
||||
promote_type_to_array(C, type, type->array_len);
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
|
@ -1972,6 +1991,7 @@ parse_init_declarator(slang_parse_ctx * C, slang_output_ctx * O,
|
|||
var->type.centroid = type->centroid;
|
||||
var->type.precision = type->precision;
|
||||
var->type.variant = type->variant;
|
||||
var->type.array_len = type->array_len;
|
||||
var->a_name = a_name;
|
||||
if (var->a_name == SLANG_ATOM_NULL)
|
||||
RETURN0;
|
||||
|
|
@ -1979,15 +1999,8 @@ parse_init_declarator(slang_parse_ctx * C, slang_output_ctx * O,
|
|||
switch (*C->I++) {
|
||||
case VARIABLE_NONE:
|
||||
/* simple variable declarator - just copy the specifier */
|
||||
if (type->array_len >= 0) {
|
||||
/* The type was something like "float[4]" */
|
||||
convert_to_array(C, var, &type->specifier);
|
||||
var->array_len = type->array_len;
|
||||
}
|
||||
else {
|
||||
if (!slang_type_specifier_copy(&var->type.specifier, &type->specifier))
|
||||
RETURN0;
|
||||
}
|
||||
if (!slang_type_specifier_copy(&var->type.specifier, &type->specifier))
|
||||
RETURN0;
|
||||
break;
|
||||
case VARIABLE_INITIALIZER:
|
||||
/* initialized variable - copy the specifier and parse the expression */
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue