glsl: add size qualifiers from EXT_shader_image_load_store
Reviewed-by: Marek Olšák <marek.olsak@amd.com>
This commit is contained in:

committed by
Marek Olšák

parent
cd45d09226
commit
cfba168b6c
@@ -4926,6 +4926,41 @@ ast_declarator_list::hir(exec_list *instructions,
|
||||
assert(!this->invariant);
|
||||
assert(!this->precise);
|
||||
|
||||
/* GL_EXT_shader_image_load_store base type uses GLSL_TYPE_VOID as a special value to
|
||||
* indicate that it needs to be updated later (see glsl_parser.yy).
|
||||
* This is done here, based on the layout qualifier and the type of the image var
|
||||
*/
|
||||
if (this->type->qualifier.flags.q.explicit_image_format &&
|
||||
this->type->specifier->type->is_image() &&
|
||||
this->type->qualifier.image_base_type == GLSL_TYPE_VOID) {
|
||||
/* "The ARB_shader_image_load_store says:
|
||||
* If both extensions are enabled in the shading language, the "size*" layout
|
||||
* qualifiers are treated as format qualifiers, and are mapped to equivalent
|
||||
* format qualifiers in the table below, according to the type of image
|
||||
* variable.
|
||||
* image* iimage* uimage*
|
||||
* -------- -------- --------
|
||||
* size1x8 n/a r8i r8ui
|
||||
* size1x16 r16f r16i r16ui
|
||||
* size1x32 r32f r32i r32ui
|
||||
* size2x32 rg32f rg32i rg32ui
|
||||
* size4x32 rgba32f rgba32i rgba32ui"
|
||||
*/
|
||||
if (strncmp(this->type->specifier->type_name, "image", strlen("image")) == 0) {
|
||||
this->type->qualifier.image_format = GL_R8 +
|
||||
this->type->qualifier.image_format - GL_R8I;
|
||||
this->type->qualifier.image_base_type = GLSL_TYPE_FLOAT;
|
||||
} else if (strncmp(this->type->specifier->type_name, "uimage", strlen("uimage")) == 0) {
|
||||
this->type->qualifier.image_format = GL_R8UI +
|
||||
this->type->qualifier.image_format - GL_R8I;
|
||||
this->type->qualifier.image_base_type = GLSL_TYPE_UINT;
|
||||
} else if (strncmp(this->type->specifier->type_name, "iimage", strlen("iimage")) == 0) {
|
||||
this->type->qualifier.image_base_type = GLSL_TYPE_INT;
|
||||
} else {
|
||||
assert(false);
|
||||
}
|
||||
}
|
||||
|
||||
/* The type specifier may contain a structure definition. Process that
|
||||
* before any of the variable declarations.
|
||||
*/
|
||||
|
@@ -1344,46 +1344,56 @@ layout_qualifier_id:
|
||||
unsigned required_essl;
|
||||
/* NV_image_formats */
|
||||
bool nv_image_formats;
|
||||
bool ext_qualifiers;
|
||||
} map[] = {
|
||||
{ "rgba32f", GL_RGBA32F, GLSL_TYPE_FLOAT, 130, 310, false },
|
||||
{ "rgba16f", GL_RGBA16F, GLSL_TYPE_FLOAT, 130, 310, false },
|
||||
{ "rg32f", GL_RG32F, GLSL_TYPE_FLOAT, 130, 0, true },
|
||||
{ "rg16f", GL_RG16F, GLSL_TYPE_FLOAT, 130, 0, true },
|
||||
{ "r11f_g11f_b10f", GL_R11F_G11F_B10F, GLSL_TYPE_FLOAT, 130, 0, true },
|
||||
{ "r32f", GL_R32F, GLSL_TYPE_FLOAT, 130, 310, false },
|
||||
{ "r16f", GL_R16F, GLSL_TYPE_FLOAT, 130, 0, true },
|
||||
{ "rgba32ui", GL_RGBA32UI, GLSL_TYPE_UINT, 130, 310, false },
|
||||
{ "rgba16ui", GL_RGBA16UI, GLSL_TYPE_UINT, 130, 310, false },
|
||||
{ "rgb10_a2ui", GL_RGB10_A2UI, GLSL_TYPE_UINT, 130, 0, true },
|
||||
{ "rgba8ui", GL_RGBA8UI, GLSL_TYPE_UINT, 130, 310, false },
|
||||
{ "rg32ui", GL_RG32UI, GLSL_TYPE_UINT, 130, 0, true },
|
||||
{ "rg16ui", GL_RG16UI, GLSL_TYPE_UINT, 130, 0, true },
|
||||
{ "rg8ui", GL_RG8UI, GLSL_TYPE_UINT, 130, 0, true },
|
||||
{ "r32ui", GL_R32UI, GLSL_TYPE_UINT, 130, 310, false },
|
||||
{ "r16ui", GL_R16UI, GLSL_TYPE_UINT, 130, 0, true },
|
||||
{ "r8ui", GL_R8UI, GLSL_TYPE_UINT, 130, 0, true },
|
||||
{ "rgba32i", GL_RGBA32I, GLSL_TYPE_INT, 130, 310, false },
|
||||
{ "rgba16i", GL_RGBA16I, GLSL_TYPE_INT, 130, 310, false },
|
||||
{ "rgba8i", GL_RGBA8I, GLSL_TYPE_INT, 130, 310, false },
|
||||
{ "rg32i", GL_RG32I, GLSL_TYPE_INT, 130, 0, true },
|
||||
{ "rg16i", GL_RG16I, GLSL_TYPE_INT, 130, 0, true },
|
||||
{ "rg8i", GL_RG8I, GLSL_TYPE_INT, 130, 0, true },
|
||||
{ "r32i", GL_R32I, GLSL_TYPE_INT, 130, 310, false },
|
||||
{ "r16i", GL_R16I, GLSL_TYPE_INT, 130, 0, true },
|
||||
{ "r8i", GL_R8I, GLSL_TYPE_INT, 130, 0, true },
|
||||
{ "rgba16", GL_RGBA16, GLSL_TYPE_FLOAT, 130, 0, true },
|
||||
{ "rgb10_a2", GL_RGB10_A2, GLSL_TYPE_FLOAT, 130, 0, true },
|
||||
{ "rgba8", GL_RGBA8, GLSL_TYPE_FLOAT, 130, 310, false },
|
||||
{ "rg16", GL_RG16, GLSL_TYPE_FLOAT, 130, 0, true },
|
||||
{ "rg8", GL_RG8, GLSL_TYPE_FLOAT, 130, 0, true },
|
||||
{ "r16", GL_R16, GLSL_TYPE_FLOAT, 130, 0, true },
|
||||
{ "r8", GL_R8, GLSL_TYPE_FLOAT, 130, 0, true },
|
||||
{ "rgba16_snorm", GL_RGBA16_SNORM, GLSL_TYPE_FLOAT, 130, 0, true },
|
||||
{ "rgba8_snorm", GL_RGBA8_SNORM, GLSL_TYPE_FLOAT, 130, 310, false },
|
||||
{ "rg16_snorm", GL_RG16_SNORM, GLSL_TYPE_FLOAT, 130, 0, true },
|
||||
{ "rg8_snorm", GL_RG8_SNORM, GLSL_TYPE_FLOAT, 130, 0, true },
|
||||
{ "r16_snorm", GL_R16_SNORM, GLSL_TYPE_FLOAT, 130, 0, true },
|
||||
{ "r8_snorm", GL_R8_SNORM, GLSL_TYPE_FLOAT, 130, 0, true }
|
||||
{ "rgba32f", GL_RGBA32F, GLSL_TYPE_FLOAT, 130, 310, false, false },
|
||||
{ "rgba16f", GL_RGBA16F, GLSL_TYPE_FLOAT, 130, 310, false, false },
|
||||
{ "rg32f", GL_RG32F, GLSL_TYPE_FLOAT, 130, 0, true, false },
|
||||
{ "rg16f", GL_RG16F, GLSL_TYPE_FLOAT, 130, 0, true, false },
|
||||
{ "r11f_g11f_b10f", GL_R11F_G11F_B10F, GLSL_TYPE_FLOAT, 130, 0, true, false },
|
||||
{ "r32f", GL_R32F, GLSL_TYPE_FLOAT, 130, 310, false, false },
|
||||
{ "r16f", GL_R16F, GLSL_TYPE_FLOAT, 130, 0, true, false },
|
||||
{ "rgba32ui", GL_RGBA32UI, GLSL_TYPE_UINT, 130, 310, false, false },
|
||||
{ "rgba16ui", GL_RGBA16UI, GLSL_TYPE_UINT, 130, 310, false, false },
|
||||
{ "rgb10_a2ui", GL_RGB10_A2UI, GLSL_TYPE_UINT, 130, 0, true, false },
|
||||
{ "rgba8ui", GL_RGBA8UI, GLSL_TYPE_UINT, 130, 310, false, false },
|
||||
{ "rg32ui", GL_RG32UI, GLSL_TYPE_UINT, 130, 0, true, false },
|
||||
{ "rg16ui", GL_RG16UI, GLSL_TYPE_UINT, 130, 0, true, false },
|
||||
{ "rg8ui", GL_RG8UI, GLSL_TYPE_UINT, 130, 0, true, false },
|
||||
{ "r32ui", GL_R32UI, GLSL_TYPE_UINT, 130, 310, false, false },
|
||||
{ "r16ui", GL_R16UI, GLSL_TYPE_UINT, 130, 0, true, false },
|
||||
{ "r8ui", GL_R8UI, GLSL_TYPE_UINT, 130, 0, true, false },
|
||||
{ "rgba32i", GL_RGBA32I, GLSL_TYPE_INT, 130, 310, false, false },
|
||||
{ "rgba16i", GL_RGBA16I, GLSL_TYPE_INT, 130, 310, false, false },
|
||||
{ "rgba8i", GL_RGBA8I, GLSL_TYPE_INT, 130, 310, false, false },
|
||||
{ "rg32i", GL_RG32I, GLSL_TYPE_INT, 130, 0, true, false },
|
||||
{ "rg16i", GL_RG16I, GLSL_TYPE_INT, 130, 0, true, false },
|
||||
{ "rg8i", GL_RG8I, GLSL_TYPE_INT, 130, 0, true, false },
|
||||
{ "r32i", GL_R32I, GLSL_TYPE_INT, 130, 310, false, false },
|
||||
{ "r16i", GL_R16I, GLSL_TYPE_INT, 130, 0, true, false },
|
||||
{ "r8i", GL_R8I, GLSL_TYPE_INT, 130, 0, true, false },
|
||||
{ "rgba16", GL_RGBA16, GLSL_TYPE_FLOAT, 130, 0, true, false },
|
||||
{ "rgb10_a2", GL_RGB10_A2, GLSL_TYPE_FLOAT, 130, 0, true, false },
|
||||
{ "rgba8", GL_RGBA8, GLSL_TYPE_FLOAT, 130, 310, false, false },
|
||||
{ "rg16", GL_RG16, GLSL_TYPE_FLOAT, 130, 0, true, false },
|
||||
{ "rg8", GL_RG8, GLSL_TYPE_FLOAT, 130, 0, true, false },
|
||||
{ "r16", GL_R16, GLSL_TYPE_FLOAT, 130, 0, true, false },
|
||||
{ "r8", GL_R8, GLSL_TYPE_FLOAT, 130, 0, true, false },
|
||||
{ "rgba16_snorm", GL_RGBA16_SNORM, GLSL_TYPE_FLOAT, 130, 0, true, false },
|
||||
{ "rgba8_snorm", GL_RGBA8_SNORM, GLSL_TYPE_FLOAT, 130, 310, false, false },
|
||||
{ "rg16_snorm", GL_RG16_SNORM, GLSL_TYPE_FLOAT, 130, 0, true, false },
|
||||
{ "rg8_snorm", GL_RG8_SNORM, GLSL_TYPE_FLOAT, 130, 0, true, false },
|
||||
{ "r16_snorm", GL_R16_SNORM, GLSL_TYPE_FLOAT, 130, 0, true, false },
|
||||
{ "r8_snorm", GL_R8_SNORM, GLSL_TYPE_FLOAT, 130, 0, true, false },
|
||||
|
||||
/* From GL_EXT_shader_image_load_store: */
|
||||
/* base_type is incorrect but it'll be patched later when we know
|
||||
* the variable type. See ast_to_hir.cpp */
|
||||
{ "size1x8", GL_R8I, GLSL_TYPE_VOID, 130, 0, false, true },
|
||||
{ "size1x16", GL_R16I, GLSL_TYPE_VOID, 130, 0, false, true },
|
||||
{ "size1x32", GL_R32I, GLSL_TYPE_VOID, 130, 0, false, true },
|
||||
{ "size2x32", GL_RG32I, GLSL_TYPE_VOID, 130, 0, false, true },
|
||||
{ "size4x32", GL_RGBA32I, GLSL_TYPE_VOID, 130, 0, false, true },
|
||||
};
|
||||
|
||||
for (unsigned i = 0; i < ARRAY_SIZE(map); i++) {
|
||||
@@ -1392,6 +1402,15 @@ layout_qualifier_id:
|
||||
(state->NV_image_formats_enable &&
|
||||
map[i].nv_image_formats)) &&
|
||||
match_layout_qualifier($1, map[i].name, state) == 0) {
|
||||
/* Skip ARB_shader_image_load_store qualifiers if not enabled */
|
||||
if (!map[i].ext_qualifiers && !(state->ARB_shader_image_load_store_enable ||
|
||||
state->is_version(420, 310))) {
|
||||
continue;
|
||||
}
|
||||
/* Skip EXT_shader_image_load_store qualifiers if not enabled */
|
||||
if (map[i].ext_qualifiers && !state->EXT_shader_image_load_store_enable) {
|
||||
continue;
|
||||
}
|
||||
$$.flags.q.explicit_image_format = 1;
|
||||
$$.image_format = map[i].format;
|
||||
$$.image_base_type = map[i].base_type;
|
||||
|
Reference in New Issue
Block a user