diff --git a/src/compiler/spirv/nir_spirv.h b/src/compiler/spirv/nir_spirv.h index aa3d110c895..946bab0224f 100644 --- a/src/compiler/spirv/nir_spirv.h +++ b/src/compiler/spirv/nir_spirv.h @@ -93,6 +93,16 @@ struct spirv_to_nir_options { */ uint32_t min_ssbo_alignment; + /* These must be identical to the values set in + * VkPhysicalDeviceDescriptorHeapPropertiesEXT + */ + uint32_t sampler_descriptor_size; + uint32_t sampler_descriptor_alignment; + uint32_t image_descriptor_size; + uint32_t image_descriptor_alignment; + uint32_t buffer_descriptor_size; + uint32_t buffer_descriptor_alignment; + const nir_shader *clc_shader; struct { diff --git a/src/compiler/spirv/spirv_to_nir.c b/src/compiler/spirv/spirv_to_nir.c index a90b3eed6d6..c43262c319d 100644 --- a/src/compiler/spirv/spirv_to_nir.c +++ b/src/compiler/spirv/spirv_to_nir.c @@ -3014,6 +3014,39 @@ vtn_handle_constant(struct vtn_builder *b, SpvOp opcode, val->is_null_constant = true; break; + case SpvOpConstantSizeOfEXT: { + vtn_fail_if(val->type->type != glsl_uint_type() && + val->type->type != glsl_int_type() && + val->type->type != glsl_uint64_t_type() && + val->type->type != glsl_int64_t_type(), + "Result Type must be a 32-bit or 64-bit integer type scalar."); + + struct vtn_type *type = vtn_get_type(b, w[3]); + switch (type->base_type) { + case vtn_base_type_image: + val->constant->values[0].u32 = + align(b->options->image_descriptor_size, + b->options->image_descriptor_alignment); + break; + case vtn_base_type_sampler: + val->constant->values[0].u32 = + align(b->options->sampler_descriptor_size, + b->options->sampler_descriptor_alignment); + break; + case vtn_base_type_accel_struct: + case vtn_base_type_buffer: + val->constant->values[0].u32 = + align(b->options->buffer_descriptor_size, + b->options->buffer_descriptor_alignment); + break; + default: + vtn_fail("Type must be an OpTypeBufferKHR, OpTypeImage, " + "OpTypeAccelerationStructureKHR, OpTypeTensorARM, or " + "OpTypeSampler instruction."); + } + break; + } + default: vtn_fail_with_opcode("Unhandled opcode", opcode); } @@ -6095,6 +6128,7 @@ vtn_handle_variable_or_type_instruction(struct vtn_builder *b, SpvOp opcode, case SpvOpSpecConstantComposite: case SpvOpSpecConstantCompositeReplicateEXT: case SpvOpSpecConstantOp: + case SpvOpConstantSizeOfEXT: vtn_handle_constant(b, opcode, w, count); break; diff --git a/src/vulkan/runtime/vk_nir.c b/src/vulkan/runtime/vk_nir.c index 391b07616e7..457a084e735 100644 --- a/src/vulkan/runtime/vk_nir.c +++ b/src/vulkan/runtime/vk_nir.c @@ -136,6 +136,19 @@ vk_spirv_to_nir(struct vk_device *device, spirv_options_local.debug.func = spirv_nir_debug; spirv_options_local.debug.private_data = (void *)device; + spirv_options_local.sampler_descriptor_size = + device->physical->properties.samplerDescriptorSize; + spirv_options_local.sampler_descriptor_alignment = + device->physical->properties.samplerDescriptorAlignment; + spirv_options_local.image_descriptor_size = + device->physical->properties.imageDescriptorSize; + spirv_options_local.image_descriptor_alignment = + device->physical->properties.imageDescriptorAlignment; + spirv_options_local.buffer_descriptor_size = + device->physical->properties.bufferDescriptorSize; + spirv_options_local.buffer_descriptor_alignment = + device->physical->properties.bufferDescriptorAlignment; + uint32_t num_spec_entries = 0; struct nir_spirv_specialization *spec_entries = vk_spec_info_to_nir_spirv(spec_info, &num_spec_entries);