From cca9c698a07aaf0f7982caff1b0aa81fdf4e0987 Mon Sep 17 00:00:00 2001 From: Corentin Wallez Date: Thu, 6 Sep 2018 15:26:48 +0200 Subject: [PATCH] Use unique_ptr where applicable. Change-Id: Icb29f6f9760f0ea36528e8ea6890713c2fb3b965 --- src/dawn_native/Device.cpp | 3 +- src/dawn_native/Device.h | 4 +- src/dawn_native/d3d12/DeviceD3D12.cpp | 41 +++++---------- src/dawn_native/d3d12/DeviceD3D12.h | 19 ++++--- src/dawn_native/metal/DeviceMTL.h | 6 ++- src/dawn_native/metal/DeviceMTL.mm | 7 +-- src/dawn_native/vulkan/DeviceVk.cpp | 29 ++++------- src/dawn_native/vulkan/DeviceVk.h | 11 ++-- src/tests/DawnTest.cpp | 38 +++++--------- src/tests/DawnTest.h | 13 ++--- src/tests/end2end/BufferTests.cpp | 1 - src/tests/unittests/WireTests.cpp | 52 +++++++++---------- .../validation/BufferValidationTests.cpp | 15 +++--- 13 files changed, 108 insertions(+), 131 deletions(-) diff --git a/src/dawn_native/Device.cpp b/src/dawn_native/Device.cpp index 57f22dc1b6..156edb5888 100644 --- a/src/dawn_native/Device.cpp +++ b/src/dawn_native/Device.cpp @@ -50,11 +50,10 @@ namespace dawn_native { // DeviceBase DeviceBase::DeviceBase() { - mCaches = new DeviceBase::Caches(); + mCaches = std::make_unique(); } DeviceBase::~DeviceBase() { - delete mCaches; } void DeviceBase::HandleError(const char* message) { diff --git a/src/dawn_native/Device.h b/src/dawn_native/Device.h index 723455d40a..beb293e2e0 100644 --- a/src/dawn_native/Device.h +++ b/src/dawn_native/Device.h @@ -21,6 +21,8 @@ #include "dawn_native/dawn_platform.h" +#include + namespace dawn_native { using ErrorCallback = void (*)(const char* errorMessage, void* userData); @@ -137,7 +139,7 @@ namespace dawn_native { // The object caches aren't exposed in the header as they would require a lot of // additional includes. struct Caches; - Caches* mCaches = nullptr; + std::unique_ptr mCaches; dawn::DeviceErrorCallback mErrorCallback = nullptr; dawn::CallbackUserdata mErrorUserdata = 0; diff --git a/src/dawn_native/d3d12/DeviceD3D12.cpp b/src/dawn_native/d3d12/DeviceD3D12.cpp index 0dc3c88e4c..538bcad656 100644 --- a/src/dawn_native/d3d12/DeviceD3D12.cpp +++ b/src/dawn_native/d3d12/DeviceD3D12.cpp @@ -116,7 +116,7 @@ namespace dawn_native { namespace d3d12 { } // anonymous namespace Device::Device() { - mFunctions = new PlatformFunctions(); + mFunctions = std::make_unique(); { MaybeError status = mFunctions->LoadFunctions(); @@ -124,10 +124,10 @@ namespace dawn_native { namespace d3d12 { } // Create the connection to DXGI and the D3D12 device - mFactory = CreateFactory(mFunctions); + mFactory = CreateFactory(mFunctions.get()); ASSERT(mFactory.Get() != nullptr); - mHardwareAdapter = GetHardwareAdapter(mFactory, mFunctions); + mHardwareAdapter = GetHardwareAdapter(mFactory, mFunctions.get()); ASSERT(mHardwareAdapter.Get() != nullptr); ASSERT_SUCCESS(mFunctions->d3d12CreateDevice(mHardwareAdapter.Get(), D3D_FEATURE_LEVEL_11_0, @@ -145,11 +145,11 @@ namespace dawn_native { namespace d3d12 { ASSERT(mFenceEvent != nullptr); // Initialize backend services - mCommandAllocatorManager = new CommandAllocatorManager(this); - mDescriptorHeapAllocator = new DescriptorHeapAllocator(this); - mMapRequestTracker = new MapRequestTracker(this); - mResourceAllocator = new ResourceAllocator(this); - mResourceUploader = new ResourceUploader(this); + mCommandAllocatorManager = std::make_unique(this); + mDescriptorHeapAllocator = std::make_unique(this); + mMapRequestTracker = std::make_unique(this); + mResourceAllocator = std::make_unique(this); + mResourceUploader = std::make_unique(this); NextSerial(); } @@ -159,22 +159,9 @@ namespace dawn_native { namespace d3d12 { NextSerial(); WaitForSerial(currentSerial); // Wait for all in-flight commands to finish executing TickImpl(); // Call tick one last time so resources are cleaned up + ASSERT(mUsedComObjectRefs.Empty()); ASSERT(mPendingCommands.commandList == nullptr); - - // Free all D3D12 and DXGI objects before unloading the DLLs - mFence = nullptr; - mFactory = nullptr; - mHardwareAdapter = nullptr; - mD3d12Device = nullptr; - mCommandQueue = nullptr; - - delete mCommandAllocatorManager; - delete mDescriptorHeapAllocator; - delete mMapRequestTracker; - delete mResourceAllocator; - delete mResourceUploader; - delete mFunctions; } ComPtr Device::GetFactory() { @@ -190,23 +177,23 @@ namespace dawn_native { namespace d3d12 { } DescriptorHeapAllocator* Device::GetDescriptorHeapAllocator() { - return mDescriptorHeapAllocator; + return mDescriptorHeapAllocator.get(); } const PlatformFunctions* Device::GetFunctions() { - return mFunctions; + return mFunctions.get(); } MapRequestTracker* Device::GetMapRequestTracker() const { - return mMapRequestTracker; + return mMapRequestTracker.get(); } ResourceAllocator* Device::GetResourceAllocator() { - return mResourceAllocator; + return mResourceAllocator.get(); } ResourceUploader* Device::GetResourceUploader() { - return mResourceUploader; + return mResourceUploader.get(); } void Device::OpenCommandList(ComPtr* commandList) { diff --git a/src/dawn_native/d3d12/DeviceD3D12.h b/src/dawn_native/d3d12/DeviceD3D12.h index 97b2289ba0..fed11f5424 100644 --- a/src/dawn_native/d3d12/DeviceD3D12.h +++ b/src/dawn_native/d3d12/DeviceD3D12.h @@ -22,6 +22,8 @@ #include "dawn_native/d3d12/Forward.h" #include "dawn_native/d3d12/d3d12_platform.h" +#include + namespace dawn_native { namespace d3d12 { class CommandAllocatorManager; @@ -88,6 +90,10 @@ namespace dawn_native { namespace d3d12 { const ShaderModuleDescriptor* descriptor) override; ResultOrError CreateTextureImpl(const TextureDescriptor* descriptor) override; + // Keep mFunctions as the first member so that in the destructor it is freed. Otherwise the + // D3D12 DLLs are unloaded before we are done using it. + std::unique_ptr mFunctions; + uint64_t mSerial = 0; ComPtr mFence; HANDLE mFenceEvent; @@ -97,19 +103,18 @@ namespace dawn_native { namespace d3d12 { ComPtr mD3d12Device; ComPtr mCommandQueue; - CommandAllocatorManager* mCommandAllocatorManager = nullptr; - DescriptorHeapAllocator* mDescriptorHeapAllocator = nullptr; - MapRequestTracker* mMapRequestTracker = nullptr; - PlatformFunctions* mFunctions = nullptr; - ResourceAllocator* mResourceAllocator = nullptr; - ResourceUploader* mResourceUploader = nullptr; - struct PendingCommandList { ComPtr commandList; bool open = false; } mPendingCommands; SerialQueue> mUsedComObjectRefs; + + std::unique_ptr mCommandAllocatorManager; + std::unique_ptr mDescriptorHeapAllocator; + std::unique_ptr mMapRequestTracker; + std::unique_ptr mResourceAllocator; + std::unique_ptr mResourceUploader; }; }} // namespace dawn_native::d3d12 diff --git a/src/dawn_native/metal/DeviceMTL.h b/src/dawn_native/metal/DeviceMTL.h index 5f93d155b3..045c285b01 100644 --- a/src/dawn_native/metal/DeviceMTL.h +++ b/src/dawn_native/metal/DeviceMTL.h @@ -23,6 +23,8 @@ #import #import + +#include #include namespace dawn_native { namespace metal { @@ -76,8 +78,8 @@ namespace dawn_native { namespace metal { id mMtlDevice = nil; id mCommandQueue = nil; - MapRequestTracker* mMapTracker; - ResourceUploader* mResourceUploader; + std::unique_ptr mMapTracker; + std::unique_ptr mResourceUploader; Serial mFinishedCommandSerial = 0; Serial mPendingCommandSerial = 1; diff --git a/src/dawn_native/metal/DeviceMTL.mm b/src/dawn_native/metal/DeviceMTL.mm index 79a326dedd..b285ee3bfe 100644 --- a/src/dawn_native/metal/DeviceMTL.mm +++ b/src/dawn_native/metal/DeviceMTL.mm @@ -65,10 +65,7 @@ namespace dawn_native { namespace metal { [mPendingCommands release]; mPendingCommands = nil; - delete mMapTracker; mMapTracker = nullptr; - - delete mResourceUploader; mResourceUploader = nullptr; [mMtlDevice release]; @@ -189,11 +186,11 @@ namespace dawn_native { namespace metal { } MapRequestTracker* Device::GetMapTracker() const { - return mMapTracker; + return mMapTracker.get(); } ResourceUploader* Device::GetResourceUploader() const { - return mResourceUploader; + return mResourceUploader.get(); } }} // namespace dawn_native::metal diff --git a/src/dawn_native/vulkan/DeviceVk.cpp b/src/dawn_native/vulkan/DeviceVk.cpp index 007dead0eb..6dc6c781c9 100644 --- a/src/dawn_native/vulkan/DeviceVk.cpp +++ b/src/dawn_native/vulkan/DeviceVk.cpp @@ -146,11 +146,11 @@ namespace dawn_native { namespace vulkan { GatherQueueFromDevice(); - mBufferUploader = new BufferUploader(this); - mDeleter = new FencedDeleter(this); - mMapRequestTracker = new MapRequestTracker(this); - mMemoryAllocator = new MemoryAllocator(this); - mRenderPassCache = new RenderPassCache(this); + mBufferUploader = std::make_unique(this); + mDeleter = std::make_unique(this); + mMapRequestTracker = std::make_unique(this); + mMemoryAllocator = std::make_unique(this); + mRenderPassCache = std::make_unique(this); } Device::~Device() { @@ -182,21 +182,14 @@ namespace dawn_native { namespace vulkan { } mUnusedFences.clear(); - delete mBufferUploader; + // Free services explicitly so that they can free Vulkan objects before vkDestroyDevice mBufferUploader = nullptr; - - delete mDeleter; mDeleter = nullptr; - - delete mMapRequestTracker; mMapRequestTracker = nullptr; - - delete mMemoryAllocator; mMemoryAllocator = nullptr; // The VkRenderPasses in the cache can be destroyed immediately since all commands referring // to them are guaranteed to be finished executing. - delete mRenderPassCache; mRenderPassCache = nullptr; // VkQueues are destroyed when the VkDevice is destroyed @@ -322,23 +315,23 @@ namespace dawn_native { namespace vulkan { } MapRequestTracker* Device::GetMapRequestTracker() const { - return mMapRequestTracker; + return mMapRequestTracker.get(); } MemoryAllocator* Device::GetMemoryAllocator() const { - return mMemoryAllocator; + return mMemoryAllocator.get(); } BufferUploader* Device::GetBufferUploader() const { - return mBufferUploader; + return mBufferUploader.get(); } FencedDeleter* Device::GetFencedDeleter() const { - return mDeleter; + return mDeleter.get(); } RenderPassCache* Device::GetRenderPassCache() const { - return mRenderPassCache; + return mRenderPassCache.get(); } Serial Device::GetSerial() const { diff --git a/src/dawn_native/vulkan/DeviceVk.h b/src/dawn_native/vulkan/DeviceVk.h index 5e5ad2e171..0ff8441579 100644 --- a/src/dawn_native/vulkan/DeviceVk.h +++ b/src/dawn_native/vulkan/DeviceVk.h @@ -25,6 +25,7 @@ #include "dawn_native/vulkan/VulkanFunctions.h" #include "dawn_native/vulkan/VulkanInfo.h" +#include #include namespace dawn_native { namespace vulkan { @@ -123,11 +124,11 @@ namespace dawn_native { namespace vulkan { VkQueue mQueue = VK_NULL_HANDLE; VkDebugReportCallbackEXT mDebugReportCallback = VK_NULL_HANDLE; - BufferUploader* mBufferUploader = nullptr; - FencedDeleter* mDeleter = nullptr; - MapRequestTracker* mMapRequestTracker = nullptr; - MemoryAllocator* mMemoryAllocator = nullptr; - RenderPassCache* mRenderPassCache = nullptr; + std::unique_ptr mBufferUploader; + std::unique_ptr mDeleter; + std::unique_ptr mMapRequestTracker; + std::unique_ptr mMemoryAllocator; + std::unique_ptr mRenderPassCache; VkFence GetUnusedFence(); void CheckPassedFences(); diff --git a/src/tests/DawnTest.cpp b/src/tests/DawnTest.cpp index 327d4a9ea3..68611af262 100644 --- a/src/tests/DawnTest.cpp +++ b/src/tests/DawnTest.cpp @@ -97,6 +97,8 @@ namespace { }; } // namespace +DawnTest::DawnTest() = default; + DawnTest::~DawnTest() { // We need to destroy child objects before the Device mReadbackSlots.clear(); @@ -104,9 +106,6 @@ DawnTest::~DawnTest() { swapchain = dawn::SwapChain(); device = dawn::Device(); - delete mBinding; - mBinding = nullptr; - dawnSetProcs(nullptr); } @@ -129,10 +128,10 @@ bool DawnTest::IsVulkan() const { bool gTestUsesWire = false; void DawnTest::SetUp() { - mBinding = utils::CreateBinding(ParamToBackendType(GetParam())); + mBinding.reset(utils::CreateBinding(ParamToBackendType(GetParam()))); DAWN_ASSERT(mBinding != nullptr); - GLFWwindow* testWindow = GetWindowForBackend(mBinding, GetParam()); + GLFWwindow* testWindow = GetWindowForBackend(mBinding.get(), GetParam()); DAWN_ASSERT(testWindow != nullptr); mBinding->SetWindow(testWindow); @@ -145,16 +144,17 @@ void DawnTest::SetUp() { dawnProcTable procs; if (gTestUsesWire) { - mC2sBuf = new utils::TerribleCommandBuffer(); - mS2cBuf = new utils::TerribleCommandBuffer(); + mC2sBuf = std::make_unique(); + mS2cBuf = std::make_unique(); - mWireServer = dawn_wire::NewServerCommandHandler(backendDevice, backendProcs, mS2cBuf); - mC2sBuf->SetHandler(mWireServer); + mWireServer.reset( + dawn_wire::NewServerCommandHandler(backendDevice, backendProcs, mS2cBuf.get())); + mC2sBuf->SetHandler(mWireServer.get()); dawnDevice clientDevice; dawnProcTable clientProcs; - mWireClient = dawn_wire::NewClientDevice(&clientProcs, &clientDevice, mC2sBuf); - mS2cBuf->SetHandler(mWireClient); + mWireClient.reset(dawn_wire::NewClientDevice(&clientProcs, &clientDevice, mC2sBuf.get())); + mS2cBuf->SetHandler(mWireClient.get()); procs = clientProcs; cDevice = clientDevice; @@ -191,18 +191,6 @@ void DawnTest::TearDown() { for (size_t i = 0; i < mReadbackSlots.size(); ++i) { mReadbackSlots[i].buffer.Unmap(); } - - for (auto& expectation : mDeferredExpectations) { - delete expectation.expectation; - expectation.expectation = nullptr; - } - - if (gTestUsesWire) { - delete mC2sBuf; - delete mS2cBuf; - delete mWireClient; - delete mWireServer; - } } std::ostringstream& DawnTest::AddBufferExpectation(const char* file, @@ -232,7 +220,7 @@ std::ostringstream& DawnTest::AddBufferExpectation(const char* file, deferred.size = size; deferred.rowBytes = size; deferred.rowPitch = size; - deferred.expectation = expectation; + deferred.expectation.reset(expectation); mDeferredExpectations.push_back(std::move(deferred)); mDeferredExpectations.back().message = std::make_unique(); @@ -273,7 +261,7 @@ std::ostringstream& DawnTest::AddTextureExpectation(const char* file, deferred.size = size; deferred.rowBytes = width * pixelSize; deferred.rowPitch = rowPitch; - deferred.expectation = expectation; + deferred.expectation.reset(expectation); mDeferredExpectations.push_back(std::move(deferred)); mDeferredExpectations.back().message = std::make_unique(); diff --git a/src/tests/DawnTest.h b/src/tests/DawnTest.h index d89dc416b6..caf2978c84 100644 --- a/src/tests/DawnTest.h +++ b/src/tests/DawnTest.h @@ -79,6 +79,7 @@ namespace dawn_wire { class DawnTest : public ::testing::TestWithParam { public: + DawnTest(); ~DawnTest(); void SetUp() override; @@ -118,10 +119,10 @@ class DawnTest : public ::testing::TestWithParam { private: // Things used to set up testing through the Wire. - dawn_wire::CommandHandler* mWireServer = nullptr; - dawn_wire::CommandHandler* mWireClient = nullptr; - utils::TerribleCommandBuffer* mC2sBuf = nullptr; - utils::TerribleCommandBuffer* mS2cBuf = nullptr; + std::unique_ptr mWireServer; + std::unique_ptr mWireClient; + std::unique_ptr mC2sBuf; + std::unique_ptr mS2cBuf; void FlushWire(); // MapRead buffers used to get data for the expectations @@ -155,7 +156,7 @@ class DawnTest : public ::testing::TestWithParam { uint32_t size; uint32_t rowBytes; uint32_t rowPitch; - detail::Expectation* expectation; + std::unique_ptr expectation; // https://gcc.gnu.org/bugzilla/show_bug.cgi?id=54316 // Use unique_ptr because of missing move/copy constructors on std::basic_ostringstream std::unique_ptr message; @@ -165,7 +166,7 @@ class DawnTest : public ::testing::TestWithParam { // Assuming the data is mapped, checks all expectations void ResolveExpectations(); - utils::BackendBinding* mBinding = nullptr; + std::unique_ptr mBinding; }; // Instantiate the test once for each backend provided after the first argument. Use it like this: diff --git a/src/tests/end2end/BufferTests.cpp b/src/tests/end2end/BufferTests.cpp index 9cf6721e01..f1e4752507 100644 --- a/src/tests/end2end/BufferTests.cpp +++ b/src/tests/end2end/BufferTests.cpp @@ -18,7 +18,6 @@ class BufferMapReadTests : public DawnTest { protected: - static void MapReadCallback(dawnBufferMapAsyncStatus status, const void* data, dawnCallbackUserdata userdata) { ASSERT_EQ(DAWN_BUFFER_MAP_ASYNC_STATUS_SUCCESS, status); ASSERT_NE(nullptr, data); diff --git a/src/tests/unittests/WireTests.cpp b/src/tests/unittests/WireTests.cpp index 1361fb945b..c1be1e6107 100644 --- a/src/tests/unittests/WireTests.cpp +++ b/src/tests/unittests/WireTests.cpp @@ -19,6 +19,8 @@ #include "dawn_wire/Wire.h" #include "utils/TerribleCommandBuffer.h" +#include + using namespace testing; using namespace dawn_wire; @@ -76,7 +78,7 @@ class MockDeviceErrorCallback { MOCK_METHOD2(Call, void(const char* message, dawnCallbackUserdata userdata)); }; -static MockDeviceErrorCallback* mockDeviceErrorCallback = nullptr; +static std::unique_ptr mockDeviceErrorCallback; static void ToMockDeviceErrorCallback(const char* message, dawnCallbackUserdata userdata) { mockDeviceErrorCallback->Call(message, userdata); } @@ -86,7 +88,7 @@ class MockBuilderErrorCallback { MOCK_METHOD4(Call, void(dawnBuilderErrorStatus status, const char* message, dawnCallbackUserdata userdata1, dawnCallbackUserdata userdata2)); }; -static MockBuilderErrorCallback* mockBuilderErrorCallback = nullptr; +static std::unique_ptr mockBuilderErrorCallback; static void ToMockBuilderErrorCallback(dawnBuilderErrorStatus status, const char* message, dawnCallbackUserdata userdata1, dawnCallbackUserdata userdata2) { mockBuilderErrorCallback->Call(status, message, userdata1, userdata2); } @@ -96,7 +98,7 @@ class MockBufferMapReadCallback { MOCK_METHOD3(Call, void(dawnBufferMapAsyncStatus status, const uint32_t* ptr, dawnCallbackUserdata userdata)); }; -static MockBufferMapReadCallback* mockBufferMapReadCallback = nullptr; +static std::unique_ptr mockBufferMapReadCallback; static void ToMockBufferMapReadCallback(dawnBufferMapAsyncStatus status, const void* ptr, dawnCallbackUserdata userdata) { // Assume the data is uint32_t to make writing matchers easier mockBufferMapReadCallback->Call(status, static_cast(ptr), userdata); @@ -107,7 +109,7 @@ class MockBufferMapWriteCallback { MOCK_METHOD3(Call, void(dawnBufferMapAsyncStatus status, uint32_t* ptr, dawnCallbackUserdata userdata)); }; -static MockBufferMapWriteCallback* mockBufferMapWriteCallback = nullptr; +static std::unique_ptr mockBufferMapWriteCallback; uint32_t* lastMapWritePointer = nullptr; static void ToMockBufferMapWriteCallback(dawnBufferMapAsyncStatus status, void* ptr, dawnCallbackUserdata userdata) { // Assume the data is uint32_t to make writing matchers easier @@ -122,10 +124,10 @@ class WireTestsBase : public Test { } void SetUp() override { - mockDeviceErrorCallback = new MockDeviceErrorCallback; - mockBuilderErrorCallback = new MockBuilderErrorCallback; - mockBufferMapReadCallback = new MockBufferMapReadCallback; - mockBufferMapWriteCallback = new MockBufferMapWriteCallback; + mockDeviceErrorCallback = std::make_unique(); + mockBuilderErrorCallback = std::make_unique(); + mockBufferMapReadCallback = std::make_unique(); + mockBufferMapWriteCallback = std::make_unique(); dawnProcTable mockProcs; dawnDevice mockDevice; @@ -138,30 +140,28 @@ class WireTestsBase : public Test { } EXPECT_CALL(api, DeviceTick(_)).Times(AnyNumber()); - mS2cBuf = new utils::TerribleCommandBuffer(); - mC2sBuf = new utils::TerribleCommandBuffer(mWireServer); + mS2cBuf = std::make_unique(); + mC2sBuf = std::make_unique(mWireServer.get()); - mWireServer = NewServerCommandHandler(mockDevice, mockProcs, mS2cBuf); - mC2sBuf->SetHandler(mWireServer); + mWireServer.reset(NewServerCommandHandler(mockDevice, mockProcs, mS2cBuf.get())); + mC2sBuf->SetHandler(mWireServer.get()); dawnProcTable clientProcs; - mWireClient = NewClientDevice(&clientProcs, &device, mC2sBuf); + mWireClient.reset(NewClientDevice(&clientProcs, &device, mC2sBuf.get())); dawnSetProcs(&clientProcs); - mS2cBuf->SetHandler(mWireClient); + mS2cBuf->SetHandler(mWireClient.get()); apiDevice = mockDevice; } void TearDown() override { dawnSetProcs(nullptr); - delete mWireServer; - delete mWireClient; - delete mC2sBuf; - delete mS2cBuf; - delete mockDeviceErrorCallback; - delete mockBuilderErrorCallback; - delete mockBufferMapReadCallback; - delete mockBufferMapWriteCallback; + + // Delete mocks so that expectations are checked + mockDeviceErrorCallback = nullptr; + mockBuilderErrorCallback = nullptr; + mockBufferMapReadCallback = nullptr; + mockBufferMapWriteCallback = nullptr; } void FlushClient() { @@ -179,10 +179,10 @@ class WireTestsBase : public Test { private: bool mIgnoreSetCallbackCalls = false; - CommandHandler* mWireServer = nullptr; - CommandHandler* mWireClient = nullptr; - utils::TerribleCommandBuffer* mS2cBuf = nullptr; - utils::TerribleCommandBuffer* mC2sBuf = nullptr; + std::unique_ptr mWireServer; + std::unique_ptr mWireClient; + std::unique_ptr mS2cBuf; + std::unique_ptr mC2sBuf; }; class WireTests : public WireTestsBase { diff --git a/src/tests/unittests/validation/BufferValidationTests.cpp b/src/tests/unittests/validation/BufferValidationTests.cpp index 91c1951584..53f95b7992 100644 --- a/src/tests/unittests/validation/BufferValidationTests.cpp +++ b/src/tests/unittests/validation/BufferValidationTests.cpp @@ -16,6 +16,8 @@ #include +#include + using namespace testing; class MockBufferMapReadCallback { @@ -23,7 +25,7 @@ class MockBufferMapReadCallback { MOCK_METHOD3(Call, void(dawnBufferMapAsyncStatus status, const uint32_t* ptr, dawnCallbackUserdata userdata)); }; -static MockBufferMapReadCallback* mockBufferMapReadCallback = nullptr; +static std::unique_ptr mockBufferMapReadCallback; static void ToMockBufferMapReadCallback(dawnBufferMapAsyncStatus status, const void* ptr, dawnCallbackUserdata userdata) { // Assume the data is uint32_t to make writing matchers easier mockBufferMapReadCallback->Call(status, reinterpret_cast(ptr), userdata); @@ -34,7 +36,7 @@ class MockBufferMapWriteCallback { MOCK_METHOD3(Call, void(dawnBufferMapAsyncStatus status, uint32_t* ptr, dawnCallbackUserdata userdata)); }; -static MockBufferMapWriteCallback* mockBufferMapWriteCallback = nullptr; +static std::unique_ptr mockBufferMapWriteCallback; static void ToMockBufferMapWriteCallback(dawnBufferMapAsyncStatus status, void* ptr, dawnCallbackUserdata userdata) { // Assume the data is uint32_t to make writing matchers easier mockBufferMapWriteCallback->Call(status, reinterpret_cast(ptr), userdata); @@ -70,14 +72,15 @@ class BufferValidationTest : public ValidationTest { void SetUp() override { ValidationTest::SetUp(); - mockBufferMapReadCallback = new MockBufferMapReadCallback; - mockBufferMapWriteCallback = new MockBufferMapWriteCallback; + mockBufferMapReadCallback = std::make_unique(); + mockBufferMapWriteCallback = std::make_unique(); queue = device.CreateQueue(); } void TearDown() override { - delete mockBufferMapReadCallback; - delete mockBufferMapWriteCallback; + // Delete mocks so that expectations are checked + mockBufferMapReadCallback = nullptr; + mockBufferMapWriteCallback = nullptr; ValidationTest::TearDown(); }