[Mesa-dev] [PATCH 3/4] spirv: add sampler and image variable support when handling texture opcodes
Samuel Iglesias Gonsálvez
siglesias at igalia.com
Fri Oct 6 09:40:29 UTC 2017
On Fri, 2017-10-06 at 11:36 +0200, Samuel Iglesias Gonsálvez wrote:
> From: Samuel Iglesias Gonsalvez <correo at samuelig.es>
>
> Signed-off-by: Samuel Iglesias Gonsalvez <correo at samuelig.es>
This patch and the following should be signed off by my Igalia email.
Fixed locally.
Sam
> ---
> src/compiler/spirv/spirv_to_nir.c | 58
> +++++++++++++++++++++++++++++++--------
> 1 file changed, 47 insertions(+), 11 deletions(-)
>
> diff --git a/src/compiler/spirv/spirv_to_nir.c
> b/src/compiler/spirv/spirv_to_nir.c
> index 6ce9d1ada34..cf7617454de 100644
> --- a/src/compiler/spirv/spirv_to_nir.c
> +++ b/src/compiler/spirv/spirv_to_nir.c
> @@ -1489,17 +1489,37 @@ vtn_handle_texture(struct vtn_builder *b,
> SpvOp opcode,
> if (opcode == SpvOpSampledImage) {
> struct vtn_value *val =
> vtn_push_value(b, w[2], vtn_value_type_sampled_image);
> - val->sampled_image = ralloc(b, struct vtn_sampled_image);
> - val->sampled_image->image =
> - vtn_value(b, w[3], vtn_value_type_pointer)->pointer;
> - val->sampled_image->sampler =
> - vtn_value(b, w[4], vtn_value_type_pointer)->pointer;
> + val->sampled_image = rzalloc(b, struct vtn_sampled_image);
> +
> + struct vtn_value *img_val = vtn_untyped_value(b, w[3]);
> + struct vtn_value *sampler_val = vtn_untyped_value(b, w[4]);
> +
> + if (img_val->value_type == vtn_value_type_pointer) {
> + val->sampled_image->image = img_val->pointer;
> + } else {
> + assert(img_val->value_type ==
> vtn_value_type_image_variable);
> + val->sampled_image->var_image = img_val->var;
> + }
> +
> + if (sampler_val->value_type == vtn_value_type_pointer) {
> + val->sampled_image->sampler = sampler_val->pointer;
> + } else {
> + assert(sampler_val->value_type ==
> vtn_value_type_sampler_variable);
> + val->sampled_image->var_sampler = sampler_val->var;
> + }
> return;
> } else if (opcode == SpvOpImage) {
> struct vtn_value *val = vtn_push_value(b, w[2],
> vtn_value_type_pointer);
> struct vtn_value *src_val = vtn_untyped_value(b, w[3]);
> if (src_val->value_type == vtn_value_type_sampled_image) {
> val->pointer = src_val->sampled_image->image;
> + if (val->pointer == NULL && src_val->sampled_image-
> >var_image != NULL) {
> + val->value_type = vtn_value_type_image_variable;
> + val->var = src_val->sampled_image->var_image;
> + } else if (val->pointer == NULL && src_val->sampled_image-
> >var_sampler != NULL) {
> + val->value_type = vtn_value_type_sampler_variable;
> + val->var = src_val->sampled_image->var_sampler;
> + }
> } else {
> assert(src_val->value_type == vtn_value_type_pointer);
> val->pointer = src_val->pointer;
> @@ -1510,21 +1530,32 @@ vtn_handle_texture(struct vtn_builder *b,
> SpvOp opcode,
> struct vtn_type *ret_type = vtn_value(b, w[1],
> vtn_value_type_type)->type;
> struct vtn_value *val = vtn_push_value(b, w[2],
> vtn_value_type_ssa);
>
> - struct vtn_sampled_image sampled;
> + struct vtn_sampled_image sampled = {NULL};
> + nir_deref_var *sampler = NULL;
> struct vtn_value *sampled_val = vtn_untyped_value(b, w[3]);
> if (sampled_val->value_type == vtn_value_type_sampled_image) {
> sampled = *sampled_val->sampled_image;
> - } else {
> + if (sampled.var_sampler)
> + sampler = nir_deref_var_create(b, sampled.var_sampler-
> >var);
> + } else if (sampled_val->value_type == vtn_value_type_pointer) {
> assert(sampled_val->value_type == vtn_value_type_pointer);
> sampled.image = NULL;
> sampled.sampler = sampled_val->pointer;
> + } else {
> + assert(sampled_val->value_type ==
> vtn_value_type_image_variable ||
> + sampled_val->value_type ==
> vtn_value_type_sampler_variable);
> + sampler = nir_deref_var_create(b, sampled_val->var->var);
> }
>
> const struct glsl_type *image_type;
> if (sampled.image) {
> image_type = sampled.image->var->var->interface_type;
> - } else {
> + } else if (sampled.var_image) {
> + image_type = sampled.var_image->type->type;
> + } else if (sampled.sampler) {
> image_type = sampled.sampler->var->var->interface_type;
> + } else {
> + image_type = sampled_val->var->var->type;
> }
> const enum glsl_sampler_dim sampler_dim =
> glsl_get_sampler_dim(image_type);
> const bool is_array = glsl_sampler_type_is_array(image_type);
> @@ -1741,10 +1772,15 @@ vtn_handle_texture(struct vtn_builder *b,
> SpvOp opcode,
> unreachable("Invalid base type for sampler result");
> }
>
> - nir_deref_var *sampler = vtn_pointer_to_deref(b,
> sampled.sampler);
> + if (!sampler)
> + sampler = vtn_pointer_to_deref(b, sampled.sampler);
> nir_deref_var *texture;
> - if (sampled.image) {
> - nir_deref_var *image = vtn_pointer_to_deref(b, sampled.image);
> + if (sampled.image || sampled.var_image) {
> + nir_deref_var *image;
> + if (!sampled.image && sampled.var_image)
> + image = nir_deref_var_create(b, sampled.var_image->var);
> + else
> + image = vtn_pointer_to_deref(b, sampled.image);
> texture = image;
> } else {
> texture = sampler;
More information about the mesa-dev
mailing list