diff --git a/tools/qfcc/source/glsl-layout.c b/tools/qfcc/source/glsl-layout.c index 147a6bf87..78ccb9922 100644 --- a/tools/qfcc/source/glsl-layout.c +++ b/tools/qfcc/source/glsl-layout.c @@ -123,6 +123,21 @@ glsl_layout_set_property (specifier_t spec, const expr_t *qual_name, expr_string (qual_name), get_value_string (val->value)); } +static void +glsl_layout_format (specifier_t spec, const expr_t *qual_name) +{ +} + +static void +glsl_layout_push_constant (specifier_t spec, const expr_t *qual_name) +{ +} + +static void +glsl_layout_execution_mode (specifier_t spec, const expr_t *qual_name) +{ +} + typedef enum { decl_var = 1 << 0, decl_qual = 1 << 1, @@ -218,7 +233,7 @@ static layout_qual_t layout_qualifiers[] = { .if_mask = I(uniform)|I(buffer), }, { .name = "push_constant", - .apply = A(nullptr), + .apply = A(glsl_layout_push_constant), .obj_mask = D(block), .var_type = V(any), .if_mask = I(uniform), @@ -365,7 +380,7 @@ static layout_qual_t layout_qualifiers[] = { .stage_filter = C { "fragment", nullptr }, }, { .name = "early_fragment_tests", - .apply = A(nullptr), + .apply = A(glsl_layout_execution_mode), .obj_mask = D(qual), .if_mask = I(in), .stage_filter = C { "fragment", nullptr }, @@ -518,235 +533,235 @@ static layout_qual_t layout_qualifiers[] = { }, { .name = "rgba32f", - .apply = A(nullptr), + .apply = A(glsl_layout_format), .obj_mask = D(var), .var_type = V(image), .if_mask = I(uniform), }, { .name = "rgba16f", - .apply = A(nullptr), + .apply = A(glsl_layout_format), .obj_mask = D(var), .var_type = V(image), .if_mask = I(uniform), }, { .name = "rg32f", - .apply = A(nullptr), + .apply = A(glsl_layout_format), .obj_mask = D(var), .var_type = V(image), .if_mask = I(uniform), }, { .name = "rg16f", - .apply = A(nullptr), + .apply = A(glsl_layout_format), .obj_mask = D(var), .var_type = V(image), .if_mask = I(uniform), }, { .name = "r11f_g11f_b10f", - .apply = A(nullptr), + .apply = A(glsl_layout_format), .obj_mask = D(var), .var_type = V(image), .if_mask = I(uniform), }, { .name = "r32f", - .apply = A(nullptr), + .apply = A(glsl_layout_format), .obj_mask = D(var), .var_type = V(image), .if_mask = I(uniform), }, { .name = "r16f", - .apply = A(nullptr), + .apply = A(glsl_layout_format), .obj_mask = D(var), .var_type = V(image), .if_mask = I(uniform), }, { .name = "rgba16", - .apply = A(nullptr), + .apply = A(glsl_layout_format), .obj_mask = D(var), .var_type = V(image), .if_mask = I(uniform), }, { .name = "rgb10_a2", - .apply = A(nullptr), + .apply = A(glsl_layout_format), .obj_mask = D(var), .var_type = V(image), .if_mask = I(uniform), }, { .name = "rgba8", - .apply = A(nullptr), + .apply = A(glsl_layout_format), .obj_mask = D(var), .var_type = V(image), .if_mask = I(uniform), }, { .name = "rg16", - .apply = A(nullptr), + .apply = A(glsl_layout_format), .obj_mask = D(var), .var_type = V(image), .if_mask = I(uniform), }, { .name = "rg8", - .apply = A(nullptr), + .apply = A(glsl_layout_format), .obj_mask = D(var), .var_type = V(image), .if_mask = I(uniform), }, { .name = "r16", - .apply = A(nullptr), + .apply = A(glsl_layout_format), .obj_mask = D(var), .var_type = V(image), .if_mask = I(uniform), }, { .name = "r8", - .apply = A(nullptr), + .apply = A(glsl_layout_format), .obj_mask = D(var), .var_type = V(image), .if_mask = I(uniform), }, { .name = "rgba16_snorm", - .apply = A(nullptr), + .apply = A(glsl_layout_format), .obj_mask = D(var), .var_type = V(image), .if_mask = I(uniform), }, { .name = "rgba8_snorm", - .apply = A(nullptr), + .apply = A(glsl_layout_format), .obj_mask = D(var), .var_type = V(image), .if_mask = I(uniform), }, { .name = "rg16_snorm", - .apply = A(nullptr), + .apply = A(glsl_layout_format), .obj_mask = D(var), .var_type = V(image), .if_mask = I(uniform), }, { .name = "rg8_snorm", - .apply = A(nullptr), + .apply = A(glsl_layout_format), .obj_mask = D(var), .var_type = V(image), .if_mask = I(uniform), }, { .name = "r16_snorm", - .apply = A(nullptr), + .apply = A(glsl_layout_format), .obj_mask = D(var), .var_type = V(image), .if_mask = I(uniform), }, { .name = "r8_snorm", - .apply = A(nullptr), + .apply = A(glsl_layout_format), .obj_mask = D(var), .var_type = V(image), .if_mask = I(uniform), }, { .name = "rgba32i", - .apply = A(nullptr), + .apply = A(glsl_layout_format), .obj_mask = D(var), .var_type = V(image), .if_mask = I(uniform), }, { .name = "rgba16i", - .apply = A(nullptr), + .apply = A(glsl_layout_format), .obj_mask = D(var), .var_type = V(image), .if_mask = I(uniform), }, { .name = "rgba8i", - .apply = A(nullptr), + .apply = A(glsl_layout_format), .obj_mask = D(var), .var_type = V(image), .if_mask = I(uniform), }, { .name = "rg32i", - .apply = A(nullptr), + .apply = A(glsl_layout_format), .obj_mask = D(var), .var_type = V(image), .if_mask = I(uniform), }, { .name = "rg16i", - .apply = A(nullptr), + .apply = A(glsl_layout_format), .obj_mask = D(var), .var_type = V(image), .if_mask = I(uniform), }, { .name = "rg8i", - .apply = A(nullptr), + .apply = A(glsl_layout_format), .obj_mask = D(var), .var_type = V(image), .if_mask = I(uniform), }, { .name = "r32i", - .apply = A(nullptr), + .apply = A(glsl_layout_format), .obj_mask = D(var), .var_type = V(image), .if_mask = I(uniform), }, { .name = "r16i", - .apply = A(nullptr), + .apply = A(glsl_layout_format), .obj_mask = D(var), .var_type = V(image), .if_mask = I(uniform), }, { .name = "r8i", - .apply = A(nullptr), + .apply = A(glsl_layout_format), .obj_mask = D(var), .var_type = V(image), .if_mask = I(uniform), }, { .name = "rgba32ui", - .apply = A(nullptr), + .apply = A(glsl_layout_format), .obj_mask = D(var), .var_type = V(image), .if_mask = I(uniform), }, { .name = "rgba16ui", - .apply = A(nullptr), + .apply = A(glsl_layout_format), .obj_mask = D(var), .var_type = V(image), .if_mask = I(uniform), }, { .name = "rgb10_a2ui", - .apply = A(nullptr), + .apply = A(glsl_layout_format), .obj_mask = D(var), .var_type = V(image), .if_mask = I(uniform), }, { .name = "rgba8ui", - .apply = A(nullptr), + .apply = A(glsl_layout_format), .obj_mask = D(var), .var_type = V(image), .if_mask = I(uniform), }, { .name = "rg32ui", - .apply = A(nullptr), + .apply = A(glsl_layout_format), .obj_mask = D(var), .var_type = V(image), .if_mask = I(uniform), }, { .name = "rg16ui", - .apply = A(nullptr), + .apply = A(glsl_layout_format), .obj_mask = D(var), .var_type = V(image), .if_mask = I(uniform), }, { .name = "rg8ui", - .apply = A(nullptr), + .apply = A(glsl_layout_format), .obj_mask = D(var), .var_type = V(image), .if_mask = I(uniform), }, { .name = "r32ui", - .apply = A(nullptr), + .apply = A(glsl_layout_format), .obj_mask = D(var), .var_type = V(image), .if_mask = I(uniform), }, { .name = "r16ui", - .apply = A(nullptr), + .apply = A(glsl_layout_format), .obj_mask = D(var), .var_type = V(image), .if_mask = I(uniform), }, { .name = "r8ui", - .apply = A(nullptr), + .apply = A(glsl_layout_format), .obj_mask = D(var), .var_type = V(image), .if_mask = I(uniform), @@ -784,9 +799,22 @@ layout_check_qualifier (const layout_qual_t *qual, specifier_t spec) if (spec.sym) { auto sym = spec.sym; if (sym->type) { - if (is_handle (sym->type)) { + auto type = sym->type; + if (is_reference (type)) { + type = dereference_type (type); + } + //FIXME is_handle works only for glsl as there are no user handles + if (is_handle (type)) { var_type = var_opaque; - } else if (spec.is_const && is_scalar (sym->type)) { + // images are opaque types, but certain qualifiers support + // only images and not other opaque types, but qualifiers that + // support opaque types in general also support images + if (qual->var_type == var_image + //FIXME shouldn't rely on name + && strstr (type->name, "image")) { + var_type = var_image; + } + } else if (spec.is_const && is_scalar (type)) { var_type = var_scalar; } else if (strcmp (sym->name, "gl_FragCoord") == 0) { var_type = var_gl_FragCoord; @@ -868,7 +896,7 @@ layout_apply_qualifier (const expr_t *qualifier, specifier_t spec) } return; } else if (qual->apply) { - if (!val) { + if (val) { error (qualifier, "%s does not take a value", key.name); } else { qual->apply (spec, qualifier->expr.e1);