mirror of
https://github.com/encounter/dawn-cmake.git
synced 2025-07-14 09:06:11 +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:
parent
dbe74bc4a2
commit
86e74e0dc1
@ -58,6 +58,7 @@
|
|||||||
{"name": "type", "type": "binding type"},
|
{"name": "type", "type": "binding type"},
|
||||||
{"name": "dynamic", "type": "bool", "default": "false"},
|
{"name": "dynamic", "type": "bool", "default": "false"},
|
||||||
{"name": "multisampled", "type": "bool", "default": "false"},
|
{"name": "multisampled", "type": "bool", "default": "false"},
|
||||||
|
{"name": "texture dimension", "type": "texture view dimension", "default": "undefined"},
|
||||||
{"name": "texture component type", "type": "texture component type", "default": "float"}
|
{"name": "texture component type", "type": "texture component type", "default": "float"}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
@ -65,7 +65,8 @@ namespace dawn_native {
|
|||||||
const BindGroupBinding& binding,
|
const BindGroupBinding& binding,
|
||||||
dawn::TextureUsage requiredUsage,
|
dawn::TextureUsage requiredUsage,
|
||||||
bool multisampledBinding,
|
bool multisampledBinding,
|
||||||
dawn::TextureComponentType requiredComponentType) {
|
dawn::TextureComponentType requiredComponentType,
|
||||||
|
dawn::TextureViewDimension requiredDimension) {
|
||||||
if (binding.textureView == nullptr || binding.sampler != nullptr ||
|
if (binding.textureView == nullptr || binding.sampler != nullptr ||
|
||||||
binding.buffer != nullptr) {
|
binding.buffer != nullptr) {
|
||||||
return DAWN_VALIDATION_ERROR("expected texture binding");
|
return DAWN_VALIDATION_ERROR("expected texture binding");
|
||||||
@ -86,6 +87,10 @@ namespace dawn_native {
|
|||||||
return DAWN_VALIDATION_ERROR("texture component type usage mismatch");
|
return DAWN_VALIDATION_ERROR("texture component type usage mismatch");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (binding.textureView->GetDimension() != requiredDimension) {
|
||||||
|
return DAWN_VALIDATION_ERROR("texture view dimension mismatch");
|
||||||
|
}
|
||||||
|
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -145,10 +150,10 @@ namespace dawn_native {
|
|||||||
DAWN_TRY(ValidateBufferBinding(device, binding, dawn::BufferUsage::Storage));
|
DAWN_TRY(ValidateBufferBinding(device, binding, dawn::BufferUsage::Storage));
|
||||||
break;
|
break;
|
||||||
case dawn::BindingType::SampledTexture:
|
case dawn::BindingType::SampledTexture:
|
||||||
DAWN_TRY(
|
DAWN_TRY(ValidateTextureBinding(device, binding, dawn::TextureUsage::Sampled,
|
||||||
ValidateTextureBinding(device, binding, dawn::TextureUsage::Sampled,
|
|
||||||
layoutInfo.multisampled[bindingIndex],
|
layoutInfo.multisampled[bindingIndex],
|
||||||
layoutInfo.textureComponentTypes[bindingIndex]));
|
layoutInfo.textureComponentTypes[bindingIndex],
|
||||||
|
layoutInfo.textureDimensions[bindingIndex]));
|
||||||
break;
|
break;
|
||||||
case dawn::BindingType::Sampler:
|
case dawn::BindingType::Sampler:
|
||||||
DAWN_TRY(ValidateSamplerBinding(device, binding));
|
DAWN_TRY(ValidateSamplerBinding(device, binding));
|
||||||
|
@ -38,6 +38,10 @@ namespace dawn_native {
|
|||||||
DAWN_TRY(ValidateBindingType(binding.type));
|
DAWN_TRY(ValidateBindingType(binding.type));
|
||||||
DAWN_TRY(ValidateTextureComponentType(binding.textureComponentType));
|
DAWN_TRY(ValidateTextureComponentType(binding.textureComponentType));
|
||||||
|
|
||||||
|
if (binding.textureDimension != dawn::TextureViewDimension::Undefined) {
|
||||||
|
DAWN_TRY(ValidateTextureViewDimension(binding.textureDimension));
|
||||||
|
}
|
||||||
|
|
||||||
if (binding.binding >= kMaxBindingsPerGroup) {
|
if (binding.binding >= kMaxBindingsPerGroup) {
|
||||||
return DAWN_VALIDATION_ERROR("some binding index exceeds the maximum value");
|
return DAWN_VALIDATION_ERROR("some binding index exceeds the maximum value");
|
||||||
}
|
}
|
||||||
@ -100,7 +104,7 @@ namespace dawn_native {
|
|||||||
|
|
||||||
for (uint32_t binding : IterateBitSet(info.mask)) {
|
for (uint32_t binding : IterateBitSet(info.mask)) {
|
||||||
HashCombine(&hash, info.visibilities[binding], info.types[binding],
|
HashCombine(&hash, info.visibilities[binding], info.types[binding],
|
||||||
info.textureComponentTypes[binding]);
|
info.textureComponentTypes[binding], info.textureDimensions[binding]);
|
||||||
}
|
}
|
||||||
|
|
||||||
return hash;
|
return hash;
|
||||||
@ -115,7 +119,8 @@ namespace dawn_native {
|
|||||||
for (uint32_t binding : IterateBitSet(a.mask)) {
|
for (uint32_t binding : IterateBitSet(a.mask)) {
|
||||||
if ((a.visibilities[binding] != b.visibilities[binding]) ||
|
if ((a.visibilities[binding] != b.visibilities[binding]) ||
|
||||||
(a.types[binding] != b.types[binding]) ||
|
(a.types[binding] != b.types[binding]) ||
|
||||||
(a.textureComponentTypes[binding] != b.textureComponentTypes[binding])) {
|
(a.textureComponentTypes[binding] != b.textureComponentTypes[binding]) ||
|
||||||
|
(a.textureDimensions[binding] != b.textureDimensions[binding])) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -138,6 +143,12 @@ namespace dawn_native {
|
|||||||
mBindingInfo.types[index] = binding.type;
|
mBindingInfo.types[index] = binding.type;
|
||||||
mBindingInfo.textureComponentTypes[index] = binding.textureComponentType;
|
mBindingInfo.textureComponentTypes[index] = binding.textureComponentType;
|
||||||
|
|
||||||
|
if (binding.textureDimension == dawn::TextureViewDimension::Undefined) {
|
||||||
|
mBindingInfo.textureDimensions[index] = dawn::TextureViewDimension::e2D;
|
||||||
|
} else {
|
||||||
|
mBindingInfo.textureDimensions[index] = binding.textureDimension;
|
||||||
|
}
|
||||||
|
|
||||||
if (binding.dynamic) {
|
if (binding.dynamic) {
|
||||||
mBindingInfo.dynamic.set(index);
|
mBindingInfo.dynamic.set(index);
|
||||||
switch (binding.type) {
|
switch (binding.type) {
|
||||||
|
@ -43,6 +43,7 @@ namespace dawn_native {
|
|||||||
std::array<dawn::ShaderStage, kMaxBindingsPerGroup> visibilities;
|
std::array<dawn::ShaderStage, kMaxBindingsPerGroup> visibilities;
|
||||||
std::array<dawn::BindingType, kMaxBindingsPerGroup> types;
|
std::array<dawn::BindingType, kMaxBindingsPerGroup> types;
|
||||||
std::array<dawn::TextureComponentType, kMaxBindingsPerGroup> textureComponentTypes;
|
std::array<dawn::TextureComponentType, kMaxBindingsPerGroup> textureComponentTypes;
|
||||||
|
std::array<dawn::TextureViewDimension, kMaxBindingsPerGroup> textureDimensions;
|
||||||
std::bitset<kMaxBindingsPerGroup> dynamic;
|
std::bitset<kMaxBindingsPerGroup> dynamic;
|
||||||
std::bitset<kMaxBindingsPerGroup> multisampled;
|
std::bitset<kMaxBindingsPerGroup> multisampled;
|
||||||
std::bitset<kMaxBindingsPerGroup> mask;
|
std::bitset<kMaxBindingsPerGroup> mask;
|
||||||
|
@ -497,6 +497,7 @@ namespace dawn_native {
|
|||||||
: ObjectBase(texture->GetDevice()),
|
: ObjectBase(texture->GetDevice()),
|
||||||
mTexture(texture),
|
mTexture(texture),
|
||||||
mFormat(GetDevice()->GetValidInternalFormat(descriptor->format)),
|
mFormat(GetDevice()->GetValidInternalFormat(descriptor->format)),
|
||||||
|
mDimension(descriptor->dimension),
|
||||||
mBaseMipLevel(descriptor->baseMipLevel),
|
mBaseMipLevel(descriptor->baseMipLevel),
|
||||||
mMipLevelCount(descriptor->mipLevelCount),
|
mMipLevelCount(descriptor->mipLevelCount),
|
||||||
mBaseArrayLayer(descriptor->baseArrayLayer),
|
mBaseArrayLayer(descriptor->baseArrayLayer),
|
||||||
@ -527,6 +528,11 @@ namespace dawn_native {
|
|||||||
return mFormat;
|
return mFormat;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
dawn::TextureViewDimension TextureViewBase::GetDimension() const {
|
||||||
|
ASSERT(!IsError());
|
||||||
|
return mDimension;
|
||||||
|
}
|
||||||
|
|
||||||
uint32_t TextureViewBase::GetBaseMipLevel() const {
|
uint32_t TextureViewBase::GetBaseMipLevel() const {
|
||||||
ASSERT(!IsError());
|
ASSERT(!IsError());
|
||||||
return mBaseMipLevel;
|
return mBaseMipLevel;
|
||||||
|
@ -115,6 +115,7 @@ namespace dawn_native {
|
|||||||
TextureBase* GetTexture();
|
TextureBase* GetTexture();
|
||||||
|
|
||||||
const Format& GetFormat() const;
|
const Format& GetFormat() const;
|
||||||
|
dawn::TextureViewDimension GetDimension() const;
|
||||||
uint32_t GetBaseMipLevel() const;
|
uint32_t GetBaseMipLevel() const;
|
||||||
uint32_t GetLevelCount() const;
|
uint32_t GetLevelCount() const;
|
||||||
uint32_t GetBaseArrayLayer() const;
|
uint32_t GetBaseArrayLayer() const;
|
||||||
@ -127,6 +128,7 @@ namespace dawn_native {
|
|||||||
|
|
||||||
// TODO(cwallez@chromium.org): This should be deduplicated in the Device
|
// TODO(cwallez@chromium.org): This should be deduplicated in the Device
|
||||||
const Format& mFormat;
|
const Format& mFormat;
|
||||||
|
dawn::TextureViewDimension mDimension;
|
||||||
uint32_t mBaseMipLevel;
|
uint32_t mBaseMipLevel;
|
||||||
uint32_t mMipLevelCount;
|
uint32_t mMipLevelCount;
|
||||||
uint32_t mBaseArrayLayer;
|
uint32_t mBaseArrayLayer;
|
||||||
|
@ -50,13 +50,30 @@ TEST_P(ObjectCachingTest, BindGroupLayoutDynamic) {
|
|||||||
TEST_P(ObjectCachingTest, BindGroupLayoutTextureComponentType) {
|
TEST_P(ObjectCachingTest, BindGroupLayoutTextureComponentType) {
|
||||||
dawn::BindGroupLayout bgl = utils::MakeBindGroupLayout(
|
dawn::BindGroupLayout bgl = utils::MakeBindGroupLayout(
|
||||||
device, {{1, dawn::ShaderStage::Fragment, dawn::BindingType::SampledTexture, false, false,
|
device, {{1, dawn::ShaderStage::Fragment, dawn::BindingType::SampledTexture, false, false,
|
||||||
dawn::TextureComponentType::Float}});
|
dawn::TextureViewDimension::e2D, dawn::TextureComponentType::Float}});
|
||||||
dawn::BindGroupLayout sameBgl = utils::MakeBindGroupLayout(
|
dawn::BindGroupLayout sameBgl = utils::MakeBindGroupLayout(
|
||||||
device, {{1, dawn::ShaderStage::Fragment, dawn::BindingType::SampledTexture, false, false,
|
device, {{1, dawn::ShaderStage::Fragment, dawn::BindingType::SampledTexture, false, false,
|
||||||
dawn::TextureComponentType::Float}});
|
dawn::TextureViewDimension::e2D, dawn::TextureComponentType::Float}});
|
||||||
dawn::BindGroupLayout otherBgl = utils::MakeBindGroupLayout(
|
dawn::BindGroupLayout otherBgl = utils::MakeBindGroupLayout(
|
||||||
device, {{1, dawn::ShaderStage::Fragment, dawn::BindingType::SampledTexture, false, false,
|
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_NE(bgl.Get(), otherBgl.Get());
|
||||||
EXPECT_EQ(bgl.Get() == sameBgl.Get(), !UsesWire());
|
EXPECT_EQ(bgl.Get() == sameBgl.Get(), !UsesWire());
|
||||||
|
@ -273,7 +273,7 @@ class TextureFormatTest : public DawnTest {
|
|||||||
dawn::BindGroupLayout bgl = utils::MakeBindGroupLayout(
|
dawn::BindGroupLayout bgl = utils::MakeBindGroupLayout(
|
||||||
device, {{0, dawn::ShaderStage::Fragment, dawn::BindingType::Sampler},
|
device, {{0, dawn::ShaderStage::Fragment, dawn::BindingType::Sampler},
|
||||||
{1, dawn::ShaderStage::Fragment, dawn::BindingType::SampledTexture, false,
|
{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
|
// Prepare objects needed to sample from texture in the renderpass
|
||||||
dawn::RenderPipeline pipeline =
|
dawn::RenderPipeline pipeline =
|
||||||
|
@ -83,12 +83,6 @@ protected:
|
|||||||
|
|
||||||
mRenderPass = utils::CreateBasicRenderPass(device, kRTSize, kRTSize);
|
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::FilterMode kFilterMode = dawn::FilterMode::Nearest;
|
||||||
dawn::AddressMode kAddressMode = dawn::AddressMode::ClampToEdge;
|
dawn::AddressMode kAddressMode = dawn::AddressMode::ClampToEdge;
|
||||||
|
|
||||||
@ -104,8 +98,6 @@ protected:
|
|||||||
samplerDescriptor.compare = dawn::CompareFunction::Never;
|
samplerDescriptor.compare = dawn::CompareFunction::Never;
|
||||||
mSampler = device.CreateSampler(&samplerDescriptor);
|
mSampler = device.CreateSampler(&samplerDescriptor);
|
||||||
|
|
||||||
mPipelineLayout = utils::MakeBasicPipelineLayout(device, &mBindGroupLayout);
|
|
||||||
|
|
||||||
mVSModule = CreateDefaultVertexShaderModule(device);
|
mVSModule = CreateDefaultVertexShaderModule(device);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -157,19 +149,27 @@ protected:
|
|||||||
queue.Submit(1, ©);
|
queue.Submit(1, ©);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Verify(const dawn::TextureView &textureView, const char* fragmentShader, int expected) {
|
void Verify(const dawn::TextureView& textureView,
|
||||||
dawn::BindGroup bindGroup = utils::MakeBindGroup(device, mBindGroupLayout, {
|
dawn::TextureViewDimension dimension,
|
||||||
{0, mSampler},
|
const char* fragmentShader,
|
||||||
{1, textureView}
|
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 =
|
dawn::ShaderModule fsModule =
|
||||||
utils::CreateShaderModule(device, utils::SingleShaderStage::Fragment, fragmentShader);
|
utils::CreateShaderModule(device, utils::SingleShaderStage::Fragment, fragmentShader);
|
||||||
|
|
||||||
utils::ComboRenderPipelineDescriptor textureDescriptor(device);
|
utils::ComboRenderPipelineDescriptor textureDescriptor(device);
|
||||||
textureDescriptor.vertexStage.module = mVSModule;
|
textureDescriptor.vertexStage.module = mVSModule;
|
||||||
textureDescriptor.cFragmentStage.module = fsModule;
|
textureDescriptor.cFragmentStage.module = fsModule;
|
||||||
textureDescriptor.layout = mPipelineLayout;
|
textureDescriptor.layout = utils::MakeBasicPipelineLayout(device, &bindGroupLayout);
|
||||||
textureDescriptor.cColorStates[0]->format = mRenderPass.colorFormat;
|
textureDescriptor.cColorStates[0]->format = mRenderPass.colorFormat;
|
||||||
|
|
||||||
dawn::RenderPipeline pipeline = device.CreateRenderPipeline(&textureDescriptor);
|
dawn::RenderPipeline pipeline = device.CreateRenderPipeline(&textureDescriptor);
|
||||||
@ -224,7 +224,7 @@ protected:
|
|||||||
)";
|
)";
|
||||||
|
|
||||||
const int expected = GenerateTestPixelValue(textureViewBaseLayer, textureViewBaseMipLevel);
|
const int expected = GenerateTestPixelValue(textureViewBaseLayer, textureViewBaseMipLevel);
|
||||||
Verify(textureView, fragmentShader, expected);
|
Verify(textureView, dawn::TextureViewDimension::e2D, fragmentShader, expected);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Texture2DArrayViewTest(uint32_t textureArrayLayers,
|
void Texture2DArrayViewTest(uint32_t textureArrayLayers,
|
||||||
@ -268,7 +268,7 @@ protected:
|
|||||||
for (int i = 0; i < static_cast<int>(kTextureViewLayerCount); ++i) {
|
for (int i = 0; i < static_cast<int>(kTextureViewLayerCount); ++i) {
|
||||||
expected += GenerateTestPixelValue(textureViewBaseLayer + i, textureViewBaseMipLevel);
|
expected += GenerateTestPixelValue(textureViewBaseLayer + i, textureViewBaseMipLevel);
|
||||||
}
|
}
|
||||||
Verify(textureView, fragmentShader, expected);
|
Verify(textureView, dawn::TextureViewDimension::e2DArray, fragmentShader, expected);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string CreateFragmentShaderForCubeMapFace(uint32_t layer, bool isCubeMapArray) {
|
std::string CreateFragmentShaderForCubeMapFace(uint32_t layer, bool isCubeMapArray) {
|
||||||
@ -320,10 +320,12 @@ protected:
|
|||||||
|
|
||||||
ASSERT_TRUE((textureViewLayerCount == 6) ||
|
ASSERT_TRUE((textureViewLayerCount == 6) ||
|
||||||
(isCubeMapArray && textureViewLayerCount % 6 == 0));
|
(isCubeMapArray && textureViewLayerCount % 6 == 0));
|
||||||
|
dawn::TextureViewDimension dimension = (isCubeMapArray)
|
||||||
|
? dawn::TextureViewDimension::CubeArray
|
||||||
|
: dawn::TextureViewDimension::Cube;
|
||||||
|
|
||||||
dawn::TextureViewDescriptor descriptor = mDefaultTextureViewDescriptor;
|
dawn::TextureViewDescriptor descriptor = mDefaultTextureViewDescriptor;
|
||||||
descriptor.dimension = (isCubeMapArray) ?
|
descriptor.dimension = dimension;
|
||||||
dawn::TextureViewDimension::CubeArray : dawn::TextureViewDimension::Cube;
|
|
||||||
descriptor.baseArrayLayer = textureViewBaseLayer;
|
descriptor.baseArrayLayer = textureViewBaseLayer;
|
||||||
descriptor.arrayLayerCount = textureViewLayerCount;
|
descriptor.arrayLayerCount = textureViewLayerCount;
|
||||||
|
|
||||||
@ -335,12 +337,10 @@ protected:
|
|||||||
CreateFragmentShaderForCubeMapFace(layer, isCubeMapArray);
|
CreateFragmentShaderForCubeMapFace(layer, isCubeMapArray);
|
||||||
|
|
||||||
int expected = GenerateTestPixelValue(textureViewBaseLayer + layer, 0);
|
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::Sampler mSampler;
|
||||||
dawn::Texture mTexture;
|
dawn::Texture mTexture;
|
||||||
dawn::TextureViewDescriptor mDefaultTextureViewDescriptor;
|
dawn::TextureViewDescriptor mDefaultTextureViewDescriptor;
|
||||||
@ -376,7 +376,7 @@ TEST_P(TextureViewSamplingTest, Default2DArrayTexture) {
|
|||||||
|
|
||||||
const int expected = GenerateTestPixelValue(0, 0) + GenerateTestPixelValue(1, 0) +
|
const int expected = GenerateTestPixelValue(0, 0) + GenerateTestPixelValue(1, 0) +
|
||||||
GenerateTestPixelValue(2, 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.
|
// 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) {
|
TEST_F(BindGroupValidationTest, TextureComponentType) {
|
||||||
dawn::BindGroupLayout layout = utils::MakeBindGroupLayout(
|
dawn::BindGroupLayout layout = utils::MakeBindGroupLayout(
|
||||||
device, {{0, dawn::ShaderStage::Fragment, dawn::BindingType::SampledTexture, false, false,
|
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.
|
// Control case: setting a Float typed texture view works.
|
||||||
utils::MakeBindGroup(device, layout, {{0, mSampledTextureView}});
|
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;
|
dawn::TextureDescriptor descriptor;
|
||||||
descriptor.dimension = dawn::TextureDimension::e2D;
|
descriptor.dimension = dawn::TextureDimension::e2D;
|
||||||
descriptor.size = {16, 16, 1};
|
descriptor.size = {16, 16, 1};
|
||||||
@ -323,6 +323,30 @@ TEST_F(BindGroupValidationTest, TextureComponentType) {
|
|||||||
ASSERT_DEVICE_ERROR(utils::MakeBindGroup(device, layout, {{0, uintTextureView}}));
|
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
|
// Check that a UBO must have the correct usage
|
||||||
TEST_F(BindGroupValidationTest, BufferUsageUBO) {
|
TEST_F(BindGroupValidationTest, BufferUsageUBO) {
|
||||||
dawn::BindGroupLayout layout = utils::MakeBindGroupLayout(
|
dawn::BindGroupLayout layout = utils::MakeBindGroupLayout(
|
||||||
|
@ -331,11 +331,12 @@ TEST_F(WireArgumentTests, StructureOfStructureArrayArgument) {
|
|||||||
static constexpr int NUM_BINDINGS = 3;
|
static constexpr int NUM_BINDINGS = 3;
|
||||||
DawnBindGroupLayoutBinding bindings[NUM_BINDINGS]{
|
DawnBindGroupLayoutBinding bindings[NUM_BINDINGS]{
|
||||||
{0, DAWN_SHADER_STAGE_VERTEX, DAWN_BINDING_TYPE_SAMPLER, false, false,
|
{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,
|
{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),
|
{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;
|
DawnBindGroupLayoutDescriptor bglDescriptor;
|
||||||
bglDescriptor.bindingCount = NUM_BINDINGS;
|
bglDescriptor.bindingCount = NUM_BINDINGS;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user