From ef733fdbac35b6180964766b107f219eb41b1d75 Mon Sep 17 00:00:00 2001 From: Egor Yusov Date: Sat, 6 Oct 2018 19:19:50 -0700 Subject: Updated submodules (main change: refactored release queues in D3D12 and Vulkan backends) --- Tests/TestApp/src/ResourceReleaseQueueTest.cpp | 129 +++++++++++++++++++++++++ 1 file changed, 129 insertions(+) create mode 100644 Tests/TestApp/src/ResourceReleaseQueueTest.cpp (limited to 'Tests/TestApp/src/ResourceReleaseQueueTest.cpp') diff --git a/Tests/TestApp/src/ResourceReleaseQueueTest.cpp b/Tests/TestApp/src/ResourceReleaseQueueTest.cpp new file mode 100644 index 0000000..1c76164 --- /dev/null +++ b/Tests/TestApp/src/ResourceReleaseQueueTest.cpp @@ -0,0 +1,129 @@ +/* Copyright 2015-2018 Egor Yusov + * + * 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 + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF ANY PROPRIETARY RIGHTS. + * + * In no event and under no legal theory, whether in tort (including negligence), + * contract, or otherwise, unless required by applicable law (such as deliberate + * and grossly negligent acts) or agreed to in writing, shall any Contributor be + * liable for any damages, including any direct, indirect, special, incidental, + * or consequential damages of any character arising as a result of this License or + * out of the use or inability to use the software (including but not limited to damages + * for loss of goodwill, work stoppage, computer failure or malfunction, or any and + * all other commercial damages or losses), even if such Contributor has been advised + * of the possibility of such damages. + */ + +// EngineSandbox.cpp : Defines the entry point for the application. +// + +#include "pch.h" +#include "Errors.h" +#include "ResourceReleaseQueue.h" +#include "DefaultRawMemoryAllocator.h" +#include "UnitTestBase.h" +#include + +using namespace Diligent; + +class ResourceReleaseQueueTest : public UnitTestBase +{ +public: + ResourceReleaseQueueTest() : + UnitTestBase("Resource release queue test") + { + struct ResourceA + { + int Data = 1; + }; + struct ResourceB + { + float Data = 2; + }; + struct ResourceC + { + float Data[2] = {3, 4}; + }; + + { + ResourceReleaseQueue Queue(DefaultRawMemoryAllocator::GetAllocator()); + std::unique_ptr res0(new ResourceA); + std::unique_ptr res1(new ResourceB); + + Queue.SafeReleaseResource(std::move(res0), 0); + Queue.SafeReleaseResource(std::move(res1), 0); + + std::unique_ptr res2(new ResourceC); + auto Wrapper2 = Queue.CreateWrapper(std::move(res2), 1); + //auto WrapperX = Queue.CreateWrapper(res2, 1);// - error + //auto WrapperY = Queue.CreateWrapper(static_cast&>(res2), 1);// - error + Queue.SafeReleaseResource(std::move(Wrapper2), 0); + + Queue.DiscardStaleResources(0, 1); + + std::unique_ptr res4(new ResourceA); + Queue.DiscardResource(std::move(res4), 1); + + std::unique_ptr res5(new ResourceB); + auto Wrapper5 = Queue.CreateWrapper(std::move(res5), 1); + Queue.DiscardResource(std::move(Wrapper5), 1); + + Queue.Purge(1); + } + + { + ResourceReleaseQueue Queue0(DefaultRawMemoryAllocator::GetAllocator()); + ResourceReleaseQueue Queue1(DefaultRawMemoryAllocator::GetAllocator()); + ResourceReleaseQueue Queue2(DefaultRawMemoryAllocator::GetAllocator()); + + std::unique_ptr res0(new ResourceA); + std::unique_ptr res1(new ResourceB); + std::unique_ptr res2(new ResourceC); + + auto Wrapper0 = ResourceReleaseQueue::CreateWrapper(std::move(res0), 3); + auto Wrapper1 = ResourceReleaseQueue::CreateWrapper(std::move(res1), 3); + auto Wrapper2 = ResourceReleaseQueue::CreateWrapper(std::move(res2), 1); + + Queue0.SafeReleaseResource(Wrapper0, 0); + Queue0.SafeReleaseResource(Wrapper1, 0); + Queue0.SafeReleaseResource(Wrapper2, 0); + Wrapper2.GiveUpOwnership(); + + Queue1.SafeReleaseResource(Wrapper0, 0); + Queue1.SafeReleaseResource(Wrapper1, 0); + + Queue2.SafeReleaseResource(std::move(Wrapper0), 0); + Queue2.SafeReleaseResource(Wrapper1, 0); + Wrapper1.GiveUpOwnership(); + + Queue0.DiscardStaleResources(0, 1); + Queue1.DiscardStaleResources(0, 1); + Queue2.DiscardStaleResources(0, 1); + + std::unique_ptr res3(new ResourceC); + auto Wrapper3 = ResourceReleaseQueue::CreateWrapper(std::move(res3), 2); + Queue0.DiscardResource(Wrapper3, 1); + Queue1.DiscardResource(std::move(Wrapper3), 1); + + std::unique_ptr res4(new ResourceA); + auto Wrapper4 = ResourceReleaseQueue::CreateWrapper(std::move(res4), 1); + Queue2.DiscardResource(Wrapper4, 1); + Wrapper4.GiveUpOwnership(); + + Queue0.Purge(1); + Queue1.Purge(1); + Queue2.Purge(1); + } + + SetStatus(TestResult::Succeeded); + } +}; + +static ResourceReleaseQueueTest TheTest; \ No newline at end of file -- cgit v1.2.3