// Copyright 2021 The Dawn & Tint Authors // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are met: // // 1. Redistributions of source code must retain the above copyright notice, this // list of conditions and the following disclaimer. // // 2. Redistributions in binary form must reproduce the above copyright notice, // this list of conditions and the following disclaimer in the documentation // and/or other materials provided with the distribution. // // 3. Neither the name of the copyright holder nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE // DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE // FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR // SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER // CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, // OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include <utility> #include "dawn/common/Math.h" #include "dawn/native/Adapter.h" #include "dawn/native/vulkan/DeviceVk.h" #include "dawn/tests/DawnTest.h" #include "dawn/tests/white_box/VulkanImageWrappingTests.h" #include "dawn/tests/white_box/VulkanImageWrappingTests_DmaBuf.h" #include "dawn/tests/white_box/VulkanImageWrappingTests_OpaqueFD.h" #include "dawn/utils/ComboRenderPipelineDescriptor.h" #include "dawn/utils/WGPUHelpers.h" #include "partition_alloc/pointers/raw_ptr.h" namespace dawn::native::vulkan { void VulkanImageWrappingTestBackend::SetParam( const VulkanImageWrappingTestBackend::TestParams& params) { … } const VulkanImageWrappingTestBackend::TestParams& VulkanImageWrappingTestBackend::GetParam() const { … } namespace { ExternalTexture; ExternalSemaphore; UseDedicatedAllocation; DetectDedicatedAllocation; constexpr int kTestTexturesCount = …; DAWN_TEST_PARAM_STRUCT(ImageWrappingParams, ExternalImageType, UseDedicatedAllocation, DetectDedicatedAllocation); class VulkanImageWrappingTestBase : public DawnTestWithParams<ImageWrappingParams> { … }; VulkanImageWrappingValidationTests; // Test no error occurs if the import is valid TEST_P(VulkanImageWrappingValidationTests, SuccessfulImport) { … } // Test no error occurs if the import is valid with DawnTextureInternalUsageDescriptor TEST_P(VulkanImageWrappingValidationTests, SuccessfulImportWithInternalUsageDescriptor) { … } // Test an error occurs if an invalid sType is the nextInChain TEST_P(VulkanImageWrappingValidationTests, InvalidTextureDescriptor) { … } // Test an error occurs if the descriptor dimension isn't 2D TEST_P(VulkanImageWrappingValidationTests, InvalidTextureDimension) { … } // Test an error occurs if the descriptor mip level count isn't 1 TEST_P(VulkanImageWrappingValidationTests, InvalidMipLevelCount) { … } // Test an error occurs if the descriptor depth isn't 1 TEST_P(VulkanImageWrappingValidationTests, InvalidDepth) { … } // Test an error occurs if the descriptor sample count isn't 1 TEST_P(VulkanImageWrappingValidationTests, InvalidSampleCount) { … } // Test an error occurs if we try to export the signal semaphore twice TEST_P(VulkanImageWrappingValidationTests, DoubleSignalSemaphoreExport) { … } // Test an error occurs if we try to export the signal semaphore from a normal texture TEST_P(VulkanImageWrappingValidationTests, NormalTextureSignalSemaphoreExport) { … } // Test an error occurs if we try to export the signal semaphore from a destroyed texture TEST_P(VulkanImageWrappingValidationTests, DestroyedTextureSignalSemaphoreExport) { … } // Fixture to test using external memory textures through different usages. // These tests are skipped if the harness is using the wire. class VulkanImageWrappingUsageTests : public VulkanImageWrappingTestBase { … }; // Clear an image in |secondDevice| // Verify clear color is visible in |device| TEST_P(VulkanImageWrappingUsageTests, ClearImageAcrossDevices) { … } // Clear two images in |secondDevice| // Verify clear color is visible in |device| // This is intended to verify that waiting on the signalFd for one external texture does not affect // those of other external textures. TEST_P(VulkanImageWrappingUsageTests, ClearTwoImagesAcrossDevices) { … } // Clear an image in |secondDevice| // Verify clear color is not visible in |device| if we import the texture as not cleared TEST_P(VulkanImageWrappingUsageTests, UninitializedTextureIsCleared) { … } // Import a texture into |secondDevice| // Clear the texture on |secondDevice| // Issue a copy of the imported texture inside |device| to |copyDstTexture| // Verify the clear color from |secondDevice| is visible in |copyDstTexture| TEST_P(VulkanImageWrappingUsageTests, CopyTextureToTextureSrcSync) { … } // Import a texture into |device| // Clear texture with color A on |device| // Import same texture into |secondDevice|, waiting on the copy signal // Clear the new texture with color B on |secondDevice| // Copy color B using Texture to Texture copy on |secondDevice| // Import texture back into |device|, waiting on color B signal // Verify texture contains color B // If texture destination isn't synchronized, |secondDevice| could copy color B // into the texture first, then |device| writes color A TEST_P(VulkanImageWrappingUsageTests, CopyTextureToTextureDstSync) { … } // Import a texture from |secondDevice| // Clear the texture on |secondDevice| // Issue a copy of the imported texture inside |device| to |copyDstBuffer| // Verify the clear color from |secondDevice| is visible in |copyDstBuffer| TEST_P(VulkanImageWrappingUsageTests, CopyTextureToBufferSrcSync) { … } // Import a texture into |device| // Clear texture with color A on |device| // Import same texture into |secondDevice|, waiting on the copy signal // Copy color B using Buffer to Texture copy on |secondDevice| // Import texture back into |device|, waiting on color B signal // Verify texture contains color B // If texture destination isn't synchronized, |secondDevice| could copy color B // into the texture first, then |device| writes color A TEST_P(VulkanImageWrappingUsageTests, CopyBufferToTextureDstSync) { … } // Import a texture from |secondDevice| // Clear the texture on |secondDevice| // Issue a copy of the imported texture inside |device| to |copyDstTexture| // Issue second copy to |secondCopyDstTexture| // Verify the clear color from |secondDevice| is visible in both copies TEST_P(VulkanImageWrappingUsageTests, DoubleTextureUsage) { … } // Tex A on device 3 (external export) // Tex B on device 2 (external export) // Tex C on device 1 (external export) // Clear color for A on device 3 // Copy A->B on device 3 // Copy B->C on device 2 (wait on B from previous op) // Copy C->D on device 1 (wait on C from previous op) // Verify D has same color as A TEST_P(VulkanImageWrappingUsageTests, ChainTextureCopy) { … } // Tests a larger image is preserved when importing TEST_P(VulkanImageWrappingUsageTests, LargerImage) { … } // Test that texture descriptor view formats are passed to the backend for wrapped external // textures, and that contents may be reinterpreted as sRGB. TEST_P(VulkanImageWrappingUsageTests, SRGBReinterpretation) { … } class VulkanImageWrappingMultithreadTests : public VulkanImageWrappingUsageTests { … }; // Test that wrapping multiple VulkanImage and clear them on multiple threads work. TEST_P(VulkanImageWrappingMultithreadTests, WrapAndClear_OnMultipleThreads) { … } DAWN_INSTANTIATE_TEST_P(…); DAWN_INSTANTIATE_TEST_P(…); DAWN_INSTANTIATE_TEST_P(…); } // anonymous namespace } // namespace dawn::native::vulkan