Add dumping inspected bindings for shader
Adding a flag to the tint sample binary that allows you to dump what the inspector is reflecting about the bindings in a shader. This has already helped me identify one blindspot in the validator. BUG=tint:530 Change-Id: I6709f1d8f8391a1419d07abebf210e9e358e0861 Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/43820 Reviewed-by: Ben Clayton <bclayton@google.com> Auto-Submit: Ryan Harrison <rharrison@chromium.org> Commit-Queue: Ben Clayton <bclayton@google.com>
This commit is contained in:
parent
e18a18bc1c
commit
f76f3081af
187
samples/main.cc
187
samples/main.cc
|
@ -54,6 +54,7 @@ struct Options {
|
||||||
bool dump_ast = false;
|
bool dump_ast = false;
|
||||||
bool dawn_validation = false;
|
bool dawn_validation = false;
|
||||||
bool demangle = false;
|
bool demangle = false;
|
||||||
|
bool dump_inspector_bindings = false;
|
||||||
|
|
||||||
Format format = Format::kNone;
|
Format format = Format::kNone;
|
||||||
|
|
||||||
|
@ -90,6 +91,7 @@ const char kUsage[] = R"(Usage: tint [options] <input-file>
|
||||||
as Dawn does. Has no effect on non-SPIRV outputs.
|
as Dawn does. Has no effect on non-SPIRV outputs.
|
||||||
--demangle -- Preserve original source names. Demangle them.
|
--demangle -- Preserve original source names. Demangle them.
|
||||||
Affects AST dumping, and text-based output languages.
|
Affects AST dumping, and text-based output languages.
|
||||||
|
--dump-inspector-bindings -- Dump reflection data about bindins to stdout.
|
||||||
-h -- This help text)";
|
-h -- This help text)";
|
||||||
|
|
||||||
#ifdef _MSC_VER
|
#ifdef _MSC_VER
|
||||||
|
@ -207,6 +209,153 @@ std::vector<std::string> split_transform_names(std::string list) {
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::string TextureDimensionToString(
|
||||||
|
tint::inspector::ResourceBinding::TextureDimension dim) {
|
||||||
|
switch (dim) {
|
||||||
|
case tint::inspector::ResourceBinding::TextureDimension::kNone:
|
||||||
|
return "None";
|
||||||
|
case tint::inspector::ResourceBinding::TextureDimension::k1d:
|
||||||
|
return "1d";
|
||||||
|
case tint::inspector::ResourceBinding::TextureDimension::k2d:
|
||||||
|
return "2d";
|
||||||
|
case tint::inspector::ResourceBinding::TextureDimension::k2dArray:
|
||||||
|
return "2dArray";
|
||||||
|
case tint::inspector::ResourceBinding::TextureDimension::k3d:
|
||||||
|
return "3d";
|
||||||
|
case tint::inspector::ResourceBinding::TextureDimension::kCube:
|
||||||
|
return "Cube";
|
||||||
|
case tint::inspector::ResourceBinding::TextureDimension::kCubeArray:
|
||||||
|
return "CubeArray";
|
||||||
|
}
|
||||||
|
|
||||||
|
return "Unknown";
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string SampledKindToString(
|
||||||
|
tint::inspector::ResourceBinding::SampledKind kind) {
|
||||||
|
switch (kind) {
|
||||||
|
case tint::inspector::ResourceBinding::SampledKind::kFloat:
|
||||||
|
return "Float";
|
||||||
|
case tint::inspector::ResourceBinding::SampledKind::kUInt:
|
||||||
|
return "UInt";
|
||||||
|
case tint::inspector::ResourceBinding::SampledKind::kSInt:
|
||||||
|
return "SInt";
|
||||||
|
case tint::inspector::ResourceBinding::SampledKind::kUnknown:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return "Unknown";
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string ImageFormatToString(
|
||||||
|
tint::inspector::ResourceBinding::ImageFormat format) {
|
||||||
|
switch (format) {
|
||||||
|
case tint::inspector::ResourceBinding::ImageFormat::kR8Unorm:
|
||||||
|
return "R8Unorm";
|
||||||
|
case tint::inspector::ResourceBinding::ImageFormat::kR8Snorm:
|
||||||
|
return "R8Snorm";
|
||||||
|
case tint::inspector::ResourceBinding::ImageFormat::kR8Uint:
|
||||||
|
return "R8Uint";
|
||||||
|
case tint::inspector::ResourceBinding::ImageFormat::kR8Sint:
|
||||||
|
return "R8Sint";
|
||||||
|
case tint::inspector::ResourceBinding::ImageFormat::kR16Uint:
|
||||||
|
return "R16Uint";
|
||||||
|
case tint::inspector::ResourceBinding::ImageFormat::kR16Sint:
|
||||||
|
return "R16Sint";
|
||||||
|
case tint::inspector::ResourceBinding::ImageFormat::kR16Float:
|
||||||
|
return "R16Float";
|
||||||
|
case tint::inspector::ResourceBinding::ImageFormat::kRg8Unorm:
|
||||||
|
return "Rg8Unorm";
|
||||||
|
case tint::inspector::ResourceBinding::ImageFormat::kRg8Snorm:
|
||||||
|
return "Rg8Snorm";
|
||||||
|
case tint::inspector::ResourceBinding::ImageFormat::kRg8Uint:
|
||||||
|
return "Rg8Uint";
|
||||||
|
case tint::inspector::ResourceBinding::ImageFormat::kRg8Sint:
|
||||||
|
return "Rg8Sint";
|
||||||
|
case tint::inspector::ResourceBinding::ImageFormat::kR32Uint:
|
||||||
|
return "R32Uint";
|
||||||
|
case tint::inspector::ResourceBinding::ImageFormat::kR32Sint:
|
||||||
|
return "R32Sint";
|
||||||
|
case tint::inspector::ResourceBinding::ImageFormat::kR32Float:
|
||||||
|
return "R32Float";
|
||||||
|
case tint::inspector::ResourceBinding::ImageFormat::kRg16Uint:
|
||||||
|
return "Rg16Uint";
|
||||||
|
case tint::inspector::ResourceBinding::ImageFormat::kRg16Sint:
|
||||||
|
return "Rg16Sint";
|
||||||
|
case tint::inspector::ResourceBinding::ImageFormat::kRg16Float:
|
||||||
|
return "Rg16Float";
|
||||||
|
case tint::inspector::ResourceBinding::ImageFormat::kRgba8Unorm:
|
||||||
|
return "Rgba8Unorm";
|
||||||
|
case tint::inspector::ResourceBinding::ImageFormat::kRgba8UnormSrgb:
|
||||||
|
return "Rgba8UnormSrgb";
|
||||||
|
case tint::inspector::ResourceBinding::ImageFormat::kRgba8Snorm:
|
||||||
|
return "Rgba8Snorm";
|
||||||
|
case tint::inspector::ResourceBinding::ImageFormat::kRgba8Uint:
|
||||||
|
return "Rgba8Uint";
|
||||||
|
case tint::inspector::ResourceBinding::ImageFormat::kRgba8Sint:
|
||||||
|
return "Rgba8Sint";
|
||||||
|
case tint::inspector::ResourceBinding::ImageFormat::kBgra8Unorm:
|
||||||
|
return "Bgra8Unorm";
|
||||||
|
case tint::inspector::ResourceBinding::ImageFormat::kBgra8UnormSrgb:
|
||||||
|
return "Bgra8UnormSrgb";
|
||||||
|
case tint::inspector::ResourceBinding::ImageFormat::kRgb10A2Unorm:
|
||||||
|
return "Rgb10A2Unorm";
|
||||||
|
case tint::inspector::ResourceBinding::ImageFormat::kRg11B10Float:
|
||||||
|
return "Rg11B10Float";
|
||||||
|
case tint::inspector::ResourceBinding::ImageFormat::kRg32Uint:
|
||||||
|
return "Rg32Uint";
|
||||||
|
case tint::inspector::ResourceBinding::ImageFormat::kRg32Sint:
|
||||||
|
return "Rg32Sint";
|
||||||
|
case tint::inspector::ResourceBinding::ImageFormat::kRg32Float:
|
||||||
|
return "Rg32Float";
|
||||||
|
case tint::inspector::ResourceBinding::ImageFormat::kRgba16Uint:
|
||||||
|
return "Rgba16Uint";
|
||||||
|
case tint::inspector::ResourceBinding::ImageFormat::kRgba16Sint:
|
||||||
|
return "Rgba16Sint";
|
||||||
|
case tint::inspector::ResourceBinding::ImageFormat::kRgba16Float:
|
||||||
|
return "Rgba16Float";
|
||||||
|
case tint::inspector::ResourceBinding::ImageFormat::kRgba32Uint:
|
||||||
|
return "Rgba32Uint";
|
||||||
|
case tint::inspector::ResourceBinding::ImageFormat::kRgba32Sint:
|
||||||
|
return "Rgba32Sint";
|
||||||
|
case tint::inspector::ResourceBinding::ImageFormat::kRgba32Float:
|
||||||
|
return "Rgba32Float";
|
||||||
|
case tint::inspector::ResourceBinding::ImageFormat::kNone:
|
||||||
|
return "None";
|
||||||
|
}
|
||||||
|
return "Unknown";
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string ResourceTypeToString(
|
||||||
|
tint::inspector::ResourceBinding::ResourceType type) {
|
||||||
|
switch (type) {
|
||||||
|
case tint::inspector::ResourceBinding::ResourceType::kUniformBuffer:
|
||||||
|
return "UniformBuffer";
|
||||||
|
case tint::inspector::ResourceBinding::ResourceType::kStorageBuffer:
|
||||||
|
return "StorageBuffer";
|
||||||
|
case tint::inspector::ResourceBinding::ResourceType::kReadOnlyStorageBuffer:
|
||||||
|
return "ReadOnlyStorageBuffer";
|
||||||
|
case tint::inspector::ResourceBinding::ResourceType::kSampler:
|
||||||
|
return "Sampler";
|
||||||
|
case tint::inspector::ResourceBinding::ResourceType::kComparisonSampler:
|
||||||
|
return "ComparisonSampler";
|
||||||
|
case tint::inspector::ResourceBinding::ResourceType::kSampledTexture:
|
||||||
|
return "SampledTexture";
|
||||||
|
case tint::inspector::ResourceBinding::ResourceType::kMulitsampledTexture:
|
||||||
|
return "MulitsampledTexture";
|
||||||
|
case tint::inspector::ResourceBinding::ResourceType::
|
||||||
|
kReadOnlyStorageTexture:
|
||||||
|
return "ReadOnlyStorageTexture";
|
||||||
|
case tint::inspector::ResourceBinding::ResourceType::
|
||||||
|
kWriteOnlyStorageTexture:
|
||||||
|
return "WriteOnlyStorageTexture";
|
||||||
|
case tint::inspector::ResourceBinding::ResourceType::kDepthTexture:
|
||||||
|
return "DepthTexture";
|
||||||
|
}
|
||||||
|
|
||||||
|
return "Unknown";
|
||||||
|
}
|
||||||
|
|
||||||
bool ParseArgs(const std::vector<std::string>& args, Options* opts) {
|
bool ParseArgs(const std::vector<std::string>& args, Options* opts) {
|
||||||
for (size_t i = 1; i < args.size(); ++i) {
|
for (size_t i = 1; i < args.size(); ++i) {
|
||||||
const std::string& arg = args[i];
|
const std::string& arg = args[i];
|
||||||
|
@ -263,6 +412,8 @@ bool ParseArgs(const std::vector<std::string>& args, Options* opts) {
|
||||||
opts->dawn_validation = true;
|
opts->dawn_validation = true;
|
||||||
} else if (arg == "--demangle") {
|
} else if (arg == "--demangle") {
|
||||||
opts->demangle = true;
|
opts->demangle = true;
|
||||||
|
} else if (arg == "--dump-inspector-bindings") {
|
||||||
|
opts->dump_inspector_bindings = true;
|
||||||
} else if (!arg.empty()) {
|
} else if (!arg.empty()) {
|
||||||
if (arg[0] == '-') {
|
if (arg[0] == '-') {
|
||||||
std::cerr << "Unrecognized option: " << arg << std::endl;
|
std::cerr << "Unrecognized option: " << arg << std::endl;
|
||||||
|
@ -576,6 +727,42 @@ int main(int argc, const char** argv) {
|
||||||
|
|
||||||
*program = std::move(out.program);
|
*program = std::move(out.program);
|
||||||
|
|
||||||
|
if (options.dump_inspector_bindings) {
|
||||||
|
std::cout << std::string(80, '-') << std::endl;
|
||||||
|
tint::inspector::Inspector inspector(program.get());
|
||||||
|
auto entry_points = inspector.GetEntryPoints();
|
||||||
|
if (!inspector.error().empty()) {
|
||||||
|
std::cerr << "Failed to get entry points from Inspector: "
|
||||||
|
<< inspector.error() << std::endl;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (auto& entry_point : entry_points) {
|
||||||
|
auto bindings = inspector.GetResourceBindings(entry_point.name);
|
||||||
|
if (!inspector.error().empty()) {
|
||||||
|
std::cerr << "Failed to get bindings from Inspector: "
|
||||||
|
<< inspector.error() << std::endl;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
std::cout << "Entry Point = " << entry_point.name << std::endl;
|
||||||
|
for (auto& binding : bindings) {
|
||||||
|
std::cout << "\t[" << binding.bind_group << "][" << binding.binding
|
||||||
|
<< "]:" << std::endl;
|
||||||
|
std::cout << "\t\t resource_type = "
|
||||||
|
<< ResourceTypeToString(binding.resource_type) << std::endl;
|
||||||
|
std::cout << "\t\t min_buffer_binding_size = "
|
||||||
|
<< binding.min_buffer_binding_size << std::endl;
|
||||||
|
std::cout << "\t\t dim = " << TextureDimensionToString(binding.dim)
|
||||||
|
<< std::endl;
|
||||||
|
std::cout << "\t\t sampled_kind = "
|
||||||
|
<< SampledKindToString(binding.sampled_kind) << std::endl;
|
||||||
|
std::cout << "\t\t image_format = "
|
||||||
|
<< ImageFormatToString(binding.image_format) << std::endl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
std::cout << std::string(80, '-') << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
std::unique_ptr<tint::writer::Writer> writer;
|
std::unique_ptr<tint::writer::Writer> writer;
|
||||||
|
|
||||||
#if TINT_BUILD_SPV_WRITER
|
#if TINT_BUILD_SPV_WRITER
|
||||||
|
|
Loading…
Reference in New Issue