spirv: Validate Dim of OpTypeSampledImage and OpSampledImage
Reviewed-by: Ian Romanick <ian.d.romanick@intel.com> Reviewed-by: Faith Ekstrand <faith.ekstrand@collabora.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/14244>
This commit is contained in:
@@ -1474,6 +1474,37 @@ translate_image_format(struct vtn_builder *b, SpvImageFormat format)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
validate_image_type_for_sampled_image(struct vtn_builder *b,
|
||||||
|
const struct glsl_type *image_type,
|
||||||
|
const char *operand)
|
||||||
|
{
|
||||||
|
/* From OpTypeSampledImage description in SPIR-V 1.6, revision 1:
|
||||||
|
*
|
||||||
|
* Image Type must be an OpTypeImage. It is the type of the image in the
|
||||||
|
* combined sampler and image type. It must not have a Dim of
|
||||||
|
* SubpassData. Additionally, starting with version 1.6, it must not have
|
||||||
|
* a Dim of Buffer.
|
||||||
|
*
|
||||||
|
* Same also applies to the type of the Image operand in OpSampledImage.
|
||||||
|
*/
|
||||||
|
|
||||||
|
const enum glsl_sampler_dim dim = glsl_get_sampler_dim(image_type);
|
||||||
|
|
||||||
|
vtn_fail_if(dim == GLSL_SAMPLER_DIM_SUBPASS ||
|
||||||
|
dim == GLSL_SAMPLER_DIM_SUBPASS_MS,
|
||||||
|
"%s must not have a Dim of SubpassData.", operand);
|
||||||
|
|
||||||
|
if (dim == GLSL_SAMPLER_DIM_BUF) {
|
||||||
|
if (b->version >= 0x10600) {
|
||||||
|
vtn_fail("Starting with SPIR-V 1.6, %s "
|
||||||
|
"must not have a Dim of Buffer.", operand);
|
||||||
|
} else {
|
||||||
|
vtn_warn("%s should not have a Dim of Buffer.", operand);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
vtn_handle_type(struct vtn_builder *b, SpvOp opcode,
|
vtn_handle_type(struct vtn_builder *b, SpvOp opcode,
|
||||||
const uint32_t *w, unsigned count)
|
const uint32_t *w, unsigned count)
|
||||||
@@ -1846,6 +1877,10 @@ vtn_handle_type(struct vtn_builder *b, SpvOp opcode,
|
|||||||
val->type->base_type = vtn_base_type_sampled_image;
|
val->type->base_type = vtn_base_type_sampled_image;
|
||||||
val->type->image = vtn_get_type(b, w[2]);
|
val->type->image = vtn_get_type(b, w[2]);
|
||||||
|
|
||||||
|
validate_image_type_for_sampled_image(
|
||||||
|
b, val->type->image->glsl_image,
|
||||||
|
"Image Type operand of OpTypeSampledImage");
|
||||||
|
|
||||||
/* Sampled images are represented NIR as a vec2 SSA value where each
|
/* Sampled images are represented NIR as a vec2 SSA value where each
|
||||||
* component is the result of a deref instruction. The first component
|
* component is the result of a deref instruction. The first component
|
||||||
* is the image and the second is the sampler. An OpLoad on an
|
* is the image and the second is the sampler. An OpLoad on an
|
||||||
@@ -2744,6 +2779,10 @@ vtn_handle_texture(struct vtn_builder *b, SpvOp opcode,
|
|||||||
.sampler = vtn_get_sampler(b, w[4]),
|
.sampler = vtn_get_sampler(b, w[4]),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
validate_image_type_for_sampled_image(
|
||||||
|
b, si.image->type,
|
||||||
|
"Type of Image operand of OpSampledImage");
|
||||||
|
|
||||||
enum gl_access_qualifier access = 0;
|
enum gl_access_qualifier access = 0;
|
||||||
vtn_foreach_decoration(b, vtn_untyped_value(b, w[3]),
|
vtn_foreach_decoration(b, vtn_untyped_value(b, w[3]),
|
||||||
non_uniform_decoration_cb, &access);
|
non_uniform_decoration_cb, &access);
|
||||||
|
Reference in New Issue
Block a user