diff --git a/tools/qfcc/source/glsl-builtins.c b/tools/qfcc/source/glsl-builtins.c index 0391925d0..414291501 100644 --- a/tools/qfcc/source/glsl-builtins.c +++ b/tools/qfcc/source/glsl-builtins.c @@ -362,7 +362,7 @@ SRC_LINE "@generic(genFType=@vector(float)," "\n" " genDType=@vector(double)," "\n" " genIType=@vector(int)," "\n" -" genUType=@vector(unsigned int)," "\n" +" genUType=@vector(uint)," "\n" " genBType=@vector(bool)," "\n" " mat=@matrix(float)," "\n" " vec=[vec2,vec3,vec4,dvec2,dvec3,dvec4]," "\n" @@ -869,8 +869,8 @@ SRC_LINE "#define writeonly" "\n" "#define __image(t,d,m,a,s) @handle t##image##d##m##a##s" "\n" "#define _image(d,m,a,s) __image(,d,m,a,s),__image(i,d,m,a,s),__image(u,d,m,a,s)\n" -"#define gvec4 @vector(gimage.base_type, 4)" "\n" -"#define gvec4MS @vector(gimageMS.base_type, 4)" "\n" +"#define gvec4 @vector(gimage.sample_type, 4)" "\n" +"#define gvec4MS @vector(gimageMS.sample_type, 4)" "\n" "#define IMAGE_PARAMS gimage image, gimage.coord_type P" "\n" "#define IMAGE_PARAMS_MS gimageMS image, gimageMS.coord_type P, int sample" "\n" "@generic(gimage=[_image(1D,,,)," "\n" @@ -891,8 +891,8 @@ SRC_LINE "gvec4MS imageLoad(readonly IMAGE_PARAMS_MS) = " SPV(OpImageRead) ";" "\n" "void imageStore(writeonly IMAGE_PARAMS, gvec4 data) = " SPV(OpImageWrite) ";" "\n" "void imageStore(writeonly IMAGE_PARAMS_MS, gvec4MS data) = " SPV(OpImageWrite) ";" "\n" -"@pointer(gimage.base_type) __imageTexel(IMAGE_PARAMS, int sample) = " SPV(OpImageTexelPointer) ";" "\n" -"@pointer(gimageMS.base_type) __imageTexel(IMAGE_PARAMS_MS) = " SPV(OpImageTexelPointer) ";" "\n" +"@pointer(gimage.sample_type) __imageTexel(IMAGE_PARAMS, int sample) = " SPV(OpImageTexelPointer) ";" "\n" +"@pointer(gimageMS.sample_type) __imageTexel(IMAGE_PARAMS_MS) = " SPV(OpImageTexelPointer) ";" "\n" "#define __imageAtomic(op,type) \\" "\n" "type imageAtomic##op(IMAGE_PARAMS, type data) \\" "\n" "{ \\" "\n" @@ -996,8 +996,8 @@ SRC_LINE "#define writeonly" "\n" "#define __spI(t,m) @handle t##subpassInput##m" "\n" "#define _subpassInput(x,m) __spI(,m),__spI(i,m),__spI(u,m)" "\n" -"#define gvec4 @vector(gsubpassInput.base_type, 4)" "\n" -"#define gvec4MS @vector(gsubpassInputMS.base_type, 4)" "\n" +"#define gvec4 @vector(gsubpassInput.sample_type, 4)" "\n" +"#define gvec4MS @vector(gsubpassInputMS.sample_type, 4)" "\n" "@generic(gsubpassInput=[_subpassInput(,)]," "\n" " gsubpassInputMS=[_subpassInput(,MS)]) {" "\n" "gvec4 subpassLoad(gsubpassInput subpass)" "\n" diff --git a/tools/qfcc/source/glsl-parse.y b/tools/qfcc/source/glsl-parse.y index dae446652..36908caa2 100644 --- a/tools/qfcc/source/glsl-parse.y +++ b/tools/qfcc/source/glsl-parse.y @@ -1631,6 +1631,74 @@ find_image_sub (image_sub_t *sub, const char *str) return nullptr; } +static const expr_t * +image_attrib (const type_t *type, const attribute_t *attr) +{ + auto image = &glsl_imageset.a[type->handle.extra]; + + if (strcmp (attr->name, "sample_type") == 0) { + return new_type_expr (image->sample_type); + } else if (strcmp (attr->name, "coord_type") == 0) { + int width = 0; + switch (image->dim) { + case glid_1d: + width = 1 + image->arrayed; + break; + case glid_2d: + width = 2 + image->arrayed; + break; + case glid_3d: + case glid_cube: + width = 3; + break; + case glid_rect: + width = 2; + break; + case glid_buffer: + width = 1; + break; + case glid_subpassdata: + width = 2; + break; + } + if (!width) { + internal_error (0, "image has bogus dimension"); + } + return new_type_expr (vector_type (&type_int, width)); + } else if (strcmp (attr->name, "size_type") == 0) { + int width = 0; + switch (image->dim) { + case glid_1d: + width = 1 + image->arrayed; + break; + case glid_2d: + width = 2 + image->arrayed; + break; + case glid_3d: + width = 3; + break; + case glid_cube: + width = 2 + image->arrayed; + break; + case glid_rect: + width = 2; + break; + case glid_buffer: + width = 1; + break; + case glid_subpassdata: + // shouldn't actually happen, but doesn't hurt + width = 2; + break; + } + if (!width) { + internal_error (0, "image has bogus dimension"); + } + return new_type_expr (vector_type (&type_int, width)); + } + return error (0, "no attribute %s on %s", attr->name, type->name + 4); +} + static symbol_t * glsl_parse_image (const char *token, rua_ctx_t *ctx) { @@ -1752,6 +1820,7 @@ glsl_parse_image (const char *token, rua_ctx_t *ctx) } t->handle.type = type.htype; t->handle.extra = index; + t->attrib = image_attrib; return sym; invalid: