Fix VulkanImageWrappingUsageTests.ClearImageAcrossDevicesAliased

In Vulkan, importing memory by file descriptor takes ownership of
the file descriptor. It is necessary to dup it in
ClearImageAcrossDevicesAliased because the texture is imported
twice. This fixes these tests on SwiftShader.

Bug: dawn:417
Change-Id: I08b6464c4b8bd31f738037678e29fd6d066e7888
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/22020
Commit-Queue: Austin Eng <enga@chromium.org>
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
This commit is contained in:
Austin Eng
2020-05-22 00:23:39 +00:00
committed by Commit Bot service account
parent bd0ad7921d
commit 65ee6497d6
2 changed files with 16 additions and 10 deletions

View File

@@ -34,7 +34,6 @@ namespace dawn_native { namespace vulkan {
void SetUp() override {
DawnTest::SetUp();
DAWN_SKIP_TEST_IF(UsesWire());
DAWN_SKIP_TEST_IF(IsSwiftshader());
deviceVk = reinterpret_cast<dawn_native::vulkan::Device*>(device.Get());
}
@@ -202,7 +201,7 @@ namespace dawn_native { namespace vulkan {
public:
void SetUp() override {
VulkanImageWrappingTestBase::SetUp();
if (UsesWire() || IsSwiftshader()) {
if (UsesWire()) {
return;
}
@@ -220,7 +219,7 @@ namespace dawn_native { namespace vulkan {
}
void TearDown() override {
if (UsesWire() || IsSwiftshader()) {
if (UsesWire()) {
VulkanImageWrappingTestBase::TearDown();
return;
}
@@ -354,7 +353,7 @@ namespace dawn_native { namespace vulkan {
public:
void SetUp() override {
VulkanImageWrappingTestBase::SetUp();
if (UsesWire() || IsSwiftshader()) {
if (UsesWire()) {
return;
}
@@ -382,7 +381,7 @@ namespace dawn_native { namespace vulkan {
}
void TearDown() override {
if (UsesWire() || IsSwiftshader()) {
if (UsesWire()) {
VulkanImageWrappingTestBase::TearDown();
return;
}
@@ -488,13 +487,17 @@ namespace dawn_native { namespace vulkan {
// alias the same memory
TEST_P(VulkanImageWrappingUsageTests, ClearImageAcrossDevicesAliased) {
DAWN_SKIP_TEST_IF(UsesWire());
// WrapVulkanImage consumes the file descriptor so we can't import defaultFd twice.
// Duplicate the file descriptor so we can import it twice.
int defaultFdCopy = dup(defaultFd);
ASSERT(defaultFdCopy != -1);
// Import the image on |device
wgpu::Texture wrappedTextureAlias =
WrapVulkanImage(device, &defaultDescriptor, defaultFd, defaultAllocationSize,
WrapVulkanImage(device, &defaultDescriptor, defaultFdCopy, defaultAllocationSize,
defaultMemoryTypeIndex, {});
int memoryFd = GetMemoryFd(deviceVk, defaultAllocation);
// Import the image on |secondDevice|
wgpu::Texture wrappedTexture =
WrapVulkanImage(secondDevice, &defaultDescriptor, defaultFd, defaultAllocationSize,
@@ -507,7 +510,7 @@ namespace dawn_native { namespace vulkan {
wrappedTexture.Get());
// Import the image to |device|, making sure we wait on signalFd
memoryFd = GetMemoryFd(deviceVk, defaultAllocation);
int memoryFd = GetMemoryFd(deviceVk, defaultAllocation);
wgpu::Texture nextWrappedTexture =
WrapVulkanImage(device, &defaultDescriptor, memoryFd, defaultAllocationSize,
defaultMemoryTypeIndex, {signalFd});