enable StorageUniform16 (#5371)

Adds support for the StorageUniform16 capability.
This commit is contained in:
Nathan Gauër 2023-08-10 19:54:31 +02:00 committed by GitHub
parent 8e3da01b45
commit 8714d7fad2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 55 additions and 5 deletions

View File

@ -207,12 +207,61 @@ Handler_OpTypePointer_StorageUniformBufferBlock16(
: std::nullopt;
}
static std::optional<spv::Capability> Handler_OpTypePointer_StorageUniform16(
const Instruction* instruction) {
assert(instruction->opcode() == spv::Op::OpTypePointer &&
"This handler only support OpTypePointer opcodes.");
// This capability is only required if the variable has a Uniform storage
// class.
spv::StorageClass storage_class = spv::StorageClass(
instruction->GetSingleWordInOperand(kOpTypePointerStorageClassIndex));
if (storage_class != spv::StorageClass::Uniform) {
return std::nullopt;
}
const auto* feature_manager = instruction->context()->get_feature_mgr();
if (!Has16BitCapability(feature_manager)) {
return std::nullopt;
}
const bool hasBufferBlockCapability =
feature_manager->GetCapabilities().contains(
spv::Capability::StorageUniformBufferBlock16);
const auto* decoration_mgr = instruction->context()->get_decoration_mgr();
bool found16bitType = false;
DFSWhile(instruction, [decoration_mgr, hasBufferBlockCapability,
&found16bitType](const Instruction* item) {
if (found16bitType) {
return false;
}
if (hasBufferBlockCapability &&
decoration_mgr->HasDecoration(item->result_id(),
spv::Decoration::BufferBlock)) {
return false;
}
if (is16bitType(item)) {
found16bitType = true;
return false;
}
return true;
});
return found16bitType ? std::optional(spv::Capability::StorageUniform16)
: std::nullopt;
}
// Opcode of interest to determine capabilities requirements.
constexpr std::array<std::pair<spv::Op, OpcodeHandler>, 3> kOpcodeHandlers{{
constexpr std::array<std::pair<spv::Op, OpcodeHandler>, 4> kOpcodeHandlers{{
// clang-format off
{spv::Op::OpTypePointer, Handler_OpTypePointer_StorageInputOutput16},
{spv::Op::OpTypePointer, Handler_OpTypePointer_StoragePushConstant16},
{spv::Op::OpTypePointer, Handler_OpTypePointer_StorageUniformBufferBlock16},
{spv::Op::OpTypePointer, Handler_OpTypePointer_StorageUniform16}
// clang-format on
}};

View File

@ -81,6 +81,7 @@ class TrimCapabilitiesPass : public Pass {
spv::Capability::ShaderClockKHR,
spv::Capability::StorageInputOutput16,
spv::Capability::StoragePushConstant16,
spv::Capability::StorageUniform16,
spv::Capability::StorageUniformBufferBlock16
// clang-format on
};

View File

@ -1237,7 +1237,7 @@ TEST_F(TrimCapabilitiesPassTest,
}
TEST_F(TrimCapabilitiesPassTest,
DISABLED_StorageUniform16_RemovedWithBufferBlockPointer_Vulkan1_0) {
StorageUniform16_RemovedWithBufferBlockPointer_Vulkan1_0) {
// See https://github.com/KhronosGroup/SPIRV-Tools/issues/5354
static_assert(spv::Capability::StorageUniformBufferBlock16 ==
spv::Capability::StorageBuffer16BitAccess);
@ -1277,7 +1277,7 @@ TEST_F(TrimCapabilitiesPassTest,
}
TEST_F(TrimCapabilitiesPassTest,
DISABLED_StorageUniform16_RemovedWithBufferBlockPointer_Vulkan1_1) {
StorageUniform16_RemovedWithBufferBlockPointer_Vulkan1_1) {
// See https://github.com/KhronosGroup/SPIRV-Tools/issues/5354
static_assert(spv::Capability::StorageUniformBufferBlock16 ==
spv::Capability::StorageBuffer16BitAccess);
@ -1317,7 +1317,7 @@ TEST_F(TrimCapabilitiesPassTest,
}
TEST_F(TrimCapabilitiesPassTest,
DISABLED_StorageUniform16_RemovedWithNonBlockUniformPointer_Vulkan1_0) {
StorageUniform16_RemovedWithNonBlockUniformPointer_Vulkan1_0) {
// See https://github.com/KhronosGroup/SPIRV-Tools/issues/5354
static_assert(spv::Capability::StorageUniformBufferBlock16 ==
spv::Capability::StorageBuffer16BitAccess);
@ -1356,7 +1356,7 @@ TEST_F(TrimCapabilitiesPassTest,
}
TEST_F(TrimCapabilitiesPassTest,
DISABLED_StorageUniform16_RemovedWithNonBlockUniformPointer_Vulkan1_1) {
StorageUniform16_RemovedWithNonBlockUniformPointer_Vulkan1_1) {
// See https://github.com/KhronosGroup/SPIRV-Tools/issues/5354
static_assert(spv::Capability::StorageUniformBufferBlock16 ==
spv::Capability::StorageBuffer16BitAccess);