mirror of
https://github.com/encounter/dawn-cmake.git
synced 2025-07-25 14:35:49 +00:00
Add transform to substitute overrides with const expressions.
This CL adds a SubstituteOverride transform which will convert an `override` into a `const`. The transform is provided a map of (string, double) which matches what the WebGPU API accepts as data for overrides. Bug: tint:1582 Change-Id: I6e6bf51b98ce4d4746f8de55128666c36735e585 Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/96760 Reviewed-by: Ben Clayton <bclayton@google.com> Commit-Queue: Dan Sinclair <dsinclair@chromium.org> Kokoro: Kokoro <noreply+kokoro@google.com>
This commit is contained in:
parent
9ec7893ad4
commit
256f1116b8
@ -31,6 +31,7 @@
|
|||||||
#include "src/tint/transform/renamer.h"
|
#include "src/tint/transform/renamer.h"
|
||||||
#include "src/tint/transform/robustness.h"
|
#include "src/tint/transform/robustness.h"
|
||||||
#include "src/tint/transform/single_entry_point.h"
|
#include "src/tint/transform/single_entry_point.h"
|
||||||
|
#include "src/tint/transform/substitute_override.h"
|
||||||
#include "src/tint/transform/vertex_pulling.h"
|
#include "src/tint/transform/vertex_pulling.h"
|
||||||
#include "src/tint/writer/flatten_bindings.h"
|
#include "src/tint/writer/flatten_bindings.h"
|
||||||
#include "src/tint/writer/writer.h"
|
#include "src/tint/writer/writer.h"
|
||||||
|
@ -287,9 +287,9 @@ libtint_source_set("libtint_core_all_src") {
|
|||||||
"ast/module.h",
|
"ast/module.h",
|
||||||
"ast/multisampled_texture.cc",
|
"ast/multisampled_texture.cc",
|
||||||
"ast/multisampled_texture.h",
|
"ast/multisampled_texture.h",
|
||||||
"ast/node_id.h",
|
|
||||||
"ast/node.cc",
|
"ast/node.cc",
|
||||||
"ast/node.h",
|
"ast/node.h",
|
||||||
|
"ast/node_id.h",
|
||||||
"ast/override.cc",
|
"ast/override.cc",
|
||||||
"ast/override.h",
|
"ast/override.h",
|
||||||
"ast/parameter.cc",
|
"ast/parameter.cc",
|
||||||
@ -529,6 +529,8 @@ libtint_source_set("libtint_core_all_src") {
|
|||||||
"transform/single_entry_point.h",
|
"transform/single_entry_point.h",
|
||||||
"transform/spirv_atomic.cc",
|
"transform/spirv_atomic.cc",
|
||||||
"transform/spirv_atomic.h",
|
"transform/spirv_atomic.h",
|
||||||
|
"transform/substitute_override.cc",
|
||||||
|
"transform/substitute_override.h",
|
||||||
"transform/transform.cc",
|
"transform/transform.cc",
|
||||||
"transform/transform.h",
|
"transform/transform.h",
|
||||||
"transform/unshadow.cc",
|
"transform/unshadow.cc",
|
||||||
@ -1034,6 +1036,7 @@ if (tint_build_unittests) {
|
|||||||
"ast/module_clone_test.cc",
|
"ast/module_clone_test.cc",
|
||||||
"ast/module_test.cc",
|
"ast/module_test.cc",
|
||||||
"ast/multisampled_texture_test.cc",
|
"ast/multisampled_texture_test.cc",
|
||||||
|
"ast/override_test.cc",
|
||||||
"ast/phony_expression_test.cc",
|
"ast/phony_expression_test.cc",
|
||||||
"ast/pointer_test.cc",
|
"ast/pointer_test.cc",
|
||||||
"ast/return_statement_test.cc",
|
"ast/return_statement_test.cc",
|
||||||
@ -1197,6 +1200,7 @@ if (tint_build_unittests) {
|
|||||||
"transform/simplify_pointers_test.cc",
|
"transform/simplify_pointers_test.cc",
|
||||||
"transform/single_entry_point_test.cc",
|
"transform/single_entry_point_test.cc",
|
||||||
"transform/spirv_atomic_test.cc",
|
"transform/spirv_atomic_test.cc",
|
||||||
|
"transform/substitute_override_test.cc",
|
||||||
"transform/test_helper.h",
|
"transform/test_helper.h",
|
||||||
"transform/transform_test.cc",
|
"transform/transform_test.cc",
|
||||||
"transform/unshadow_test.cc",
|
"transform/unshadow_test.cc",
|
||||||
|
@ -441,6 +441,8 @@ set(TINT_LIB_SRCS
|
|||||||
transform/single_entry_point.h
|
transform/single_entry_point.h
|
||||||
transform/spirv_atomic.cc
|
transform/spirv_atomic.cc
|
||||||
transform/spirv_atomic.h
|
transform/spirv_atomic.h
|
||||||
|
transform/substitute_override.cc
|
||||||
|
transform/substitute_override.h
|
||||||
transform/transform.cc
|
transform/transform.cc
|
||||||
transform/transform.h
|
transform/transform.h
|
||||||
transform/unshadow.cc
|
transform/unshadow.cc
|
||||||
@ -730,6 +732,7 @@ if(TINT_BUILD_TESTS)
|
|||||||
ast/module_clone_test.cc
|
ast/module_clone_test.cc
|
||||||
ast/module_test.cc
|
ast/module_test.cc
|
||||||
ast/multisampled_texture_test.cc
|
ast/multisampled_texture_test.cc
|
||||||
|
ast/override_test.cc
|
||||||
ast/phony_expression_test.cc
|
ast/phony_expression_test.cc
|
||||||
ast/pointer_test.cc
|
ast/pointer_test.cc
|
||||||
ast/return_statement_test.cc
|
ast/return_statement_test.cc
|
||||||
@ -1109,6 +1112,7 @@ if(TINT_BUILD_TESTS)
|
|||||||
transform/simplify_pointers_test.cc
|
transform/simplify_pointers_test.cc
|
||||||
transform/single_entry_point_test.cc
|
transform/single_entry_point_test.cc
|
||||||
transform/spirv_atomic_test.cc
|
transform/spirv_atomic_test.cc
|
||||||
|
transform/substitute_override_test.cc
|
||||||
transform/test_helper.h
|
transform/test_helper.h
|
||||||
transform/unshadow_test.cc
|
transform/unshadow_test.cc
|
||||||
transform/unwind_discard_functions_test.cc
|
transform/unwind_discard_functions_test.cc
|
||||||
|
@ -46,4 +46,11 @@ const Override* Override::Clone(CloneContext* ctx) const {
|
|||||||
return ctx->dst->create<Override>(src, sym, ty, ctor, attrs);
|
return ctx->dst->create<Override>(src, sym, ty, ctor, attrs);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::string Override::Identifier(const SymbolTable& symbols) const {
|
||||||
|
if (auto* id = ast::GetAttribute<ast::IdAttribute>(attributes)) {
|
||||||
|
return std::to_string(id->value);
|
||||||
|
}
|
||||||
|
return symbols.NameFor(symbol);
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace tint::ast
|
} // namespace tint::ast
|
||||||
|
@ -15,6 +15,8 @@
|
|||||||
#ifndef SRC_TINT_AST_OVERRIDE_H_
|
#ifndef SRC_TINT_AST_OVERRIDE_H_
|
||||||
#define SRC_TINT_AST_OVERRIDE_H_
|
#define SRC_TINT_AST_OVERRIDE_H_
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
|
||||||
#include "src/tint/ast/variable.h"
|
#include "src/tint/ast/variable.h"
|
||||||
|
|
||||||
namespace tint::ast {
|
namespace tint::ast {
|
||||||
@ -60,6 +62,12 @@ class Override final : public Castable<Override, Variable> {
|
|||||||
/// @param ctx the clone context
|
/// @param ctx the clone context
|
||||||
/// @return the newly cloned node
|
/// @return the newly cloned node
|
||||||
const Override* Clone(CloneContext* ctx) const override;
|
const Override* Clone(CloneContext* ctx) const override;
|
||||||
|
|
||||||
|
/// @param symbols the symbol table to retrieve the name from
|
||||||
|
/// @returns the identifier string for the override. If the override has
|
||||||
|
/// an ID attribute, the string is the id-stringified. Otherwise, the ID
|
||||||
|
/// is the symbol.
|
||||||
|
std::string Identifier(const SymbolTable& symbols) const;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace tint::ast
|
} // namespace tint::ast
|
||||||
|
35
src/tint/ast/override_test.cc
Normal file
35
src/tint/ast/override_test.cc
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
// Copyright 2022 The Tint Authors.
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
#include "src/tint/ast/override.h"
|
||||||
|
|
||||||
|
#include "src/tint/ast/test_helper.h"
|
||||||
|
|
||||||
|
namespace tint::ast {
|
||||||
|
namespace {
|
||||||
|
|
||||||
|
using OverrideTest = TestHelper;
|
||||||
|
|
||||||
|
TEST_F(OverrideTest, Identifier_NoId) {
|
||||||
|
auto* o = Override("o", nullptr, Expr(f32(1.0)));
|
||||||
|
EXPECT_EQ(std::string("o"), o->Identifier(Symbols()));
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(OverrideTest, Identifier_WithId) {
|
||||||
|
auto* o = Override("o", nullptr, Expr(f32(1.0)), {Id(4u)});
|
||||||
|
EXPECT_EQ(std::string("4"), o->Identifier(Symbols()));
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace
|
||||||
|
} // namespace tint::ast
|
@ -20,6 +20,7 @@
|
|||||||
#include <optional>
|
#include <optional>
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
#include <unordered_map>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
#if TINT_BUILD_GLSL_WRITER
|
#if TINT_BUILD_GLSL_WRITER
|
||||||
@ -86,7 +87,7 @@ struct Options {
|
|||||||
bool use_fxc = false;
|
bool use_fxc = false;
|
||||||
std::string dxc_path;
|
std::string dxc_path;
|
||||||
std::string xcrun_path;
|
std::string xcrun_path;
|
||||||
std::vector<std::string> overrides;
|
std::unordered_map<std::string, double> overrides;
|
||||||
std::optional<tint::sem::BindingPoint> hlsl_root_constant_binding_point;
|
std::optional<tint::sem::BindingPoint> hlsl_root_constant_binding_point;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -126,7 +127,8 @@ ${transforms}
|
|||||||
When specified, automatically enables --validate
|
When specified, automatically enables --validate
|
||||||
--xcrun -- Path to xcrun executable, used to validate MSL output.
|
--xcrun -- Path to xcrun executable, used to validate MSL output.
|
||||||
When specified, automatically enables --validate
|
When specified, automatically enables --validate
|
||||||
--overrides -- Pipeline overrides as NAME=VALUE, comma-separated.)";
|
--overrides -- Override values as IDENTIFIER=VALUE, comma-separated.
|
||||||
|
)";
|
||||||
|
|
||||||
Format parse_format(const std::string& fmt) {
|
Format parse_format(const std::string& fmt) {
|
||||||
(void)fmt;
|
(void)fmt;
|
||||||
@ -215,18 +217,26 @@ Format infer_format(const std::string& filename) {
|
|||||||
return Format::kNone;
|
return Format::kNone;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<std::string> split_on_comma(std::string list) {
|
std::vector<std::string> split_on_char(std::string list, char c) {
|
||||||
std::vector<std::string> res;
|
std::vector<std::string> res;
|
||||||
|
|
||||||
std::stringstream str(list);
|
std::stringstream str(list);
|
||||||
while (str.good()) {
|
while (str.good()) {
|
||||||
std::string substr;
|
std::string substr;
|
||||||
getline(str, substr, ',');
|
getline(str, substr, c);
|
||||||
res.push_back(substr);
|
res.push_back(substr);
|
||||||
}
|
}
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::vector<std::string> split_on_comma(std::string list) {
|
||||||
|
return split_on_char(list, ',');
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<std::string> split_on_equal(std::string list) {
|
||||||
|
return split_on_char(list, '=');
|
||||||
|
}
|
||||||
|
|
||||||
std::optional<uint64_t> parse_unsigned_number(std::string number) {
|
std::optional<uint64_t> parse_unsigned_number(std::string number) {
|
||||||
for (char c : number) {
|
for (char c : number) {
|
||||||
if (!std::isdigit(c)) {
|
if (!std::isdigit(c)) {
|
||||||
@ -429,7 +439,10 @@ bool ParseArgs(const std::vector<std::string>& args, Options* opts) {
|
|||||||
std::cerr << "Missing value for " << arg << std::endl;
|
std::cerr << "Missing value for " << arg << std::endl;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
opts->overrides = split_on_comma(args[i]);
|
for (const auto& o : split_on_comma(args[i])) {
|
||||||
|
auto parts = split_on_equal(o);
|
||||||
|
opts->overrides.insert({parts[0], std::stod(parts[1])});
|
||||||
|
}
|
||||||
} else if (arg == "--hlsl-root-constant-binding-point") {
|
} else if (arg == "--hlsl-root-constant-binding-point") {
|
||||||
++i;
|
++i;
|
||||||
if (i >= args.size()) {
|
if (i >= args.size()) {
|
||||||
@ -792,7 +805,7 @@ bool GenerateHlsl(const tint::Program* program, const Options& options) {
|
|||||||
tint::val::Result res;
|
tint::val::Result res;
|
||||||
if (options.use_fxc) {
|
if (options.use_fxc) {
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
res = tint::val::HlslUsingFXC(result.hlsl, result.entry_points, options.overrides);
|
res = tint::val::HlslUsingFXC(result.hlsl, result.entry_points);
|
||||||
#else
|
#else
|
||||||
res.failed = true;
|
res.failed = true;
|
||||||
res.output = "FXC can only be used on Windows. Sorry :X";
|
res.output = "FXC can only be used on Windows. Sorry :X";
|
||||||
@ -801,8 +814,7 @@ bool GenerateHlsl(const tint::Program* program, const Options& options) {
|
|||||||
auto dxc =
|
auto dxc =
|
||||||
tint::utils::Command::LookPath(options.dxc_path.empty() ? "dxc" : options.dxc_path);
|
tint::utils::Command::LookPath(options.dxc_path.empty() ? "dxc" : options.dxc_path);
|
||||||
if (dxc.Found()) {
|
if (dxc.Found()) {
|
||||||
res = tint::val::HlslUsingDXC(dxc.Path(), result.hlsl, result.entry_points,
|
res = tint::val::HlslUsingDXC(dxc.Path(), result.hlsl, result.entry_points);
|
||||||
options.overrides);
|
|
||||||
} else {
|
} else {
|
||||||
res.failed = true;
|
res.failed = true;
|
||||||
res.output = "DXC executable not found. Cannot validate";
|
res.output = "DXC executable not found. Cannot validate";
|
||||||
@ -947,6 +959,14 @@ int main(int argc, const char** argv) {
|
|||||||
tint::transform::DataMap&) { m.Add<tint::transform::Renamer>(); }},
|
tint::transform::DataMap&) { m.Add<tint::transform::Renamer>(); }},
|
||||||
{"robustness", [](tint::transform::Manager& m,
|
{"robustness", [](tint::transform::Manager& m,
|
||||||
tint::transform::DataMap&) { m.Add<tint::transform::Robustness>(); }},
|
tint::transform::DataMap&) { m.Add<tint::transform::Robustness>(); }},
|
||||||
|
{"substitute_override",
|
||||||
|
[&](tint::transform::Manager& m, tint::transform::DataMap& i) {
|
||||||
|
tint::transform::SubstituteOverride::Config cfg;
|
||||||
|
cfg.map = options.overrides;
|
||||||
|
|
||||||
|
i.Add<tint::transform::SubstituteOverride::Config>(cfg);
|
||||||
|
m.Add<tint::transform::SubstituteOverride>();
|
||||||
|
}},
|
||||||
};
|
};
|
||||||
auto transform_names = [&] {
|
auto transform_names = [&] {
|
||||||
std::stringstream names;
|
std::stringstream names;
|
||||||
@ -1078,6 +1098,17 @@ int main(int argc, const char** argv) {
|
|||||||
|
|
||||||
tint::transform::Manager transform_manager;
|
tint::transform::Manager transform_manager;
|
||||||
tint::transform::DataMap transform_inputs;
|
tint::transform::DataMap transform_inputs;
|
||||||
|
|
||||||
|
// If overrides are provided, add the SubstituteOverride transform.
|
||||||
|
if (!options.overrides.empty()) {
|
||||||
|
for (auto& t : transforms) {
|
||||||
|
if (t.name == std::string("substitute_override")) {
|
||||||
|
t.make(transform_manager, transform_inputs);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
for (const auto& name : options.transforms) {
|
for (const auto& name : options.transforms) {
|
||||||
// TODO(dsinclair): The vertex pulling transform requires setup code to
|
// TODO(dsinclair): The vertex pulling transform requires setup code to
|
||||||
// be run that needs user input. Should we find a way to support that here
|
// be run that needs user input. Should we find a way to support that here
|
||||||
|
96
src/tint/transform/substitute_override.cc
Normal file
96
src/tint/transform/substitute_override.cc
Normal file
@ -0,0 +1,96 @@
|
|||||||
|
// Copyright 2022 The Tint Authors.
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
#include "src/tint/transform/substitute_override.h"
|
||||||
|
|
||||||
|
#include <functional>
|
||||||
|
|
||||||
|
#include "src/tint/program_builder.h"
|
||||||
|
#include "src/tint/sem/variable.h"
|
||||||
|
|
||||||
|
TINT_INSTANTIATE_TYPEINFO(tint::transform::SubstituteOverride);
|
||||||
|
TINT_INSTANTIATE_TYPEINFO(tint::transform::SubstituteOverride::Config);
|
||||||
|
|
||||||
|
namespace tint::transform {
|
||||||
|
|
||||||
|
SubstituteOverride::SubstituteOverride() = default;
|
||||||
|
|
||||||
|
SubstituteOverride::~SubstituteOverride() = default;
|
||||||
|
|
||||||
|
bool SubstituteOverride::ShouldRun(const Program* program, const DataMap&) const {
|
||||||
|
for (auto* node : program->AST().GlobalVariables()) {
|
||||||
|
if (node->Is<ast::Override>()) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SubstituteOverride::Run(CloneContext& ctx, const DataMap& config, DataMap&) const {
|
||||||
|
const auto* data = config.Get<Config>();
|
||||||
|
if (!data) {
|
||||||
|
ctx.dst->Diagnostics().add_error(diag::System::Transform,
|
||||||
|
"Missing override substitution data");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
ctx.ReplaceAll([&](const ast::Override* w) -> const ast::Const* {
|
||||||
|
auto ident = w->Identifier(ctx.src->Symbols());
|
||||||
|
|
||||||
|
auto src = ctx.Clone(w->source);
|
||||||
|
auto sym = ctx.Clone(w->symbol);
|
||||||
|
auto* ty = ctx.Clone(w->type);
|
||||||
|
|
||||||
|
// No replacement provided, just clone the override node as a const.
|
||||||
|
auto iter = data->map.find(ident);
|
||||||
|
if (iter == data->map.end()) {
|
||||||
|
if (!w->constructor) {
|
||||||
|
ctx.dst->Diagnostics().add_error(
|
||||||
|
diag::System::Transform,
|
||||||
|
"Initializer not provided for override, and override not overridden.");
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
return ctx.dst->Const(src, sym, ty, ctx.Clone(w->constructor));
|
||||||
|
}
|
||||||
|
|
||||||
|
auto value = iter->second;
|
||||||
|
auto* ctor = Switch(
|
||||||
|
ctx.src->Sem().Get(w)->Type(),
|
||||||
|
[&](const sem::Bool*) { return ctx.dst->Expr(!std::equal_to<double>()(value, 0.0)); },
|
||||||
|
[&](const sem::I32*) { return ctx.dst->Expr(i32(value)); },
|
||||||
|
[&](const sem::U32*) { return ctx.dst->Expr(u32(value)); },
|
||||||
|
[&](const sem::F32*) { return ctx.dst->Expr(f32(value)); },
|
||||||
|
[&](const sem::F16*) { return ctx.dst->Expr(f16(value)); });
|
||||||
|
|
||||||
|
if (!ctor) {
|
||||||
|
ctx.dst->Diagnostics().add_error(diag::System::Transform,
|
||||||
|
"Failed to create override expression");
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ctx.dst->Const(src, sym, ty, ctor);
|
||||||
|
});
|
||||||
|
|
||||||
|
ctx.Clone();
|
||||||
|
}
|
||||||
|
|
||||||
|
SubstituteOverride::Config::Config() = default;
|
||||||
|
|
||||||
|
SubstituteOverride::Config::Config(const Config&) = default;
|
||||||
|
|
||||||
|
SubstituteOverride::Config::~Config() = default;
|
||||||
|
|
||||||
|
SubstituteOverride::Config& SubstituteOverride::Config::operator=(const Config&) = default;
|
||||||
|
|
||||||
|
} // namespace tint::transform
|
89
src/tint/transform/substitute_override.h
Normal file
89
src/tint/transform/substitute_override.h
Normal file
@ -0,0 +1,89 @@
|
|||||||
|
// Copyright 2022 The Tint Authors.
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
#ifndef SRC_TINT_TRANSFORM_SUBSTITUTE_OVERRIDE_H_
|
||||||
|
#define SRC_TINT_TRANSFORM_SUBSTITUTE_OVERRIDE_H_
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
#include <unordered_map>
|
||||||
|
|
||||||
|
#include "src/tint/transform/transform.h"
|
||||||
|
|
||||||
|
namespace tint::transform {
|
||||||
|
|
||||||
|
/// A transform that replaces overrides with the constant values provided.
|
||||||
|
///
|
||||||
|
/// # Example
|
||||||
|
/// ```
|
||||||
|
/// override width: f32;
|
||||||
|
/// @id(1) override height: i32 = 4;
|
||||||
|
/// override depth = 1i;
|
||||||
|
/// ```
|
||||||
|
///
|
||||||
|
/// When transformed with `width` -> 1, `1` -> 22, `depth` -> 42
|
||||||
|
///
|
||||||
|
/// ```
|
||||||
|
/// const width: f32 = 1f;
|
||||||
|
/// const height: i32 = 22i;
|
||||||
|
/// const depth = 42i;
|
||||||
|
/// ```
|
||||||
|
///
|
||||||
|
/// @see crbug.com/tint/1582
|
||||||
|
class SubstituteOverride final : public Castable<SubstituteOverride, Transform> {
|
||||||
|
public:
|
||||||
|
/// Configuration options for the transform
|
||||||
|
struct Config final : public Castable<Config, Data> {
|
||||||
|
/// Constructor
|
||||||
|
Config();
|
||||||
|
|
||||||
|
/// Copy constructor
|
||||||
|
Config(const Config&);
|
||||||
|
|
||||||
|
/// Destructor
|
||||||
|
~Config() override;
|
||||||
|
|
||||||
|
/// Assignment operator
|
||||||
|
/// @returns this Config
|
||||||
|
Config& operator=(const Config&);
|
||||||
|
|
||||||
|
/// The map of override name (either the identifier or id) to value.
|
||||||
|
/// The value is always a double coming into the transform and will be
|
||||||
|
/// converted to the correct type through and initializer.
|
||||||
|
std::unordered_map<std::string, double> map;
|
||||||
|
};
|
||||||
|
|
||||||
|
/// Constructor
|
||||||
|
SubstituteOverride();
|
||||||
|
|
||||||
|
/// Destructor
|
||||||
|
~SubstituteOverride() override;
|
||||||
|
|
||||||
|
/// @param program the program to inspect
|
||||||
|
/// @param data optional extra transform-specific input data
|
||||||
|
/// @returns true if this transform should be run for the given program
|
||||||
|
bool ShouldRun(const Program* program, const DataMap& data = {}) const override;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
/// Runs the transform using the CloneContext built for transforming a
|
||||||
|
/// program. Run() is responsible for calling Clone() on the CloneContext.
|
||||||
|
/// @param ctx the CloneContext primed with the input program and
|
||||||
|
/// ProgramBuilder
|
||||||
|
/// @param inputs optional extra transform-specific input data
|
||||||
|
/// @param outputs optional extra transform-specific output data
|
||||||
|
void Run(CloneContext& ctx, const DataMap& inputs, DataMap& outputs) const override;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace tint::transform
|
||||||
|
|
||||||
|
#endif // SRC_TINT_TRANSFORM_SUBSTITUTE_OVERRIDE_H_
|
243
src/tint/transform/substitute_override_test.cc
Normal file
243
src/tint/transform/substitute_override_test.cc
Normal file
@ -0,0 +1,243 @@
|
|||||||
|
// Copyright 2022 The Tint Authors.
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
#include "src/tint/transform/substitute_override.h"
|
||||||
|
|
||||||
|
#include "src/tint/transform/test_helper.h"
|
||||||
|
|
||||||
|
namespace tint::transform {
|
||||||
|
namespace {
|
||||||
|
|
||||||
|
using SubstituteOverrideTest = TransformTest;
|
||||||
|
|
||||||
|
TEST_F(SubstituteOverrideTest, Error_NoData) {
|
||||||
|
auto* src = R"(
|
||||||
|
override width: i32;
|
||||||
|
@vertex
|
||||||
|
fn main() -> @builtin(position) vec4<f32> {
|
||||||
|
return vec4<f32>();
|
||||||
|
}
|
||||||
|
)";
|
||||||
|
|
||||||
|
auto* expect = "error: Missing override substitution data";
|
||||||
|
|
||||||
|
DataMap data;
|
||||||
|
auto got = Run<SubstituteOverride>(src, data);
|
||||||
|
|
||||||
|
EXPECT_EQ(expect, str(got));
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(SubstituteOverrideTest, Error_NoOverrideValue) {
|
||||||
|
auto* src = R"(
|
||||||
|
override width: i32;
|
||||||
|
@vertex
|
||||||
|
fn main() -> @builtin(position) vec4<f32> {
|
||||||
|
return vec4<f32>();
|
||||||
|
}
|
||||||
|
)";
|
||||||
|
|
||||||
|
auto* expect = "error: Initializer not provided for override, and override not overridden.";
|
||||||
|
|
||||||
|
SubstituteOverride::Config cfg;
|
||||||
|
DataMap data;
|
||||||
|
data.Add<SubstituteOverride::Config>(cfg);
|
||||||
|
|
||||||
|
auto got = Run<SubstituteOverride>(src, data);
|
||||||
|
|
||||||
|
EXPECT_EQ(expect, str(got));
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(SubstituteOverrideTest, Module_NoOverrides) {
|
||||||
|
auto* src = R"(
|
||||||
|
@vertex
|
||||||
|
fn main() -> @builtin(position) vec4<f32> {
|
||||||
|
return vec4<f32>();
|
||||||
|
}
|
||||||
|
)";
|
||||||
|
|
||||||
|
auto* expect = R"(
|
||||||
|
@vertex
|
||||||
|
fn main() -> @builtin(position) vec4<f32> {
|
||||||
|
return vec4<f32>();
|
||||||
|
}
|
||||||
|
)";
|
||||||
|
|
||||||
|
SubstituteOverride::Config cfg;
|
||||||
|
|
||||||
|
DataMap data;
|
||||||
|
data.Add<SubstituteOverride::Config>(cfg);
|
||||||
|
auto got = Run<SubstituteOverride>(src, data);
|
||||||
|
|
||||||
|
EXPECT_EQ(expect, str(got));
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(SubstituteOverrideTest, Identifier) {
|
||||||
|
auto* src = R"(
|
||||||
|
override i_width: i32;
|
||||||
|
override i_height = 1i;
|
||||||
|
|
||||||
|
override f_width: f32;
|
||||||
|
override f_height = 1.f;
|
||||||
|
|
||||||
|
// TODO(crbug.com/tint/1473)
|
||||||
|
// override h_width: f16;
|
||||||
|
// override h_height = 1.h;
|
||||||
|
|
||||||
|
override b_width: bool;
|
||||||
|
override b_height = true;
|
||||||
|
|
||||||
|
override o_width = 2i;
|
||||||
|
|
||||||
|
@vertex
|
||||||
|
fn main() -> @builtin(position) vec4<f32> {
|
||||||
|
return vec4<f32>();
|
||||||
|
}
|
||||||
|
)";
|
||||||
|
|
||||||
|
auto* expect = R"(
|
||||||
|
const i_width : i32 = 42i;
|
||||||
|
|
||||||
|
const i_height = 11i;
|
||||||
|
|
||||||
|
const f_width : f32 = 22.299999237f;
|
||||||
|
|
||||||
|
const f_height = 12.399999619f;
|
||||||
|
|
||||||
|
const b_width : bool = true;
|
||||||
|
|
||||||
|
const b_height = false;
|
||||||
|
|
||||||
|
const o_width = 2i;
|
||||||
|
|
||||||
|
@vertex
|
||||||
|
fn main() -> @builtin(position) vec4<f32> {
|
||||||
|
return vec4<f32>();
|
||||||
|
}
|
||||||
|
)";
|
||||||
|
|
||||||
|
SubstituteOverride::Config cfg;
|
||||||
|
cfg.map.insert({"i_width", 42.0});
|
||||||
|
cfg.map.insert({"i_height", 11.0});
|
||||||
|
cfg.map.insert({"f_width", 22.3});
|
||||||
|
cfg.map.insert({"f_height", 12.4});
|
||||||
|
cfg.map.insert({"h_width", 9.4});
|
||||||
|
cfg.map.insert({"h_height", 3.4});
|
||||||
|
cfg.map.insert({"b_width", 1.0});
|
||||||
|
cfg.map.insert({"b_height", 0.0});
|
||||||
|
|
||||||
|
DataMap data;
|
||||||
|
data.Add<SubstituteOverride::Config>(cfg);
|
||||||
|
auto got = Run<SubstituteOverride>(src, data);
|
||||||
|
|
||||||
|
EXPECT_EQ(expect, str(got));
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(SubstituteOverrideTest, Id) {
|
||||||
|
auto* src = R"(
|
||||||
|
enable f16;
|
||||||
|
|
||||||
|
@id(0) override i_width: i32;
|
||||||
|
@id(10) override i_height = 1i;
|
||||||
|
|
||||||
|
@id(1) override f_width: f32;
|
||||||
|
@id(9) override f_height = 1.f;
|
||||||
|
|
||||||
|
// TODO(crbug.com/tint/1473)
|
||||||
|
// @id(2) override h_width: f16;
|
||||||
|
// @id(8) override h_height = 1.h;
|
||||||
|
|
||||||
|
@id(3) override b_width: bool;
|
||||||
|
@id(7) override b_height = true;
|
||||||
|
|
||||||
|
@id(5) override o_width = 2i;
|
||||||
|
|
||||||
|
@vertex
|
||||||
|
fn main() -> @builtin(position) vec4<f32> {
|
||||||
|
return vec4<f32>();
|
||||||
|
}
|
||||||
|
)";
|
||||||
|
|
||||||
|
auto* expect = R"(
|
||||||
|
enable f16;
|
||||||
|
|
||||||
|
const i_width : i32 = 42i;
|
||||||
|
|
||||||
|
const i_height = 11i;
|
||||||
|
|
||||||
|
const f_width : f32 = 22.299999237f;
|
||||||
|
|
||||||
|
const f_height = 12.399999619f;
|
||||||
|
|
||||||
|
const b_width : bool = true;
|
||||||
|
|
||||||
|
const b_height = false;
|
||||||
|
|
||||||
|
const o_width = 2i;
|
||||||
|
|
||||||
|
@vertex
|
||||||
|
fn main() -> @builtin(position) vec4<f32> {
|
||||||
|
return vec4<f32>();
|
||||||
|
}
|
||||||
|
)";
|
||||||
|
|
||||||
|
SubstituteOverride::Config cfg;
|
||||||
|
cfg.map.insert({"0", 42.0});
|
||||||
|
cfg.map.insert({"10", 11.0});
|
||||||
|
cfg.map.insert({"1", 22.3});
|
||||||
|
cfg.map.insert({"9", 12.4});
|
||||||
|
cfg.map.insert({"2", 9.4});
|
||||||
|
cfg.map.insert({"8", 3.4});
|
||||||
|
cfg.map.insert({"3", 1.0});
|
||||||
|
cfg.map.insert({"7", 0.0});
|
||||||
|
// No effect because an @id is set for o_width
|
||||||
|
cfg.map.insert({"o_width", 13});
|
||||||
|
|
||||||
|
DataMap data;
|
||||||
|
data.Add<SubstituteOverride::Config>(cfg);
|
||||||
|
auto got = Run<SubstituteOverride>(src, data);
|
||||||
|
|
||||||
|
EXPECT_EQ(expect, str(got));
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(SubstituteOverrideTest, Identifier_Expression) {
|
||||||
|
auto* src = R"(
|
||||||
|
override i_height = ~2i;
|
||||||
|
|
||||||
|
@vertex
|
||||||
|
fn main() -> @builtin(position) vec4<f32> {
|
||||||
|
return vec4<f32>();
|
||||||
|
}
|
||||||
|
)";
|
||||||
|
|
||||||
|
auto* expect = R"(
|
||||||
|
const i_height = 11i;
|
||||||
|
|
||||||
|
@vertex
|
||||||
|
fn main() -> @builtin(position) vec4<f32> {
|
||||||
|
return vec4<f32>();
|
||||||
|
}
|
||||||
|
)";
|
||||||
|
|
||||||
|
SubstituteOverride::Config cfg;
|
||||||
|
cfg.map.insert({"i_height", 11.0});
|
||||||
|
|
||||||
|
DataMap data;
|
||||||
|
data.Add<SubstituteOverride::Config>(cfg);
|
||||||
|
auto got = Run<SubstituteOverride>(src, data);
|
||||||
|
|
||||||
|
EXPECT_EQ(expect, str(got));
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace
|
||||||
|
} // namespace tint::transform
|
@ -30,8 +30,7 @@ namespace tint::val {
|
|||||||
|
|
||||||
Result HlslUsingDXC(const std::string& dxc_path,
|
Result HlslUsingDXC(const std::string& dxc_path,
|
||||||
const std::string& source,
|
const std::string& source,
|
||||||
const EntryPointList& entry_points,
|
const EntryPointList& entry_points) {
|
||||||
const std::vector<std::string>& overrides) {
|
|
||||||
Result result;
|
Result result;
|
||||||
|
|
||||||
auto dxc = utils::Command(dxc_path);
|
auto dxc = utils::Command(dxc_path);
|
||||||
@ -70,13 +69,7 @@ Result HlslUsingDXC(const std::string& dxc_path,
|
|||||||
"/Zpr " // D3DCOMPILE_PACK_MATRIX_ROW_MAJOR
|
"/Zpr " // D3DCOMPILE_PACK_MATRIX_ROW_MAJOR
|
||||||
"/Gis"; // D3DCOMPILE_IEEE_STRICTNESS
|
"/Gis"; // D3DCOMPILE_IEEE_STRICTNESS
|
||||||
|
|
||||||
std::string defs;
|
auto res = dxc(profile, "-E " + ep.first, compileFlags, file.Path());
|
||||||
defs.reserve(overrides.size() * 20);
|
|
||||||
for (auto& o : overrides) {
|
|
||||||
defs += "/D" + o + " ";
|
|
||||||
}
|
|
||||||
|
|
||||||
auto res = dxc(profile, "-E " + ep.first, compileFlags, file.Path(), defs);
|
|
||||||
if (!res.out.empty()) {
|
if (!res.out.empty()) {
|
||||||
if (!result.output.empty()) {
|
if (!result.output.empty()) {
|
||||||
result.output += "\n";
|
result.output += "\n";
|
||||||
@ -102,9 +95,7 @@ Result HlslUsingDXC(const std::string& dxc_path,
|
|||||||
}
|
}
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
Result HlslUsingFXC(const std::string& source,
|
Result HlslUsingFXC(const std::string& source, const EntryPointList& entry_points) {
|
||||||
const EntryPointList& entry_points,
|
|
||||||
const std::vector<std::string>& overrides) {
|
|
||||||
Result result;
|
Result result;
|
||||||
|
|
||||||
// This library leaks if an error happens in this function, but it is ok
|
// This library leaks if an error happens in this function, but it is ok
|
||||||
@ -148,26 +139,12 @@ Result HlslUsingFXC(const std::string& source,
|
|||||||
UINT compileFlags = D3DCOMPILE_OPTIMIZATION_LEVEL0 | D3DCOMPILE_PACK_MATRIX_ROW_MAJOR |
|
UINT compileFlags = D3DCOMPILE_OPTIMIZATION_LEVEL0 | D3DCOMPILE_PACK_MATRIX_ROW_MAJOR |
|
||||||
D3DCOMPILE_IEEE_STRICTNESS;
|
D3DCOMPILE_IEEE_STRICTNESS;
|
||||||
|
|
||||||
auto overrides_copy = overrides; // Copy so that we can replace '=' with '\0'
|
|
||||||
std::vector<D3D_SHADER_MACRO> macros;
|
|
||||||
macros.reserve(overrides_copy.size() * 2);
|
|
||||||
for (auto& o : overrides_copy) {
|
|
||||||
if (auto sep = o.find_first_of('='); sep != std::string::npos) {
|
|
||||||
// Replace '=' with '\0' so we can point directly into the allocated string buffer
|
|
||||||
o[sep] = '\0';
|
|
||||||
macros.push_back(D3D_SHADER_MACRO{&o[0], &o[sep + 1]});
|
|
||||||
} else {
|
|
||||||
macros.emplace_back(D3D_SHADER_MACRO{o.c_str(), NULL});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
macros.emplace_back(D3D_SHADER_MACRO{NULL, NULL});
|
|
||||||
|
|
||||||
ComPtr<ID3DBlob> compiledShader;
|
ComPtr<ID3DBlob> compiledShader;
|
||||||
ComPtr<ID3DBlob> errors;
|
ComPtr<ID3DBlob> errors;
|
||||||
HRESULT cr = d3dCompile(source.c_str(), // pSrcData
|
HRESULT cr = d3dCompile(source.c_str(), // pSrcData
|
||||||
source.length(), // SrcDataSize
|
source.length(), // SrcDataSize
|
||||||
nullptr, // pSourceName
|
nullptr, // pSourceName
|
||||||
macros.data(), // pDefines
|
nullptr, // pDefines
|
||||||
nullptr, // pInclude
|
nullptr, // pInclude
|
||||||
ep.first.c_str(), // pEntrypoint
|
ep.first.c_str(), // pEntrypoint
|
||||||
profile, // pTarget
|
profile, // pTarget
|
||||||
|
@ -43,23 +43,18 @@ struct Result {
|
|||||||
/// @param dxc_path path to DXC
|
/// @param dxc_path path to DXC
|
||||||
/// @param source the generated HLSL source
|
/// @param source the generated HLSL source
|
||||||
/// @param entry_points the list of entry points to validate
|
/// @param entry_points the list of entry points to validate
|
||||||
/// @param overrides optional list of pipeline overrides
|
|
||||||
/// @return the result of the compile
|
/// @return the result of the compile
|
||||||
Result HlslUsingDXC(const std::string& dxc_path,
|
Result HlslUsingDXC(const std::string& dxc_path,
|
||||||
const std::string& source,
|
const std::string& source,
|
||||||
const EntryPointList& entry_points,
|
const EntryPointList& entry_points);
|
||||||
const std::vector<std::string>& overrides);
|
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
/// Hlsl attempts to compile the shader with FXC, verifying that the shader
|
/// Hlsl attempts to compile the shader with FXC, verifying that the shader
|
||||||
/// compiles successfully.
|
/// compiles successfully.
|
||||||
/// @param source the generated HLSL source
|
/// @param source the generated HLSL source
|
||||||
/// @param entry_points the list of entry points to validate
|
/// @param entry_points the list of entry points to validate
|
||||||
/// @param overrides optional list of pipeline overrides
|
|
||||||
/// @return the result of the compile
|
/// @return the result of the compile
|
||||||
Result HlslUsingFXC(const std::string& source,
|
Result HlslUsingFXC(const std::string& source, const EntryPointList& entry_points);
|
||||||
const EntryPointList& entry_points,
|
|
||||||
const std::vector<std::string>& overrides);
|
|
||||||
#endif // _WIN32
|
#endif // _WIN32
|
||||||
|
|
||||||
/// Msl attempts to compile the shader with the Metal Shader Compiler,
|
/// Msl attempts to compile the shader with the Metal Shader Compiler,
|
||||||
|
@ -1,7 +1,10 @@
|
|||||||
// flags: --overrides WGSL_SPEC_CONSTANT_0=0
|
// flags: --overrides o=0,j=1
|
||||||
override o : bool;
|
override o : bool;
|
||||||
|
override j : bool;
|
||||||
|
|
||||||
@compute @workgroup_size(1)
|
@compute @workgroup_size(1)
|
||||||
fn main() {
|
fn main() {
|
||||||
_ = o;
|
if o && j {
|
||||||
|
_ = 1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,12 +1,12 @@
|
|||||||
SKIP: FAILED
|
|
||||||
|
|
||||||
#version 310 es
|
#version 310 es
|
||||||
|
|
||||||
#ifndef WGSL_SPEC_CONSTANT_0
|
|
||||||
#error spec constant required for constant id 0
|
|
||||||
#endif
|
|
||||||
const bool o = WGSL_SPEC_CONSTANT_0;
|
|
||||||
void tint_symbol() {
|
void tint_symbol() {
|
||||||
|
bool tint_tmp = false;
|
||||||
|
if (tint_tmp) {
|
||||||
|
tint_tmp = true;
|
||||||
|
}
|
||||||
|
if ((tint_tmp)) {
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
|
layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
|
||||||
@ -14,11 +14,3 @@ void main() {
|
|||||||
tint_symbol();
|
tint_symbol();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
Error parsing GLSL shader:
|
|
||||||
ERROR: 0:4: '#error' : spec constant required for constant id 0
|
|
||||||
ERROR: 0:5: '' : missing #endif
|
|
||||||
ERROR: 0:5: '' : compilation terminated
|
|
||||||
ERROR: 3 compilation errors. No code generated.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,9 +1,10 @@
|
|||||||
#ifndef WGSL_SPEC_CONSTANT_0
|
|
||||||
#error spec constant required for constant id 0
|
|
||||||
#endif
|
|
||||||
static const bool o = WGSL_SPEC_CONSTANT_0;
|
|
||||||
|
|
||||||
[numthreads(1, 1, 1)]
|
[numthreads(1, 1, 1)]
|
||||||
void main() {
|
void main() {
|
||||||
|
bool tint_tmp = false;
|
||||||
|
if (tint_tmp) {
|
||||||
|
tint_tmp = true;
|
||||||
|
}
|
||||||
|
if ((tint_tmp)) {
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -1,9 +1,9 @@
|
|||||||
#include <metal_stdlib>
|
#include <metal_stdlib>
|
||||||
|
|
||||||
using namespace metal;
|
using namespace metal;
|
||||||
constant bool o [[function_constant(0)]];
|
|
||||||
|
|
||||||
kernel void tint_symbol() {
|
kernel void tint_symbol() {
|
||||||
|
if ((false && true)) {
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,20 +1,30 @@
|
|||||||
; SPIR-V
|
; SPIR-V
|
||||||
; Version: 1.3
|
; Version: 1.3
|
||||||
; Generator: Google Tint Compiler; 0
|
; Generator: Google Tint Compiler; 0
|
||||||
; Bound: 7
|
; Bound: 13
|
||||||
; Schema: 0
|
; Schema: 0
|
||||||
OpCapability Shader
|
OpCapability Shader
|
||||||
OpMemoryModel Logical GLSL450
|
OpMemoryModel Logical GLSL450
|
||||||
OpEntryPoint GLCompute %main "main"
|
OpEntryPoint GLCompute %main "main"
|
||||||
OpExecutionMode %main LocalSize 1 1 1
|
OpExecutionMode %main LocalSize 1 1 1
|
||||||
OpName %o "o"
|
|
||||||
OpName %main "main"
|
OpName %main "main"
|
||||||
OpDecorate %o SpecId 0
|
|
||||||
%bool = OpTypeBool
|
|
||||||
%o = OpSpecConstantFalse %bool
|
|
||||||
%void = OpTypeVoid
|
%void = OpTypeVoid
|
||||||
%3 = OpTypeFunction %void
|
%1 = OpTypeFunction %void
|
||||||
%main = OpFunction %void None %3
|
%bool = OpTypeBool
|
||||||
%6 = OpLabel
|
%6 = OpConstantNull %bool
|
||||||
|
%true = OpConstantTrue %bool
|
||||||
|
%main = OpFunction %void None %1
|
||||||
|
%4 = OpLabel
|
||||||
|
OpSelectionMerge %7 None
|
||||||
|
OpBranchConditional %6 %8 %7
|
||||||
|
%8 = OpLabel
|
||||||
|
OpBranch %7
|
||||||
|
%7 = OpLabel
|
||||||
|
%10 = OpPhi %bool %6 %4 %true %8
|
||||||
|
OpSelectionMerge %11 None
|
||||||
|
OpBranchConditional %10 %12 %11
|
||||||
|
%12 = OpLabel
|
||||||
|
OpBranch %11
|
||||||
|
%11 = OpLabel
|
||||||
OpReturn
|
OpReturn
|
||||||
OpFunctionEnd
|
OpFunctionEnd
|
||||||
|
@ -1,6 +1,10 @@
|
|||||||
override o : bool;
|
const o : bool = false;
|
||||||
|
|
||||||
|
const j : bool = true;
|
||||||
|
|
||||||
@compute @workgroup_size(1)
|
@compute @workgroup_size(1)
|
||||||
fn main() {
|
fn main() {
|
||||||
_ = o;
|
if ((o && j)) {
|
||||||
|
_ = 1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,9 @@
|
|||||||
// flags: --overrides WGSL_SPEC_CONSTANT_0=0
|
// flags: --overrides o=0
|
||||||
override o : f32;
|
override o : f32;
|
||||||
|
|
||||||
@compute @workgroup_size(1)
|
@compute @workgroup_size(1)
|
||||||
fn main() {
|
fn main() {
|
||||||
_ = o;
|
if o == 0.0 {
|
||||||
|
_ = 1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,12 +1,8 @@
|
|||||||
SKIP: FAILED
|
|
||||||
|
|
||||||
#version 310 es
|
#version 310 es
|
||||||
|
|
||||||
#ifndef WGSL_SPEC_CONSTANT_0
|
|
||||||
#error spec constant required for constant id 0
|
|
||||||
#endif
|
|
||||||
const float o = WGSL_SPEC_CONSTANT_0;
|
|
||||||
void tint_symbol() {
|
void tint_symbol() {
|
||||||
|
if ((0.0f == 0.0f)) {
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
|
layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
|
||||||
@ -14,11 +10,3 @@ void main() {
|
|||||||
tint_symbol();
|
tint_symbol();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
Error parsing GLSL shader:
|
|
||||||
ERROR: 0:4: '#error' : spec constant required for constant id 0
|
|
||||||
ERROR: 0:5: '' : missing #endif
|
|
||||||
ERROR: 0:5: '' : compilation terminated
|
|
||||||
ERROR: 3 compilation errors. No code generated.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,9 +1,6 @@
|
|||||||
#ifndef WGSL_SPEC_CONSTANT_0
|
|
||||||
#error spec constant required for constant id 0
|
|
||||||
#endif
|
|
||||||
static const float o = WGSL_SPEC_CONSTANT_0;
|
|
||||||
|
|
||||||
[numthreads(1, 1, 1)]
|
[numthreads(1, 1, 1)]
|
||||||
void main() {
|
void main() {
|
||||||
|
if ((0.0f == 0.0f)) {
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -1,9 +1,9 @@
|
|||||||
#include <metal_stdlib>
|
#include <metal_stdlib>
|
||||||
|
|
||||||
using namespace metal;
|
using namespace metal;
|
||||||
constant float o [[function_constant(0)]];
|
|
||||||
|
|
||||||
kernel void tint_symbol() {
|
kernel void tint_symbol() {
|
||||||
|
if ((0.0f == 0.0f)) {
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,20 +1,25 @@
|
|||||||
; SPIR-V
|
; SPIR-V
|
||||||
; Version: 1.3
|
; Version: 1.3
|
||||||
; Generator: Google Tint Compiler; 0
|
; Generator: Google Tint Compiler; 0
|
||||||
; Bound: 7
|
; Bound: 11
|
||||||
; Schema: 0
|
; Schema: 0
|
||||||
OpCapability Shader
|
OpCapability Shader
|
||||||
OpMemoryModel Logical GLSL450
|
OpMemoryModel Logical GLSL450
|
||||||
OpEntryPoint GLCompute %main "main"
|
OpEntryPoint GLCompute %main "main"
|
||||||
OpExecutionMode %main LocalSize 1 1 1
|
OpExecutionMode %main LocalSize 1 1 1
|
||||||
OpName %o "o"
|
|
||||||
OpName %main "main"
|
OpName %main "main"
|
||||||
OpDecorate %o SpecId 0
|
|
||||||
%float = OpTypeFloat 32
|
|
||||||
%o = OpSpecConstant %float 0
|
|
||||||
%void = OpTypeVoid
|
%void = OpTypeVoid
|
||||||
%3 = OpTypeFunction %void
|
%1 = OpTypeFunction %void
|
||||||
%main = OpFunction %void None %3
|
%float = OpTypeFloat 32
|
||||||
%6 = OpLabel
|
%6 = OpConstantNull %float
|
||||||
|
%bool = OpTypeBool
|
||||||
|
%main = OpFunction %void None %1
|
||||||
|
%4 = OpLabel
|
||||||
|
%7 = OpFOrdEqual %bool %6 %6
|
||||||
|
OpSelectionMerge %9 None
|
||||||
|
OpBranchConditional %7 %10 %9
|
||||||
|
%10 = OpLabel
|
||||||
|
OpBranch %9
|
||||||
|
%9 = OpLabel
|
||||||
OpReturn
|
OpReturn
|
||||||
OpFunctionEnd
|
OpFunctionEnd
|
||||||
|
@ -1,6 +1,8 @@
|
|||||||
override o : f32;
|
const o : f32 = 0.0f;
|
||||||
|
|
||||||
@compute @workgroup_size(1)
|
@compute @workgroup_size(1)
|
||||||
fn main() {
|
fn main() {
|
||||||
_ = o;
|
if ((o == 0.0)) {
|
||||||
|
_ = 1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,9 @@
|
|||||||
// flags: --overrides WGSL_SPEC_CONSTANT_0=0
|
// flags: --overrides o=0
|
||||||
override o : i32;
|
override o : i32;
|
||||||
|
|
||||||
@compute @workgroup_size(1)
|
@compute @workgroup_size(1)
|
||||||
fn main() {
|
fn main() {
|
||||||
_ = o;
|
if o == 1 {
|
||||||
|
_ = o;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,12 +1,8 @@
|
|||||||
SKIP: FAILED
|
|
||||||
|
|
||||||
#version 310 es
|
#version 310 es
|
||||||
|
|
||||||
#ifndef WGSL_SPEC_CONSTANT_0
|
|
||||||
#error spec constant required for constant id 0
|
|
||||||
#endif
|
|
||||||
const int o = WGSL_SPEC_CONSTANT_0;
|
|
||||||
void tint_symbol() {
|
void tint_symbol() {
|
||||||
|
if ((0 == 1)) {
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
|
layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
|
||||||
@ -14,11 +10,3 @@ void main() {
|
|||||||
tint_symbol();
|
tint_symbol();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
Error parsing GLSL shader:
|
|
||||||
ERROR: 0:4: '#error' : spec constant required for constant id 0
|
|
||||||
ERROR: 0:5: '' : missing #endif
|
|
||||||
ERROR: 0:5: '' : compilation terminated
|
|
||||||
ERROR: 3 compilation errors. No code generated.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,9 +1,6 @@
|
|||||||
#ifndef WGSL_SPEC_CONSTANT_0
|
|
||||||
#error spec constant required for constant id 0
|
|
||||||
#endif
|
|
||||||
static const int o = WGSL_SPEC_CONSTANT_0;
|
|
||||||
|
|
||||||
[numthreads(1, 1, 1)]
|
[numthreads(1, 1, 1)]
|
||||||
void main() {
|
void main() {
|
||||||
|
if ((0 == 1)) {
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -1,9 +1,9 @@
|
|||||||
#include <metal_stdlib>
|
#include <metal_stdlib>
|
||||||
|
|
||||||
using namespace metal;
|
using namespace metal;
|
||||||
constant int o [[function_constant(0)]];
|
|
||||||
|
|
||||||
kernel void tint_symbol() {
|
kernel void tint_symbol() {
|
||||||
|
if ((0 == 1)) {
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,20 +1,26 @@
|
|||||||
; SPIR-V
|
; SPIR-V
|
||||||
; Version: 1.3
|
; Version: 1.3
|
||||||
; Generator: Google Tint Compiler; 0
|
; Generator: Google Tint Compiler; 0
|
||||||
; Bound: 7
|
; Bound: 12
|
||||||
; Schema: 0
|
; Schema: 0
|
||||||
OpCapability Shader
|
OpCapability Shader
|
||||||
OpMemoryModel Logical GLSL450
|
OpMemoryModel Logical GLSL450
|
||||||
OpEntryPoint GLCompute %main "main"
|
OpEntryPoint GLCompute %main "main"
|
||||||
OpExecutionMode %main LocalSize 1 1 1
|
OpExecutionMode %main LocalSize 1 1 1
|
||||||
OpName %o "o"
|
|
||||||
OpName %main "main"
|
OpName %main "main"
|
||||||
OpDecorate %o SpecId 0
|
|
||||||
%int = OpTypeInt 32 1
|
|
||||||
%o = OpSpecConstant %int 0
|
|
||||||
%void = OpTypeVoid
|
%void = OpTypeVoid
|
||||||
%3 = OpTypeFunction %void
|
%1 = OpTypeFunction %void
|
||||||
%main = OpFunction %void None %3
|
%int = OpTypeInt 32 1
|
||||||
%6 = OpLabel
|
%6 = OpConstantNull %int
|
||||||
|
%int_1 = OpConstant %int 1
|
||||||
|
%bool = OpTypeBool
|
||||||
|
%main = OpFunction %void None %1
|
||||||
|
%4 = OpLabel
|
||||||
|
%8 = OpIEqual %bool %6 %int_1
|
||||||
|
OpSelectionMerge %10 None
|
||||||
|
OpBranchConditional %8 %11 %10
|
||||||
|
%11 = OpLabel
|
||||||
|
OpBranch %10
|
||||||
|
%10 = OpLabel
|
||||||
OpReturn
|
OpReturn
|
||||||
OpFunctionEnd
|
OpFunctionEnd
|
||||||
|
@ -1,6 +1,8 @@
|
|||||||
override o : i32;
|
const o : i32 = 0i;
|
||||||
|
|
||||||
@compute @workgroup_size(1)
|
@compute @workgroup_size(1)
|
||||||
fn main() {
|
fn main() {
|
||||||
_ = o;
|
if ((o == 1)) {
|
||||||
|
_ = o;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,9 @@
|
|||||||
// flags: --overrides WGSL_SPEC_CONSTANT_0=0
|
// flags: --overrides o=0
|
||||||
override o : u32;
|
override o : u32;
|
||||||
|
|
||||||
@compute @workgroup_size(1)
|
@compute @workgroup_size(1)
|
||||||
fn main() {
|
fn main() {
|
||||||
_ = o;
|
if o == 1 {
|
||||||
|
_ = o;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,12 +1,8 @@
|
|||||||
SKIP: FAILED
|
|
||||||
|
|
||||||
#version 310 es
|
#version 310 es
|
||||||
|
|
||||||
#ifndef WGSL_SPEC_CONSTANT_0
|
|
||||||
#error spec constant required for constant id 0
|
|
||||||
#endif
|
|
||||||
const uint o = WGSL_SPEC_CONSTANT_0;
|
|
||||||
void tint_symbol() {
|
void tint_symbol() {
|
||||||
|
if ((0u == 1u)) {
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
|
layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
|
||||||
@ -14,11 +10,3 @@ void main() {
|
|||||||
tint_symbol();
|
tint_symbol();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
Error parsing GLSL shader:
|
|
||||||
ERROR: 0:4: '#error' : spec constant required for constant id 0
|
|
||||||
ERROR: 0:5: '' : missing #endif
|
|
||||||
ERROR: 0:5: '' : compilation terminated
|
|
||||||
ERROR: 3 compilation errors. No code generated.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,9 +1,6 @@
|
|||||||
#ifndef WGSL_SPEC_CONSTANT_0
|
|
||||||
#error spec constant required for constant id 0
|
|
||||||
#endif
|
|
||||||
static const uint o = WGSL_SPEC_CONSTANT_0;
|
|
||||||
|
|
||||||
[numthreads(1, 1, 1)]
|
[numthreads(1, 1, 1)]
|
||||||
void main() {
|
void main() {
|
||||||
|
if ((0u == 1u)) {
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -1,9 +1,9 @@
|
|||||||
#include <metal_stdlib>
|
#include <metal_stdlib>
|
||||||
|
|
||||||
using namespace metal;
|
using namespace metal;
|
||||||
constant uint o [[function_constant(0)]];
|
|
||||||
|
|
||||||
kernel void tint_symbol() {
|
kernel void tint_symbol() {
|
||||||
|
if ((0u == 1u)) {
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,20 +1,26 @@
|
|||||||
; SPIR-V
|
; SPIR-V
|
||||||
; Version: 1.3
|
; Version: 1.3
|
||||||
; Generator: Google Tint Compiler; 0
|
; Generator: Google Tint Compiler; 0
|
||||||
; Bound: 7
|
; Bound: 12
|
||||||
; Schema: 0
|
; Schema: 0
|
||||||
OpCapability Shader
|
OpCapability Shader
|
||||||
OpMemoryModel Logical GLSL450
|
OpMemoryModel Logical GLSL450
|
||||||
OpEntryPoint GLCompute %main "main"
|
OpEntryPoint GLCompute %main "main"
|
||||||
OpExecutionMode %main LocalSize 1 1 1
|
OpExecutionMode %main LocalSize 1 1 1
|
||||||
OpName %o "o"
|
|
||||||
OpName %main "main"
|
OpName %main "main"
|
||||||
OpDecorate %o SpecId 0
|
|
||||||
%uint = OpTypeInt 32 0
|
|
||||||
%o = OpSpecConstant %uint 0
|
|
||||||
%void = OpTypeVoid
|
%void = OpTypeVoid
|
||||||
%3 = OpTypeFunction %void
|
%1 = OpTypeFunction %void
|
||||||
%main = OpFunction %void None %3
|
%uint = OpTypeInt 32 0
|
||||||
%6 = OpLabel
|
%6 = OpConstantNull %uint
|
||||||
|
%uint_1 = OpConstant %uint 1
|
||||||
|
%bool = OpTypeBool
|
||||||
|
%main = OpFunction %void None %1
|
||||||
|
%4 = OpLabel
|
||||||
|
%8 = OpIEqual %bool %6 %uint_1
|
||||||
|
OpSelectionMerge %10 None
|
||||||
|
OpBranchConditional %8 %11 %10
|
||||||
|
%11 = OpLabel
|
||||||
|
OpBranch %10
|
||||||
|
%10 = OpLabel
|
||||||
OpReturn
|
OpReturn
|
||||||
OpFunctionEnd
|
OpFunctionEnd
|
||||||
|
@ -1,6 +1,8 @@
|
|||||||
override o : u32;
|
const o : u32 = 0u;
|
||||||
|
|
||||||
@compute @workgroup_size(1)
|
@compute @workgroup_size(1)
|
||||||
fn main() {
|
fn main() {
|
||||||
_ = o;
|
if ((o == 1)) {
|
||||||
|
_ = o;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,10 @@
|
|||||||
|
// flags: --overrides o=0,j=1
|
||||||
override o : bool = true;
|
override o : bool = true;
|
||||||
|
override j : bool = false;
|
||||||
|
|
||||||
@compute @workgroup_size(1)
|
@compute @workgroup_size(1)
|
||||||
fn main() {
|
fn main() {
|
||||||
_ = o;
|
if o && j {
|
||||||
|
_ = o;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,10 +1,12 @@
|
|||||||
#version 310 es
|
#version 310 es
|
||||||
|
|
||||||
#ifndef WGSL_SPEC_CONSTANT_0
|
|
||||||
#define WGSL_SPEC_CONSTANT_0 true
|
|
||||||
#endif
|
|
||||||
const bool o = WGSL_SPEC_CONSTANT_0;
|
|
||||||
void tint_symbol() {
|
void tint_symbol() {
|
||||||
|
bool tint_tmp = false;
|
||||||
|
if (tint_tmp) {
|
||||||
|
tint_tmp = true;
|
||||||
|
}
|
||||||
|
if ((tint_tmp)) {
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
|
layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
|
||||||
|
@ -1,9 +1,10 @@
|
|||||||
#ifndef WGSL_SPEC_CONSTANT_0
|
|
||||||
#define WGSL_SPEC_CONSTANT_0 true
|
|
||||||
#endif
|
|
||||||
static const bool o = WGSL_SPEC_CONSTANT_0;
|
|
||||||
|
|
||||||
[numthreads(1, 1, 1)]
|
[numthreads(1, 1, 1)]
|
||||||
void main() {
|
void main() {
|
||||||
|
bool tint_tmp = false;
|
||||||
|
if (tint_tmp) {
|
||||||
|
tint_tmp = true;
|
||||||
|
}
|
||||||
|
if ((tint_tmp)) {
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -1,9 +1,9 @@
|
|||||||
#include <metal_stdlib>
|
#include <metal_stdlib>
|
||||||
|
|
||||||
using namespace metal;
|
using namespace metal;
|
||||||
constant bool o [[function_constant(0)]];
|
|
||||||
|
|
||||||
kernel void tint_symbol() {
|
kernel void tint_symbol() {
|
||||||
|
if ((false && true)) {
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,20 +1,30 @@
|
|||||||
; SPIR-V
|
; SPIR-V
|
||||||
; Version: 1.3
|
; Version: 1.3
|
||||||
; Generator: Google Tint Compiler; 0
|
; Generator: Google Tint Compiler; 0
|
||||||
; Bound: 7
|
; Bound: 13
|
||||||
; Schema: 0
|
; Schema: 0
|
||||||
OpCapability Shader
|
OpCapability Shader
|
||||||
OpMemoryModel Logical GLSL450
|
OpMemoryModel Logical GLSL450
|
||||||
OpEntryPoint GLCompute %main "main"
|
OpEntryPoint GLCompute %main "main"
|
||||||
OpExecutionMode %main LocalSize 1 1 1
|
OpExecutionMode %main LocalSize 1 1 1
|
||||||
OpName %o "o"
|
|
||||||
OpName %main "main"
|
OpName %main "main"
|
||||||
OpDecorate %o SpecId 0
|
|
||||||
%bool = OpTypeBool
|
|
||||||
%o = OpSpecConstantTrue %bool
|
|
||||||
%void = OpTypeVoid
|
%void = OpTypeVoid
|
||||||
%3 = OpTypeFunction %void
|
%1 = OpTypeFunction %void
|
||||||
%main = OpFunction %void None %3
|
%bool = OpTypeBool
|
||||||
%6 = OpLabel
|
%6 = OpConstantNull %bool
|
||||||
|
%true = OpConstantTrue %bool
|
||||||
|
%main = OpFunction %void None %1
|
||||||
|
%4 = OpLabel
|
||||||
|
OpSelectionMerge %7 None
|
||||||
|
OpBranchConditional %6 %8 %7
|
||||||
|
%8 = OpLabel
|
||||||
|
OpBranch %7
|
||||||
|
%7 = OpLabel
|
||||||
|
%10 = OpPhi %bool %6 %4 %true %8
|
||||||
|
OpSelectionMerge %11 None
|
||||||
|
OpBranchConditional %10 %12 %11
|
||||||
|
%12 = OpLabel
|
||||||
|
OpBranch %11
|
||||||
|
%11 = OpLabel
|
||||||
OpReturn
|
OpReturn
|
||||||
OpFunctionEnd
|
OpFunctionEnd
|
||||||
|
@ -1,6 +1,10 @@
|
|||||||
override o : bool = true;
|
const o : bool = false;
|
||||||
|
|
||||||
|
const j : bool = true;
|
||||||
|
|
||||||
@compute @workgroup_size(1)
|
@compute @workgroup_size(1)
|
||||||
fn main() {
|
fn main() {
|
||||||
_ = o;
|
if ((o && j)) {
|
||||||
|
_ = o;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,9 @@
|
|||||||
|
// flags: --overrides o=0
|
||||||
override o : f32 = 1.0;
|
override o : f32 = 1.0;
|
||||||
|
|
||||||
@compute @workgroup_size(1)
|
@compute @workgroup_size(1)
|
||||||
fn main() {
|
fn main() {
|
||||||
_ = o;
|
if o == 0.0 {
|
||||||
|
_ = o;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,10 +1,8 @@
|
|||||||
#version 310 es
|
#version 310 es
|
||||||
|
|
||||||
#ifndef WGSL_SPEC_CONSTANT_0
|
|
||||||
#define WGSL_SPEC_CONSTANT_0 1.0f
|
|
||||||
#endif
|
|
||||||
const float o = WGSL_SPEC_CONSTANT_0;
|
|
||||||
void tint_symbol() {
|
void tint_symbol() {
|
||||||
|
if ((0.0f == 0.0f)) {
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
|
layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
|
||||||
|
@ -1,9 +1,6 @@
|
|||||||
#ifndef WGSL_SPEC_CONSTANT_0
|
|
||||||
#define WGSL_SPEC_CONSTANT_0 1.0f
|
|
||||||
#endif
|
|
||||||
static const float o = WGSL_SPEC_CONSTANT_0;
|
|
||||||
|
|
||||||
[numthreads(1, 1, 1)]
|
[numthreads(1, 1, 1)]
|
||||||
void main() {
|
void main() {
|
||||||
|
if ((0.0f == 0.0f)) {
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -1,9 +1,9 @@
|
|||||||
#include <metal_stdlib>
|
#include <metal_stdlib>
|
||||||
|
|
||||||
using namespace metal;
|
using namespace metal;
|
||||||
constant float o [[function_constant(0)]];
|
|
||||||
|
|
||||||
kernel void tint_symbol() {
|
kernel void tint_symbol() {
|
||||||
|
if ((0.0f == 0.0f)) {
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,20 +1,25 @@
|
|||||||
; SPIR-V
|
; SPIR-V
|
||||||
; Version: 1.3
|
; Version: 1.3
|
||||||
; Generator: Google Tint Compiler; 0
|
; Generator: Google Tint Compiler; 0
|
||||||
; Bound: 7
|
; Bound: 11
|
||||||
; Schema: 0
|
; Schema: 0
|
||||||
OpCapability Shader
|
OpCapability Shader
|
||||||
OpMemoryModel Logical GLSL450
|
OpMemoryModel Logical GLSL450
|
||||||
OpEntryPoint GLCompute %main "main"
|
OpEntryPoint GLCompute %main "main"
|
||||||
OpExecutionMode %main LocalSize 1 1 1
|
OpExecutionMode %main LocalSize 1 1 1
|
||||||
OpName %o "o"
|
|
||||||
OpName %main "main"
|
OpName %main "main"
|
||||||
OpDecorate %o SpecId 0
|
|
||||||
%float = OpTypeFloat 32
|
|
||||||
%o = OpSpecConstant %float 1
|
|
||||||
%void = OpTypeVoid
|
%void = OpTypeVoid
|
||||||
%3 = OpTypeFunction %void
|
%1 = OpTypeFunction %void
|
||||||
%main = OpFunction %void None %3
|
%float = OpTypeFloat 32
|
||||||
%6 = OpLabel
|
%6 = OpConstantNull %float
|
||||||
|
%bool = OpTypeBool
|
||||||
|
%main = OpFunction %void None %1
|
||||||
|
%4 = OpLabel
|
||||||
|
%7 = OpFOrdEqual %bool %6 %6
|
||||||
|
OpSelectionMerge %9 None
|
||||||
|
OpBranchConditional %7 %10 %9
|
||||||
|
%10 = OpLabel
|
||||||
|
OpBranch %9
|
||||||
|
%9 = OpLabel
|
||||||
OpReturn
|
OpReturn
|
||||||
OpFunctionEnd
|
OpFunctionEnd
|
||||||
|
@ -1,6 +1,8 @@
|
|||||||
override o : f32 = 1.0;
|
const o : f32 = 0.0f;
|
||||||
|
|
||||||
@compute @workgroup_size(1)
|
@compute @workgroup_size(1)
|
||||||
fn main() {
|
fn main() {
|
||||||
_ = o;
|
if ((o == 0.0)) {
|
||||||
|
_ = o;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,9 @@
|
|||||||
|
// flags: --overrides o=0
|
||||||
override o : i32 = 1;
|
override o : i32 = 1;
|
||||||
|
|
||||||
@compute @workgroup_size(1)
|
@compute @workgroup_size(1)
|
||||||
fn main() {
|
fn main() {
|
||||||
_ = o;
|
if o == 2 {
|
||||||
|
_ = o;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,10 +1,8 @@
|
|||||||
#version 310 es
|
#version 310 es
|
||||||
|
|
||||||
#ifndef WGSL_SPEC_CONSTANT_0
|
|
||||||
#define WGSL_SPEC_CONSTANT_0 1
|
|
||||||
#endif
|
|
||||||
const int o = WGSL_SPEC_CONSTANT_0;
|
|
||||||
void tint_symbol() {
|
void tint_symbol() {
|
||||||
|
if ((0 == 2)) {
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
|
layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
|
||||||
|
@ -1,9 +1,6 @@
|
|||||||
#ifndef WGSL_SPEC_CONSTANT_0
|
|
||||||
#define WGSL_SPEC_CONSTANT_0 1
|
|
||||||
#endif
|
|
||||||
static const int o = WGSL_SPEC_CONSTANT_0;
|
|
||||||
|
|
||||||
[numthreads(1, 1, 1)]
|
[numthreads(1, 1, 1)]
|
||||||
void main() {
|
void main() {
|
||||||
|
if ((0 == 2)) {
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -1,9 +1,9 @@
|
|||||||
#include <metal_stdlib>
|
#include <metal_stdlib>
|
||||||
|
|
||||||
using namespace metal;
|
using namespace metal;
|
||||||
constant int o [[function_constant(0)]];
|
|
||||||
|
|
||||||
kernel void tint_symbol() {
|
kernel void tint_symbol() {
|
||||||
|
if ((0 == 2)) {
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,20 +1,26 @@
|
|||||||
; SPIR-V
|
; SPIR-V
|
||||||
; Version: 1.3
|
; Version: 1.3
|
||||||
; Generator: Google Tint Compiler; 0
|
; Generator: Google Tint Compiler; 0
|
||||||
; Bound: 7
|
; Bound: 12
|
||||||
; Schema: 0
|
; Schema: 0
|
||||||
OpCapability Shader
|
OpCapability Shader
|
||||||
OpMemoryModel Logical GLSL450
|
OpMemoryModel Logical GLSL450
|
||||||
OpEntryPoint GLCompute %main "main"
|
OpEntryPoint GLCompute %main "main"
|
||||||
OpExecutionMode %main LocalSize 1 1 1
|
OpExecutionMode %main LocalSize 1 1 1
|
||||||
OpName %o "o"
|
|
||||||
OpName %main "main"
|
OpName %main "main"
|
||||||
OpDecorate %o SpecId 0
|
|
||||||
%int = OpTypeInt 32 1
|
|
||||||
%o = OpSpecConstant %int 1
|
|
||||||
%void = OpTypeVoid
|
%void = OpTypeVoid
|
||||||
%3 = OpTypeFunction %void
|
%1 = OpTypeFunction %void
|
||||||
%main = OpFunction %void None %3
|
%int = OpTypeInt 32 1
|
||||||
%6 = OpLabel
|
%6 = OpConstantNull %int
|
||||||
|
%int_2 = OpConstant %int 2
|
||||||
|
%bool = OpTypeBool
|
||||||
|
%main = OpFunction %void None %1
|
||||||
|
%4 = OpLabel
|
||||||
|
%8 = OpIEqual %bool %6 %int_2
|
||||||
|
OpSelectionMerge %10 None
|
||||||
|
OpBranchConditional %8 %11 %10
|
||||||
|
%11 = OpLabel
|
||||||
|
OpBranch %10
|
||||||
|
%10 = OpLabel
|
||||||
OpReturn
|
OpReturn
|
||||||
OpFunctionEnd
|
OpFunctionEnd
|
||||||
|
@ -1,6 +1,8 @@
|
|||||||
override o : i32 = 1;
|
const o : i32 = 0i;
|
||||||
|
|
||||||
@compute @workgroup_size(1)
|
@compute @workgroup_size(1)
|
||||||
fn main() {
|
fn main() {
|
||||||
_ = o;
|
if ((o == 2)) {
|
||||||
|
_ = o;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,9 @@
|
|||||||
|
// flags: --overrides o=0
|
||||||
override o : u32 = 1u;
|
override o : u32 = 1u;
|
||||||
|
|
||||||
@compute @workgroup_size(1)
|
@compute @workgroup_size(1)
|
||||||
fn main() {
|
fn main() {
|
||||||
_ = o;
|
if o == 2 {
|
||||||
|
_ = o;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,10 +1,8 @@
|
|||||||
#version 310 es
|
#version 310 es
|
||||||
|
|
||||||
#ifndef WGSL_SPEC_CONSTANT_0
|
|
||||||
#define WGSL_SPEC_CONSTANT_0 1u
|
|
||||||
#endif
|
|
||||||
const uint o = WGSL_SPEC_CONSTANT_0;
|
|
||||||
void tint_symbol() {
|
void tint_symbol() {
|
||||||
|
if ((0u == 2u)) {
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
|
layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
|
||||||
|
@ -1,9 +1,6 @@
|
|||||||
#ifndef WGSL_SPEC_CONSTANT_0
|
|
||||||
#define WGSL_SPEC_CONSTANT_0 1u
|
|
||||||
#endif
|
|
||||||
static const uint o = WGSL_SPEC_CONSTANT_0;
|
|
||||||
|
|
||||||
[numthreads(1, 1, 1)]
|
[numthreads(1, 1, 1)]
|
||||||
void main() {
|
void main() {
|
||||||
|
if ((0u == 2u)) {
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -1,9 +1,9 @@
|
|||||||
#include <metal_stdlib>
|
#include <metal_stdlib>
|
||||||
|
|
||||||
using namespace metal;
|
using namespace metal;
|
||||||
constant uint o [[function_constant(0)]];
|
|
||||||
|
|
||||||
kernel void tint_symbol() {
|
kernel void tint_symbol() {
|
||||||
|
if ((0u == 2u)) {
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,20 +1,26 @@
|
|||||||
; SPIR-V
|
; SPIR-V
|
||||||
; Version: 1.3
|
; Version: 1.3
|
||||||
; Generator: Google Tint Compiler; 0
|
; Generator: Google Tint Compiler; 0
|
||||||
; Bound: 7
|
; Bound: 12
|
||||||
; Schema: 0
|
; Schema: 0
|
||||||
OpCapability Shader
|
OpCapability Shader
|
||||||
OpMemoryModel Logical GLSL450
|
OpMemoryModel Logical GLSL450
|
||||||
OpEntryPoint GLCompute %main "main"
|
OpEntryPoint GLCompute %main "main"
|
||||||
OpExecutionMode %main LocalSize 1 1 1
|
OpExecutionMode %main LocalSize 1 1 1
|
||||||
OpName %o "o"
|
|
||||||
OpName %main "main"
|
OpName %main "main"
|
||||||
OpDecorate %o SpecId 0
|
|
||||||
%uint = OpTypeInt 32 0
|
|
||||||
%o = OpSpecConstant %uint 1
|
|
||||||
%void = OpTypeVoid
|
%void = OpTypeVoid
|
||||||
%3 = OpTypeFunction %void
|
%1 = OpTypeFunction %void
|
||||||
%main = OpFunction %void None %3
|
%uint = OpTypeInt 32 0
|
||||||
%6 = OpLabel
|
%6 = OpConstantNull %uint
|
||||||
|
%uint_2 = OpConstant %uint 2
|
||||||
|
%bool = OpTypeBool
|
||||||
|
%main = OpFunction %void None %1
|
||||||
|
%4 = OpLabel
|
||||||
|
%8 = OpIEqual %bool %6 %uint_2
|
||||||
|
OpSelectionMerge %10 None
|
||||||
|
OpBranchConditional %8 %11 %10
|
||||||
|
%11 = OpLabel
|
||||||
|
OpBranch %10
|
||||||
|
%10 = OpLabel
|
||||||
OpReturn
|
OpReturn
|
||||||
OpFunctionEnd
|
OpFunctionEnd
|
||||||
|
@ -1,6 +1,8 @@
|
|||||||
override o : u32 = 1u;
|
const o : u32 = 0u;
|
||||||
|
|
||||||
@compute @workgroup_size(1)
|
@compute @workgroup_size(1)
|
||||||
fn main() {
|
fn main() {
|
||||||
_ = o;
|
if ((o == 2)) {
|
||||||
|
_ = o;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,10 @@
|
|||||||
|
// flags: --overrides o=0,j=1
|
||||||
override o : bool = bool();
|
override o : bool = bool();
|
||||||
|
override j : bool = bool();
|
||||||
|
|
||||||
@compute @workgroup_size(1)
|
@compute @workgroup_size(1)
|
||||||
fn main() {
|
fn main() {
|
||||||
_ = o;
|
if o && j {
|
||||||
|
_ = o;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,10 +1,12 @@
|
|||||||
#version 310 es
|
#version 310 es
|
||||||
|
|
||||||
#ifndef WGSL_SPEC_CONSTANT_0
|
|
||||||
#define WGSL_SPEC_CONSTANT_0 false
|
|
||||||
#endif
|
|
||||||
const bool o = WGSL_SPEC_CONSTANT_0;
|
|
||||||
void tint_symbol() {
|
void tint_symbol() {
|
||||||
|
bool tint_tmp = false;
|
||||||
|
if (tint_tmp) {
|
||||||
|
tint_tmp = true;
|
||||||
|
}
|
||||||
|
if ((tint_tmp)) {
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
|
layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
|
||||||
|
@ -1,9 +1,10 @@
|
|||||||
#ifndef WGSL_SPEC_CONSTANT_0
|
|
||||||
#define WGSL_SPEC_CONSTANT_0 false
|
|
||||||
#endif
|
|
||||||
static const bool o = WGSL_SPEC_CONSTANT_0;
|
|
||||||
|
|
||||||
[numthreads(1, 1, 1)]
|
[numthreads(1, 1, 1)]
|
||||||
void main() {
|
void main() {
|
||||||
|
bool tint_tmp = false;
|
||||||
|
if (tint_tmp) {
|
||||||
|
tint_tmp = true;
|
||||||
|
}
|
||||||
|
if ((tint_tmp)) {
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -1,9 +1,9 @@
|
|||||||
#include <metal_stdlib>
|
#include <metal_stdlib>
|
||||||
|
|
||||||
using namespace metal;
|
using namespace metal;
|
||||||
constant bool o [[function_constant(0)]];
|
|
||||||
|
|
||||||
kernel void tint_symbol() {
|
kernel void tint_symbol() {
|
||||||
|
if ((false && true)) {
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,20 +1,30 @@
|
|||||||
; SPIR-V
|
; SPIR-V
|
||||||
; Version: 1.3
|
; Version: 1.3
|
||||||
; Generator: Google Tint Compiler; 0
|
; Generator: Google Tint Compiler; 0
|
||||||
; Bound: 7
|
; Bound: 13
|
||||||
; Schema: 0
|
; Schema: 0
|
||||||
OpCapability Shader
|
OpCapability Shader
|
||||||
OpMemoryModel Logical GLSL450
|
OpMemoryModel Logical GLSL450
|
||||||
OpEntryPoint GLCompute %main "main"
|
OpEntryPoint GLCompute %main "main"
|
||||||
OpExecutionMode %main LocalSize 1 1 1
|
OpExecutionMode %main LocalSize 1 1 1
|
||||||
OpName %o "o"
|
|
||||||
OpName %main "main"
|
OpName %main "main"
|
||||||
OpDecorate %o SpecId 0
|
|
||||||
%bool = OpTypeBool
|
|
||||||
%o = OpSpecConstantFalse %bool
|
|
||||||
%void = OpTypeVoid
|
%void = OpTypeVoid
|
||||||
%3 = OpTypeFunction %void
|
%1 = OpTypeFunction %void
|
||||||
%main = OpFunction %void None %3
|
%bool = OpTypeBool
|
||||||
%6 = OpLabel
|
%6 = OpConstantNull %bool
|
||||||
|
%true = OpConstantTrue %bool
|
||||||
|
%main = OpFunction %void None %1
|
||||||
|
%4 = OpLabel
|
||||||
|
OpSelectionMerge %7 None
|
||||||
|
OpBranchConditional %6 %8 %7
|
||||||
|
%8 = OpLabel
|
||||||
|
OpBranch %7
|
||||||
|
%7 = OpLabel
|
||||||
|
%10 = OpPhi %bool %6 %4 %true %8
|
||||||
|
OpSelectionMerge %11 None
|
||||||
|
OpBranchConditional %10 %12 %11
|
||||||
|
%12 = OpLabel
|
||||||
|
OpBranch %11
|
||||||
|
%11 = OpLabel
|
||||||
OpReturn
|
OpReturn
|
||||||
OpFunctionEnd
|
OpFunctionEnd
|
||||||
|
@ -1,6 +1,10 @@
|
|||||||
override o : bool = bool();
|
const o : bool = false;
|
||||||
|
|
||||||
|
const j : bool = true;
|
||||||
|
|
||||||
@compute @workgroup_size(1)
|
@compute @workgroup_size(1)
|
||||||
fn main() {
|
fn main() {
|
||||||
_ = o;
|
if ((o && j)) {
|
||||||
|
_ = o;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,9 @@
|
|||||||
|
// flags: --overrides o=0
|
||||||
override o : f32 = f32();
|
override o : f32 = f32();
|
||||||
|
|
||||||
@compute @workgroup_size(1)
|
@compute @workgroup_size(1)
|
||||||
fn main() {
|
fn main() {
|
||||||
_ = o;
|
if o == 0.0 {
|
||||||
|
_ = o;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,10 +1,8 @@
|
|||||||
#version 310 es
|
#version 310 es
|
||||||
|
|
||||||
#ifndef WGSL_SPEC_CONSTANT_0
|
|
||||||
#define WGSL_SPEC_CONSTANT_0 0.0f
|
|
||||||
#endif
|
|
||||||
const float o = WGSL_SPEC_CONSTANT_0;
|
|
||||||
void tint_symbol() {
|
void tint_symbol() {
|
||||||
|
if ((0.0f == 0.0f)) {
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
|
layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
|
||||||
|
@ -1,9 +1,6 @@
|
|||||||
#ifndef WGSL_SPEC_CONSTANT_0
|
|
||||||
#define WGSL_SPEC_CONSTANT_0 0.0f
|
|
||||||
#endif
|
|
||||||
static const float o = WGSL_SPEC_CONSTANT_0;
|
|
||||||
|
|
||||||
[numthreads(1, 1, 1)]
|
[numthreads(1, 1, 1)]
|
||||||
void main() {
|
void main() {
|
||||||
|
if ((0.0f == 0.0f)) {
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -1,9 +1,9 @@
|
|||||||
#include <metal_stdlib>
|
#include <metal_stdlib>
|
||||||
|
|
||||||
using namespace metal;
|
using namespace metal;
|
||||||
constant float o [[function_constant(0)]];
|
|
||||||
|
|
||||||
kernel void tint_symbol() {
|
kernel void tint_symbol() {
|
||||||
|
if ((0.0f == 0.0f)) {
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,20 +1,25 @@
|
|||||||
; SPIR-V
|
; SPIR-V
|
||||||
; Version: 1.3
|
; Version: 1.3
|
||||||
; Generator: Google Tint Compiler; 0
|
; Generator: Google Tint Compiler; 0
|
||||||
; Bound: 7
|
; Bound: 11
|
||||||
; Schema: 0
|
; Schema: 0
|
||||||
OpCapability Shader
|
OpCapability Shader
|
||||||
OpMemoryModel Logical GLSL450
|
OpMemoryModel Logical GLSL450
|
||||||
OpEntryPoint GLCompute %main "main"
|
OpEntryPoint GLCompute %main "main"
|
||||||
OpExecutionMode %main LocalSize 1 1 1
|
OpExecutionMode %main LocalSize 1 1 1
|
||||||
OpName %o "o"
|
|
||||||
OpName %main "main"
|
OpName %main "main"
|
||||||
OpDecorate %o SpecId 0
|
|
||||||
%float = OpTypeFloat 32
|
|
||||||
%o = OpSpecConstant %float 0
|
|
||||||
%void = OpTypeVoid
|
%void = OpTypeVoid
|
||||||
%3 = OpTypeFunction %void
|
%1 = OpTypeFunction %void
|
||||||
%main = OpFunction %void None %3
|
%float = OpTypeFloat 32
|
||||||
%6 = OpLabel
|
%6 = OpConstantNull %float
|
||||||
|
%bool = OpTypeBool
|
||||||
|
%main = OpFunction %void None %1
|
||||||
|
%4 = OpLabel
|
||||||
|
%7 = OpFOrdEqual %bool %6 %6
|
||||||
|
OpSelectionMerge %9 None
|
||||||
|
OpBranchConditional %7 %10 %9
|
||||||
|
%10 = OpLabel
|
||||||
|
OpBranch %9
|
||||||
|
%9 = OpLabel
|
||||||
OpReturn
|
OpReturn
|
||||||
OpFunctionEnd
|
OpFunctionEnd
|
||||||
|
@ -1,6 +1,8 @@
|
|||||||
override o : f32 = f32();
|
const o : f32 = 0.0f;
|
||||||
|
|
||||||
@compute @workgroup_size(1)
|
@compute @workgroup_size(1)
|
||||||
fn main() {
|
fn main() {
|
||||||
_ = o;
|
if ((o == 0.0)) {
|
||||||
|
_ = o;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,9 @@
|
|||||||
|
// flags: --overrides o=0
|
||||||
override o : i32 = i32();
|
override o : i32 = i32();
|
||||||
|
|
||||||
@compute @workgroup_size(1)
|
@compute @workgroup_size(1)
|
||||||
fn main() {
|
fn main() {
|
||||||
_ = o;
|
if o == 2 {
|
||||||
|
_ = o;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,10 +1,8 @@
|
|||||||
#version 310 es
|
#version 310 es
|
||||||
|
|
||||||
#ifndef WGSL_SPEC_CONSTANT_0
|
|
||||||
#define WGSL_SPEC_CONSTANT_0 0
|
|
||||||
#endif
|
|
||||||
const int o = WGSL_SPEC_CONSTANT_0;
|
|
||||||
void tint_symbol() {
|
void tint_symbol() {
|
||||||
|
if ((0 == 2)) {
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
|
layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
|
||||||
|
@ -1,9 +1,6 @@
|
|||||||
#ifndef WGSL_SPEC_CONSTANT_0
|
|
||||||
#define WGSL_SPEC_CONSTANT_0 0
|
|
||||||
#endif
|
|
||||||
static const int o = WGSL_SPEC_CONSTANT_0;
|
|
||||||
|
|
||||||
[numthreads(1, 1, 1)]
|
[numthreads(1, 1, 1)]
|
||||||
void main() {
|
void main() {
|
||||||
|
if ((0 == 2)) {
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -1,9 +1,9 @@
|
|||||||
#include <metal_stdlib>
|
#include <metal_stdlib>
|
||||||
|
|
||||||
using namespace metal;
|
using namespace metal;
|
||||||
constant int o [[function_constant(0)]];
|
|
||||||
|
|
||||||
kernel void tint_symbol() {
|
kernel void tint_symbol() {
|
||||||
|
if ((0 == 2)) {
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,20 +1,26 @@
|
|||||||
; SPIR-V
|
; SPIR-V
|
||||||
; Version: 1.3
|
; Version: 1.3
|
||||||
; Generator: Google Tint Compiler; 0
|
; Generator: Google Tint Compiler; 0
|
||||||
; Bound: 7
|
; Bound: 12
|
||||||
; Schema: 0
|
; Schema: 0
|
||||||
OpCapability Shader
|
OpCapability Shader
|
||||||
OpMemoryModel Logical GLSL450
|
OpMemoryModel Logical GLSL450
|
||||||
OpEntryPoint GLCompute %main "main"
|
OpEntryPoint GLCompute %main "main"
|
||||||
OpExecutionMode %main LocalSize 1 1 1
|
OpExecutionMode %main LocalSize 1 1 1
|
||||||
OpName %o "o"
|
|
||||||
OpName %main "main"
|
OpName %main "main"
|
||||||
OpDecorate %o SpecId 0
|
|
||||||
%int = OpTypeInt 32 1
|
|
||||||
%o = OpSpecConstant %int 0
|
|
||||||
%void = OpTypeVoid
|
%void = OpTypeVoid
|
||||||
%3 = OpTypeFunction %void
|
%1 = OpTypeFunction %void
|
||||||
%main = OpFunction %void None %3
|
%int = OpTypeInt 32 1
|
||||||
%6 = OpLabel
|
%6 = OpConstantNull %int
|
||||||
|
%int_2 = OpConstant %int 2
|
||||||
|
%bool = OpTypeBool
|
||||||
|
%main = OpFunction %void None %1
|
||||||
|
%4 = OpLabel
|
||||||
|
%8 = OpIEqual %bool %6 %int_2
|
||||||
|
OpSelectionMerge %10 None
|
||||||
|
OpBranchConditional %8 %11 %10
|
||||||
|
%11 = OpLabel
|
||||||
|
OpBranch %10
|
||||||
|
%10 = OpLabel
|
||||||
OpReturn
|
OpReturn
|
||||||
OpFunctionEnd
|
OpFunctionEnd
|
||||||
|
@ -1,6 +1,8 @@
|
|||||||
override o : i32 = i32();
|
const o : i32 = 0i;
|
||||||
|
|
||||||
@compute @workgroup_size(1)
|
@compute @workgroup_size(1)
|
||||||
fn main() {
|
fn main() {
|
||||||
_ = o;
|
if ((o == 2)) {
|
||||||
|
_ = o;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,9 @@
|
|||||||
|
// flags: --overrides o=0
|
||||||
override o : u32 = u32();
|
override o : u32 = u32();
|
||||||
|
|
||||||
@compute @workgroup_size(1)
|
@compute @workgroup_size(1)
|
||||||
fn main() {
|
fn main() {
|
||||||
_ = o;
|
if o == 2 {
|
||||||
|
_ = o;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,10 +1,8 @@
|
|||||||
#version 310 es
|
#version 310 es
|
||||||
|
|
||||||
#ifndef WGSL_SPEC_CONSTANT_0
|
|
||||||
#define WGSL_SPEC_CONSTANT_0 0u
|
|
||||||
#endif
|
|
||||||
const uint o = WGSL_SPEC_CONSTANT_0;
|
|
||||||
void tint_symbol() {
|
void tint_symbol() {
|
||||||
|
if ((0u == 2u)) {
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
|
layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
|
||||||
|
@ -1,9 +1,6 @@
|
|||||||
#ifndef WGSL_SPEC_CONSTANT_0
|
|
||||||
#define WGSL_SPEC_CONSTANT_0 0u
|
|
||||||
#endif
|
|
||||||
static const uint o = WGSL_SPEC_CONSTANT_0;
|
|
||||||
|
|
||||||
[numthreads(1, 1, 1)]
|
[numthreads(1, 1, 1)]
|
||||||
void main() {
|
void main() {
|
||||||
|
if ((0u == 2u)) {
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -1,9 +1,9 @@
|
|||||||
#include <metal_stdlib>
|
#include <metal_stdlib>
|
||||||
|
|
||||||
using namespace metal;
|
using namespace metal;
|
||||||
constant uint o [[function_constant(0)]];
|
|
||||||
|
|
||||||
kernel void tint_symbol() {
|
kernel void tint_symbol() {
|
||||||
|
if ((0u == 2u)) {
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,20 +1,26 @@
|
|||||||
; SPIR-V
|
; SPIR-V
|
||||||
; Version: 1.3
|
; Version: 1.3
|
||||||
; Generator: Google Tint Compiler; 0
|
; Generator: Google Tint Compiler; 0
|
||||||
; Bound: 7
|
; Bound: 12
|
||||||
; Schema: 0
|
; Schema: 0
|
||||||
OpCapability Shader
|
OpCapability Shader
|
||||||
OpMemoryModel Logical GLSL450
|
OpMemoryModel Logical GLSL450
|
||||||
OpEntryPoint GLCompute %main "main"
|
OpEntryPoint GLCompute %main "main"
|
||||||
OpExecutionMode %main LocalSize 1 1 1
|
OpExecutionMode %main LocalSize 1 1 1
|
||||||
OpName %o "o"
|
|
||||||
OpName %main "main"
|
OpName %main "main"
|
||||||
OpDecorate %o SpecId 0
|
|
||||||
%uint = OpTypeInt 32 0
|
|
||||||
%o = OpSpecConstant %uint 0
|
|
||||||
%void = OpTypeVoid
|
%void = OpTypeVoid
|
||||||
%3 = OpTypeFunction %void
|
%1 = OpTypeFunction %void
|
||||||
%main = OpFunction %void None %3
|
%uint = OpTypeInt 32 0
|
||||||
%6 = OpLabel
|
%6 = OpConstantNull %uint
|
||||||
|
%uint_2 = OpConstant %uint 2
|
||||||
|
%bool = OpTypeBool
|
||||||
|
%main = OpFunction %void None %1
|
||||||
|
%4 = OpLabel
|
||||||
|
%8 = OpIEqual %bool %6 %uint_2
|
||||||
|
OpSelectionMerge %10 None
|
||||||
|
OpBranchConditional %8 %11 %10
|
||||||
|
%11 = OpLabel
|
||||||
|
OpBranch %10
|
||||||
|
%10 = OpLabel
|
||||||
OpReturn
|
OpReturn
|
||||||
OpFunctionEnd
|
OpFunctionEnd
|
||||||
|
@ -1,6 +1,8 @@
|
|||||||
override o : u32 = u32();
|
const o : u32 = 0u;
|
||||||
|
|
||||||
@compute @workgroup_size(1)
|
@compute @workgroup_size(1)
|
||||||
fn main() {
|
fn main() {
|
||||||
_ = o;
|
if ((o == 2)) {
|
||||||
|
_ = o;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,9 @@
|
|||||||
// flags: --overrides WGSL_SPEC_CONSTANT_1234=0
|
// flags: --overrides 1234=0
|
||||||
@id(1234) override o : bool;
|
@id(1234) override o : bool;
|
||||||
|
|
||||||
@compute @workgroup_size(1)
|
@compute @workgroup_size(1)
|
||||||
fn main() {
|
fn main() {
|
||||||
_ = o;
|
if o {
|
||||||
|
_ = o;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,12 +1,8 @@
|
|||||||
SKIP: FAILED
|
|
||||||
|
|
||||||
#version 310 es
|
#version 310 es
|
||||||
|
|
||||||
#ifndef WGSL_SPEC_CONSTANT_1234
|
|
||||||
#error spec constant required for constant id 1234
|
|
||||||
#endif
|
|
||||||
const bool o = WGSL_SPEC_CONSTANT_1234;
|
|
||||||
void tint_symbol() {
|
void tint_symbol() {
|
||||||
|
if (false) {
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
|
layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
|
||||||
@ -14,11 +10,3 @@ void main() {
|
|||||||
tint_symbol();
|
tint_symbol();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
Error parsing GLSL shader:
|
|
||||||
ERROR: 0:4: '#error' : spec constant required for constant id 1234
|
|
||||||
ERROR: 0:5: '' : missing #endif
|
|
||||||
ERROR: 0:5: '' : compilation terminated
|
|
||||||
ERROR: 3 compilation errors. No code generated.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,9 +1,6 @@
|
|||||||
#ifndef WGSL_SPEC_CONSTANT_1234
|
|
||||||
#error spec constant required for constant id 1234
|
|
||||||
#endif
|
|
||||||
static const bool o = WGSL_SPEC_CONSTANT_1234;
|
|
||||||
|
|
||||||
[numthreads(1, 1, 1)]
|
[numthreads(1, 1, 1)]
|
||||||
void main() {
|
void main() {
|
||||||
|
if (false) {
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -1,9 +1,9 @@
|
|||||||
#include <metal_stdlib>
|
#include <metal_stdlib>
|
||||||
|
|
||||||
using namespace metal;
|
using namespace metal;
|
||||||
constant bool o [[function_constant(1234)]];
|
|
||||||
|
|
||||||
kernel void tint_symbol() {
|
kernel void tint_symbol() {
|
||||||
|
if (false) {
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,20 +1,23 @@
|
|||||||
; SPIR-V
|
; SPIR-V
|
||||||
; Version: 1.3
|
; Version: 1.3
|
||||||
; Generator: Google Tint Compiler; 0
|
; Generator: Google Tint Compiler; 0
|
||||||
; Bound: 7
|
; Bound: 9
|
||||||
; Schema: 0
|
; Schema: 0
|
||||||
OpCapability Shader
|
OpCapability Shader
|
||||||
OpMemoryModel Logical GLSL450
|
OpMemoryModel Logical GLSL450
|
||||||
OpEntryPoint GLCompute %main "main"
|
OpEntryPoint GLCompute %main "main"
|
||||||
OpExecutionMode %main LocalSize 1 1 1
|
OpExecutionMode %main LocalSize 1 1 1
|
||||||
OpName %o "o"
|
|
||||||
OpName %main "main"
|
OpName %main "main"
|
||||||
OpDecorate %o SpecId 1234
|
|
||||||
%bool = OpTypeBool
|
|
||||||
%o = OpSpecConstantFalse %bool
|
|
||||||
%void = OpTypeVoid
|
%void = OpTypeVoid
|
||||||
%3 = OpTypeFunction %void
|
%1 = OpTypeFunction %void
|
||||||
%main = OpFunction %void None %3
|
%bool = OpTypeBool
|
||||||
%6 = OpLabel
|
%6 = OpConstantNull %bool
|
||||||
|
%main = OpFunction %void None %1
|
||||||
|
%4 = OpLabel
|
||||||
|
OpSelectionMerge %7 None
|
||||||
|
OpBranchConditional %6 %8 %7
|
||||||
|
%8 = OpLabel
|
||||||
|
OpBranch %7
|
||||||
|
%7 = OpLabel
|
||||||
OpReturn
|
OpReturn
|
||||||
OpFunctionEnd
|
OpFunctionEnd
|
||||||
|
@ -1,6 +1,8 @@
|
|||||||
@id(1234) override o : bool;
|
const o : bool = false;
|
||||||
|
|
||||||
@compute @workgroup_size(1)
|
@compute @workgroup_size(1)
|
||||||
fn main() {
|
fn main() {
|
||||||
_ = o;
|
if (o) {
|
||||||
|
_ = o;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,9 @@
|
|||||||
// flags: --overrides WGSL_SPEC_CONSTANT_1234=0
|
// flags: --overrides 1234=0
|
||||||
@id(1234) override o : f32;
|
@id(1234) override o : f32;
|
||||||
|
|
||||||
@compute @workgroup_size(1)
|
@compute @workgroup_size(1)
|
||||||
fn main() {
|
fn main() {
|
||||||
_ = o;
|
if o == 0.0 {
|
||||||
|
_ = o;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,12 +1,8 @@
|
|||||||
SKIP: FAILED
|
|
||||||
|
|
||||||
#version 310 es
|
#version 310 es
|
||||||
|
|
||||||
#ifndef WGSL_SPEC_CONSTANT_1234
|
|
||||||
#error spec constant required for constant id 1234
|
|
||||||
#endif
|
|
||||||
const float o = WGSL_SPEC_CONSTANT_1234;
|
|
||||||
void tint_symbol() {
|
void tint_symbol() {
|
||||||
|
if ((0.0f == 0.0f)) {
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
|
layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
|
||||||
@ -14,11 +10,3 @@ void main() {
|
|||||||
tint_symbol();
|
tint_symbol();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
Error parsing GLSL shader:
|
|
||||||
ERROR: 0:4: '#error' : spec constant required for constant id 1234
|
|
||||||
ERROR: 0:5: '' : missing #endif
|
|
||||||
ERROR: 0:5: '' : compilation terminated
|
|
||||||
ERROR: 3 compilation errors. No code generated.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,9 +1,6 @@
|
|||||||
#ifndef WGSL_SPEC_CONSTANT_1234
|
|
||||||
#error spec constant required for constant id 1234
|
|
||||||
#endif
|
|
||||||
static const float o = WGSL_SPEC_CONSTANT_1234;
|
|
||||||
|
|
||||||
[numthreads(1, 1, 1)]
|
[numthreads(1, 1, 1)]
|
||||||
void main() {
|
void main() {
|
||||||
|
if ((0.0f == 0.0f)) {
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -1,9 +1,9 @@
|
|||||||
#include <metal_stdlib>
|
#include <metal_stdlib>
|
||||||
|
|
||||||
using namespace metal;
|
using namespace metal;
|
||||||
constant float o [[function_constant(1234)]];
|
|
||||||
|
|
||||||
kernel void tint_symbol() {
|
kernel void tint_symbol() {
|
||||||
|
if ((0.0f == 0.0f)) {
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,20 +1,25 @@
|
|||||||
; SPIR-V
|
; SPIR-V
|
||||||
; Version: 1.3
|
; Version: 1.3
|
||||||
; Generator: Google Tint Compiler; 0
|
; Generator: Google Tint Compiler; 0
|
||||||
; Bound: 7
|
; Bound: 11
|
||||||
; Schema: 0
|
; Schema: 0
|
||||||
OpCapability Shader
|
OpCapability Shader
|
||||||
OpMemoryModel Logical GLSL450
|
OpMemoryModel Logical GLSL450
|
||||||
OpEntryPoint GLCompute %main "main"
|
OpEntryPoint GLCompute %main "main"
|
||||||
OpExecutionMode %main LocalSize 1 1 1
|
OpExecutionMode %main LocalSize 1 1 1
|
||||||
OpName %o "o"
|
|
||||||
OpName %main "main"
|
OpName %main "main"
|
||||||
OpDecorate %o SpecId 1234
|
|
||||||
%float = OpTypeFloat 32
|
|
||||||
%o = OpSpecConstant %float 0
|
|
||||||
%void = OpTypeVoid
|
%void = OpTypeVoid
|
||||||
%3 = OpTypeFunction %void
|
%1 = OpTypeFunction %void
|
||||||
%main = OpFunction %void None %3
|
%float = OpTypeFloat 32
|
||||||
%6 = OpLabel
|
%6 = OpConstantNull %float
|
||||||
|
%bool = OpTypeBool
|
||||||
|
%main = OpFunction %void None %1
|
||||||
|
%4 = OpLabel
|
||||||
|
%7 = OpFOrdEqual %bool %6 %6
|
||||||
|
OpSelectionMerge %9 None
|
||||||
|
OpBranchConditional %7 %10 %9
|
||||||
|
%10 = OpLabel
|
||||||
|
OpBranch %9
|
||||||
|
%9 = OpLabel
|
||||||
OpReturn
|
OpReturn
|
||||||
OpFunctionEnd
|
OpFunctionEnd
|
||||||
|
@ -1,6 +1,8 @@
|
|||||||
@id(1234) override o : f32;
|
const o : f32 = 0.0f;
|
||||||
|
|
||||||
@compute @workgroup_size(1)
|
@compute @workgroup_size(1)
|
||||||
fn main() {
|
fn main() {
|
||||||
_ = o;
|
if ((o == 0.0)) {
|
||||||
|
_ = o;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,9 @@
|
|||||||
// flags: --overrides WGSL_SPEC_CONSTANT_1234=0
|
// flags: --overrides 1234=0
|
||||||
@id(1234) override o : i32;
|
@id(1234) override o : i32;
|
||||||
|
|
||||||
@compute @workgroup_size(1)
|
@compute @workgroup_size(1)
|
||||||
fn main() {
|
fn main() {
|
||||||
_ = o;
|
if o == 0 {
|
||||||
|
_ = o;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,12 +1,8 @@
|
|||||||
SKIP: FAILED
|
|
||||||
|
|
||||||
#version 310 es
|
#version 310 es
|
||||||
|
|
||||||
#ifndef WGSL_SPEC_CONSTANT_1234
|
|
||||||
#error spec constant required for constant id 1234
|
|
||||||
#endif
|
|
||||||
const int o = WGSL_SPEC_CONSTANT_1234;
|
|
||||||
void tint_symbol() {
|
void tint_symbol() {
|
||||||
|
if ((0 == 0)) {
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
|
layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
|
||||||
@ -14,11 +10,3 @@ void main() {
|
|||||||
tint_symbol();
|
tint_symbol();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
Error parsing GLSL shader:
|
|
||||||
ERROR: 0:4: '#error' : spec constant required for constant id 1234
|
|
||||||
ERROR: 0:5: '' : missing #endif
|
|
||||||
ERROR: 0:5: '' : compilation terminated
|
|
||||||
ERROR: 3 compilation errors. No code generated.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,9 +1,6 @@
|
|||||||
#ifndef WGSL_SPEC_CONSTANT_1234
|
|
||||||
#error spec constant required for constant id 1234
|
|
||||||
#endif
|
|
||||||
static const int o = WGSL_SPEC_CONSTANT_1234;
|
|
||||||
|
|
||||||
[numthreads(1, 1, 1)]
|
[numthreads(1, 1, 1)]
|
||||||
void main() {
|
void main() {
|
||||||
|
if ((0 == 0)) {
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -1,9 +1,9 @@
|
|||||||
#include <metal_stdlib>
|
#include <metal_stdlib>
|
||||||
|
|
||||||
using namespace metal;
|
using namespace metal;
|
||||||
constant int o [[function_constant(1234)]];
|
|
||||||
|
|
||||||
kernel void tint_symbol() {
|
kernel void tint_symbol() {
|
||||||
|
if ((0 == 0)) {
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user