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) {