Fix a bug for multisample texture validation
If a texture format supports multisample, it should be renderable. This change adds this validation rule to fix a bug. It also adds a validation test in dawn_unittests. BUG: dawn:731 Change-Id: I33a06cb16367e4e379b29b223ef6b69128baf30f Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/46840 Reviewed-by: Corentin Wallez <cwallez@chromium.org> Reviewed-by: Austin Eng <enga@chromium.org> Commit-Queue: Yunchao He <yunchao.he@intel.com>
This commit is contained in:
parent
ff55b2f217
commit
44771b3567
|
@ -122,10 +122,14 @@ namespace dawn_native {
|
||||||
return DAWN_VALIDATION_ERROR("Multisampled texture must be 2D with depth=1");
|
return DAWN_VALIDATION_ERROR("Multisampled texture must be 2D with depth=1");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (format->isCompressed) {
|
// If a format can support multisample, it must be renderable. Because Vulkan
|
||||||
return DAWN_VALIDATION_ERROR(
|
// requires that if the format is not color-renderable or depth/stencil renderable,
|
||||||
"The sample counts of the textures in BC formats must be 1.");
|
// sampleCount must be 1.
|
||||||
|
if (!format->isRenderable) {
|
||||||
|
return DAWN_VALIDATION_ERROR("This format cannot support multisample.");
|
||||||
}
|
}
|
||||||
|
// Compressed formats are not renderable. They cannot support multisample.
|
||||||
|
ASSERT(!format->isCompressed);
|
||||||
|
|
||||||
if (descriptor->usage & wgpu::TextureUsage::Storage) {
|
if (descriptor->usage & wgpu::TextureUsage::Storage) {
|
||||||
return DAWN_VALIDATION_ERROR(
|
return DAWN_VALIDATION_ERROR(
|
||||||
|
|
|
@ -21,6 +21,12 @@
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
|
constexpr wgpu::TextureFormat kNonRenderableColorFormats[] = {
|
||||||
|
wgpu::TextureFormat::RG11B10Ufloat, wgpu::TextureFormat::RGB9E5Ufloat,
|
||||||
|
wgpu::TextureFormat::R8Snorm, wgpu::TextureFormat::RG8Snorm,
|
||||||
|
wgpu::TextureFormat::RGBA8Snorm,
|
||||||
|
};
|
||||||
|
|
||||||
class TextureValidationTest : public ValidationTest {
|
class TextureValidationTest : public ValidationTest {
|
||||||
protected:
|
protected:
|
||||||
void SetUp() override {
|
void SetUp() override {
|
||||||
|
@ -105,6 +111,19 @@ namespace {
|
||||||
ASSERT_DEVICE_ERROR(device.CreateTexture(&descriptor));
|
ASSERT_DEVICE_ERROR(device.CreateTexture(&descriptor));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// It is an error to create a multisample texture when the format cannot support
|
||||||
|
// multisample.
|
||||||
|
{
|
||||||
|
wgpu::TextureDescriptor descriptor = defaultDescriptor;
|
||||||
|
descriptor.sampleCount = 4;
|
||||||
|
|
||||||
|
for (wgpu::TextureFormat format : kNonRenderableColorFormats) {
|
||||||
|
// If a format can support multisample, it must be renderable.
|
||||||
|
descriptor.format = format;
|
||||||
|
ASSERT_DEVICE_ERROR(device.CreateTexture(&descriptor));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Currently we do not support multisampled 2D textures with depth>1.
|
// Currently we do not support multisampled 2D textures with depth>1.
|
||||||
{
|
{
|
||||||
wgpu::TextureDescriptor descriptor = defaultDescriptor;
|
wgpu::TextureDescriptor descriptor = defaultDescriptor;
|
||||||
|
@ -453,14 +472,7 @@ namespace {
|
||||||
descriptor.format = wgpu::TextureFormat::RGBA8Unorm;
|
descriptor.format = wgpu::TextureFormat::RGBA8Unorm;
|
||||||
device.CreateTexture(&descriptor);
|
device.CreateTexture(&descriptor);
|
||||||
|
|
||||||
wgpu::TextureFormat nonRenderableFormats[] = {
|
for (wgpu::TextureFormat format : kNonRenderableColorFormats) {
|
||||||
wgpu::TextureFormat::RG11B10Ufloat,
|
|
||||||
wgpu::TextureFormat::R8Snorm,
|
|
||||||
wgpu::TextureFormat::RG8Snorm,
|
|
||||||
wgpu::TextureFormat::RGBA8Snorm,
|
|
||||||
};
|
|
||||||
|
|
||||||
for (wgpu::TextureFormat format : nonRenderableFormats) {
|
|
||||||
// Fails because `format` is non-renderable
|
// Fails because `format` is non-renderable
|
||||||
descriptor.format = format;
|
descriptor.format = format;
|
||||||
ASSERT_DEVICE_ERROR(device.CreateTexture(&descriptor));
|
ASSERT_DEVICE_ERROR(device.CreateTexture(&descriptor));
|
||||||
|
|
Loading…
Reference in New Issue