From db3b89367574b9f974023dc378048750fbc879d8 Mon Sep 17 00:00:00 2001 From: Jiawei Shao Date: Wed, 7 Nov 2018 09:52:33 +0000 Subject: [PATCH] Add entry points for creating a cube map/cube map array texture view This patch adds the entry points for creating cube map and cube map array texture views. This patch also adds validations that the array layer in the texture view descriptor must be 6 when the texture view dimension is cube map, and a multiple of 6 when the texture view dimension is cube map array. BUG=dawn:16 TEST=dawn_unittests Change-Id: I86a66c3753a7678351f65b43f6cd54b96d1b762c Reviewed-on: https://dawn-review.googlesource.com/c/2200 Commit-Queue: Corentin Wallez Reviewed-by: Corentin Wallez Reviewed-by: Kai Ninomiya --- dawn.json | 6 ++- src/dawn_native/Texture.cpp | 7 +++- .../validation/TextureViewValidationTests.cpp | 42 +++++++++++++++++++ 3 files changed, 52 insertions(+), 3 deletions(-) diff --git a/dawn.json b/dawn.json index 7ed7a6fd3c..583727984d 100644 --- a/dawn.json +++ b/dawn.json @@ -1111,10 +1111,12 @@ "category": "enum", "values": [ {"value": 0, "name": "2D"}, - {"value": 1, "name": "2D array"} + {"value": 1, "name": "2D array"}, + {"value": 2, "name": "cube"}, + {"value": 3, "name": "cube array"} ], "TODO": [ - "jiawei.shao@intel.com: support 1D, 3D, cube and cube array texture views" + "jiawei.shao@intel.com: support 1D and 3D texture views" ] }, "vertex format": { diff --git a/src/dawn_native/Texture.cpp b/src/dawn_native/Texture.cpp index a32893d233..ffc5da2862 100644 --- a/src/dawn_native/Texture.cpp +++ b/src/dawn_native/Texture.cpp @@ -37,8 +37,9 @@ namespace dawn_native { dawn::TextureDimension textureDimension) { switch (textureViewDimension) { case dawn::TextureViewDimension::e2D: - return textureDimension == dawn::TextureDimension::e2D; case dawn::TextureViewDimension::e2DArray: + case dawn::TextureViewDimension::Cube: + case dawn::TextureViewDimension::CubeArray: return textureDimension == dawn::TextureDimension::e2D; default: UNREACHABLE(); @@ -55,6 +56,10 @@ namespace dawn_native { return textureViewArrayLayer == 1u; case dawn::TextureViewDimension::e2DArray: return true; + case dawn::TextureViewDimension::Cube: + return textureViewArrayLayer == 6u; + case dawn::TextureViewDimension::CubeArray: + return textureViewArrayLayer % 6 == 0; default: UNREACHABLE(); return false; diff --git a/src/tests/unittests/validation/TextureViewValidationTests.cpp b/src/tests/unittests/validation/TextureViewValidationTests.cpp index 24d7a4b0b0..a81ae3e9f0 100644 --- a/src/tests/unittests/validation/TextureViewValidationTests.cpp +++ b/src/tests/unittests/validation/TextureViewValidationTests.cpp @@ -136,6 +136,48 @@ TEST_F(TextureViewValidationTest, CreateTextureViewOnTexture2DArray) { } } +// Test creating cube map texture view +TEST_F(TextureViewValidationTest, CreateCubeMapTextureView) { + constexpr uint32_t kDefaultArrayLayers = 16; + + dawn::Texture texture = Create2DArrayTexture(device, kDefaultArrayLayers); + + dawn::TextureViewDescriptor base2DArrayTextureViewDescriptor = + CreateDefaultTextureViewDescriptor(dawn::TextureViewDimension::e2DArray); + + // It is OK to create a cube map texture view with layerCount == 6. + { + dawn::TextureViewDescriptor descriptor = base2DArrayTextureViewDescriptor; + descriptor.dimension = dawn::TextureViewDimension::Cube; + descriptor.layerCount = 6; + texture.CreateTextureView(&descriptor); + } + + // It is an error to create a cube map texture view with layerCount != 6. + { + dawn::TextureViewDescriptor descriptor = base2DArrayTextureViewDescriptor; + descriptor.dimension = dawn::TextureViewDimension::Cube; + descriptor.layerCount = 3; + ASSERT_DEVICE_ERROR(texture.CreateTextureView(&descriptor)); + } + + // It is OK to create a cube map array texture view with layerCount % 6 == 0. + { + dawn::TextureViewDescriptor descriptor = base2DArrayTextureViewDescriptor; + descriptor.dimension = dawn::TextureViewDimension::CubeArray; + descriptor.layerCount = 12; + texture.CreateTextureView(&descriptor); + } + + // It is an error create a cube map array texture view with layerCount % 6 != 0. + { + dawn::TextureViewDescriptor descriptor = base2DArrayTextureViewDescriptor; + descriptor.dimension = dawn::TextureViewDimension::CubeArray; + descriptor.layerCount = 11; + ASSERT_DEVICE_ERROR(texture.CreateTextureView(&descriptor)); + } +} + // Test the format compatibility rules when creating a texture view. // TODO(jiawei.shao@intel.com): add more tests when the rules are fully implemented. TEST_F(TextureViewValidationTest, TextureViewFormatCompatibility) {