Updated spirv-tools.

This commit is contained in:
Бранимир Караџић 2021-10-02 10:49:42 -07:00
parent d2e245c725
commit fe54a8720f
6 changed files with 50 additions and 18 deletions

View File

@ -1 +1 @@
"v2021.4-dev", "SPIRV-Tools v2021.4-dev 133b7ce91f51ffb26e674a856ec6692cca650ab3"
"v2021.4-dev", "SPIRV-Tools v2021.4-dev e180849b89618fde67379735eae3a633a97e293c"

View File

@ -20,6 +20,7 @@
namespace {
const uint32_t kRemovedMember = 0xFFFFFFFF;
const uint32_t kSpecConstOpOpcodeIdx = 0;
constexpr uint32_t kArrayElementTypeIdx = 0;
} // namespace
namespace spvtools {
@ -64,6 +65,10 @@ void EliminateDeadMembersPass::FindLiveMembers() {
MarkPointeeTypeAsFullUsed(inst.type_id());
break;
default:
// Ignore structured buffers as layout(offset) qualifiers cannot be
// applied to structure fields
if (inst.IsVulkanStorageBufferVariable())
MarkPointeeTypeAsFullUsed(inst.type_id());
break;
}
}
@ -136,18 +141,22 @@ void EliminateDeadMembersPass::MarkMembersAsLiveForStore(
void EliminateDeadMembersPass::MarkTypeAsFullyUsed(uint32_t type_id) {
Instruction* type_inst = get_def_use_mgr()->GetDef(type_id);
assert(type_inst != nullptr);
if (type_inst->opcode() != SpvOpTypeStruct) {
return;
}
// Mark every member of the current struct as used.
for (uint32_t i = 0; i < type_inst->NumInOperands(); ++i) {
used_members_[type_id].insert(i);
}
// Mark any sub struct as fully used.
for (uint32_t i = 0; i < type_inst->NumInOperands(); ++i) {
MarkTypeAsFullyUsed(type_inst->GetSingleWordInOperand(i));
switch (type_inst->opcode()) {
case SpvOpTypeStruct:
// Mark every member and its type as fully used.
for (uint32_t i = 0; i < type_inst->NumInOperands(); ++i) {
used_members_[type_id].insert(i);
MarkTypeAsFullyUsed(type_inst->GetSingleWordInOperand(i));
}
break;
case SpvOpTypeArray:
case SpvOpTypeRuntimeArray:
MarkTypeAsFullyUsed(
type_inst->GetSingleWordInOperand(kArrayElementTypeIdx));
break;
default:
break;
}
}

View File

@ -30,6 +30,7 @@ namespace {
const uint32_t kTypeImageDimIndex = 1;
const uint32_t kLoadBaseIndex = 0;
const uint32_t kPointerTypeStorageClassIndex = 0;
const uint32_t kVariableStorageClassIndex = 0;
const uint32_t kTypeImageSampledIndex = 5;
// Constants for OpenCL.DebugInfo.100 / NonSemantic.Shader.DebugInfo.100
@ -403,6 +404,21 @@ bool Instruction::IsVulkanStorageBuffer() const {
return false;
}
bool Instruction::IsVulkanStorageBufferVariable() const {
if (opcode() != SpvOpVariable) {
return false;
}
uint32_t storage_class = GetSingleWordInOperand(kVariableStorageClassIndex);
if (storage_class == SpvStorageClassStorageBuffer ||
storage_class == SpvStorageClassUniform) {
Instruction* var_type = context()->get_def_use_mgr()->GetDef(type_id());
return var_type != nullptr && var_type->IsVulkanStorageBuffer();
}
return false;
}
bool Instruction::IsVulkanUniformBuffer() const {
if (opcode() != SpvOpTypePointer) {
return false;

View File

@ -464,6 +464,10 @@ class Instruction : public utils::IntrusiveNodeBase<Instruction> {
// storage buffer.
bool IsVulkanStorageBuffer() const;
// Returns true if the instruction defines a variable in StorageBuffer or
// Uniform storage class with a pointer type that points to a storage buffer.
bool IsVulkanStorageBufferVariable() const;
// Returns true if the instruction defines a pointer type that points to a
// uniform buffer.
bool IsVulkanUniformBuffer() const;

View File

@ -120,7 +120,8 @@ spv_result_t getWord(spv_text text, spv_position position, std::string* word) {
case '\n':
case '\r':
if (escaping || quoting) break;
// Fall through.
word->assign(text->str + start_index, text->str + position->index);
return SPV_SUCCESS;
case '\0': { // NOTE: End of word found!
word->assign(text->str + start_index, text->str + position->index);
return SPV_SUCCESS;

View File

@ -79,11 +79,13 @@ spv_result_t DerivativesPass(ValidationState_t& _, const Instruction* inst) {
std::string* message) {
const auto* models = state.GetExecutionModels(entry_point->id());
const auto* modes = state.GetExecutionModes(entry_point->id());
if (models->find(SpvExecutionModelGLCompute) != models->end() &&
modes->find(SpvExecutionModeDerivativeGroupLinearNV) ==
modes->end() &&
modes->find(SpvExecutionModeDerivativeGroupQuadsNV) ==
modes->end()) {
if (models &&
models->find(SpvExecutionModelGLCompute) != models->end() &&
(!modes ||
(modes->find(SpvExecutionModeDerivativeGroupLinearNV) ==
modes->end() &&
modes->find(SpvExecutionModeDerivativeGroupQuadsNV) ==
modes->end()))) {
if (message) {
*message = std::string(
"Derivative instructions require "