Fix VVL error when creating a bind group from a destroyed texture

Fixed: dawn:1043
Change-Id: Ibc91361a984cd5d51d192d130206c20d620dff9a
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/60641
Reviewed-by: Jiawei Shao <jiawei.shao@intel.com>
Reviewed-by: Stephen White <senorblanco@chromium.org>
Commit-Queue: Austin Eng <enga@chromium.org>
This commit is contained in:
Austin Eng 2021-08-03 21:48:59 +00:00 committed by Dawn LUCI CQ
parent 8e957160b1
commit 8ec325cfc6
2 changed files with 51 additions and 10 deletions

View File

@ -95,7 +95,17 @@ namespace dawn_native { namespace vulkan {
case BindingInfoType::Texture: {
TextureView* view = ToBackend(GetBindingAsTextureView(bindingIndex));
writeImageInfo[numWrites].imageView = view->GetHandle();
VkImageView handle = view->GetHandle();
if (handle == VK_NULL_HANDLE) {
// The Texture was destroyed before the TextureView was created.
// Skip this descriptor write since it would be
// a Vulkan Validation Layers error. This bind group won't be used as it
// is an error to submit a command buffer that references destroyed
// resources.
continue;
}
writeImageInfo[numWrites].imageView = handle;
// The layout may be GENERAL here because of interactions between the Sampled
// and ReadOnlyStorage usages. See the logic in VulkanImageLayout.
writeImageInfo[numWrites].imageLayout = VulkanImageLayout(
@ -108,7 +118,16 @@ namespace dawn_native { namespace vulkan {
case BindingInfoType::StorageTexture: {
TextureView* view = ToBackend(GetBindingAsTextureView(bindingIndex));
writeImageInfo[numWrites].imageView = view->GetHandle();
VkImageView handle = view->GetHandle();
if (handle == VK_NULL_HANDLE) {
// The Texture was destroyed before the TextureView was created.
// Skip this descriptor write since it would be
// a Vulkan Validation Layers error. This bind group won't be used as it
// is an error to submit a command buffer that references destroyed
// resources.
continue;
}
writeImageInfo[numWrites].imageView = handle;
writeImageInfo[numWrites].imageLayout = VK_IMAGE_LAYOUT_GENERAL;
write.pImageInfo = &writeImageInfo[numWrites];

View File

@ -1291,11 +1291,22 @@ TEST_P(BindGroupTests, CreateWithDestroyedResource) {
textureDesc.size = {1, 1, 1};
textureDesc.format = wgpu::TextureFormat::BGRA8Unorm;
wgpu::Texture texture = device.CreateTexture(&textureDesc);
wgpu::TextureView textureView = texture.CreateView();
// Create view, then destroy.
{
wgpu::Texture texture = device.CreateTexture(&textureDesc);
wgpu::TextureView textureView = texture.CreateView();
texture.Destroy();
wgpu::BindGroup bg = utils::MakeBindGroup(device, bgl, {{0, textureView}});
texture.Destroy();
wgpu::BindGroup bg = utils::MakeBindGroup(device, bgl, {{0, textureView}});
}
// Destroy, then create view.
{
wgpu::Texture texture = device.CreateTexture(&textureDesc);
texture.Destroy();
wgpu::TextureView textureView = texture.CreateView();
wgpu::BindGroup bg = utils::MakeBindGroup(device, bgl, {{0, textureView}});
}
}
// Test a storage texture.
@ -1313,11 +1324,22 @@ TEST_P(BindGroupTests, CreateWithDestroyedResource) {
textureDesc.size = {1, 1, 1};
textureDesc.format = wgpu::TextureFormat::R32Uint;
wgpu::Texture texture = device.CreateTexture(&textureDesc);
wgpu::TextureView textureView = texture.CreateView();
// Create view, then destroy.
{
wgpu::Texture texture = device.CreateTexture(&textureDesc);
wgpu::TextureView textureView = texture.CreateView();
texture.Destroy();
wgpu::BindGroup bg = utils::MakeBindGroup(device, bgl, {{0, textureView}});
texture.Destroy();
wgpu::BindGroup bg = utils::MakeBindGroup(device, bgl, {{0, textureView}});
}
// Destroy, then create view.
{
wgpu::Texture texture = device.CreateTexture(&textureDesc);
texture.Destroy();
wgpu::TextureView textureView = texture.CreateView();
wgpu::BindGroup bg = utils::MakeBindGroup(device, bgl, {{0, textureView}});
}
}
}