mirror of
https://github.com/encounter/dawn-cmake.git
synced 2025-07-03 03:35:59 +00:00
spirv-writer: avoid dup OpCapability instructions
Change-Id: Iaf53d2addadd8efbb912e4f97ff426fd4182c9f3 Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/34002 Reviewed-by: Ben Clayton <bclayton@google.com> Commit-Queue: Ben Clayton <bclayton@google.com> Auto-Submit: David Neto <dneto@google.com>
This commit is contained in:
parent
66794eada3
commit
b496611165
@ -357,8 +357,11 @@ void Builder::iterate(std::function<void(const Instruction&)> cb) const {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void Builder::push_capability(uint32_t cap) {
|
void Builder::push_capability(uint32_t cap) {
|
||||||
capabilities_.push_back(
|
if (capability_set_.count(cap) == 0) {
|
||||||
Instruction{spv::Op::OpCapability, {Operand::Int(cap)}});
|
capability_set_.insert(cap);
|
||||||
|
capabilities_.push_back(
|
||||||
|
Instruction{spv::Op::OpCapability, {Operand::Int(cap)}});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Builder::GenerateLabel(uint32_t id) {
|
void Builder::GenerateLabel(uint32_t id) {
|
||||||
|
@ -18,6 +18,7 @@
|
|||||||
#include <functional>
|
#include <functional>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <unordered_map>
|
#include <unordered_map>
|
||||||
|
#include <unordered_set>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
#include "spirv/unified1/spirv.h"
|
#include "spirv/unified1/spirv.h"
|
||||||
@ -93,7 +94,8 @@ class Builder {
|
|||||||
/// @param cb the callback to execute
|
/// @param cb the callback to execute
|
||||||
void iterate(std::function<void(const Instruction&)> cb) const;
|
void iterate(std::function<void(const Instruction&)> cb) const;
|
||||||
|
|
||||||
/// Adds an instruction to the list of capabilities
|
/// Adds an instruction to the list of capabilities, if the capability
|
||||||
|
/// hasn't already been added.
|
||||||
/// @param cap the capability to set
|
/// @param cap the capability to set
|
||||||
void push_capability(uint32_t cap);
|
void push_capability(uint32_t cap);
|
||||||
/// @returns the capabilities
|
/// @returns the capabilities
|
||||||
@ -500,6 +502,7 @@ class Builder {
|
|||||||
std::unordered_map<uint32_t, ast::Variable*> spirv_id_to_variable_;
|
std::unordered_map<uint32_t, ast::Variable*> spirv_id_to_variable_;
|
||||||
std::vector<uint32_t> merge_stack_;
|
std::vector<uint32_t> merge_stack_;
|
||||||
std::vector<uint32_t> continue_stack_;
|
std::vector<uint32_t> continue_stack_;
|
||||||
|
std::unordered_set<uint32_t> capability_set_;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace spirv
|
} // namespace spirv
|
||||||
|
@ -45,6 +45,14 @@ TEST_F(BuilderTest, TracksIdBounds) {
|
|||||||
EXPECT_EQ(6u, b.id_bound());
|
EXPECT_EQ(6u, b.id_bound());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_F(BuilderTest, Capabilities_Dedup) {
|
||||||
|
b.push_capability(SpvCapabilityShader);
|
||||||
|
b.push_capability(SpvCapabilityShader);
|
||||||
|
b.push_capability(SpvCapabilityShader);
|
||||||
|
|
||||||
|
EXPECT_EQ(DumpInstructions(b.capabilities()), "OpCapability Shader\n");
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
} // namespace spirv
|
} // namespace spirv
|
||||||
} // namespace writer
|
} // namespace writer
|
||||||
|
Loading…
x
Reference in New Issue
Block a user