mirror of
https://git.code.sf.net/p/quake/quakeforge
synced 2025-04-07 01:42:04 +00:00
[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:
parent
ed88152f85
commit
17ae2b592c
2 changed files with 76 additions and 7 deletions
|
@ -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"
|
||||
|
|
|
@ -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:
|
||||
|
|
Loading…
Reference in a new issue