mirror of
https://github.com/encounter/dawn-cmake.git
synced 2025-12-17 17:05:31 +00:00
Implement BGLBinding::textureDimension
In WebGPU the BGLBinding needs to know the texture dimension for compatibility reasons between the texture views passed and the pipelines. This adds the member and implements the restriction. BUG=dawn:22 Change-Id: I95204de1cd621c936994739e840c76351fea9035 Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/10960 Reviewed-by: Austin Eng <enga@chromium.org> Reviewed-by: Kai Ninomiya <kainino@chromium.org> Commit-Queue: Corentin Wallez <cwallez@chromium.org>
This commit is contained in:
committed by
Commit Bot service account
parent
dbe74bc4a2
commit
86e74e0dc1
@@ -50,13 +50,30 @@ TEST_P(ObjectCachingTest, BindGroupLayoutDynamic) {
|
||||
TEST_P(ObjectCachingTest, BindGroupLayoutTextureComponentType) {
|
||||
dawn::BindGroupLayout bgl = utils::MakeBindGroupLayout(
|
||||
device, {{1, dawn::ShaderStage::Fragment, dawn::BindingType::SampledTexture, false, false,
|
||||
dawn::TextureComponentType::Float}});
|
||||
dawn::TextureViewDimension::e2D, dawn::TextureComponentType::Float}});
|
||||
dawn::BindGroupLayout sameBgl = utils::MakeBindGroupLayout(
|
||||
device, {{1, dawn::ShaderStage::Fragment, dawn::BindingType::SampledTexture, false, false,
|
||||
dawn::TextureComponentType::Float}});
|
||||
dawn::TextureViewDimension::e2D, dawn::TextureComponentType::Float}});
|
||||
dawn::BindGroupLayout otherBgl = utils::MakeBindGroupLayout(
|
||||
device, {{1, dawn::ShaderStage::Fragment, dawn::BindingType::SampledTexture, false, false,
|
||||
dawn::TextureComponentType::Uint}});
|
||||
dawn::TextureViewDimension::e2D, dawn::TextureComponentType::Uint}});
|
||||
|
||||
EXPECT_NE(bgl.Get(), otherBgl.Get());
|
||||
EXPECT_EQ(bgl.Get() == sameBgl.Get(), !UsesWire());
|
||||
}
|
||||
|
||||
// Test that two similar bind group layouts won't refer to the same one if they differ by
|
||||
// textureDimension
|
||||
TEST_P(ObjectCachingTest, BindGroupLayoutTextureDimension) {
|
||||
dawn::BindGroupLayout bgl = utils::MakeBindGroupLayout(
|
||||
device, {{1, dawn::ShaderStage::Fragment, dawn::BindingType::SampledTexture, false, false,
|
||||
dawn::TextureViewDimension::e2D, dawn::TextureComponentType::Float}});
|
||||
dawn::BindGroupLayout sameBgl = utils::MakeBindGroupLayout(
|
||||
device, {{1, dawn::ShaderStage::Fragment, dawn::BindingType::SampledTexture, false, false,
|
||||
dawn::TextureViewDimension::e2D, dawn::TextureComponentType::Float}});
|
||||
dawn::BindGroupLayout otherBgl = utils::MakeBindGroupLayout(
|
||||
device, {{1, dawn::ShaderStage::Fragment, dawn::BindingType::SampledTexture, false, false,
|
||||
dawn::TextureViewDimension::e2DArray, dawn::TextureComponentType::Float}});
|
||||
|
||||
EXPECT_NE(bgl.Get(), otherBgl.Get());
|
||||
EXPECT_EQ(bgl.Get() == sameBgl.Get(), !UsesWire());
|
||||
|
||||
@@ -273,7 +273,7 @@ class TextureFormatTest : public DawnTest {
|
||||
dawn::BindGroupLayout bgl = utils::MakeBindGroupLayout(
|
||||
device, {{0, dawn::ShaderStage::Fragment, dawn::BindingType::Sampler},
|
||||
{1, dawn::ShaderStage::Fragment, dawn::BindingType::SampledTexture, false,
|
||||
false, sampleFormatInfo.type}});
|
||||
false, dawn::TextureViewDimension::e2D, sampleFormatInfo.type}});
|
||||
|
||||
// Prepare objects needed to sample from texture in the renderpass
|
||||
dawn::RenderPipeline pipeline =
|
||||
|
||||
@@ -83,12 +83,6 @@ protected:
|
||||
|
||||
mRenderPass = utils::CreateBasicRenderPass(device, kRTSize, kRTSize);
|
||||
|
||||
mBindGroupLayout = utils::MakeBindGroupLayout(
|
||||
device, {
|
||||
{0, dawn::ShaderStage::Fragment, dawn::BindingType::Sampler},
|
||||
{1, dawn::ShaderStage::Fragment, dawn::BindingType::SampledTexture},
|
||||
});
|
||||
|
||||
dawn::FilterMode kFilterMode = dawn::FilterMode::Nearest;
|
||||
dawn::AddressMode kAddressMode = dawn::AddressMode::ClampToEdge;
|
||||
|
||||
@@ -104,8 +98,6 @@ protected:
|
||||
samplerDescriptor.compare = dawn::CompareFunction::Never;
|
||||
mSampler = device.CreateSampler(&samplerDescriptor);
|
||||
|
||||
mPipelineLayout = utils::MakeBasicPipelineLayout(device, &mBindGroupLayout);
|
||||
|
||||
mVSModule = CreateDefaultVertexShaderModule(device);
|
||||
}
|
||||
|
||||
@@ -157,11 +149,19 @@ protected:
|
||||
queue.Submit(1, ©);
|
||||
}
|
||||
|
||||
void Verify(const dawn::TextureView &textureView, const char* fragmentShader, int expected) {
|
||||
dawn::BindGroup bindGroup = utils::MakeBindGroup(device, mBindGroupLayout, {
|
||||
{0, mSampler},
|
||||
{1, textureView}
|
||||
});
|
||||
void Verify(const dawn::TextureView& textureView,
|
||||
dawn::TextureViewDimension dimension,
|
||||
const char* fragmentShader,
|
||||
int expected) {
|
||||
dawn::BindGroupLayout bindGroupLayout = utils::MakeBindGroupLayout(
|
||||
device, {
|
||||
{0, dawn::ShaderStage::Fragment, dawn::BindingType::Sampler},
|
||||
{1, dawn::ShaderStage::Fragment, dawn::BindingType::SampledTexture, false,
|
||||
false, dimension, dawn::TextureComponentType::Float},
|
||||
});
|
||||
|
||||
dawn::BindGroup bindGroup =
|
||||
utils::MakeBindGroup(device, bindGroupLayout, {{0, mSampler}, {1, textureView}});
|
||||
|
||||
dawn::ShaderModule fsModule =
|
||||
utils::CreateShaderModule(device, utils::SingleShaderStage::Fragment, fragmentShader);
|
||||
@@ -169,7 +169,7 @@ protected:
|
||||
utils::ComboRenderPipelineDescriptor textureDescriptor(device);
|
||||
textureDescriptor.vertexStage.module = mVSModule;
|
||||
textureDescriptor.cFragmentStage.module = fsModule;
|
||||
textureDescriptor.layout = mPipelineLayout;
|
||||
textureDescriptor.layout = utils::MakeBasicPipelineLayout(device, &bindGroupLayout);
|
||||
textureDescriptor.cColorStates[0]->format = mRenderPass.colorFormat;
|
||||
|
||||
dawn::RenderPipeline pipeline = device.CreateRenderPipeline(&textureDescriptor);
|
||||
@@ -224,7 +224,7 @@ protected:
|
||||
)";
|
||||
|
||||
const int expected = GenerateTestPixelValue(textureViewBaseLayer, textureViewBaseMipLevel);
|
||||
Verify(textureView, fragmentShader, expected);
|
||||
Verify(textureView, dawn::TextureViewDimension::e2D, fragmentShader, expected);
|
||||
}
|
||||
|
||||
void Texture2DArrayViewTest(uint32_t textureArrayLayers,
|
||||
@@ -268,7 +268,7 @@ protected:
|
||||
for (int i = 0; i < static_cast<int>(kTextureViewLayerCount); ++i) {
|
||||
expected += GenerateTestPixelValue(textureViewBaseLayer + i, textureViewBaseMipLevel);
|
||||
}
|
||||
Verify(textureView, fragmentShader, expected);
|
||||
Verify(textureView, dawn::TextureViewDimension::e2DArray, fragmentShader, expected);
|
||||
}
|
||||
|
||||
std::string CreateFragmentShaderForCubeMapFace(uint32_t layer, bool isCubeMapArray) {
|
||||
@@ -320,10 +320,12 @@ protected:
|
||||
|
||||
ASSERT_TRUE((textureViewLayerCount == 6) ||
|
||||
(isCubeMapArray && textureViewLayerCount % 6 == 0));
|
||||
dawn::TextureViewDimension dimension = (isCubeMapArray)
|
||||
? dawn::TextureViewDimension::CubeArray
|
||||
: dawn::TextureViewDimension::Cube;
|
||||
|
||||
dawn::TextureViewDescriptor descriptor = mDefaultTextureViewDescriptor;
|
||||
descriptor.dimension = (isCubeMapArray) ?
|
||||
dawn::TextureViewDimension::CubeArray : dawn::TextureViewDimension::Cube;
|
||||
descriptor.dimension = dimension;
|
||||
descriptor.baseArrayLayer = textureViewBaseLayer;
|
||||
descriptor.arrayLayerCount = textureViewLayerCount;
|
||||
|
||||
@@ -335,12 +337,10 @@ protected:
|
||||
CreateFragmentShaderForCubeMapFace(layer, isCubeMapArray);
|
||||
|
||||
int expected = GenerateTestPixelValue(textureViewBaseLayer + layer, 0);
|
||||
Verify(cubeMapTextureView, fragmentShader.c_str(), expected);
|
||||
Verify(cubeMapTextureView, dimension, fragmentShader.c_str(), expected);
|
||||
}
|
||||
}
|
||||
|
||||
dawn::BindGroupLayout mBindGroupLayout;
|
||||
dawn::PipelineLayout mPipelineLayout;
|
||||
dawn::Sampler mSampler;
|
||||
dawn::Texture mTexture;
|
||||
dawn::TextureViewDescriptor mDefaultTextureViewDescriptor;
|
||||
@@ -376,7 +376,7 @@ TEST_P(TextureViewSamplingTest, Default2DArrayTexture) {
|
||||
|
||||
const int expected = GenerateTestPixelValue(0, 0) + GenerateTestPixelValue(1, 0) +
|
||||
GenerateTestPixelValue(2, 0);
|
||||
Verify(textureView, fragmentShader, expected);
|
||||
Verify(textureView, dawn::TextureViewDimension::e2DArray, fragmentShader, expected);
|
||||
}
|
||||
|
||||
// Test sampling from a 2D texture view created on a 2D array texture.
|
||||
|
||||
@@ -303,12 +303,12 @@ TEST_F(BindGroupValidationTest, TextureUsage) {
|
||||
TEST_F(BindGroupValidationTest, TextureComponentType) {
|
||||
dawn::BindGroupLayout layout = utils::MakeBindGroupLayout(
|
||||
device, {{0, dawn::ShaderStage::Fragment, dawn::BindingType::SampledTexture, false, false,
|
||||
dawn::TextureComponentType::Float}});
|
||||
dawn::TextureViewDimension::e2D, dawn::TextureComponentType::Float}});
|
||||
|
||||
// Control case: setting a Float typed texture view works.
|
||||
utils::MakeBindGroup(device, layout, {{0, mSampledTextureView}});
|
||||
|
||||
// Make an output attachment texture and try to set it for a SampledTexture binding
|
||||
// Make a Uint component typed texture and try to set it to a Float component binding.
|
||||
dawn::TextureDescriptor descriptor;
|
||||
descriptor.dimension = dawn::TextureDimension::e2D;
|
||||
descriptor.size = {16, 16, 1};
|
||||
@@ -323,6 +323,30 @@ TEST_F(BindGroupValidationTest, TextureComponentType) {
|
||||
ASSERT_DEVICE_ERROR(utils::MakeBindGroup(device, layout, {{0, uintTextureView}}));
|
||||
}
|
||||
|
||||
// Check that a texture must have the correct dimension
|
||||
TEST_F(BindGroupValidationTest, TextureDimension) {
|
||||
dawn::BindGroupLayout layout = utils::MakeBindGroupLayout(
|
||||
device, {{0, dawn::ShaderStage::Fragment, dawn::BindingType::SampledTexture, false, false,
|
||||
dawn::TextureViewDimension::e2D, dawn::TextureComponentType::Float}});
|
||||
|
||||
// Control case: setting a 2D texture view works.
|
||||
utils::MakeBindGroup(device, layout, {{0, mSampledTextureView}});
|
||||
|
||||
// Make a 2DArray texture and try to set it to a 2D binding.
|
||||
dawn::TextureDescriptor descriptor;
|
||||
descriptor.dimension = dawn::TextureDimension::e2D;
|
||||
descriptor.size = {16, 16, 1};
|
||||
descriptor.arrayLayerCount = 2;
|
||||
descriptor.sampleCount = 1;
|
||||
descriptor.format = dawn::TextureFormat::RGBA8Uint;
|
||||
descriptor.mipLevelCount = 1;
|
||||
descriptor.usage = dawn::TextureUsage::Sampled;
|
||||
dawn::Texture arrayTexture = device.CreateTexture(&descriptor);
|
||||
dawn::TextureView arrayTextureView = arrayTexture.CreateView();
|
||||
|
||||
ASSERT_DEVICE_ERROR(utils::MakeBindGroup(device, layout, {{0, arrayTextureView}}));
|
||||
}
|
||||
|
||||
// Check that a UBO must have the correct usage
|
||||
TEST_F(BindGroupValidationTest, BufferUsageUBO) {
|
||||
dawn::BindGroupLayout layout = utils::MakeBindGroupLayout(
|
||||
|
||||
@@ -331,11 +331,12 @@ TEST_F(WireArgumentTests, StructureOfStructureArrayArgument) {
|
||||
static constexpr int NUM_BINDINGS = 3;
|
||||
DawnBindGroupLayoutBinding bindings[NUM_BINDINGS]{
|
||||
{0, DAWN_SHADER_STAGE_VERTEX, DAWN_BINDING_TYPE_SAMPLER, false, false,
|
||||
DAWN_TEXTURE_COMPONENT_TYPE_FLOAT},
|
||||
DAWN_TEXTURE_VIEW_DIMENSION_2D, DAWN_TEXTURE_COMPONENT_TYPE_FLOAT},
|
||||
{1, DAWN_SHADER_STAGE_VERTEX, DAWN_BINDING_TYPE_SAMPLED_TEXTURE, false, false,
|
||||
DAWN_TEXTURE_COMPONENT_TYPE_FLOAT},
|
||||
DAWN_TEXTURE_VIEW_DIMENSION_2D, DAWN_TEXTURE_COMPONENT_TYPE_FLOAT},
|
||||
{2, static_cast<DawnShaderStage>(DAWN_SHADER_STAGE_VERTEX | DAWN_SHADER_STAGE_FRAGMENT),
|
||||
DAWN_BINDING_TYPE_UNIFORM_BUFFER, false, false, DAWN_TEXTURE_COMPONENT_TYPE_FLOAT},
|
||||
DAWN_BINDING_TYPE_UNIFORM_BUFFER, false, false, DAWN_TEXTURE_VIEW_DIMENSION_2D,
|
||||
DAWN_TEXTURE_COMPONENT_TYPE_FLOAT},
|
||||
};
|
||||
DawnBindGroupLayoutDescriptor bglDescriptor;
|
||||
bglDescriptor.bindingCount = NUM_BINDINGS;
|
||||
|
||||
Reference in New Issue
Block a user