Revert "Destroy backend implementation for Buffers"
This reverts commit b6a80b321e8fa0b79d9a947656ea0ad649ed5a3c.
Reason for revert: dawn_end2end_tests are failing on the Chromium GPU FYI bots. Example here: https://ci.chromium.org/p/chromium/builders/ci/Win10%20FYI%20Release%20%28NVIDIA%29/4226
Original change's description:
> Destroy backend implementation for Buffers
>
> Destroy can be used to free the GPU memory associated with resources
> without waiting for javascript garbage collection to occur.
> The buffer is validated at submission to the queue.
> So any buffer that has been destroyed before submission, will then
> invalidate the submit and result in an error.
>
> Bug: dawn:46
> Change-Id: I40df56ce97baef01deea7552d7a6d40b558fc985
> Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/5320
> Reviewed-by: Kai Ninomiya <kainino@chromium.org>
> Commit-Queue: Natasha Lee <natlee@microsoft.com>
TBR=cwallez@chromium.org,kainino@chromium.org,enga@chromium.org,rafael.cintron@microsoft.com,natlee@microsoft.com
# Not skipping CQ checks because original CL landed > 1 day ago.
Bug: dawn:46
Change-Id: Iadf37a8a6675c744207ec7daaa3fd2fde7da3714
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/5480
Reviewed-by: Austin Eng <enga@chromium.org>
Commit-Queue: Austin Eng <enga@chromium.org>
diff --git a/BUILD.gn b/BUILD.gn
index ac84461..024119e 100644
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -645,7 +645,6 @@
"src/tests/end2end/CopyTests.cpp",
"src/tests/end2end/DebugMarkerTests.cpp",
"src/tests/end2end/DepthStencilStateTests.cpp",
- "src/tests/end2end/DestroyBufferTests.cpp",
"src/tests/end2end/DrawIndexedTests.cpp",
"src/tests/end2end/DrawTests.cpp",
"src/tests/end2end/FenceTests.cpp",
diff --git a/src/dawn_native/Buffer.cpp b/src/dawn_native/Buffer.cpp
index 4a68302..d619fa4 100644
--- a/src/dawn_native/Buffer.cpp
+++ b/src/dawn_native/Buffer.cpp
@@ -47,9 +47,6 @@
void UnmapImpl() override {
UNREACHABLE();
}
- void DestroyImpl() override {
- UNREACHABLE();
- }
};
} // anonymous namespace
@@ -235,7 +232,6 @@
if (mState == BufferState::Mapped) {
Unmap();
}
- DestroyImpl();
mState = BufferState::Destroyed;
}
diff --git a/src/dawn_native/Buffer.h b/src/dawn_native/Buffer.h
index 28653dc..22bd170 100644
--- a/src/dawn_native/Buffer.h
+++ b/src/dawn_native/Buffer.h
@@ -76,7 +76,6 @@
virtual void MapReadAsyncImpl(uint32_t serial) = 0;
virtual void MapWriteAsyncImpl(uint32_t serial) = 0;
virtual void UnmapImpl() = 0;
- virtual void DestroyImpl() = 0;
MaybeError ValidateSetSubData(uint32_t start, uint32_t count) const;
MaybeError ValidateMap(dawn::BufferUsageBit requiredUsage) const;
diff --git a/src/dawn_native/d3d12/BufferD3D12.cpp b/src/dawn_native/d3d12/BufferD3D12.cpp
index 307118d..c24ce83 100644
--- a/src/dawn_native/d3d12/BufferD3D12.cpp
+++ b/src/dawn_native/d3d12/BufferD3D12.cpp
@@ -105,7 +105,7 @@
}
Buffer::~Buffer() {
- DestroyImpl();
+ ToBackend(GetDevice())->GetResourceAllocator()->Release(mResource);
}
uint32_t Buffer::GetD3D12Size() const {
@@ -189,11 +189,6 @@
mWrittenMappedRange = {};
}
- void Buffer::DestroyImpl() {
- ToBackend(GetDevice())->GetResourceAllocator()->Release(mResource);
- mResource = nullptr;
- }
-
MapRequestTracker::MapRequestTracker(Device* device) : mDevice(device) {
}
diff --git a/src/dawn_native/d3d12/BufferD3D12.h b/src/dawn_native/d3d12/BufferD3D12.h
index 9667085..9398fb5 100644
--- a/src/dawn_native/d3d12/BufferD3D12.h
+++ b/src/dawn_native/d3d12/BufferD3D12.h
@@ -42,7 +42,6 @@
void MapReadAsyncImpl(uint32_t serial) override;
void MapWriteAsyncImpl(uint32_t serial) override;
void UnmapImpl() override;
- void DestroyImpl() override;
ComPtr<ID3D12Resource> mResource;
bool mFixedResourceState = false;
diff --git a/src/dawn_native/metal/BufferMTL.h b/src/dawn_native/metal/BufferMTL.h
index 4cdbb5a..1d9a011 100644
--- a/src/dawn_native/metal/BufferMTL.h
+++ b/src/dawn_native/metal/BufferMTL.h
@@ -37,7 +37,6 @@
void MapReadAsyncImpl(uint32_t serial) override;
void MapWriteAsyncImpl(uint32_t serial) override;
void UnmapImpl() override;
- void DestroyImpl() override;
id<MTLBuffer> mMtlBuffer = nil;
};
diff --git a/src/dawn_native/metal/BufferMTL.mm b/src/dawn_native/metal/BufferMTL.mm
index 3e91b43..6d0aa9c 100644
--- a/src/dawn_native/metal/BufferMTL.mm
+++ b/src/dawn_native/metal/BufferMTL.mm
@@ -31,7 +31,8 @@
}
Buffer::~Buffer() {
- DestroyImpl();
+ [mMtlBuffer release];
+ mMtlBuffer = nil;
}
id<MTLBuffer> Buffer::GetMTLBuffer() {
@@ -61,11 +62,6 @@
// Nothing to do, Metal StorageModeShared buffers are always mapped.
}
- void Buffer::DestroyImpl() {
- [mMtlBuffer release];
- mMtlBuffer = nil;
- }
-
MapRequestTracker::MapRequestTracker(Device* device) : mDevice(device) {
}
diff --git a/src/dawn_native/null/DeviceNull.cpp b/src/dawn_native/null/DeviceNull.cpp
index 9cf3824..f2832d0 100644
--- a/src/dawn_native/null/DeviceNull.cpp
+++ b/src/dawn_native/null/DeviceNull.cpp
@@ -226,9 +226,6 @@
void Buffer::UnmapImpl() {
}
- void Buffer::DestroyImpl() {
- }
-
// CommandBuffer
CommandBuffer::CommandBuffer(Device* device, CommandEncoderBase* encoder)
diff --git a/src/dawn_native/null/DeviceNull.h b/src/dawn_native/null/DeviceNull.h
index e38f88e..0b5d40f 100644
--- a/src/dawn_native/null/DeviceNull.h
+++ b/src/dawn_native/null/DeviceNull.h
@@ -146,7 +146,6 @@
void MapReadAsyncImpl(uint32_t serial) override;
void MapWriteAsyncImpl(uint32_t serial) override;
void UnmapImpl() override;
- void DestroyImpl() override;
void MapAsyncImplCommon(uint32_t serial, bool isWrite);
diff --git a/src/dawn_native/opengl/BufferGL.cpp b/src/dawn_native/opengl/BufferGL.cpp
index 50e2d0b..348126e 100644
--- a/src/dawn_native/opengl/BufferGL.cpp
+++ b/src/dawn_native/opengl/BufferGL.cpp
@@ -27,10 +27,6 @@
glBufferData(GL_ARRAY_BUFFER, GetSize(), nullptr, GL_STATIC_DRAW);
}
- Buffer::~Buffer() {
- DestroyImpl();
- }
-
GLuint Buffer::GetHandle() const {
return mBuffer;
}
@@ -62,9 +58,4 @@
glUnmapBuffer(GL_ARRAY_BUFFER);
}
- void Buffer::DestroyImpl() {
- glDeleteBuffers(1, &mBuffer);
- mBuffer = 0;
- }
-
}} // namespace dawn_native::opengl
diff --git a/src/dawn_native/opengl/BufferGL.h b/src/dawn_native/opengl/BufferGL.h
index 5a2b4a5..ba84267 100644
--- a/src/dawn_native/opengl/BufferGL.h
+++ b/src/dawn_native/opengl/BufferGL.h
@@ -26,7 +26,6 @@
class Buffer : public BufferBase {
public:
Buffer(Device* device, const BufferDescriptor* descriptor);
- ~Buffer();
GLuint GetHandle() const;
@@ -35,7 +34,6 @@
void MapReadAsyncImpl(uint32_t serial) override;
void MapWriteAsyncImpl(uint32_t serial) override;
void UnmapImpl() override;
- void DestroyImpl() override;
GLuint mBuffer = 0;
};
diff --git a/src/dawn_native/vulkan/BufferVk.cpp b/src/dawn_native/vulkan/BufferVk.cpp
index e38a716..3b7ef78 100644
--- a/src/dawn_native/vulkan/BufferVk.cpp
+++ b/src/dawn_native/vulkan/BufferVk.cpp
@@ -137,7 +137,14 @@
}
Buffer::~Buffer() {
- DestroyImpl();
+ Device* device = ToBackend(GetDevice());
+
+ device->GetMemoryAllocator()->Free(&mMemoryAllocation);
+
+ if (mHandle != VK_NULL_HANDLE) {
+ device->GetFencedDeleter()->DeleteWhenUnused(mHandle);
+ mHandle = VK_NULL_HANDLE;
+ }
}
void Buffer::OnMapReadCommandSerialFinished(uint32_t mapSerial, const void* data) {
@@ -218,15 +225,6 @@
// No need to do anything, we keep CPU-visible memory mapped at all time.
}
- void Buffer::DestroyImpl() {
- ToBackend(GetDevice())->GetMemoryAllocator()->Free(&mMemoryAllocation);
-
- if (mHandle != VK_NULL_HANDLE) {
- ToBackend(GetDevice())->GetFencedDeleter()->DeleteWhenUnused(mHandle);
- mHandle = VK_NULL_HANDLE;
- }
- }
-
// MapRequestTracker
MapRequestTracker::MapRequestTracker(Device* device) : mDevice(device) {
diff --git a/src/dawn_native/vulkan/BufferVk.h b/src/dawn_native/vulkan/BufferVk.h
index 348f9be..ee703b4 100644
--- a/src/dawn_native/vulkan/BufferVk.h
+++ b/src/dawn_native/vulkan/BufferVk.h
@@ -44,7 +44,6 @@
void MapReadAsyncImpl(uint32_t serial) override;
void MapWriteAsyncImpl(uint32_t serial) override;
void UnmapImpl() override;
- void DestroyImpl() override;
VkBuffer mHandle = VK_NULL_HANDLE;
DeviceMemoryAllocation mMemoryAllocation;
diff --git a/src/tests/end2end/DestroyBufferTests.cpp b/src/tests/end2end/DestroyBufferTests.cpp
deleted file mode 100644
index 37722fd..0000000
--- a/src/tests/end2end/DestroyBufferTests.cpp
+++ /dev/null
@@ -1,133 +0,0 @@
-// Copyright 2019 The Dawn Authors
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#include "tests/DawnTest.h"
-
-#include "utils/ComboRenderPipelineDescriptor.h"
-#include "utils/DawnHelpers.h"
-
-constexpr uint32_t kRTSize = 4;
-
-class DestroyBufferTest : public DawnTest {
- protected:
- void SetUp() override {
- DawnTest::SetUp();
-
- renderPass = utils::CreateBasicRenderPass(device, kRTSize, kRTSize);
- dawn::VertexInputDescriptor input;
- input.inputSlot = 0;
- input.stride = 4 * sizeof(float);
- input.stepMode = dawn::InputStepMode::Vertex;
-
- dawn::VertexAttributeDescriptor attribute;
- attribute.shaderLocation = 0;
- attribute.inputSlot = 0;
- attribute.offset = 0;
- attribute.format = dawn::VertexFormat::FloatR32G32B32A32;
-
- dawn::InputState inputState =
- device.CreateInputStateBuilder().SetInput(&input).SetAttribute(&attribute).GetResult();
-
- dawn::ShaderModule vsModule =
- utils::CreateShaderModule(device, dawn::ShaderStage::Vertex, R"(
- #version 450
- layout(location = 0) in vec4 pos;
- void main() {
- gl_Position = pos;
- })");
-
- dawn::ShaderModule fsModule =
- utils::CreateShaderModule(device, dawn::ShaderStage::Fragment, R"(
- #version 450
- layout(location = 0) out vec4 fragColor;
- void main() {
- fragColor = vec4(0.0, 1.0, 0.0, 1.0);
- })");
-
- utils::ComboRenderPipelineDescriptor descriptor(device);
- descriptor.cVertexStage.module = vsModule;
- descriptor.cFragmentStage.module = fsModule;
- descriptor.primitiveTopology = dawn::PrimitiveTopology::TriangleStrip;
- descriptor.indexFormat = dawn::IndexFormat::Uint32;
- descriptor.inputState = inputState;
- descriptor.cColorStates[0]->format = renderPass.colorFormat;
-
- pipeline = device.CreateRenderPipeline(&descriptor);
-
- vertexBuffer = utils::CreateBufferFromData<float>(
- device, dawn::BufferUsageBit::Vertex,
- {// The bottom left triangle
- -1.0f, -1.0f, 0.0f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f, -1.0f, 1.0f, 0.0f, 1.0f});
- }
-
- utils::BasicRenderPass renderPass;
- dawn::RenderPipeline pipeline;
- dawn::Buffer vertexBuffer;
-
- dawn::CommandBuffer CreateTriangleCommandBuffer() {
- uint32_t zeroOffset = 0;
- dawn::CommandEncoder encoder = device.CreateCommandEncoder();
- {
- dawn::RenderPassEncoder pass = encoder.BeginRenderPass(&renderPass.renderPassInfo);
- pass.SetPipeline(pipeline);
- pass.SetVertexBuffers(0, 1, &vertexBuffer, &zeroOffset);
- pass.Draw(3, 1, 0, 0);
- pass.EndPass();
- }
- dawn::CommandBuffer commands = encoder.Finish();
- return commands;
- }
-};
-
-// Destroy before submit will result in error, and nothing drawn
-TEST_P(DestroyBufferTest, DestroyBeforeSubmit) {
- RGBA8 notFilled(0, 0, 0, 0);
-
- dawn::CommandBuffer commands = CreateTriangleCommandBuffer();
- vertexBuffer.Destroy();
- ASSERT_DEVICE_ERROR(queue.Submit(1, &commands));
-
- EXPECT_PIXEL_RGBA8_EQ(notFilled, renderPass.color, 1, 3);
-}
-
-// Destroy after submit will draw successfully
-TEST_P(DestroyBufferTest, DestroyAfterSubmit) {
- RGBA8 filled(0, 255, 0, 255);
-
- dawn::CommandBuffer commands = CreateTriangleCommandBuffer();
- queue.Submit(1, &commands);
-
- EXPECT_PIXEL_RGBA8_EQ(filled, renderPass.color, 1, 3);
- vertexBuffer.Destroy();
-}
-
-// First submit succeeds, draws triangle, second submit fails
-// after destroy is called on the buffer, pixel does not change
-TEST_P(DestroyBufferTest, SubmitDestroySubmit) {
- RGBA8 filled(0, 255, 0, 255);
-
- dawn::CommandBuffer commands = CreateTriangleCommandBuffer();
- queue.Submit(1, &commands);
- EXPECT_PIXEL_RGBA8_EQ(filled, renderPass.color, 1, 3);
-
- vertexBuffer.Destroy();
-
- // Submit fails because vertex buffer was destroyed
- ASSERT_DEVICE_ERROR(queue.Submit(1, &commands));
-
- // Pixel stays the same
- EXPECT_PIXEL_RGBA8_EQ(filled, renderPass.color, 1, 3);
-}
-
-DAWN_INSTANTIATE_TEST(DestroyBufferTest, D3D12Backend, MetalBackend, OpenGLBackend, VulkanBackend);
\ No newline at end of file