mirror of
https://github.com/KhronosGroup/SPIRV-Tools
synced 2024-10-18 11:10:05 +00:00
enable StorageUniform16 (#5371)
Adds support for the StorageUniform16 capability.
This commit is contained in:
parent
8e3da01b45
commit
8714d7fad2
@ -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
|
||||
}};
|
||||
|
||||
|
@ -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
|
||||
};
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user