Extract more StorageTexture information

BUG=tint:489

Change-Id: I03a15fdd156bf0c85b1afebb6e0e26fd44dff51f
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/42060
Commit-Queue: Ryan Harrison <rharrison@chromium.org>
Commit-Queue: dan sinclair <dsinclair@chromium.org>
Auto-Submit: Ryan Harrison <rharrison@chromium.org>
Reviewed-by: dan sinclair <dsinclair@chromium.org>
This commit is contained in:
Ryan Harrison 2021-02-18 20:11:49 +00:00 committed by Commit Bot service account
parent 15daded41b
commit 94cfbbeb5f
3 changed files with 320 additions and 87 deletions

View File

@ -38,6 +38,7 @@
#include "src/type/matrix_type.h"
#include "src/type/multisampled_texture_type.h"
#include "src/type/sampled_texture_type.h"
#include "src/type/storage_texture_type.h"
#include "src/type/struct_type.h"
#include "src/type/texture_type.h"
#include "src/type/type.h"
@ -60,6 +61,131 @@ void AppendResourceBindings(std::vector<ResourceBinding>* dest,
dest->insert(dest->end(), orig.begin(), orig.end());
}
ResourceBinding::TextureDimension
TypeTextureDimensionToResourceBindingTextureDimension(
const type::TextureDimension& type_dim) {
switch (type_dim) {
case type::TextureDimension::k1d:
return ResourceBinding::TextureDimension::k1d;
case type::TextureDimension::k1dArray:
return ResourceBinding::TextureDimension::k1dArray;
case type::TextureDimension::k2d:
return ResourceBinding::TextureDimension::k2d;
case type::TextureDimension::k2dArray:
return ResourceBinding::TextureDimension::k2dArray;
case type::TextureDimension::k3d:
return ResourceBinding::TextureDimension::k3d;
case type::TextureDimension::kCube:
return ResourceBinding::TextureDimension::kCube;
case type::TextureDimension::kCubeArray:
return ResourceBinding::TextureDimension::kCubeArray;
default:
return ResourceBinding::TextureDimension::kNone;
}
}
ResourceBinding::SampledKind BaseTypeToSampledKind(type::Type* base_type) {
if (!base_type) {
return ResourceBinding::SampledKind::kUnknown;
}
if (auto* at = base_type->As<type::Array>()) {
base_type = at->type();
} else if (auto* mt = base_type->As<type::Matrix>()) {
base_type = mt->type();
} else if (auto* vt = base_type->As<type::Vector>()) {
base_type = vt->type();
}
if (base_type->Is<type::F32>()) {
return ResourceBinding::SampledKind::kFloat;
} else if (base_type->Is<type::U32>()) {
return ResourceBinding::SampledKind::kUInt;
} else if (base_type->Is<type::I32>()) {
return ResourceBinding::SampledKind::kSInt;
} else {
return ResourceBinding::SampledKind::kUnknown;
}
}
ResourceBinding::ImageFormat TypeImageFormatToResourceBindingImageFormat(
const type::ImageFormat& image_format) {
switch (image_format) {
case type::ImageFormat::kR8Unorm:
return ResourceBinding::ImageFormat::kR8Unorm;
case type::ImageFormat::kR8Snorm:
return ResourceBinding::ImageFormat::kR8Snorm;
case type::ImageFormat::kR8Uint:
return ResourceBinding::ImageFormat::kR8Uint;
case type::ImageFormat::kR8Sint:
return ResourceBinding::ImageFormat::kR8Sint;
case type::ImageFormat::kR16Uint:
return ResourceBinding::ImageFormat::kR16Uint;
case type::ImageFormat::kR16Sint:
return ResourceBinding::ImageFormat::kR16Sint;
case type::ImageFormat::kR16Float:
return ResourceBinding::ImageFormat::kR16Float;
case type::ImageFormat::kRg8Unorm:
return ResourceBinding::ImageFormat::kRg8Unorm;
case type::ImageFormat::kRg8Snorm:
return ResourceBinding::ImageFormat::kRg8Snorm;
case type::ImageFormat::kRg8Uint:
return ResourceBinding::ImageFormat::kRg8Uint;
case type::ImageFormat::kRg8Sint:
return ResourceBinding::ImageFormat::kRg8Sint;
case type::ImageFormat::kR32Uint:
return ResourceBinding::ImageFormat::kR32Uint;
case type::ImageFormat::kR32Sint:
return ResourceBinding::ImageFormat::kR32Sint;
case type::ImageFormat::kR32Float:
return ResourceBinding::ImageFormat::kR32Float;
case type::ImageFormat::kRg16Uint:
return ResourceBinding::ImageFormat::kRg16Uint;
case type::ImageFormat::kRg16Sint:
return ResourceBinding::ImageFormat::kRg16Sint;
case type::ImageFormat::kRg16Float:
return ResourceBinding::ImageFormat::kRg16Float;
case type::ImageFormat::kRgba8Unorm:
return ResourceBinding::ImageFormat::kRgba8Unorm;
case type::ImageFormat::kRgba8UnormSrgb:
return ResourceBinding::ImageFormat::kRgba8UnormSrgb;
case type::ImageFormat::kRgba8Snorm:
return ResourceBinding::ImageFormat::kRgba8Snorm;
case type::ImageFormat::kRgba8Uint:
return ResourceBinding::ImageFormat::kRgba8Uint;
case type::ImageFormat::kRgba8Sint:
return ResourceBinding::ImageFormat::kRgba8Sint;
case type::ImageFormat::kBgra8Unorm:
return ResourceBinding::ImageFormat::kBgra8Unorm;
case type::ImageFormat::kBgra8UnormSrgb:
return ResourceBinding::ImageFormat::kBgra8UnormSrgb;
case type::ImageFormat::kRgb10A2Unorm:
return ResourceBinding::ImageFormat::kRgb10A2Unorm;
case type::ImageFormat::kRg11B10Float:
return ResourceBinding::ImageFormat::kRg11B10Float;
case type::ImageFormat::kRg32Uint:
return ResourceBinding::ImageFormat::kRg32Uint;
case type::ImageFormat::kRg32Sint:
return ResourceBinding::ImageFormat::kRg32Sint;
case type::ImageFormat::kRg32Float:
return ResourceBinding::ImageFormat::kRg32Float;
case type::ImageFormat::kRgba16Uint:
return ResourceBinding::ImageFormat::kRgba16Uint;
case type::ImageFormat::kRgba16Sint:
return ResourceBinding::ImageFormat::kRgba16Sint;
case type::ImageFormat::kRgba16Float:
return ResourceBinding::ImageFormat::kRgba16Float;
case type::ImageFormat::kRgba32Uint:
return ResourceBinding::ImageFormat::kRgba32Uint;
case type::ImageFormat::kRgba32Sint:
return ResourceBinding::ImageFormat::kRgba32Sint;
case type::ImageFormat::kRgba32Float:
return ResourceBinding::ImageFormat::kRgba32Float;
default:
return ResourceBinding::ImageFormat::kNone;
}
}
} // namespace
Inspector::Inspector(const Program* program) : program_(program) {}
@ -428,32 +554,8 @@ std::vector<ResourceBinding> Inspector::GetSampledTextureResourceBindingsImpl(
entry.binding = binding_info.binding->value();
auto* texture_type = decl->type()->UnwrapIfNeeded()->As<type::Texture>();
switch (texture_type->dim()) {
case type::TextureDimension::k1d:
entry.dim = ResourceBinding::TextureDimension::k1d;
break;
case type::TextureDimension::k1dArray:
entry.dim = ResourceBinding::TextureDimension::k1dArray;
break;
case type::TextureDimension::k2d:
entry.dim = ResourceBinding::TextureDimension::k2d;
break;
case type::TextureDimension::k2dArray:
entry.dim = ResourceBinding::TextureDimension::k2dArray;
break;
case type::TextureDimension::k3d:
entry.dim = ResourceBinding::TextureDimension::k3d;
break;
case type::TextureDimension::kCube:
entry.dim = ResourceBinding::TextureDimension::kCube;
break;
case type::TextureDimension::kCubeArray:
entry.dim = ResourceBinding::TextureDimension::kCubeArray;
break;
default:
entry.dim = ResourceBinding::TextureDimension::kNone;
break;
}
entry.dim = TypeTextureDimensionToResourceBindingTextureDimension(
texture_type->dim());
type::Type* base_type = nullptr;
if (multisampled_only) {
@ -464,24 +566,7 @@ std::vector<ResourceBinding> Inspector::GetSampledTextureResourceBindingsImpl(
base_type =
texture_type->As<type::SampledTexture>()->type()->UnwrapIfNeeded();
}
if (auto* at = base_type->As<type::Array>()) {
base_type = at->type();
} else if (auto* mt = base_type->As<type::Matrix>()) {
base_type = mt->type();
} else if (auto* vt = base_type->As<type::Vector>()) {
base_type = vt->type();
}
if (base_type->Is<type::F32>()) {
entry.sampled_kind = ResourceBinding::SampledKind::kFloat;
} else if (base_type->Is<type::U32>()) {
entry.sampled_kind = ResourceBinding::SampledKind::kUInt;
} else if (base_type->Is<type::I32>()) {
entry.sampled_kind = ResourceBinding::SampledKind::kSInt;
} else {
entry.sampled_kind = ResourceBinding::SampledKind::kUnknown;
}
entry.sampled_kind = BaseTypeToSampledKind(base_type);
result.push_back(entry);
}
@ -520,6 +605,16 @@ std::vector<ResourceBinding> Inspector::GetStorageTextureResourceBindingsImpl(
entry.bind_group = binding_info.group->value();
entry.binding = binding_info.binding->value();
auto* texture_type = decl->type()->UnwrapIfNeeded()->As<type::Texture>();
entry.dim = TypeTextureDimensionToResourceBindingTextureDimension(
texture_type->dim());
type::Type* base_type =
texture_type->As<type::StorageTexture>()->type()->UnwrapIfNeeded();
entry.sampled_kind = BaseTypeToSampledKind(base_type);
entry.image_format = TypeImageFormatToResourceBindingImageFormat(
texture_type->As<type::StorageTexture>()->image_format());
result.push_back(entry);
}

View File

@ -55,6 +55,45 @@ struct ResourceBinding {
/// in SPIR-V OpTypeImage.
enum class SampledKind { kUnknown = -1, kFloat, kUInt, kSInt };
enum class ImageFormat {
kNone = -1,
kR8Unorm,
kR8Snorm,
kR8Uint,
kR8Sint,
kR16Uint,
kR16Sint,
kR16Float,
kRg8Unorm,
kRg8Snorm,
kRg8Uint,
kRg8Sint,
kR32Uint,
kR32Sint,
kR32Float,
kRg16Uint,
kRg16Sint,
kRg16Float,
kRgba8Unorm,
kRgba8UnormSrgb,
kRgba8Snorm,
kRgba8Uint,
kRgba8Sint,
kBgra8Unorm,
kBgra8UnormSrgb,
kRgb10A2Unorm,
kRg11B10Float,
kRg32Uint,
kRg32Sint,
kRg32Float,
kRgba16Uint,
kRgba16Sint,
kRgba16Float,
kRgba32Uint,
kRgba32Sint,
kRgba32Float,
};
/// kXXX maps to entries returned by GetXXXResourceBindings call.
enum class ResourceType {
kUniformBuffer,
@ -80,6 +119,8 @@ struct ResourceBinding {
TextureDimension dim;
/// Kind of data being sampled, if defined.
SampledKind sampled_kind;
/// Format of data, if defined.
ImageFormat image_format;
};
/// Extracts information from a program

View File

@ -760,7 +760,14 @@ class InspectorGetMultisampledTextureResourceBindingsTestWithParam
public testing::TestWithParam<GetMultisampledTextureTestParams> {};
class InspectorGetStorageTextureResourceBindingsTest : public InspectorHelper,
public testing::Test {};
typedef std::tuple<bool, type::TextureDimension, type::ImageFormat>
typedef std::tuple<type::TextureDimension, ResourceBinding::TextureDimension>
DimensionParams;
typedef std::tuple<type::ImageFormat,
ResourceBinding::ImageFormat,
ResourceBinding::SampledKind>
ImageFormatParams;
typedef std::tuple<bool, DimensionParams, ImageFormatParams>
GetStorageTextureTestParams;
class InspectorGetStorageTextureResourceBindingsTestWithParam
: public InspectorHelper,
@ -2507,9 +2514,18 @@ TEST_F(InspectorGetStorageTextureResourceBindingsTest, Empty) {
TEST_P(InspectorGetStorageTextureResourceBindingsTestWithParam, Simple) {
bool read_only;
DimensionParams dim_params;
ImageFormatParams format_params;
std::tie(read_only, dim_params, format_params) = GetParam();
type::TextureDimension dim;
ResourceBinding::TextureDimension expected_dim;
std::tie(dim, expected_dim) = dim_params;
type::ImageFormat format;
std::tie(read_only, dim, format) = GetParam();
ResourceBinding::ImageFormat expected_format;
ResourceBinding::SampledKind expected_kind;
std::tie(format, expected_format, expected_kind) = format_params;
type::StorageTexture* st_type;
type::Type* st_subtype;
@ -2555,6 +2571,9 @@ TEST_P(InspectorGetStorageTextureResourceBindingsTestWithParam, Simple) {
result[0].resource_type);
EXPECT_EQ(0u, result[0].bind_group);
EXPECT_EQ(0u, result[0].binding);
EXPECT_EQ(expected_dim, result[0].dim);
EXPECT_EQ(expected_format, result[0].image_format);
EXPECT_EQ(expected_kind, result[0].sampled_kind);
result = read_only
? inspector.GetWriteOnlyStorageTextureResourceBindings("ep")
@ -2566,47 +2585,125 @@ TEST_P(InspectorGetStorageTextureResourceBindingsTestWithParam, Simple) {
INSTANTIATE_TEST_SUITE_P(
InspectorGetStorageTextureResourceBindingsTest,
InspectorGetStorageTextureResourceBindingsTestWithParam,
testing::Combine(testing::Bool(),
testing::Values(type::TextureDimension::k1d,
type::TextureDimension::k1dArray,
type::TextureDimension::k2d,
type::TextureDimension::k2dArray,
type::TextureDimension::k3d),
testing::Values(type::ImageFormat::kR8Uint,
type::ImageFormat::kR16Uint,
type::ImageFormat::kRg8Uint,
type::ImageFormat::kR32Uint,
type::ImageFormat::kRg16Uint,
type::ImageFormat::kRgba8Uint,
type::ImageFormat::kRg32Uint,
type::ImageFormat::kRgba16Uint,
type::ImageFormat::kRgba32Uint,
type::ImageFormat::kR8Sint,
type::ImageFormat::kR16Sint,
type::ImageFormat::kRg8Sint,
type::ImageFormat::kR32Sint,
type::ImageFormat::kRg16Sint,
type::ImageFormat::kRgba8Sint,
type::ImageFormat::kRg32Sint,
type::ImageFormat::kRgba16Sint,
type::ImageFormat::kRgba32Sint,
type::ImageFormat::kR8Unorm,
type::ImageFormat::kRg8Unorm,
type::ImageFormat::kRgba8Unorm,
type::ImageFormat::kRgba8UnormSrgb,
type::ImageFormat::kBgra8Unorm,
type::ImageFormat::kBgra8UnormSrgb,
type::ImageFormat::kRgb10A2Unorm,
type::ImageFormat::kR8Snorm,
type::ImageFormat::kRg8Snorm,
type::ImageFormat::kRgba8Snorm,
type::ImageFormat::kR16Float,
type::ImageFormat::kR32Float,
type::ImageFormat::kRg16Float,
type::ImageFormat::kRg11B10Float,
type::ImageFormat::kRg32Float,
type::ImageFormat::kRgba16Float,
type::ImageFormat::kRgba32Float)));
testing::Combine(
testing::Bool(),
testing::Values(
std::make_tuple(type::TextureDimension::k1d,
ResourceBinding::TextureDimension::k1d),
std::make_tuple(type::TextureDimension::k1dArray,
ResourceBinding::TextureDimension::k1dArray),
std::make_tuple(type::TextureDimension::k2d,
ResourceBinding::TextureDimension::k2d),
std::make_tuple(type::TextureDimension::k2dArray,
ResourceBinding::TextureDimension::k2dArray),
std::make_tuple(type::TextureDimension::k3d,
ResourceBinding::TextureDimension::k3d)),
testing::Values(
std::make_tuple(type::ImageFormat::kR8Uint,
ResourceBinding::ImageFormat::kR8Uint,
ResourceBinding::SampledKind::kUInt),
std::make_tuple(type::ImageFormat::kR16Uint,
ResourceBinding::ImageFormat::kR16Uint,
ResourceBinding::SampledKind::kUInt),
std::make_tuple(type::ImageFormat::kRg8Uint,
ResourceBinding::ImageFormat::kRg8Uint,
ResourceBinding::SampledKind::kUInt),
std::make_tuple(type::ImageFormat::kR32Uint,
ResourceBinding::ImageFormat::kR32Uint,
ResourceBinding::SampledKind::kUInt),
std::make_tuple(type::ImageFormat::kRg16Uint,
ResourceBinding::ImageFormat::kRg16Uint,
ResourceBinding::SampledKind::kUInt),
std::make_tuple(type::ImageFormat::kRgba8Uint,
ResourceBinding::ImageFormat::kRgba8Uint,
ResourceBinding::SampledKind::kUInt),
std::make_tuple(type::ImageFormat::kRg32Uint,
ResourceBinding::ImageFormat::kRg32Uint,
ResourceBinding::SampledKind::kUInt),
std::make_tuple(type::ImageFormat::kRgba16Uint,
ResourceBinding::ImageFormat::kRgba16Uint,
ResourceBinding::SampledKind::kUInt),
std::make_tuple(type::ImageFormat::kRgba32Uint,
ResourceBinding::ImageFormat::kRgba32Uint,
ResourceBinding::SampledKind::kUInt),
std::make_tuple(type::ImageFormat::kR8Sint,
ResourceBinding::ImageFormat::kR8Sint,
ResourceBinding::SampledKind::kSInt),
std::make_tuple(type::ImageFormat::kR16Sint,
ResourceBinding::ImageFormat::kR16Sint,
ResourceBinding::SampledKind::kSInt),
std::make_tuple(type::ImageFormat::kRg8Sint,
ResourceBinding::ImageFormat::kRg8Sint,
ResourceBinding::SampledKind::kSInt),
std::make_tuple(type::ImageFormat::kR32Sint,
ResourceBinding::ImageFormat::kR32Sint,
ResourceBinding::SampledKind::kSInt),
std::make_tuple(type::ImageFormat::kRg16Sint,
ResourceBinding::ImageFormat::kRg16Sint,
ResourceBinding::SampledKind::kSInt),
std::make_tuple(type::ImageFormat::kRgba8Sint,
ResourceBinding::ImageFormat::kRgba8Sint,
ResourceBinding::SampledKind::kSInt),
std::make_tuple(type::ImageFormat::kRg32Sint,
ResourceBinding::ImageFormat::kRg32Sint,
ResourceBinding::SampledKind::kSInt),
std::make_tuple(type::ImageFormat::kRgba16Sint,
ResourceBinding::ImageFormat::kRgba16Sint,
ResourceBinding::SampledKind::kSInt),
std::make_tuple(type::ImageFormat::kRgba32Sint,
ResourceBinding::ImageFormat::kRgba32Sint,
ResourceBinding::SampledKind::kSInt),
std::make_tuple(type::ImageFormat::kR8Unorm,
ResourceBinding::ImageFormat::kR8Unorm,
ResourceBinding::SampledKind::kFloat),
std::make_tuple(type::ImageFormat::kRg8Unorm,
ResourceBinding::ImageFormat::kRg8Unorm,
ResourceBinding::SampledKind::kFloat),
std::make_tuple(type::ImageFormat::kRgba8Unorm,
ResourceBinding::ImageFormat::kRgba8Unorm,
ResourceBinding::SampledKind::kFloat),
std::make_tuple(type::ImageFormat::kRgba8UnormSrgb,
ResourceBinding::ImageFormat::kRgba8UnormSrgb,
ResourceBinding::SampledKind::kFloat),
std::make_tuple(type::ImageFormat::kBgra8Unorm,
ResourceBinding::ImageFormat::kBgra8Unorm,
ResourceBinding::SampledKind::kFloat),
std::make_tuple(type::ImageFormat::kBgra8UnormSrgb,
ResourceBinding::ImageFormat::kBgra8UnormSrgb,
ResourceBinding::SampledKind::kFloat),
std::make_tuple(type::ImageFormat::kRgb10A2Unorm,
ResourceBinding::ImageFormat::kRgb10A2Unorm,
ResourceBinding::SampledKind::kFloat),
std::make_tuple(type::ImageFormat::kR8Snorm,
ResourceBinding::ImageFormat::kR8Snorm,
ResourceBinding::SampledKind::kFloat),
std::make_tuple(type::ImageFormat::kRg8Snorm,
ResourceBinding::ImageFormat::kRg8Snorm,
ResourceBinding::SampledKind::kFloat),
std::make_tuple(type::ImageFormat::kRgba8Snorm,
ResourceBinding::ImageFormat::kRgba8Snorm,
ResourceBinding::SampledKind::kFloat),
std::make_tuple(type::ImageFormat::kR16Float,
ResourceBinding::ImageFormat::kR16Float,
ResourceBinding::SampledKind::kFloat),
std::make_tuple(type::ImageFormat::kR32Float,
ResourceBinding::ImageFormat::kR32Float,
ResourceBinding::SampledKind::kFloat),
std::make_tuple(type::ImageFormat::kRg16Float,
ResourceBinding::ImageFormat::kRg16Float,
ResourceBinding::SampledKind::kFloat),
std::make_tuple(type::ImageFormat::kRg11B10Float,
ResourceBinding::ImageFormat::kRg11B10Float,
ResourceBinding::SampledKind::kFloat),
std::make_tuple(type::ImageFormat::kRg32Float,
ResourceBinding::ImageFormat::kRg32Float,
ResourceBinding::SampledKind::kFloat),
std::make_tuple(type::ImageFormat::kRgba16Float,
ResourceBinding::ImageFormat::kRgba16Float,
ResourceBinding::SampledKind::kFloat),
std::make_tuple(type::ImageFormat::kRgba32Float,
ResourceBinding::ImageFormat::kRgba32Float,
ResourceBinding::SampledKind::kFloat))));
} // namespace
} // namespace inspector