[qfcc] Support attributes on image types

And rename base_type to sample_type: I decided it was a better name as
it's "sampled type" in the spir-v spec.
This commit is contained in:
Bill Currie 2025-01-14 01:07:00 +09:00
parent ed88152f85
commit 17ae2b592c
2 changed files with 76 additions and 7 deletions

View file

@ -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"

View file

@ -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: