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:
Ryan Harrison 2021-03-04 15:30:35 +00:00 committed by Commit Bot service account
parent e18a18bc1c
commit f76f3081af
1 changed files with 187 additions and 0 deletions

View File

@ -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