mirror of
https://github.com/encounter/dawn-cmake.git
synced 2025-12-21 18:59:21 +00:00
D3D12: Indirect validation shader name cleanup and parameter merge
Bug: dawn:548 Change-Id: Id2bf9c54e10ba791e5878844a0fe98efd4fc85d6 Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/87705 Reviewed-by: Corentin Wallez <cwallez@chromium.org> Commit-Queue: Enrico Galli <enrico.galli@intel.com> Kokoro: Kokoro <noreply+kokoro@google.com>
This commit is contained in:
committed by
Dawn LUCI CQ
parent
857175e59b
commit
b52d740227
@@ -42,14 +42,8 @@ FirstIndexOffset::BindingPoint::BindingPoint(uint32_t b, uint32_t g)
|
||||
: binding(b), group(g) {}
|
||||
FirstIndexOffset::BindingPoint::~BindingPoint() = default;
|
||||
|
||||
FirstIndexOffset::Data::Data(bool has_vtx_index,
|
||||
bool has_inst_index,
|
||||
uint32_t first_vtx_offset,
|
||||
uint32_t first_inst_offset)
|
||||
: has_vertex_index(has_vtx_index),
|
||||
has_instance_index(has_inst_index),
|
||||
first_vertex_offset(first_vtx_offset),
|
||||
first_instance_offset(first_inst_offset) {}
|
||||
FirstIndexOffset::Data::Data(bool has_vtx_or_inst_index)
|
||||
: has_vertex_or_instance_index(has_vtx_or_inst_index) {}
|
||||
FirstIndexOffset::Data::Data(const Data&) = default;
|
||||
FirstIndexOffset::Data::~Data() = default;
|
||||
|
||||
@@ -80,8 +74,7 @@ void FirstIndexOffset::Run(CloneContext& ctx,
|
||||
std::unordered_map<const sem::Variable*, const char*> builtin_vars;
|
||||
std::unordered_map<const sem::StructMember*, const char*> builtin_members;
|
||||
|
||||
bool has_vertex_index = false;
|
||||
bool has_instance_index = false;
|
||||
bool has_vertex_or_instance_index = false;
|
||||
|
||||
// Traverse the AST scanning for builtin accesses via variables (includes
|
||||
// parameters) or structure member accesses.
|
||||
@@ -93,12 +86,12 @@ void FirstIndexOffset::Run(CloneContext& ctx,
|
||||
if (builtin == ast::Builtin::kVertexIndex) {
|
||||
auto* sem_var = ctx.src->Sem().Get(var);
|
||||
builtin_vars.emplace(sem_var, kFirstVertexName);
|
||||
has_vertex_index = true;
|
||||
has_vertex_or_instance_index = true;
|
||||
}
|
||||
if (builtin == ast::Builtin::kInstanceIndex) {
|
||||
auto* sem_var = ctx.src->Sem().Get(var);
|
||||
builtin_vars.emplace(sem_var, kFirstInstanceName);
|
||||
has_instance_index = true;
|
||||
has_vertex_or_instance_index = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -110,29 +103,23 @@ void FirstIndexOffset::Run(CloneContext& ctx,
|
||||
if (builtin == ast::Builtin::kVertexIndex) {
|
||||
auto* sem_mem = ctx.src->Sem().Get(member);
|
||||
builtin_members.emplace(sem_mem, kFirstVertexName);
|
||||
has_vertex_index = true;
|
||||
has_vertex_or_instance_index = true;
|
||||
}
|
||||
if (builtin == ast::Builtin::kInstanceIndex) {
|
||||
auto* sem_mem = ctx.src->Sem().Get(member);
|
||||
builtin_members.emplace(sem_mem, kFirstInstanceName);
|
||||
has_instance_index = true;
|
||||
has_vertex_or_instance_index = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Byte offsets on the uniform buffer
|
||||
uint32_t vertex_index_offset = 0;
|
||||
uint32_t instance_index_offset = 0;
|
||||
|
||||
if (has_vertex_index || has_instance_index) {
|
||||
if (has_vertex_or_instance_index) {
|
||||
// Add uniform buffer members and calculate byte offsets
|
||||
ast::StructMemberList members;
|
||||
members.push_back(ctx.dst->Member(kFirstVertexName, ctx.dst->ty.u32()));
|
||||
vertex_index_offset = 0;
|
||||
members.push_back(ctx.dst->Member(kFirstInstanceName, ctx.dst->ty.u32()));
|
||||
instance_index_offset = 4;
|
||||
auto* struct_ = ctx.dst->Structure(ctx.dst->Sym(), std::move(members));
|
||||
|
||||
// Create a global to hold the uniform buffer
|
||||
@@ -172,8 +159,7 @@ void FirstIndexOffset::Run(CloneContext& ctx,
|
||||
|
||||
ctx.Clone();
|
||||
|
||||
outputs.Add<Data>(has_vertex_index, has_instance_index, vertex_index_offset,
|
||||
instance_index_offset);
|
||||
outputs.Add<Data>(has_vertex_or_instance_index);
|
||||
}
|
||||
|
||||
} // namespace tint::transform
|
||||
|
||||
@@ -84,14 +84,9 @@ class FirstIndexOffset final : public Castable<FirstIndexOffset, Transform> {
|
||||
/// Data holds information about shader usage and constant buffer offsets.
|
||||
struct Data final : public Castable<Data, transform::Data> {
|
||||
/// Constructor
|
||||
/// @param has_vtx_index True if the shader uses vertex_index
|
||||
/// @param has_inst_index True if the shader uses instance_index
|
||||
/// @param first_vtx_offset Offset of first vertex into constant buffer
|
||||
/// @param first_inst_offset Offset of first instance into constant buffer
|
||||
Data(bool has_vtx_index,
|
||||
bool has_inst_index,
|
||||
uint32_t first_vtx_offset,
|
||||
uint32_t first_inst_offset);
|
||||
/// @param has_vtx_or_inst_index True if the shader uses vertex_index or
|
||||
/// instance_index
|
||||
explicit Data(bool has_vtx_or_inst_index);
|
||||
|
||||
/// Copy constructor
|
||||
Data(const Data&);
|
||||
@@ -100,13 +95,7 @@ class FirstIndexOffset final : public Castable<FirstIndexOffset, Transform> {
|
||||
~Data() override;
|
||||
|
||||
/// True if the shader uses vertex_index
|
||||
const bool has_vertex_index;
|
||||
/// True if the shader uses instance_index
|
||||
const bool has_instance_index;
|
||||
/// Offset of first vertex into constant buffer
|
||||
const uint32_t first_vertex_offset;
|
||||
/// Offset of first instance into constant buffer
|
||||
const uint32_t first_instance_offset;
|
||||
const bool has_vertex_or_instance_index;
|
||||
};
|
||||
|
||||
/// Constructor
|
||||
|
||||
@@ -86,10 +86,7 @@ fn entry() -> @builtin(position) vec4<f32> {
|
||||
auto* data = got.data.Get<FirstIndexOffset::Data>();
|
||||
|
||||
ASSERT_NE(data, nullptr);
|
||||
EXPECT_EQ(data->has_vertex_index, false);
|
||||
EXPECT_EQ(data->has_instance_index, false);
|
||||
EXPECT_EQ(data->first_vertex_offset, 0u);
|
||||
EXPECT_EQ(data->first_instance_offset, 0u);
|
||||
EXPECT_EQ(data->has_vertex_or_instance_index, false);
|
||||
}
|
||||
|
||||
TEST_F(FirstIndexOffsetTest, BasicModuleVertexIndex) {
|
||||
@@ -133,10 +130,7 @@ fn entry(@builtin(vertex_index) vert_idx : u32) -> @builtin(position) vec4<f32>
|
||||
auto* data = got.data.Get<FirstIndexOffset::Data>();
|
||||
|
||||
ASSERT_NE(data, nullptr);
|
||||
EXPECT_EQ(data->has_vertex_index, true);
|
||||
EXPECT_EQ(data->has_instance_index, false);
|
||||
EXPECT_EQ(data->first_vertex_offset, 0u);
|
||||
EXPECT_EQ(data->first_instance_offset, 4u);
|
||||
EXPECT_EQ(data->has_vertex_or_instance_index, true);
|
||||
}
|
||||
|
||||
TEST_F(FirstIndexOffsetTest, BasicModuleVertexIndex_OutOfOrder) {
|
||||
@@ -180,10 +174,7 @@ fn test(vert_idx : u32) -> u32 {
|
||||
auto* data = got.data.Get<FirstIndexOffset::Data>();
|
||||
|
||||
ASSERT_NE(data, nullptr);
|
||||
EXPECT_EQ(data->has_vertex_index, true);
|
||||
EXPECT_EQ(data->has_instance_index, false);
|
||||
EXPECT_EQ(data->first_vertex_offset, 0u);
|
||||
EXPECT_EQ(data->first_instance_offset, 4u);
|
||||
EXPECT_EQ(data->has_vertex_or_instance_index, true);
|
||||
}
|
||||
|
||||
TEST_F(FirstIndexOffsetTest, BasicModuleInstanceIndex) {
|
||||
@@ -227,10 +218,7 @@ fn entry(@builtin(instance_index) inst_idx : u32) -> @builtin(position) vec4<f32
|
||||
auto* data = got.data.Get<FirstIndexOffset::Data>();
|
||||
|
||||
ASSERT_NE(data, nullptr);
|
||||
EXPECT_EQ(data->has_vertex_index, false);
|
||||
EXPECT_EQ(data->has_instance_index, true);
|
||||
EXPECT_EQ(data->first_vertex_offset, 0u);
|
||||
EXPECT_EQ(data->first_instance_offset, 4u);
|
||||
EXPECT_EQ(data->has_vertex_or_instance_index, true);
|
||||
}
|
||||
|
||||
TEST_F(FirstIndexOffsetTest, BasicModuleInstanceIndex_OutOfOrder) {
|
||||
@@ -274,10 +262,7 @@ fn test(inst_idx : u32) -> u32 {
|
||||
auto* data = got.data.Get<FirstIndexOffset::Data>();
|
||||
|
||||
ASSERT_NE(data, nullptr);
|
||||
EXPECT_EQ(data->has_vertex_index, false);
|
||||
EXPECT_EQ(data->has_instance_index, true);
|
||||
EXPECT_EQ(data->first_vertex_offset, 0u);
|
||||
EXPECT_EQ(data->first_instance_offset, 4u);
|
||||
EXPECT_EQ(data->has_vertex_or_instance_index, true);
|
||||
}
|
||||
|
||||
TEST_F(FirstIndexOffsetTest, BasicModuleBothIndex) {
|
||||
@@ -333,10 +318,7 @@ fn entry(inputs : Inputs) -> @builtin(position) vec4<f32> {
|
||||
auto* data = got.data.Get<FirstIndexOffset::Data>();
|
||||
|
||||
ASSERT_NE(data, nullptr);
|
||||
EXPECT_EQ(data->has_vertex_index, true);
|
||||
EXPECT_EQ(data->has_instance_index, true);
|
||||
EXPECT_EQ(data->first_vertex_offset, 0u);
|
||||
EXPECT_EQ(data->first_instance_offset, 4u);
|
||||
EXPECT_EQ(data->has_vertex_or_instance_index, true);
|
||||
}
|
||||
|
||||
TEST_F(FirstIndexOffsetTest, BasicModuleBothIndex_OutOfOrder) {
|
||||
@@ -392,10 +374,7 @@ fn test(instance_idx : u32, vert_idx : u32) -> u32 {
|
||||
auto* data = got.data.Get<FirstIndexOffset::Data>();
|
||||
|
||||
ASSERT_NE(data, nullptr);
|
||||
EXPECT_EQ(data->has_vertex_index, true);
|
||||
EXPECT_EQ(data->has_instance_index, true);
|
||||
EXPECT_EQ(data->first_vertex_offset, 0u);
|
||||
EXPECT_EQ(data->first_instance_offset, 4u);
|
||||
EXPECT_EQ(data->has_vertex_or_instance_index, true);
|
||||
}
|
||||
|
||||
TEST_F(FirstIndexOffsetTest, NestedCalls) {
|
||||
@@ -447,10 +426,7 @@ fn entry(@builtin(vertex_index) vert_idx : u32) -> @builtin(position) vec4<f32>
|
||||
auto* data = got.data.Get<FirstIndexOffset::Data>();
|
||||
|
||||
ASSERT_NE(data, nullptr);
|
||||
EXPECT_EQ(data->has_vertex_index, true);
|
||||
EXPECT_EQ(data->has_instance_index, false);
|
||||
EXPECT_EQ(data->first_vertex_offset, 0u);
|
||||
EXPECT_EQ(data->first_instance_offset, 4u);
|
||||
EXPECT_EQ(data->has_vertex_or_instance_index, true);
|
||||
}
|
||||
|
||||
TEST_F(FirstIndexOffsetTest, NestedCalls_OutOfOrder) {
|
||||
@@ -502,10 +478,7 @@ fn func1(vert_idx : u32) -> u32 {
|
||||
auto* data = got.data.Get<FirstIndexOffset::Data>();
|
||||
|
||||
ASSERT_NE(data, nullptr);
|
||||
EXPECT_EQ(data->has_vertex_index, true);
|
||||
EXPECT_EQ(data->has_instance_index, false);
|
||||
EXPECT_EQ(data->first_vertex_offset, 0u);
|
||||
EXPECT_EQ(data->first_instance_offset, 4u);
|
||||
EXPECT_EQ(data->has_vertex_or_instance_index, true);
|
||||
}
|
||||
|
||||
TEST_F(FirstIndexOffsetTest, MultipleEntryPoints) {
|
||||
@@ -573,10 +546,7 @@ fn entry_c(@builtin(instance_index) inst_idx : u32) -> @builtin(position) vec4<f
|
||||
auto* data = got.data.Get<FirstIndexOffset::Data>();
|
||||
|
||||
ASSERT_NE(data, nullptr);
|
||||
EXPECT_EQ(data->has_vertex_index, true);
|
||||
EXPECT_EQ(data->has_instance_index, true);
|
||||
EXPECT_EQ(data->first_vertex_offset, 0u);
|
||||
EXPECT_EQ(data->first_instance_offset, 4u);
|
||||
EXPECT_EQ(data->has_vertex_or_instance_index, true);
|
||||
}
|
||||
|
||||
TEST_F(FirstIndexOffsetTest, MultipleEntryPoints_OutOfOrder) {
|
||||
@@ -644,10 +614,7 @@ fn func(i : u32) -> u32 {
|
||||
auto* data = got.data.Get<FirstIndexOffset::Data>();
|
||||
|
||||
ASSERT_NE(data, nullptr);
|
||||
EXPECT_EQ(data->has_vertex_index, true);
|
||||
EXPECT_EQ(data->has_instance_index, true);
|
||||
EXPECT_EQ(data->first_vertex_offset, 0u);
|
||||
EXPECT_EQ(data->first_instance_offset, 4u);
|
||||
EXPECT_EQ(data->has_vertex_or_instance_index, true);
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
Reference in New Issue
Block a user