瀏覽代碼

spirv: Add support for SpvCapabilityStorageImageWriteWithoutFormat

Allow that capability if the driver indicates that it is supported, and
flag whether images are read-only/write-only in the nir_variable (based
on the NonReadable and NonWritable decorations), which drivers may need
to implement this.

Signed-off-by: Alex Smith <asmith@feralinteractive.com>
Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
tags/17.1-branchpoint
Alex Smith 8 年之前
父節點
當前提交
94d48b7f9f
共有 3 個檔案被更改,包括 9 行新增2 行删除
  1. 1
    0
      src/compiler/spirv/nir_spirv.h
  2. 4
    1
      src/compiler/spirv/spirv_to_nir.c
  3. 4
    1
      src/compiler/spirv/vtn_variables.c

+ 1
- 0
src/compiler/spirv/nir_spirv.h 查看文件

@@ -49,6 +49,7 @@ struct nir_spirv_supported_extensions {
bool image_ms_array;
bool tessellation;
bool draw_parameters;
bool image_write_without_format;
};

nir_function *spirv_to_nir(const uint32_t *words, size_t word_count,

+ 4
- 1
src/compiler/spirv/spirv_to_nir.c 查看文件

@@ -2664,7 +2664,6 @@ vtn_handle_preamble_instruction(struct vtn_builder *b, SpvOp opcode,
case SpvCapabilityMinLod:
case SpvCapabilityTransformFeedback:
case SpvCapabilityStorageImageReadWithoutFormat:
case SpvCapabilityStorageImageWriteWithoutFormat:
vtn_warn("Unsupported SPIR-V capability: %s",
spirv_capability_to_string(cap));
break;
@@ -2700,6 +2699,10 @@ vtn_handle_preamble_instruction(struct vtn_builder *b, SpvOp opcode,
spv_check_supported(draw_parameters, cap);
break;

case SpvCapabilityStorageImageWriteWithoutFormat:
spv_check_supported(image_write_without_format, cap);
break;

default:
unreachable("Unhandled capability");
}

+ 4
- 1
src/compiler/spirv/vtn_variables.c 查看文件

@@ -1054,8 +1054,12 @@ apply_var_decoration(struct vtn_builder *b, nir_variable *nir_var,
assert(nir_var->constant_initializer != NULL);
nir_var->data.read_only = true;
break;
case SpvDecorationNonReadable:
nir_var->data.image.write_only = true;
break;
case SpvDecorationNonWritable:
nir_var->data.read_only = true;
nir_var->data.image.read_only = true;
break;
case SpvDecorationComponent:
nir_var->data.location_frac = dec->literals[0];
@@ -1107,7 +1111,6 @@ apply_var_decoration(struct vtn_builder *b, nir_variable *nir_var,
case SpvDecorationAliased:
case SpvDecorationVolatile:
case SpvDecorationCoherent:
case SpvDecorationNonReadable:
case SpvDecorationUniform:
case SpvDecorationStream:
case SpvDecorationOffset:

Loading…
取消
儲存