diff --git a/CMake/Target.cmake b/CMake/Target.cmake index 9b1914bac..41cbdd852 100644 --- a/CMake/Target.cmake +++ b/CMake/Target.cmake @@ -337,7 +337,7 @@ function(AddExecutable) endif() if (${MSVC}) - set_target_properties(${PARAMS_NAME} PROPERTIES VS_DEBUGGER_WORKING_DIRECTORY ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/$) + set_target_properties(${PARAMS_NAME} PROPERTIES VS_DEBUGGER_WORKING_DIRECTORY ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}) endif() endfunction() diff --git a/Editor/Include/Editor/QmlEngine.h b/Editor/Include/Editor/QmlEngine.h index b4184d95a..23a411c87 100644 --- a/Editor/Include/Editor/QmlEngine.h +++ b/Editor/Include/Editor/QmlEngine.h @@ -32,6 +32,6 @@ namespace Editor { Common::Path qmlSourceDir; std::unordered_set widgets; - Common::UniqueRef watcher; + Common::UniquePtr watcher; }; } diff --git a/Editor/Src/Main.cpp b/Editor/Src/Main.cpp index fc58154b5..f5569fa59 100644 --- a/Editor/Src/Main.cpp +++ b/Editor/Src/Main.cpp @@ -25,7 +25,7 @@ int main(int argc, char* argv[]) auto& qmlEngine = Editor::QmlEngine::Get(); qmlEngine.Start(); - Common::UniqueRef mainWidget; + Common::UniquePtr mainWidget; #if BUILD_CONFIG_DEBUG if (caRunSample.GetValue()) { mainWidget = new Editor::WidgetSamples(); diff --git a/Engine/Source/Common/Include/Common/Concurrent.h b/Engine/Source/Common/Include/Common/Concurrent.h index b3b1f6a0e..070c814c9 100644 --- a/Engine/Source/Common/Include/Common/Concurrent.h +++ b/Engine/Source/Common/Include/Common/Concurrent.h @@ -4,17 +4,17 @@ #pragma once +#include #include #include #include #include #include -#include #include #include -#include #include +#include #include namespace Common { @@ -24,8 +24,7 @@ namespace Common { NamedThread(); - template - explicit NamedThread(const std::string& name, F&& task, Args&&... args); + template explicit NamedThread(const std::string& name, F&& task); void Join(); @@ -40,10 +39,12 @@ namespace Common { ThreadPool(const std::string& name, uint8_t threadNum); ~ThreadPool(); - template - auto EmplaceTask(F&& task, Args&&... args); + template auto EmplaceTask(F&& task); + template void ExecuteTasks(size_t taskNum, F&& task); private: + template auto EmplaceTaskInternal(Common::SharedPtr> packedTask); + bool stop; std::mutex mutex; std::condition_variable condition; @@ -58,8 +59,7 @@ namespace Common { void Flush(); - template - auto EmplaceTask(F&& task, Args&&... args); + template auto EmplaceTask(F&& task); private: bool stop; @@ -73,35 +73,56 @@ namespace Common { } namespace Common { - template - NamedThread::NamedThread(const std::string& name, F&& task, Args&& ... args) + template + NamedThread::NamedThread(const std::string& name, F&& task) { - thread = std::thread([this, task = std::forward(task), name](Args&&... args) -> void { + thread = std::thread([this, task, name]() -> void { SetThreadName(name); - task(args...); - }, std::forward(args)...); + task(); + }); } - template - auto ThreadPool::EmplaceTask(F&& task, Args&& ... args) + template + auto ThreadPool::EmplaceTask(F&& task) { - using RetType = std::invoke_result_t; - auto packagedTask = std::make_shared>(std::bind(std::forward(task), std::forward(args)...)); - auto result = packagedTask->get_future(); + using RetType = std::invoke_result_t; + return EmplaceTaskInternal(Common::MakeShared>(task)); + } + + template + void ThreadPool::ExecuteTasks(size_t taskNum, F&& task) + { + using RetType = std::invoke_result_t; + + std::vector> futures; + futures.reserve(taskNum); + for (size_t i = 0; i < taskNum; i++) { + futures.emplace_back(EmplaceTaskInternal(Common::MakeShared>(std::bind(std::forward(task), i)))); + } + + for (const auto& future : futures) { + future.wait(); + } + } + + template + auto ThreadPool::EmplaceTaskInternal(Common::SharedPtr> packedTask) + { + auto result = packedTask->get_future(); { std::unique_lock lock(mutex); Assert(!stop); - tasks.emplace([packagedTask]() -> void { (*packagedTask)(); }); + tasks.emplace([packedTask]() -> void { (*packedTask)(); }); } condition.notify_one(); return result; } - template - auto WorkerThread::EmplaceTask(F&& task, Args&& ... args) + template + auto WorkerThread::EmplaceTask(F&& task) { - using RetType = std::invoke_result_t; - auto packagedTask = std::make_shared>(std::bind(std::forward(task), std::forward(args)...)); + using RetType = std::invoke_result_t; + auto packagedTask = Common::MakeShared>(task); auto result = packagedTask->get_future(); { std::unique_lock lock(mutex); diff --git a/Engine/Source/Common/Include/Common/Memory.h b/Engine/Source/Common/Include/Common/Memory.h index 5f74bccec..db04297f6 100644 --- a/Engine/Source/Common/Include/Common/Memory.h +++ b/Engine/Source/Common/Include/Common/Memory.h @@ -11,448 +11,465 @@ namespace Common { template - class UniqueRef { + class UniquePtr { public: - NonCopyable(UniqueRef) - UniqueRef(T* pointer); // NOLINT - UniqueRef(std::unique_ptr&& inRef); // NOLINT - UniqueRef(UniqueRef&& other) noexcept; // NOLINT - UniqueRef(); - ~UniqueRef(); + NonCopyable(UniquePtr) + UniquePtr(T* pointer); // NOLINT + UniquePtr(std::unique_ptr&& uniquePtr); // NOLINT + UniquePtr(UniquePtr&& other) noexcept; // NOLINT + UniquePtr(); + ~UniquePtr(); - UniqueRef& operator=(T* pointer); - UniqueRef& operator=(std::unique_ptr&& inRef); - UniqueRef& operator=(UniqueRef&& other) noexcept; + UniquePtr& operator=(T* pointer); + UniquePtr& operator=(std::unique_ptr&& uniquePtr); + UniquePtr& operator=(UniquePtr&& other) noexcept; T* operator->() const noexcept; T& operator*() const noexcept; bool operator==(nullptr_t) const noexcept; bool operator!=(nullptr_t) const noexcept; + explicit operator bool() const noexcept; + bool Valid() const; T* Get() const; void Reset(T* pointer = nullptr); + std::unique_ptr& GetStd(); private: - std::unique_ptr ref; + std::unique_ptr ptr; }; template - class SharedRef { + class SharedPtr { public: - template - SharedRef(std::shared_ptr& inRef); // NOLINT - - template - SharedRef(std::shared_ptr&& inRef) noexcept; // NOLINT - - template - SharedRef(std::unique_ptr&& inRef) noexcept; // NOLINT - - template - SharedRef(UniqueRef&& inRef) noexcept; // NOLINT - - SharedRef(T* pointer); // NOLINT - SharedRef(const SharedRef& other); // NOLINT - SharedRef(SharedRef&& other) noexcept; // NOLINT - SharedRef(); - ~SharedRef(); - - template - SharedRef& operator=(std::shared_ptr& inRef); - - template - SharedRef& operator=(std::shared_ptr&& inRef); - - template - SharedRef& operator=(std::unique_ptr&& inRef) noexcept; - - template - SharedRef& operator=(UniqueRef&& inRef) noexcept; - - SharedRef& operator=(T* pointer); - SharedRef& operator=(SharedRef& other); // NOLINT - SharedRef& operator=(SharedRef&& other) noexcept; + template SharedPtr(std::shared_ptr& sharedPtr); // NOLINT + template SharedPtr(std::shared_ptr&& sharedPtr) noexcept; // NOLINT + template SharedPtr(std::unique_ptr&& uniquePtr) noexcept; // NOLINT + template SharedPtr(UniquePtr&& uniquePtr) noexcept; // NOLINT + + SharedPtr(T* pointer); // NOLINT + SharedPtr(const SharedPtr& other); // NOLINT + SharedPtr(SharedPtr&& other) noexcept; // NOLINT + SharedPtr(); + ~SharedPtr(); + + template SharedPtr& operator=(std::shared_ptr& sharedPtr); + template SharedPtr& operator=(std::shared_ptr&& sharedPtr); + template SharedPtr& operator=(std::unique_ptr&& uniquePtr) noexcept; + template SharedPtr& operator=(UniquePtr&& uniquePtr) noexcept; + + SharedPtr& operator=(T* pointer); + SharedPtr& operator=(SharedPtr& other); // NOLINT + SharedPtr& operator=(SharedPtr&& other) noexcept; T* operator->() const noexcept; T& operator*() const noexcept; bool operator==(nullptr_t) const noexcept; bool operator!=(nullptr_t) const noexcept; + explicit operator bool() const noexcept; + bool Valid() const; T* Get() const; void Reset(T* pointer = nullptr); auto RefCount() const; std::shared_ptr& GetStd(); - template - SharedRef StaticCast(); - - template - SharedRef DynamicCast(); - - template - SharedRef ReinterpretCast(); + template SharedPtr StaticCast(); + template SharedPtr DynamicCast(); + template SharedPtr ReinterpretCast(); private: - std::shared_ptr ref; + std::shared_ptr ptr; }; template - class WeakRef { + class WeakPtr { public: - template - WeakRef(SharedRef& inRef); // NOLINT - - WeakRef(WeakRef& other); // NOLINT - WeakRef(WeakRef&& other) noexcept; // NOLINT - ~WeakRef(); + template WeakPtr(SharedPtr& sharedPtr); // NOLINT - template - WeakRef& operator=(SharedRef& inRef); + WeakPtr(WeakPtr& other); // NOLINT + WeakPtr(WeakPtr&& other) noexcept; // NOLINT + ~WeakPtr(); - WeakRef& operator=(WeakRef& other); // NOLINT - WeakRef& operator=(WeakRef&& other) noexcept; + template WeakPtr& operator=(SharedPtr& sharedPtr); + WeakPtr& operator=(WeakPtr& other); // NOLINT + WeakPtr& operator=(WeakPtr&& other) noexcept; void Reset(); bool Expired() const; - SharedRef Lock() const; + SharedPtr Lock() const; + std::weak_ptr& GetStd(); private: - std::weak_ptr ref; + std::weak_ptr ptr; }; - template - UniqueRef MakeUnique(Args&&... args); - - template - SharedRef MakeShared(Args&&... args); + template UniquePtr MakeUnique(Args&&... args); + template SharedPtr MakeShared(Args&&... args); } namespace Common { template - UniqueRef::UniqueRef(T* pointer) - : ref(pointer) + UniquePtr::UniquePtr(T* pointer) + : ptr(pointer) { } template - UniqueRef::UniqueRef(std::unique_ptr&& inRef) - : ref(std::move(inRef)) + UniquePtr::UniquePtr(std::unique_ptr&& uniquePtr) + : ptr(std::move(uniquePtr)) { } template - UniqueRef::UniqueRef(UniqueRef&& other) noexcept - : ref(std::move(other.ref)) + UniquePtr::UniquePtr(UniquePtr&& other) noexcept + : ptr(std::move(other.ptr)) { } template - UniqueRef::UniqueRef() = default; + UniquePtr::UniquePtr() = default; template - UniqueRef::~UniqueRef() = default; + UniquePtr::~UniquePtr() = default; template - UniqueRef& UniqueRef::operator=(T* pointer) + UniquePtr& UniquePtr::operator=(T* pointer) { - ref = std::unique_ptr(pointer); + ptr = std::unique_ptr(pointer); return *this; } template - UniqueRef& UniqueRef::operator=(std::unique_ptr&& inRef) + UniquePtr& UniquePtr::operator=(std::unique_ptr&& uniquePtr) { - ref = std::move(inRef); + ptr = std::move(uniquePtr); return *this; } template - UniqueRef& UniqueRef::operator=(UniqueRef&& other) noexcept + UniquePtr& UniquePtr::operator=(UniquePtr&& other) noexcept { - ref = std::move(other.ref); + ptr = std::move(other.ptr); return *this; } template - T* UniqueRef::operator->() const noexcept + T* UniquePtr::operator->() const noexcept { - return ref.operator->(); + return ptr.operator->(); } template - T& UniqueRef::operator*() const noexcept + T& UniquePtr::operator*() const noexcept { - return ref.operator*(); + return ptr.operator*(); } template - bool UniqueRef::operator==(nullptr_t) const noexcept + bool UniquePtr::operator==(nullptr_t) const noexcept { - return ref == nullptr; + return ptr == nullptr; } template - bool UniqueRef::operator!=(nullptr_t) const noexcept + bool UniquePtr::operator!=(nullptr_t) const noexcept { - return ref != nullptr; + return ptr != nullptr; } template - T* UniqueRef::Get() const + UniquePtr::operator bool() const noexcept { - return ref.get(); + return Valid(); } template - void UniqueRef::Reset(T* pointer) + T* UniquePtr::Get() const { - ref.reset(pointer); + return ptr.get(); + } + + template + bool UniquePtr::Valid() const + { + return ptr != nullptr; + } + + template + void UniquePtr::Reset(T* pointer) + { + ptr.reset(pointer); + } + + template + std::unique_ptr& UniquePtr::GetStd() + { + return ptr; } template template - SharedRef::SharedRef(std::shared_ptr& inRef) - : ref(inRef) + SharedPtr::SharedPtr(std::shared_ptr& sharedPtr) + : ptr(sharedPtr) { } template template - SharedRef::SharedRef(std::shared_ptr&& inRef) noexcept - : ref(std::move(inRef)) + SharedPtr::SharedPtr(std::shared_ptr&& sharedPtr) noexcept + : ptr(std::move(sharedPtr)) { } template template - SharedRef::SharedRef(std::unique_ptr&& inRef) noexcept - : ref(std::move(inRef)) + SharedPtr::SharedPtr(std::unique_ptr&& uniquePtr) noexcept + : ptr(std::move(uniquePtr)) { } template template - SharedRef::SharedRef(UniqueRef&& inRef) noexcept - : ref(std::move(inRef.Get())) + SharedPtr::SharedPtr(UniquePtr&& uniquePtr) noexcept + : ptr(std::move(uniquePtr.Get())) { } template - SharedRef::SharedRef(T* pointer) - : ref(pointer) + SharedPtr::SharedPtr(T* pointer) + : ptr(pointer) { } template - SharedRef::SharedRef(const SharedRef& other) - : ref(other.ref) + SharedPtr::SharedPtr(const SharedPtr& other) + : ptr(other.ptr) { } template - SharedRef::SharedRef(SharedRef && other) noexcept - : ref(std::move(other.ref)) + SharedPtr::SharedPtr(SharedPtr && other) noexcept + : ptr(std::move(other.ptr)) { } template - SharedRef::SharedRef() = default; + SharedPtr::SharedPtr() = default; template - SharedRef::~SharedRef() = default; + SharedPtr::~SharedPtr() = default; template template - SharedRef & SharedRef::operator=(std::shared_ptr & inRef) + SharedPtr & SharedPtr::operator=(std::shared_ptr & sharedPtr) { - ref = inRef; + ptr = sharedPtr; return *this; } template template - SharedRef & SharedRef::operator=(std::shared_ptr && inRef) + SharedPtr & SharedPtr::operator=(std::shared_ptr && sharedPtr) { - ref = std::move(inRef); + ptr = std::move(sharedPtr); return *this; } template template - SharedRef& SharedRef::operator=(std::unique_ptr&& inRef) noexcept + SharedPtr& SharedPtr::operator=(std::unique_ptr&& uniquePtr) noexcept { - ref = std::move(inRef); + ptr = std::move(uniquePtr); return *this; } template template - SharedRef& SharedRef::operator=(UniqueRef&& inRef) noexcept + SharedPtr& SharedPtr::operator=(UniquePtr&& uniquePtr) noexcept { - ref = std::move(inRef.Get()); + ptr = std::move(uniquePtr.Get()); return *this; } template - SharedRef & SharedRef::operator=(T* pointer) + SharedPtr & SharedPtr::operator=(T* pointer) { - ref = std::shared_ptr(pointer); + ptr = std::shared_ptr(pointer); return *this; } template - SharedRef & SharedRef::operator=(SharedRef & other) + SharedPtr & SharedPtr::operator=(SharedPtr& other) { - ref = other.ref; + ptr = other.ptr; return *this; } template - SharedRef & SharedRef::operator=(SharedRef && other) noexcept + SharedPtr & SharedPtr::operator=(SharedPtr&& other) noexcept { - ref = std::move(other.ref); + ptr = std::move(other.ptr); return *this; } template - T* SharedRef::operator->() const noexcept + T* SharedPtr::operator->() const noexcept { - return ref.operator->(); + return ptr.operator->(); } template - T& SharedRef::operator*() const noexcept + T& SharedPtr::operator*() const noexcept { - return ref.operator*(); + return ptr.operator*(); } template - bool SharedRef::operator==(nullptr_t) const noexcept + bool SharedPtr::operator==(nullptr_t) const noexcept { - return ref == nullptr; + return ptr == nullptr; } template - bool SharedRef::operator!=(nullptr_t) const noexcept + bool SharedPtr::operator!=(nullptr_t) const noexcept { - return ref != nullptr; + return ptr != nullptr; } template - T* SharedRef::Get() const + SharedPtr::operator bool() const noexcept { - return ref.get(); + return Valid(); } template - void SharedRef::Reset(T* pointer) + bool SharedPtr::Valid() const { - ref.reset(pointer); + return ptr != nullptr; } template - auto SharedRef::RefCount() const + T* SharedPtr::Get() const { - return ref.use_count(); + return ptr.get(); } template - std::shared_ptr & SharedRef::GetStd() + void SharedPtr::Reset(T* pointer) { - return ref; + ptr.reset(pointer); + } + + template + auto SharedPtr::RefCount() const + { + return ptr.use_count(); + } + + template + std::shared_ptr & SharedPtr::GetStd() + { + return ptr; } template template - SharedRef SharedRef::StaticCast() + SharedPtr SharedPtr::StaticCast() { - return static_pointer_cast(ref); + return static_pointer_cast(ptr); } template template - SharedRef SharedRef::DynamicCast() + SharedPtr SharedPtr::DynamicCast() { - return dynamic_pointer_cast(ref); + return dynamic_pointer_cast(ptr); } template template - SharedRef SharedRef::ReinterpretCast() + SharedPtr SharedPtr::ReinterpretCast() { - return reinterpret_pointer_cast(ref); + return reinterpret_pointer_cast(ptr); } template template - WeakRef::WeakRef(SharedRef & inRef) - : ref(inRef.GetStd()) + WeakPtr::WeakPtr(SharedPtr & sharedPtr) + : ptr(sharedPtr.GetStd()) { } template - WeakRef::WeakRef(WeakRef& other) - : ref(other.ref) + WeakPtr::WeakPtr(WeakPtr& other) + : ptr(other.ptr) { } template - WeakRef::WeakRef(WeakRef && other) noexcept - : ref(std::move(other.ref)) + WeakPtr::WeakPtr(WeakPtr && other) noexcept + : ptr(std::move(other.ptr)) { } template - WeakRef::~WeakRef() = default; + WeakPtr::~WeakPtr() = default; template template - WeakRef& WeakRef::operator=(SharedRef & inRef) + WeakPtr& WeakPtr::operator=(SharedPtr & sharedPtr) { - ref = inRef.GetStd(); + ptr = sharedPtr.GetStd(); return *this; } template - WeakRef& WeakRef::operator=(WeakRef & other) + WeakPtr& WeakPtr::operator=(WeakPtr & other) { - ref = other.ref; + ptr = other.ptr; return *this; } template - WeakRef & WeakRef::operator=(WeakRef && other) noexcept + WeakPtr & WeakPtr::operator=(WeakPtr && other) noexcept { - ref = std::move(other.ref); + ptr = std::move(other.ptr); return *this; } template - void WeakRef::Reset() + void WeakPtr::Reset() + { + ptr.reset(); + } + + template + bool WeakPtr::Expired() const { - ref.reset(); + return ptr.expired(); } template - bool WeakRef::Expired() const + SharedPtr WeakPtr::Lock() const { - return ref.expired(); + return ptr.lock(); } template - SharedRef WeakRef::Lock() const + std::weak_ptr& WeakPtr::GetStd() { - return ref.lock(); + return ptr; } template - UniqueRef MakeUnique(Args && ... args) + UniquePtr MakeUnique(Args && ... args) { - return Common::UniqueRef(new T(std::forward(args)...)); + return Common::UniquePtr(new T(std::forward(args)...)); } template - SharedRef MakeShared(Args && ... args) + SharedPtr MakeShared(Args && ... args) { - return Common::SharedRef(new T(std::forward(args)...)); + return Common::SharedPtr(new T(std::forward(args)...)); } } diff --git a/Engine/Source/Common/Src/Concurrent.cpp b/Engine/Source/Common/Src/Concurrent.cpp index 0a27a2645..34dfbcb70 100644 --- a/Engine/Source/Common/Src/Concurrent.cpp +++ b/Engine/Source/Common/Src/Concurrent.cpp @@ -9,6 +9,7 @@ #endif #include +#include namespace Common { NamedThread::NamedThread() = default; diff --git a/Engine/Source/Common/Test/ConcurrentTest.cpp b/Engine/Source/Common/Test/ConcurrentTest.cpp index f7ef4c1c9..a97df50e5 100644 --- a/Engine/Source/Common/Test/ConcurrentTest.cpp +++ b/Engine/Source/Common/Test/ConcurrentTest.cpp @@ -65,6 +65,14 @@ TEST(ConcurrentTest, ThreadPoolTest3) ASSERT_EQ(count, 200); } +TEST(ConcurrentTest, ThreadPoolExecuteTasksTest) +{ + Common::ThreadPool threadPool("TestThreadPool", 4); + std::atomic count = 0; + threadPool.ExecuteTasks(64, [&count](size_t i) -> void { ++count; }); + ASSERT_EQ(count, 64); +} + TEST(ConcurrentTest, WorkerThread0) { uint32_t value = 0; diff --git a/Engine/Source/Common/Test/MemoryTest.cpp b/Engine/Source/Common/Test/MemoryTest.cpp index 2c0e4c6be..cc975bcb5 100644 --- a/Engine/Source/Common/Test/MemoryTest.cpp +++ b/Engine/Source/Common/Test/MemoryTest.cpp @@ -34,18 +34,18 @@ TEST(MemoryTest, UniqueRefTest) // NOLINT { bool live; { - const UniqueRef ref = new TestStruct(1, live); + const UniquePtr ref = new TestStruct(1, live); ASSERT_EQ(live, true); ASSERT_EQ(ref->value, 1); } ASSERT_EQ(live, false); { - UniqueRef ref = new TestStruct(1, live); + UniquePtr ref = new TestStruct(1, live); ASSERT_EQ(live, true); ASSERT_EQ(ref->value, 1); - UniqueRef movedRef = std::move(ref); + UniquePtr movedRef = std::move(ref); ASSERT_EQ(live, true); } ASSERT_EQ(live, false); @@ -55,17 +55,17 @@ TEST(MemoryTest, SharedRefTest) // NOLINT { bool live; { - const SharedRef ref1 = new TestStruct(1, live); + const SharedPtr ref1 = new TestStruct(1, live); ASSERT_EQ(live, true); ASSERT_EQ(ref1->value, 1); ASSERT_EQ(ref1.RefCount(), 1); - SharedRef ref2 = ref1; + SharedPtr ref2 = ref1; ASSERT_EQ(live, true); ASSERT_EQ(ref2->value, 1); ASSERT_EQ(ref2.RefCount(), 2); - const SharedRef ref3 = std::move(ref2); + const SharedPtr ref3 = std::move(ref2); ASSERT_EQ(live, true); ASSERT_EQ(ref3->value, 1); ASSERT_EQ(ref1.RefCount(), 2); @@ -77,12 +77,12 @@ TEST(MemoryTest, SharedRefTest) // NOLINT TEST(MemoryTest, WeakRefTest) // NOLINT { bool live; - SharedRef ref = new TestStruct(1, live); + SharedPtr ref = new TestStruct(1, live); ASSERT_EQ(live, true); ASSERT_EQ(ref->value, 1); ASSERT_EQ(ref.RefCount(), 1); - const WeakRef weakRef = ref; + const WeakPtr weakRef = ref; ASSERT_EQ(live, true); ASSERT_EQ(weakRef.Expired(), false); ASSERT_EQ(ref.RefCount(), 1); @@ -108,19 +108,19 @@ TEST(MemoryTest, WeakRefTest) // NOLINT TEST(MemoryTest, WeakRefDeriveTest) // NOLINT { bool live; - SharedRef ref = new ChildTestStruct(1, 2, live); + SharedPtr ref = new ChildTestStruct(1, 2, live); ASSERT_EQ(live, true); ASSERT_EQ(ref->value, 1); ASSERT_EQ(ref->cValue, 2); ASSERT_EQ(ref.RefCount(), 1); - const WeakRef weakRef = ref; + const WeakPtr weakRef = ref; ASSERT_EQ(live, true); ASSERT_EQ(weakRef.Expired(), false); ASSERT_EQ(ref.RefCount(), 1); { - const SharedRef lockRef = weakRef.Lock().StaticCast(); + const SharedPtr lockRef = weakRef.Lock().StaticCast(); ASSERT_EQ(lockRef != nullptr, true); ASSERT_EQ(live, true); ASSERT_EQ(lockRef->value, 1); diff --git a/Engine/Source/Common/Test/SerializationTest.h b/Engine/Source/Common/Test/SerializationTest.h index 706fe3327..6c86be48f 100644 --- a/Engine/Source/Common/Test/SerializationTest.h +++ b/Engine/Source/Common/Test/SerializationTest.h @@ -35,8 +35,8 @@ inline std::string GetEndianString(std::endian e) template void PerformTypedSerializationTestWithStream( - const std::function()>& createSerializeStream, - const std::function()>& createDeserializeStream, + const std::function()>& createSerializeStream, + const std::function()>& createDeserializeStream, const T& inValue) { { @@ -59,14 +59,14 @@ void PerformTypedSerializationTestWithEndian(const T& inValue) std::filesystem::create_directories(fileName.parent_path()); PerformTypedSerializationTestWithStream( - []() -> Common::UniqueRef { return { new Common::BinaryFileSerializeStream(fileName.string()) }; }, - []() -> Common::UniqueRef { return { new Common::BinaryFileDeserializeStream(fileName.string()) }; }, + []() -> Common::UniquePtr { return {new Common::BinaryFileSerializeStream(fileName.string()) }; }, + []() -> Common::UniquePtr { return {new Common::BinaryFileDeserializeStream(fileName.string()) }; }, inValue); std::vector buffer; PerformTypedSerializationTestWithStream( - [&]() -> Common::UniqueRef { return { new Common::MemorySerializeStream(buffer) }; }, - [&]() -> Common::UniqueRef { return { new Common::MemoryDeserializeStream(buffer) }; }, + [&]() -> Common::UniquePtr { return {new Common::MemorySerializeStream(buffer) }; }, + [&]() -> Common::UniquePtr { return {new Common::MemoryDeserializeStream(buffer) }; }, inValue); } diff --git a/Engine/Source/Core/Include/Core/Log.h b/Engine/Source/Core/Include/Core/Log.h index c70a54e45..56f2c89cf 100644 --- a/Engine/Source/Core/Include/Core/Log.h +++ b/Engine/Source/Core/Include/Core/Log.h @@ -74,7 +74,7 @@ namespace Core { NonMovable(Logger) void Log(const std::string& inTag, const std::string& inLevel, const std::string& inContent); - void Attach(Common::UniqueRef&& inStream); + void Attach(Common::UniquePtr&& inStream); void Flush(); private: @@ -83,6 +83,6 @@ namespace Core { void LogInternal(const std::string& inString); float lastFlushTimeSec; - std::vector> streams; + std::vector> streams; }; } diff --git a/Engine/Source/Core/Src/Log.cpp b/Engine/Source/Core/Src/Log.cpp index 625e9c8c9..b6c4560eb 100644 --- a/Engine/Source/Core/Src/Log.cpp +++ b/Engine/Source/Core/Src/Log.cpp @@ -65,7 +65,7 @@ namespace Core { LogInternal(std::format("[{}][{}][{}] {}", time.ToString(), inTag, inLevel, inContent)); } - void Logger::Attach(Common::UniqueRef&& inStream) + void Logger::Attach(Common::UniquePtr&& inStream) { streams.emplace_back(std::move(inStream)); } diff --git a/Engine/Source/Mirror/Test/AnyTest.cpp b/Engine/Source/Mirror/Test/AnyTest.cpp index 77ac3c5f5..e7cb229c8 100644 --- a/Engine/Source/Mirror/Test/AnyTest.cpp +++ b/Engine/Source/Mirror/Test/AnyTest.cpp @@ -659,7 +659,7 @@ TEST(AnyTest, ConstTryAsTest) TEST(AnyTest, PolyAsTest) { - const Common::UniqueRef v0 = new AnyDerivedClassTest2(1, 2.0f, "3"); + const Common::UniquePtr v0 = new AnyDerivedClassTest2(1, 2.0f, "3"); Any a0 = std::ref(*v0); const auto& r0 = a0.PolyAs(); @@ -676,7 +676,7 @@ TEST(AnyTest, PolyAsTest) TEST(AnyTest, ConstPolyAsTest) { - const Common::UniqueRef v0 = new AnyDerivedClassTest2(1, 2.0f, "3"); + const Common::UniquePtr v0 = new AnyDerivedClassTest2(1, 2.0f, "3"); const Any a0 = std::ref(*v0); const auto& r0 = a0.PolyAs(); diff --git a/Engine/Source/RHI-DirectX12/Include/RHI/DirectX12/Buffer.h b/Engine/Source/RHI-DirectX12/Include/RHI/DirectX12/Buffer.h index 91765bff7..d386c5bf2 100644 --- a/Engine/Source/RHI-DirectX12/Include/RHI/DirectX12/Buffer.h +++ b/Engine/Source/RHI-DirectX12/Include/RHI/DirectX12/Buffer.h @@ -22,7 +22,7 @@ namespace RHI::DirectX12 { void* Map(MapMode inMapMode, size_t inOffset, size_t inLength) override; void UnMap() override; - Common::UniqueRef CreateBufferView(const BufferViewCreateInfo& inCreateInfo) override; + Common::UniquePtr CreateBufferView(const BufferViewCreateInfo& inCreateInfo) override; ID3D12Resource* GetNative() const; DX12Device& GetDevice() const; diff --git a/Engine/Source/RHI-DirectX12/Include/RHI/DirectX12/BufferView.h b/Engine/Source/RHI-DirectX12/Include/RHI/DirectX12/BufferView.h index 11399d3ae..d829ea5f9 100644 --- a/Engine/Source/RHI-DirectX12/Include/RHI/DirectX12/BufferView.h +++ b/Engine/Source/RHI-DirectX12/Include/RHI/DirectX12/BufferView.h @@ -29,6 +29,6 @@ namespace RHI::DirectX12 { void CreateNativeView(const BufferViewCreateInfo& inCreateInfo); DX12Buffer& buffer; - std::variant, D3D12_VERTEX_BUFFER_VIEW, D3D12_INDEX_BUFFER_VIEW> nativeView; + std::variant, D3D12_VERTEX_BUFFER_VIEW, D3D12_INDEX_BUFFER_VIEW> nativeView; }; } diff --git a/Engine/Source/RHI-DirectX12/Include/RHI/DirectX12/CommandBuffer.h b/Engine/Source/RHI-DirectX12/Include/RHI/DirectX12/CommandBuffer.h index 50e48cf55..dca744d12 100644 --- a/Engine/Source/RHI-DirectX12/Include/RHI/DirectX12/CommandBuffer.h +++ b/Engine/Source/RHI-DirectX12/Include/RHI/DirectX12/CommandBuffer.h @@ -50,8 +50,8 @@ namespace RHI::DirectX12 { static constexpr uint32_t cbvSrvUavHeapCapacity = 10240; DX12Device& device; - Common::UniqueRef samplerHeap; - Common::UniqueRef cbvSrvUavHeap; + Common::UniquePtr samplerHeap; + Common::UniquePtr cbvSrvUavHeap; }; class DX12CommandBuffer final : public CommandBuffer { @@ -60,16 +60,19 @@ namespace RHI::DirectX12 { explicit DX12CommandBuffer(DX12Device& inDevice); ~DX12CommandBuffer() override; - Common::UniqueRef Begin() override; + Common::UniquePtr Begin() override; - ID3D12GraphicsCommandList* GetNative() const; + ID3D12CommandAllocator* GetNativeAllocator() const; + ID3D12GraphicsCommandList* GetNativeCmdList() const; RuntimeDescriptorCompact* GetRuntimeDescriptorHeaps() const; private: - void AllocateDX12CommandList(DX12Device& inDevice); + void CreateNativeCommandAllocator(DX12Device& inDevice); + void CreateNativeCommandList(DX12Device& inDevice); DX12Device& device; - ComPtr dx12GraphicsCommandList; - Common::UniqueRef runtimeDescriptorHeaps; + ComPtr nativeCommandAllocator; + ComPtr nativeGraphicsCommandList; + Common::UniquePtr runtimeDescriptorHeaps; }; } diff --git a/Engine/Source/RHI-DirectX12/Include/RHI/DirectX12/CommandRecorder.h b/Engine/Source/RHI-DirectX12/Include/RHI/DirectX12/CommandRecorder.h index ed085b0d4..1d9d94000 100644 --- a/Engine/Source/RHI-DirectX12/Include/RHI/DirectX12/CommandRecorder.h +++ b/Engine/Source/RHI-DirectX12/Include/RHI/DirectX12/CommandRecorder.h @@ -20,9 +20,9 @@ namespace RHI::DirectX12 { ~DX12CommandRecorder() override; void ResourceBarrier(const Barrier& inBarrier) override; - Common::UniqueRef BeginCopyPass() override; - Common::UniqueRef BeginComputePass() override; - Common::UniqueRef BeginRasterPass(const RasterPassBeginInfo& inBeginInfo) override; + Common::UniquePtr BeginCopyPass() override; + Common::UniquePtr BeginComputePass() override; + Common::UniquePtr BeginRasterPass(const RasterPassBeginInfo& inBeginInfo) override; void End() override; private: diff --git a/Engine/Source/RHI-DirectX12/Include/RHI/DirectX12/Device.h b/Engine/Source/RHI-DirectX12/Include/RHI/DirectX12/Device.h index 7210fe991..02b06fc87 100644 --- a/Engine/Source/RHI-DirectX12/Include/RHI/DirectX12/Device.h +++ b/Engine/Source/RHI-DirectX12/Include/RHI/DirectX12/Device.h @@ -43,7 +43,7 @@ namespace RHI::DirectX12 { DescriptorHeapNode(ComPtr&& inHeap, uint32_t inDescriptorSize, uint32_t inCapacity); bool HasFreeSlot() const; - Common::UniqueRef Allocate(); + Common::UniquePtr Allocate(); void Free(uint32_t slot); private: @@ -57,7 +57,7 @@ namespace RHI::DirectX12 { class DescriptorPool { public: DescriptorPool(DX12Device& inDevice, D3D12_DESCRIPTOR_HEAP_TYPE inNativeHeapType, uint32_t inDescriptorSize, uint32_t inCapacity); - Common::UniqueRef Allocate(); + Common::UniquePtr Allocate(); private: DX12Device& device; @@ -75,36 +75,34 @@ namespace RHI::DirectX12 { size_t GetQueueNum(QueueType inType) override; Queue* GetQueue(QueueType inType, size_t inIndex) override; - Common::UniqueRef CreateSurface(const SurfaceCreateInfo& inCreateInfo) override; - Common::UniqueRef CreateSwapChain(const SwapChainCreateInfo& inCreateInfo) override; - Common::UniqueRef CreateBuffer(const BufferCreateInfo& inCreateInfo) override; - Common::UniqueRef CreateTexture(const TextureCreateInfo& inCreateInfo) override; - Common::UniqueRef CreateSampler(const SamplerCreateInfo& inCreateInfo) override; - Common::UniqueRef CreateBindGroupLayout(const BindGroupLayoutCreateInfo& inCreateInfo) override; - Common::UniqueRef CreateBindGroup(const BindGroupCreateInfo& inCreateInfo) override; - Common::UniqueRef CreatePipelineLayout(const PipelineLayoutCreateInfo& inCreateInfo) override; - Common::UniqueRef CreateShaderModule(const ShaderModuleCreateInfo& inCreateInfo) override; - Common::UniqueRef CreateComputePipeline(const ComputePipelineCreateInfo& inCreateInfo) override; - Common::UniqueRef CreateRasterPipeline(const RasterPipelineCreateInfo& inCreateInfo) override; - Common::UniqueRef CreateCommandBuffer() override; - Common::UniqueRef CreateFence(bool inInitAsSignaled) override; - Common::UniqueRef CreateSemaphore() override; + Common::UniquePtr CreateSurface(const SurfaceCreateInfo& inCreateInfo) override; + Common::UniquePtr CreateSwapChain(const SwapChainCreateInfo& inCreateInfo) override; + Common::UniquePtr CreateBuffer(const BufferCreateInfo& inCreateInfo) override; + Common::UniquePtr CreateTexture(const TextureCreateInfo& inCreateInfo) override; + Common::UniquePtr CreateSampler(const SamplerCreateInfo& inCreateInfo) override; + Common::UniquePtr CreateBindGroupLayout(const BindGroupLayoutCreateInfo& inCreateInfo) override; + Common::UniquePtr CreateBindGroup(const BindGroupCreateInfo& inCreateInfo) override; + Common::UniquePtr CreatePipelineLayout(const PipelineLayoutCreateInfo& inCreateInfo) override; + Common::UniquePtr CreateShaderModule(const ShaderModuleCreateInfo& inCreateInfo) override; + Common::UniquePtr CreateComputePipeline(const ComputePipelineCreateInfo& inCreateInfo) override; + Common::UniquePtr CreateRasterPipeline(const RasterPipelineCreateInfo& inCreateInfo) override; + Common::UniquePtr CreateCommandBuffer() override; + Common::UniquePtr CreateFence(bool inInitAsSignaled) override; + Common::UniquePtr CreateSemaphore() override; bool CheckSwapChainFormatSupport(Surface* inSurface, PixelFormat inFormat) override; TextureSubResourceCopyFootprint GetTextureSubResourceCopyFootprint(const Texture& texture, const TextureSubResourceInfo& subResourceInfo) override; DX12Gpu& GetGpu() const; ID3D12Device* GetNative() const; - ID3D12CommandAllocator* GetNativeCmdAllocator() const; - Common::UniqueRef AllocateRtvDescriptor() const; - Common::UniqueRef AllocateCbvSrvUavDescriptor() const; - Common::UniqueRef AllocateSamplerDescriptor() const; - Common::UniqueRef AllocateDsvDescriptor() const; + Common::UniquePtr AllocateRtvDescriptor() const; + Common::UniquePtr AllocateCbvSrvUavDescriptor() const; + Common::UniquePtr AllocateSamplerDescriptor() const; + Common::UniquePtr AllocateDsvDescriptor() const; private: void CreateNativeDevice(); void CreateNativeQueues(const DeviceCreateInfo& inCreateInfo); - void CreateNativeCmdAllocator(); void QueryNativeDescriptorSize(); void CreateDescriptorPools(); #if BUILD_CONFIG_DEBUG @@ -113,16 +111,15 @@ namespace RHI::DirectX12 { #endif DX12Gpu& gpu; - std::unordered_map>> queues; + std::unordered_map>> queues; uint32_t nativeRtvDescriptorSize; uint32_t nativeCbvSrvUavDescriptorSize; uint32_t nativeSamplerDescriptorSize; uint32_t nativeDsvDescriptorSize; - Common::UniqueRef rtvDescriptorPool; - Common::UniqueRef cbvSrvUavDescriptorPool; - Common::UniqueRef samplerDescriptorPool; - Common::UniqueRef dsvDescriptorPool; + Common::UniquePtr rtvDescriptorPool; + Common::UniquePtr cbvSrvUavDescriptorPool; + Common::UniquePtr samplerDescriptorPool; + Common::UniquePtr dsvDescriptorPool; ComPtr nativeDevice; - ComPtr nativeCmdAllocator; }; } diff --git a/Engine/Source/RHI-DirectX12/Include/RHI/DirectX12/Gpu.h b/Engine/Source/RHI-DirectX12/Include/RHI/DirectX12/Gpu.h index e3f411d74..ff9d4fd5d 100644 --- a/Engine/Source/RHI-DirectX12/Include/RHI/DirectX12/Gpu.h +++ b/Engine/Source/RHI-DirectX12/Include/RHI/DirectX12/Gpu.h @@ -21,7 +21,7 @@ namespace RHI::DirectX12 { ~DX12Gpu() override; GpuProperty GetProperty() override; - Common::UniqueRef RequestDevice(const DeviceCreateInfo& inCreateInfo) override; + Common::UniquePtr RequestDevice(const DeviceCreateInfo& inCreateInfo) override; DX12Instance& GetInstance() const; IDXGIAdapter1* GetNative() const; diff --git a/Engine/Source/RHI-DirectX12/Include/RHI/DirectX12/Instance.h b/Engine/Source/RHI-DirectX12/Include/RHI/DirectX12/Instance.h index fa1105fb2..224c232a5 100644 --- a/Engine/Source/RHI-DirectX12/Include/RHI/DirectX12/Instance.h +++ b/Engine/Source/RHI-DirectX12/Include/RHI/DirectX12/Instance.h @@ -55,7 +55,7 @@ namespace RHI::DirectX12 { #endif ComPtr nativeFactory; - std::vector> gpus; + std::vector> gpus; #if BUILD_CONFIG_DEBUG void* nativeExceptionHandler; std::unordered_map nativeDebugLayerExceptionHandlers; diff --git a/Engine/Source/RHI-DirectX12/Include/RHI/DirectX12/Sampler.h b/Engine/Source/RHI-DirectX12/Include/RHI/DirectX12/Sampler.h index b8b6b4e2a..df6a03cfe 100644 --- a/Engine/Source/RHI-DirectX12/Include/RHI/DirectX12/Sampler.h +++ b/Engine/Source/RHI-DirectX12/Include/RHI/DirectX12/Sampler.h @@ -24,6 +24,6 @@ namespace RHI::DirectX12 { private: void CreateDX12Descriptor(DX12Device& inDevice, const SamplerCreateInfo& inCreateInfo); - Common::UniqueRef descriptorAllocation; + Common::UniquePtr descriptorAllocation; }; } diff --git a/Engine/Source/RHI-DirectX12/Include/RHI/DirectX12/SwapChain.h b/Engine/Source/RHI-DirectX12/Include/RHI/DirectX12/SwapChain.h index 209a937bb..eb2a20d23 100644 --- a/Engine/Source/RHI-DirectX12/Include/RHI/DirectX12/SwapChain.h +++ b/Engine/Source/RHI-DirectX12/Include/RHI/DirectX12/SwapChain.h @@ -34,6 +34,6 @@ namespace RHI::DirectX12 { uint8_t textureNum; PresentMode presentMode; ComPtr nativeSwapChain; - std::vector> textures; + std::vector> textures; }; } diff --git a/Engine/Source/RHI-DirectX12/Include/RHI/DirectX12/Texture.h b/Engine/Source/RHI-DirectX12/Include/RHI/DirectX12/Texture.h index b0597bd8b..1e00c4a98 100644 --- a/Engine/Source/RHI-DirectX12/Include/RHI/DirectX12/Texture.h +++ b/Engine/Source/RHI-DirectX12/Include/RHI/DirectX12/Texture.h @@ -19,7 +19,7 @@ namespace RHI::DirectX12 { DX12Texture(DX12Device& inDevice, const TextureCreateInfo& inCreateInfo, ComPtr&& nativeResource); ~DX12Texture() override; - Common::UniqueRef CreateTextureView(const TextureViewCreateInfo& inCreateInfo) override; + Common::UniquePtr CreateTextureView(const TextureViewCreateInfo& inCreateInfo) override; ID3D12Resource* GetNative() const; diff --git a/Engine/Source/RHI-DirectX12/Include/RHI/DirectX12/TextureView.h b/Engine/Source/RHI-DirectX12/Include/RHI/DirectX12/TextureView.h index b05cce5d8..79eb1c968 100644 --- a/Engine/Source/RHI-DirectX12/Include/RHI/DirectX12/TextureView.h +++ b/Engine/Source/RHI-DirectX12/Include/RHI/DirectX12/TextureView.h @@ -26,6 +26,6 @@ namespace RHI::DirectX12 { void CreateNativeDescriptor(DX12Device& inDevice, const TextureViewCreateInfo& inCreateInfo); DX12Texture& texture; - Common::UniqueRef descriptorAllocation; + Common::UniquePtr descriptorAllocation; }; } diff --git a/Engine/Source/RHI-DirectX12/Src/Buffer.cpp b/Engine/Source/RHI-DirectX12/Src/Buffer.cpp index 186891480..ecadb4c21 100644 --- a/Engine/Source/RHI-DirectX12/Src/Buffer.cpp +++ b/Engine/Source/RHI-DirectX12/Src/Buffer.cpp @@ -88,9 +88,9 @@ namespace RHI::DirectX12 { nativeResource->Unmap(0, nullptr); } - Common::UniqueRef DX12Buffer::CreateBufferView(const BufferViewCreateInfo& inCreateInfo) + Common::UniquePtr DX12Buffer::CreateBufferView(const BufferViewCreateInfo& inCreateInfo) { - return Common::UniqueRef(new DX12BufferView(*this, inCreateInfo)); + return Common::UniquePtr(new DX12BufferView(*this, inCreateInfo)); } ID3D12Resource* DX12Buffer::GetNative() const diff --git a/Engine/Source/RHI-DirectX12/Src/BufferView.cpp b/Engine/Source/RHI-DirectX12/Src/BufferView.cpp index 1b3569b13..9e1a0fe45 100644 --- a/Engine/Source/RHI-DirectX12/Src/BufferView.cpp +++ b/Engine/Source/RHI-DirectX12/Src/BufferView.cpp @@ -20,7 +20,7 @@ namespace RHI::DirectX12 { CD3DX12_CPU_DESCRIPTOR_HANDLE DX12BufferView::GetNativeCpuDescriptorHandle() const { - return std::get>(nativeView)->GetCpuHandle(); + return std::get>(nativeView)->GetCpuHandle(); } const D3D12_VERTEX_BUFFER_VIEW& DX12BufferView::GetNativeVertexBufferView() const @@ -45,7 +45,7 @@ namespace RHI::DirectX12 { desc.SizeInBytes = Common::AlignUp(inCreateInfo.size); nativeView = buffer.GetDevice().AllocateCbvSrvUavDescriptor(); - buffer.GetDevice().GetNative()->CreateConstantBufferView(&desc, std::get>(nativeView)->GetCpuHandle()); + buffer.GetDevice().GetNative()->CreateConstantBufferView(&desc, std::get>(nativeView)->GetCpuHandle()); } else if (inCreateInfo.type == BufferViewType::storageBinding) { Assert((bufferUsages & BufferUsageBits::storage) != 0); auto storageViewInfo = std::get(inCreateInfo.extend); @@ -59,7 +59,7 @@ namespace RHI::DirectX12 { desc.Buffer.StructureByteStride = storageViewInfo.stride; nativeView = buffer.GetDevice().AllocateCbvSrvUavDescriptor(); - buffer.GetDevice().GetNative()->CreateShaderResourceView(buffer.GetNative(), &desc, std::get>(nativeView)->GetCpuHandle()); + buffer.GetDevice().GetNative()->CreateShaderResourceView(buffer.GetNative(), &desc, std::get>(nativeView)->GetCpuHandle()); } else if (inCreateInfo.type == BufferViewType::rwStorageBinding) { Assert((bufferUsages & BufferUsageBits::rwStorage) != 0); auto storageViewInfo = std::get(inCreateInfo.extend); @@ -73,7 +73,7 @@ namespace RHI::DirectX12 { desc.Buffer.StructureByteStride = storageViewInfo.stride; nativeView = buffer.GetDevice().AllocateCbvSrvUavDescriptor(); - buffer.GetDevice().GetNative()->CreateUnorderedAccessView(buffer.GetNative(), nullptr, &desc, std::get>(nativeView)->GetCpuHandle()); + buffer.GetDevice().GetNative()->CreateUnorderedAccessView(buffer.GetNative(), nullptr, &desc, std::get>(nativeView)->GetCpuHandle()); } else if (inCreateInfo.type == BufferViewType::vertex) { Assert((bufferUsages & BufferUsageBits::vertex) != 0); diff --git a/Engine/Source/RHI-DirectX12/Src/CommandBuffer.cpp b/Engine/Source/RHI-DirectX12/Src/CommandBuffer.cpp index 6f54645de..351e4628b 100644 --- a/Engine/Source/RHI-DirectX12/Src/CommandBuffer.cpp +++ b/Engine/Source/RHI-DirectX12/Src/CommandBuffer.cpp @@ -85,20 +85,26 @@ namespace RHI::DirectX12 { DX12CommandBuffer::DX12CommandBuffer(DX12Device& inDevice) : device(inDevice) { - AllocateDX12CommandList(inDevice); + CreateNativeCommandAllocator(inDevice); + CreateNativeCommandList(inDevice); runtimeDescriptorHeaps = Common::MakeUnique(inDevice); } DX12CommandBuffer::~DX12CommandBuffer() = default; - Common::UniqueRef DX12CommandBuffer::Begin() + Common::UniquePtr DX12CommandBuffer::Begin() { - return Common::UniqueRef(new DX12CommandRecorder(device, *this)); + return Common::UniquePtr(new DX12CommandRecorder(device, *this)); } - ID3D12GraphicsCommandList* DX12CommandBuffer::GetNative() const + ID3D12CommandAllocator* DX12CommandBuffer::GetNativeAllocator() const { - return dx12GraphicsCommandList.Get(); + return nativeCommandAllocator.Get(); + } + + ID3D12GraphicsCommandList* DX12CommandBuffer::GetNativeCmdList() const + { + return nativeGraphicsCommandList.Get(); } RuntimeDescriptorCompact* DX12CommandBuffer::GetRuntimeDescriptorHeaps() const @@ -106,9 +112,14 @@ namespace RHI::DirectX12 { return runtimeDescriptorHeaps.Get(); } - void DX12CommandBuffer::AllocateDX12CommandList(DX12Device& inDevice) + void DX12CommandBuffer::CreateNativeCommandAllocator(DX12Device& inDevice) + { + Assert(SUCCEEDED(inDevice.GetNative()->CreateCommandAllocator(D3D12_COMMAND_LIST_TYPE_DIRECT, IID_PPV_ARGS(&nativeCommandAllocator)))); + } + + void DX12CommandBuffer::CreateNativeCommandList(DX12Device& inDevice) { - Assert(SUCCEEDED(inDevice.GetNative()->CreateCommandList(0, D3D12_COMMAND_LIST_TYPE_DIRECT, inDevice.GetNativeCmdAllocator(), nullptr, IID_PPV_ARGS(&dx12GraphicsCommandList)))); - Assert(SUCCEEDED(dx12GraphicsCommandList->Close())); + Assert(SUCCEEDED(inDevice.GetNative()->CreateCommandList(0, D3D12_COMMAND_LIST_TYPE_DIRECT, nativeCommandAllocator.Get(), nullptr, IID_PPV_ARGS(&nativeGraphicsCommandList)))); + Assert(SUCCEEDED(nativeGraphicsCommandList->Close())); } } diff --git a/Engine/Source/RHI-DirectX12/Src/CommandRecorder.cpp b/Engine/Source/RHI-DirectX12/Src/CommandRecorder.cpp index f7b6c06a5..705ddafff 100644 --- a/Engine/Source/RHI-DirectX12/Src/CommandRecorder.cpp +++ b/Engine/Source/RHI-DirectX12/Src/CommandRecorder.cpp @@ -91,7 +91,7 @@ namespace RHI::DirectX12 { const auto* srcBuffer = static_cast(src); const auto* dstBuffer = static_cast(dst); - commandBuffer.GetNative()->CopyBufferRegion( + commandBuffer.GetNativeCmdList()->CopyBufferRegion( dstBuffer->GetNative(), copyInfo.dstOffset, srcBuffer->GetNative(), copyInfo.srcOffset, copyInfo.copySize); @@ -106,7 +106,7 @@ namespace RHI::DirectX12 { const CD3DX12_TEXTURE_COPY_LOCATION dstCopyRegion = GetNativeTextureCopyLocation(*dstTexture, copyInfo.textureSubResource); const D3D12_BOX srcBox = GetNativeBox(Common::UVec3Consts::zero, copyInfo.copyRegion); - commandBuffer.GetNative()->CopyTextureRegion( + commandBuffer.GetNativeCmdList()->CopyTextureRegion( &dstCopyRegion, copyInfo.textureOrigin.x, copyInfo.textureOrigin.y, @@ -124,7 +124,7 @@ namespace RHI::DirectX12 { const CD3DX12_TEXTURE_COPY_LOCATION dstCopyRegion = GetNativeBufferCopyLocationFromTextureLayout(device, *dstBuffer, *srcTexture, copyInfo); const D3D12_BOX srcBox = GetNativeBox(copyInfo.textureOrigin, copyInfo.copyRegion); - commandBuffer.GetNative()->CopyTextureRegion( + commandBuffer.GetNativeCmdList()->CopyTextureRegion( &dstCopyRegion, 0, 0, 0, &srcCopyRegion, @@ -140,7 +140,7 @@ namespace RHI::DirectX12 { const CD3DX12_TEXTURE_COPY_LOCATION dstCopyRegion = GetNativeTextureCopyLocation(*dstTexture, copyInfo.dstSubResource); const D3D12_BOX srcBox = GetNativeBox(copyInfo.srcOrigin, copyInfo.copyRegion); - commandBuffer.GetNative()->CopyTextureRegion( + commandBuffer.GetNativeCmdList()->CopyTextureRegion( &dstCopyRegion, copyInfo.dstOrigin.x, copyInfo.dstOrigin.y, @@ -173,8 +173,8 @@ namespace RHI::DirectX12 { computePipeline = static_cast(inPipeline); Assert(computePipeline); - commandBuffer.GetNative()->SetPipelineState(computePipeline->GetNative()); - commandBuffer.GetNative()->SetComputeRootSignature(computePipeline->GetPipelineLayout().GetNative()); + commandBuffer.GetNativeCmdList()->SetPipelineState(computePipeline->GetNative()); + commandBuffer.GetNativeCmdList()->SetComputeRootSignature(computePipeline->GetPipelineLayout().GetNative()); } void DX12ComputePassCommandRecorder::SetBindGroup(const uint8_t inLayoutIndex, BindGroup* inBindGroup) @@ -192,13 +192,13 @@ namespace RHI::DirectX12 { if (!t.has_value()) { return; } - commandBuffer.GetNative()->SetComputeRootDescriptorTable(t.value().second, commandBuffer.GetRuntimeDescriptorHeaps()->NewGpuDescriptorHandle(hlslBinding.rangeType, cpuDescriptorHandle)); + commandBuffer.GetNativeCmdList()->SetComputeRootDescriptorTable(t.value().second, commandBuffer.GetRuntimeDescriptorHeaps()->NewGpuDescriptorHandle(hlslBinding.rangeType, cpuDescriptorHandle)); } } void DX12ComputePassCommandRecorder::Dispatch(const size_t inGroupCountX, const size_t inGroupCountY, const size_t inGroupCountZ) { - commandBuffer.GetNative()->Dispatch(inGroupCountX, inGroupCountY, inGroupCountZ); + commandBuffer.GetNativeCmdList()->Dispatch(inGroupCountX, inGroupCountY, inGroupCountZ); } void DX12ComputePassCommandRecorder::EndPass() @@ -224,7 +224,7 @@ namespace RHI::DirectX12 { Assert(view); dsvHandle = view->GetNativeCpuDescriptorHandle(); } - inCmdBuffer.GetNative()->OMSetRenderTargets(rtvHandles.size(), rtvHandles.data(), false, dsvHandle.has_value() ? &dsvHandle.value() : nullptr); + inCmdBuffer.GetNativeCmdList()->OMSetRenderTargets(rtvHandles.size(), rtvHandles.data(), false, dsvHandle.has_value() ? &dsvHandle.value() : nullptr); // clear render targets for (auto i = 0; i < rtvHandles.size(); i++) { @@ -233,14 +233,14 @@ namespace RHI::DirectX12 { continue; } const auto* clearValue = reinterpret_cast(&colorAttachment.clearValue); - inCmdBuffer.GetNative()->ClearRenderTargetView(rtvHandles[i], clearValue, 0, nullptr); + inCmdBuffer.GetNativeCmdList()->ClearRenderTargetView(rtvHandles[i], clearValue, 0, nullptr); } if (dsvHandle.has_value()) { const auto& depthStencilAttachment = *inBeginInfo.depthStencilAttachment; if (depthStencilAttachment.depthLoadOp != LoadOp::clear && depthStencilAttachment.stencilLoadOp != LoadOp::clear) { return; } - inCmdBuffer.GetNative()->ClearDepthStencilView(dsvHandle.value(), GetDX12ClearFlags(depthStencilAttachment), depthStencilAttachment.depthClearValue, depthStencilAttachment.stencilClearValue, 0, nullptr); + inCmdBuffer.GetNativeCmdList()->ClearDepthStencilView(dsvHandle.value(), GetDX12ClearFlags(depthStencilAttachment), depthStencilAttachment.depthClearValue, depthStencilAttachment.stencilClearValue, 0, nullptr); } } @@ -256,8 +256,8 @@ namespace RHI::DirectX12 { rasterPipeline = static_cast(inPipeline); Assert(rasterPipeline); - commandBuffer.GetNative()->SetPipelineState(rasterPipeline->GetNative()); - commandBuffer.GetNative()->SetGraphicsRootSignature(rasterPipeline->GetPipelineLayout().GetNative()); + commandBuffer.GetNativeCmdList()->SetPipelineState(rasterPipeline->GetNative()); + commandBuffer.GetNativeCmdList()->SetGraphicsRootSignature(rasterPipeline->GetPipelineLayout().GetNative()); } void DX12RasterPassCommandRecorder::SetBindGroup(const uint8_t inLayoutIndex, BindGroup* inBindGroup) @@ -275,58 +275,58 @@ namespace RHI::DirectX12 { if (!t.has_value()) { return; } - commandBuffer.GetNative()->SetGraphicsRootDescriptorTable(t.value().second, commandBuffer.GetRuntimeDescriptorHeaps()->NewGpuDescriptorHandle(hlslBinding.rangeType, cpuDescriptorHandle)); + commandBuffer.GetNativeCmdList()->SetGraphicsRootDescriptorTable(t.value().second, commandBuffer.GetRuntimeDescriptorHeaps()->NewGpuDescriptorHandle(hlslBinding.rangeType, cpuDescriptorHandle)); } } void DX12RasterPassCommandRecorder::SetIndexBuffer(BufferView* inBufferView) { const auto* bufferView = static_cast(inBufferView); - commandBuffer.GetNative()->IASetIndexBuffer(&bufferView->GetNativeIndexBufferView()); + commandBuffer.GetNativeCmdList()->IASetIndexBuffer(&bufferView->GetNativeIndexBufferView()); } void DX12RasterPassCommandRecorder::SetVertexBuffer(const size_t inSlot, BufferView* inBufferView) { const auto* bufferView = static_cast(inBufferView); - commandBuffer.GetNative()->IASetVertexBuffers(inSlot, 1, &bufferView->GetNativeVertexBufferView()); + commandBuffer.GetNativeCmdList()->IASetVertexBuffers(inSlot, 1, &bufferView->GetNativeVertexBufferView()); } void DX12RasterPassCommandRecorder::Draw(const size_t inVertexCount, const size_t inInstanceCount, const size_t inFirstVertex, const size_t inFirstInstance) { - commandBuffer.GetNative()->DrawInstanced(inVertexCount, inInstanceCount, inFirstVertex, inFirstInstance); + commandBuffer.GetNativeCmdList()->DrawInstanced(inVertexCount, inInstanceCount, inFirstVertex, inFirstInstance); } void DX12RasterPassCommandRecorder::DrawIndexed(const size_t inIndexCount, const size_t inInstanceCount, const size_t inFirstIndex, const size_t inBaseVertex, const size_t inFirstInstance) { - commandBuffer.GetNative()->DrawIndexedInstanced(inIndexCount, inInstanceCount, inFirstIndex, inBaseVertex, inFirstInstance); + commandBuffer.GetNativeCmdList()->DrawIndexedInstanced(inIndexCount, inInstanceCount, inFirstIndex, inBaseVertex, inFirstInstance); } void DX12RasterPassCommandRecorder::SetViewport(const float inX, const float inY, const float inWidth, const float inHeight, const float inMinDepth, const float inMaxDepth) { // (x, y) = topLeft const CD3DX12_VIEWPORT viewport(inX, inY, inWidth, inHeight, inMinDepth, inMaxDepth); - commandBuffer.GetNative()->RSSetViewports(1, &viewport); + commandBuffer.GetNativeCmdList()->RSSetViewports(1, &viewport); } void DX12RasterPassCommandRecorder::SetScissor(uint32_t inLeft, uint32_t inTop, uint32_t inRight, uint32_t inBottom) { const CD3DX12_RECT scissor(inLeft, inTop, inRight, inBottom); - commandBuffer.GetNative()->RSSetScissorRects(1, &scissor); + commandBuffer.GetNativeCmdList()->RSSetScissorRects(1, &scissor); } void DX12RasterPassCommandRecorder::SetBlendConstant(const float* inConstants) { - commandBuffer.GetNative()->OMSetBlendFactor(inConstants); + commandBuffer.GetNativeCmdList()->OMSetBlendFactor(inConstants); } void DX12RasterPassCommandRecorder::SetPrimitiveTopology(PrimitiveTopology inPrimitiveTopology) { - commandBuffer.GetNative()->IASetPrimitiveTopology(EnumCast(inPrimitiveTopology)); + commandBuffer.GetNativeCmdList()->IASetPrimitiveTopology(EnumCast(inPrimitiveTopology)); } void DX12RasterPassCommandRecorder::SetStencilReference(uint32_t inReference) { - commandBuffer.GetNative()->OMSetStencilRef(inReference); + commandBuffer.GetNativeCmdList()->OMSetStencilRef(inReference); } void DX12RasterPassCommandRecorder::EndPass() @@ -337,11 +337,15 @@ namespace RHI::DirectX12 { : device(inDevice) , commandBuffer(inCmdBuffer) { - Assert(SUCCEEDED(inCmdBuffer.GetNative()->Reset(inDevice.GetNativeCmdAllocator(), nullptr))); + auto* nativeCmdAllocator = inCmdBuffer.GetNativeAllocator(); + auto* nativeCmdList = inCmdBuffer.GetNativeCmdList(); + Assert(nativeCmdAllocator != nullptr && nativeCmdList != nullptr); + Assert(SUCCEEDED(nativeCmdAllocator->Reset())); + Assert(SUCCEEDED(nativeCmdList->Reset(nativeCmdAllocator, nullptr))); inCmdBuffer.GetRuntimeDescriptorHeaps()->ResetUsed(); const auto activeHeap = inCmdBuffer.GetRuntimeDescriptorHeaps()->GetNative(); - inCmdBuffer.GetNative()->SetDescriptorHeaps(activeHeap.size(), activeHeap.data()); + nativeCmdList->SetDescriptorHeaps(activeHeap.size(), activeHeap.data()); } DX12CommandRecorder::~DX12CommandRecorder() = default; @@ -366,26 +370,26 @@ namespace RHI::DirectX12 { } const CD3DX12_RESOURCE_BARRIER resourceBarrier = CD3DX12_RESOURCE_BARRIER::Transition(resource, beforeState, afterState); - commandBuffer.GetNative()->ResourceBarrier(1, &resourceBarrier); + commandBuffer.GetNativeCmdList()->ResourceBarrier(1, &resourceBarrier); } - Common::UniqueRef DX12CommandRecorder::BeginCopyPass() + Common::UniquePtr DX12CommandRecorder::BeginCopyPass() { - return Common::UniqueRef(new DX12CopyPassCommandRecorder(device, *this, commandBuffer)); + return Common::UniquePtr(new DX12CopyPassCommandRecorder(device, *this, commandBuffer)); } - Common::UniqueRef DX12CommandRecorder::BeginComputePass() + Common::UniquePtr DX12CommandRecorder::BeginComputePass() { - return Common::UniqueRef(new DX12ComputePassCommandRecorder(device, *this, commandBuffer)); + return Common::UniquePtr(new DX12ComputePassCommandRecorder(device, *this, commandBuffer)); } - Common::UniqueRef DX12CommandRecorder::BeginRasterPass(const RasterPassBeginInfo& inBeginInfo) + Common::UniquePtr DX12CommandRecorder::BeginRasterPass(const RasterPassBeginInfo& inBeginInfo) { - return Common::UniqueRef(new DX12RasterPassCommandRecorder(device, *this, commandBuffer, inBeginInfo)); + return Common::UniquePtr(new DX12RasterPassCommandRecorder(device, *this, commandBuffer, inBeginInfo)); } void DX12CommandRecorder::End() { - Assert(SUCCEEDED(commandBuffer.GetNative()->Close())); + Assert(SUCCEEDED(commandBuffer.GetNativeCmdList()->Close())); } } diff --git a/Engine/Source/RHI-DirectX12/Src/Device.cpp b/Engine/Source/RHI-DirectX12/Src/Device.cpp index 76a308c8b..953b76715 100644 --- a/Engine/Source/RHI-DirectX12/Src/Device.cpp +++ b/Engine/Source/RHI-DirectX12/Src/Device.cpp @@ -64,7 +64,7 @@ namespace RHI::DirectX12 { return free > 0; } - Common::UniqueRef DescriptorHeapNode::Allocate() + Common::UniquePtr DescriptorHeapNode::Allocate() { Assert(HasFreeSlot()); @@ -117,7 +117,7 @@ namespace RHI::DirectX12 { { } - Common::UniqueRef DescriptorPool::Allocate() + Common::UniquePtr DescriptorPool::Allocate() { for (auto& node : heapNodes) { if (node.HasFreeSlot()) { @@ -147,7 +147,6 @@ namespace RHI::DirectX12 { { CreateNativeDevice(); CreateNativeQueues(inCreateInfo); - CreateNativeCmdAllocator(); QueryNativeDescriptorSize(); CreateDescriptorPools(); #if BUILD_CONFIG_DEBUG @@ -174,77 +173,72 @@ namespace RHI::DirectX12 { return queueArray[inIndex].Get(); } - Common::UniqueRef DX12Device::CreateSurface(const SurfaceCreateInfo& inCreateInfo) + Common::UniquePtr DX12Device::CreateSurface(const SurfaceCreateInfo& inCreateInfo) { return { new DX12Surface(inCreateInfo) }; } - Common::UniqueRef DX12Device::CreateSwapChain(const SwapChainCreateInfo& inCreateInfo) + Common::UniquePtr DX12Device::CreateSwapChain(const SwapChainCreateInfo& inCreateInfo) { return { new DX12SwapChain(*this, inCreateInfo) }; } - ID3D12CommandAllocator* DX12Device::GetNativeCmdAllocator() const - { - return nativeCmdAllocator.Get(); - } - - Common::UniqueRef DX12Device::CreateBuffer(const BufferCreateInfo& inCreateInfo) + Common::UniquePtr DX12Device::CreateBuffer(const BufferCreateInfo& inCreateInfo) { return { new DX12Buffer(*this, inCreateInfo) }; } - Common::UniqueRef DX12Device::CreateTexture(const TextureCreateInfo& inCreateInfo) + Common::UniquePtr DX12Device::CreateTexture(const TextureCreateInfo& inCreateInfo) { return { new DX12Texture(*this, inCreateInfo) }; } - Common::UniqueRef DX12Device::CreateSampler(const SamplerCreateInfo& inCreateInfo) + Common::UniquePtr DX12Device::CreateSampler(const SamplerCreateInfo& inCreateInfo) { return { new DX12Sampler(*this, inCreateInfo) }; } - Common::UniqueRef DX12Device::CreateBindGroupLayout(const BindGroupLayoutCreateInfo& inCreateInfo) + Common::UniquePtr DX12Device::CreateBindGroupLayout(const BindGroupLayoutCreateInfo& inCreateInfo) { return { new DX12BindGroupLayout(inCreateInfo) }; } - Common::UniqueRef DX12Device::CreateBindGroup(const BindGroupCreateInfo& inCreateInfo) + Common::UniquePtr DX12Device::CreateBindGroup(const BindGroupCreateInfo& inCreateInfo) { return { new DX12BindGroup(inCreateInfo) }; } - Common::UniqueRef DX12Device::CreatePipelineLayout(const PipelineLayoutCreateInfo& inCreateInfo) + Common::UniquePtr DX12Device::CreatePipelineLayout(const PipelineLayoutCreateInfo& inCreateInfo) { return { new DX12PipelineLayout(*this, inCreateInfo) }; } - Common::UniqueRef DX12Device::CreateShaderModule(const ShaderModuleCreateInfo& inCreateInfo) + Common::UniquePtr DX12Device::CreateShaderModule(const ShaderModuleCreateInfo& inCreateInfo) { return { new DX12ShaderModule(inCreateInfo) }; } - Common::UniqueRef DX12Device::CreateComputePipeline(const ComputePipelineCreateInfo& inCreateInfo) + Common::UniquePtr DX12Device::CreateComputePipeline(const ComputePipelineCreateInfo& inCreateInfo) { return { new DX12ComputePipeline(*this, inCreateInfo) }; } - Common::UniqueRef DX12Device::CreateRasterPipeline(const RasterPipelineCreateInfo& inCreateInfo) + Common::UniquePtr DX12Device::CreateRasterPipeline(const RasterPipelineCreateInfo& inCreateInfo) { return { new DX12RasterPipeline(*this, inCreateInfo) }; } - Common::UniqueRef DX12Device::CreateCommandBuffer() + Common::UniquePtr DX12Device::CreateCommandBuffer() { return { new DX12CommandBuffer(*this) }; } - Common::UniqueRef DX12Device::CreateFence(const bool inInitAsSignaled) + Common::UniquePtr DX12Device::CreateFence(const bool inInitAsSignaled) { return { new DX12Fence(*this, inInitAsSignaled) }; } - Common::UniqueRef DX12Device::CreateSemaphore() + Common::UniquePtr DX12Device::CreateSemaphore() { return { new DX12Semaphore(*this) }; } @@ -289,22 +283,22 @@ namespace RHI::DirectX12 { return nativeDevice.Get(); } - Common::UniqueRef DX12Device::AllocateRtvDescriptor() const + Common::UniquePtr DX12Device::AllocateRtvDescriptor() const { return rtvDescriptorPool->Allocate(); } - Common::UniqueRef DX12Device::AllocateCbvSrvUavDescriptor() const + Common::UniquePtr DX12Device::AllocateCbvSrvUavDescriptor() const { return cbvSrvUavDescriptorPool->Allocate(); } - Common::UniqueRef DX12Device::AllocateSamplerDescriptor() const + Common::UniquePtr DX12Device::AllocateSamplerDescriptor() const { return samplerDescriptorPool->Allocate(); } - Common::UniqueRef DX12Device::AllocateDsvDescriptor() const + Common::UniquePtr DX12Device::AllocateDsvDescriptor() const { return dsvDescriptorPool->Allocate(); } @@ -327,7 +321,7 @@ namespace RHI::DirectX12 { } for (auto iter : queueNumMap) { - std::vector> tempQueues(iter.second); + std::vector> tempQueues(iter.second); D3D12_COMMAND_QUEUE_DESC queueDesc {}; queueDesc.Flags = D3D12_COMMAND_QUEUE_FLAG_NONE; @@ -342,11 +336,6 @@ namespace RHI::DirectX12 { } } - void DX12Device::CreateNativeCmdAllocator() - { - nativeDevice->CreateCommandAllocator(D3D12_COMMAND_LIST_TYPE_DIRECT, IID_PPV_ARGS(&nativeCmdAllocator)); - } - void DX12Device::QueryNativeDescriptorSize() { nativeRtvDescriptorSize = nativeDevice->GetDescriptorHandleIncrementSize(D3D12_DESCRIPTOR_HEAP_TYPE_RTV); diff --git a/Engine/Source/RHI-DirectX12/Src/Gpu.cpp b/Engine/Source/RHI-DirectX12/Src/Gpu.cpp index 9729a1c23..f80bed93b 100644 --- a/Engine/Source/RHI-DirectX12/Src/Gpu.cpp +++ b/Engine/Source/RHI-DirectX12/Src/Gpu.cpp @@ -37,8 +37,8 @@ namespace RHI::DirectX12 { return nativeAdapter.Get(); } - Common::UniqueRef DX12Gpu::RequestDevice(const DeviceCreateInfo& inCreateInfo) + Common::UniquePtr DX12Gpu::RequestDevice(const DeviceCreateInfo& inCreateInfo) { - return Common::UniqueRef(new DX12Device(*this, inCreateInfo)); + return Common::UniquePtr(new DX12Device(*this, inCreateInfo)); } } diff --git a/Engine/Source/RHI-DirectX12/Src/Queue.cpp b/Engine/Source/RHI-DirectX12/Src/Queue.cpp index 27cf81e2a..ca700b262 100644 --- a/Engine/Source/RHI-DirectX12/Src/Queue.cpp +++ b/Engine/Source/RHI-DirectX12/Src/Queue.cpp @@ -24,7 +24,7 @@ namespace RHI::DirectX12 { Assert(SUCCEEDED(nativeCmdQueue->Wait(waitSemaphore->GetNative(), 1))); } - std::array cmdListsToExecute = { commandBuffer->GetNative() }; + std::array cmdListsToExecute = { commandBuffer->GetNativeCmdList() }; nativeCmdQueue->ExecuteCommandLists(cmdListsToExecute.size(), cmdListsToExecute.data()); for (auto i = 0; i < inSubmitInfo.signalSemaphores.size(); i++) { diff --git a/Engine/Source/RHI-DirectX12/Src/Texture.cpp b/Engine/Source/RHI-DirectX12/Src/Texture.cpp index 39d6398d5..0b96994fb 100644 --- a/Engine/Source/RHI-DirectX12/Src/Texture.cpp +++ b/Engine/Source/RHI-DirectX12/Src/Texture.cpp @@ -26,9 +26,9 @@ namespace RHI::DirectX12 { DX12Texture::~DX12Texture() = default; - Common::UniqueRef DX12Texture::CreateTextureView(const TextureViewCreateInfo& inCreateInfo) + Common::UniquePtr DX12Texture::CreateTextureView(const TextureViewCreateInfo& inCreateInfo) { - return Common::UniqueRef(new DX12TextureView(static_cast(device), *this, inCreateInfo)); + return Common::UniquePtr(new DX12TextureView(static_cast(device), *this, inCreateInfo)); } ID3D12Resource* DX12Texture::GetNative() const diff --git a/Engine/Source/RHI-Dummy/Include/RHI/Dummy/Buffer.h b/Engine/Source/RHI-Dummy/Include/RHI/Dummy/Buffer.h index 379b34c18..58c779d30 100644 --- a/Engine/Source/RHI-Dummy/Include/RHI/Dummy/Buffer.h +++ b/Engine/Source/RHI-Dummy/Include/RHI/Dummy/Buffer.h @@ -16,7 +16,7 @@ namespace RHI::Dummy { void* Map(MapMode mapMode, size_t offset, size_t length) override; void UnMap() override; - Common::UniqueRef CreateBufferView(const BufferViewCreateInfo& createInfo) override; + Common::UniquePtr CreateBufferView(const BufferViewCreateInfo& createInfo) override; private: std::vector dummyData; }; diff --git a/Engine/Source/RHI-Dummy/Include/RHI/Dummy/CommandBuffer.h b/Engine/Source/RHI-Dummy/Include/RHI/Dummy/CommandBuffer.h index 2c20be032..3334920b2 100644 --- a/Engine/Source/RHI-Dummy/Include/RHI/Dummy/CommandBuffer.h +++ b/Engine/Source/RHI-Dummy/Include/RHI/Dummy/CommandBuffer.h @@ -12,6 +12,6 @@ namespace RHI::Dummy { NonCopyable(DummyCommandBuffer) DummyCommandBuffer(); - Common::UniqueRef Begin() override; + Common::UniquePtr Begin() override; }; } diff --git a/Engine/Source/RHI-Dummy/Include/RHI/Dummy/CommandRecorder.h b/Engine/Source/RHI-Dummy/Include/RHI/Dummy/CommandRecorder.h index 746a04564..b1c983ab4 100644 --- a/Engine/Source/RHI-Dummy/Include/RHI/Dummy/CommandRecorder.h +++ b/Engine/Source/RHI-Dummy/Include/RHI/Dummy/CommandRecorder.h @@ -16,9 +16,9 @@ namespace RHI::Dummy { ~DummyCommandRecorder() override; void ResourceBarrier(const Barrier& barrier) override; - Common::UniqueRef BeginCopyPass() override; - Common::UniqueRef BeginComputePass() override; - Common::UniqueRef BeginRasterPass(const RasterPassBeginInfo& beginInfo) override; + Common::UniquePtr BeginCopyPass() override; + Common::UniquePtr BeginComputePass() override; + Common::UniquePtr BeginRasterPass(const RasterPassBeginInfo& beginInfo) override; void End() override; private: diff --git a/Engine/Source/RHI-Dummy/Include/RHI/Dummy/Device.h b/Engine/Source/RHI-Dummy/Include/RHI/Dummy/Device.h index 4310cf2f8..993d78d76 100644 --- a/Engine/Source/RHI-Dummy/Include/RHI/Dummy/Device.h +++ b/Engine/Source/RHI-Dummy/Include/RHI/Dummy/Device.h @@ -17,25 +17,25 @@ namespace RHI::Dummy { size_t GetQueueNum(QueueType type) override; Queue* GetQueue(QueueType type, size_t index) override; - Common::UniqueRef CreateSurface(const RHI::SurfaceCreateInfo &createInfo) override; - Common::UniqueRef CreateSwapChain(const SwapChainCreateInfo& createInfo) override; - Common::UniqueRef CreateBuffer(const BufferCreateInfo& createInfo) override; - Common::UniqueRef CreateTexture(const TextureCreateInfo& createInfo) override; - Common::UniqueRef CreateSampler(const SamplerCreateInfo& createInfo) override; - Common::UniqueRef CreateBindGroupLayout(const BindGroupLayoutCreateInfo& createInfo) override; - Common::UniqueRef CreateBindGroup(const BindGroupCreateInfo& createInfo) override; - Common::UniqueRef CreatePipelineLayout(const PipelineLayoutCreateInfo& createInfo) override; - Common::UniqueRef CreateShaderModule(const ShaderModuleCreateInfo& createInfo) override; - Common::UniqueRef CreateComputePipeline(const ComputePipelineCreateInfo& createInfo) override; - Common::UniqueRef CreateRasterPipeline(const RasterPipelineCreateInfo& createInfo) override; - Common::UniqueRef CreateCommandBuffer() override; - Common::UniqueRef CreateFence(bool bInitAsSignaled) override; - Common::UniqueRef CreateSemaphore() override; + Common::UniquePtr CreateSurface(const RHI::SurfaceCreateInfo &createInfo) override; + Common::UniquePtr CreateSwapChain(const SwapChainCreateInfo& createInfo) override; + Common::UniquePtr CreateBuffer(const BufferCreateInfo& createInfo) override; + Common::UniquePtr CreateTexture(const TextureCreateInfo& createInfo) override; + Common::UniquePtr CreateSampler(const SamplerCreateInfo& createInfo) override; + Common::UniquePtr CreateBindGroupLayout(const BindGroupLayoutCreateInfo& createInfo) override; + Common::UniquePtr CreateBindGroup(const BindGroupCreateInfo& createInfo) override; + Common::UniquePtr CreatePipelineLayout(const PipelineLayoutCreateInfo& createInfo) override; + Common::UniquePtr CreateShaderModule(const ShaderModuleCreateInfo& createInfo) override; + Common::UniquePtr CreateComputePipeline(const ComputePipelineCreateInfo& createInfo) override; + Common::UniquePtr CreateRasterPipeline(const RasterPipelineCreateInfo& createInfo) override; + Common::UniquePtr CreateCommandBuffer() override; + Common::UniquePtr CreateFence(bool bInitAsSignaled) override; + Common::UniquePtr CreateSemaphore() override; bool CheckSwapChainFormatSupport(Surface *surface, PixelFormat format) override; TextureSubResourceCopyFootprint GetTextureSubResourceCopyFootprint(const Texture& texture, const TextureSubResourceInfo& subResourceInfo) override; private: - Common::UniqueRef dummyQueue; + Common::UniquePtr dummyQueue; }; } diff --git a/Engine/Source/RHI-Dummy/Include/RHI/Dummy/Gpu.h b/Engine/Source/RHI-Dummy/Include/RHI/Dummy/Gpu.h index 2b8590ac0..932e5de14 100644 --- a/Engine/Source/RHI-Dummy/Include/RHI/Dummy/Gpu.h +++ b/Engine/Source/RHI-Dummy/Include/RHI/Dummy/Gpu.h @@ -13,6 +13,6 @@ namespace RHI::Dummy { DummyGpu(); ~DummyGpu() override; GpuProperty GetProperty() override; - Common::UniqueRef RequestDevice(const DeviceCreateInfo& createInfo) override; + Common::UniquePtr RequestDevice(const DeviceCreateInfo& createInfo) override; }; } diff --git a/Engine/Source/RHI-Dummy/Include/RHI/Dummy/Instance.h b/Engine/Source/RHI-Dummy/Include/RHI/Dummy/Instance.h index 633b26a41..812111a11 100644 --- a/Engine/Source/RHI-Dummy/Include/RHI/Dummy/Instance.h +++ b/Engine/Source/RHI-Dummy/Include/RHI/Dummy/Instance.h @@ -22,6 +22,6 @@ namespace RHI::Dummy { void Destroy() override; private: - Common::UniqueRef dummyGpu; + Common::UniquePtr dummyGpu; }; } diff --git a/Engine/Source/RHI-Dummy/Include/RHI/Dummy/SwapChain.h b/Engine/Source/RHI-Dummy/Include/RHI/Dummy/SwapChain.h index 8e33b4e9b..16e8b1795 100644 --- a/Engine/Source/RHI-Dummy/Include/RHI/Dummy/SwapChain.h +++ b/Engine/Source/RHI-Dummy/Include/RHI/Dummy/SwapChain.h @@ -24,6 +24,6 @@ namespace RHI::Dummy { private: bool pingPong; - std::vector> dummyTextures; + std::vector> dummyTextures; }; } diff --git a/Engine/Source/RHI-Dummy/Include/RHI/Dummy/Texture.h b/Engine/Source/RHI-Dummy/Include/RHI/Dummy/Texture.h index a56bc3b67..c395132d7 100644 --- a/Engine/Source/RHI-Dummy/Include/RHI/Dummy/Texture.h +++ b/Engine/Source/RHI-Dummy/Include/RHI/Dummy/Texture.h @@ -13,6 +13,6 @@ namespace RHI::Dummy { explicit DummyTexture(const TextureCreateInfo& createInfo); ~DummyTexture() override; - Common::UniqueRef CreateTextureView(const TextureViewCreateInfo& createInfo) override; + Common::UniquePtr CreateTextureView(const TextureViewCreateInfo& createInfo) override; }; } diff --git a/Engine/Source/RHI-Dummy/Src/Buffer.cpp b/Engine/Source/RHI-Dummy/Src/Buffer.cpp index 4b6aac9b7..2530cec0f 100644 --- a/Engine/Source/RHI-Dummy/Src/Buffer.cpp +++ b/Engine/Source/RHI-Dummy/Src/Buffer.cpp @@ -23,8 +23,8 @@ namespace RHI::Dummy { { } - Common::UniqueRef DummyBuffer::CreateBufferView(const BufferViewCreateInfo& createInfo) + Common::UniquePtr DummyBuffer::CreateBufferView(const BufferViewCreateInfo& createInfo) { - return Common::UniqueRef(new DummyBufferView(createInfo)); + return Common::UniquePtr(new DummyBufferView(createInfo)); } } diff --git a/Engine/Source/RHI-Dummy/Src/CommandBuffer.cpp b/Engine/Source/RHI-Dummy/Src/CommandBuffer.cpp index ef9694601..59e0ce3a8 100644 --- a/Engine/Source/RHI-Dummy/Src/CommandBuffer.cpp +++ b/Engine/Source/RHI-Dummy/Src/CommandBuffer.cpp @@ -8,7 +8,7 @@ namespace RHI::Dummy { DummyCommandBuffer::DummyCommandBuffer() = default; - Common::UniqueRef DummyCommandBuffer::Begin() + Common::UniquePtr DummyCommandBuffer::Begin() { return { new DummyCommandRecorder(*this) }; } diff --git a/Engine/Source/RHI-Dummy/Src/CommandRecorder.cpp b/Engine/Source/RHI-Dummy/Src/CommandRecorder.cpp index d58875a77..f981c7c25 100644 --- a/Engine/Source/RHI-Dummy/Src/CommandRecorder.cpp +++ b/Engine/Source/RHI-Dummy/Src/CommandRecorder.cpp @@ -132,19 +132,19 @@ namespace RHI::Dummy { { } - Common::UniqueRef DummyCommandRecorder::BeginCopyPass() + Common::UniquePtr DummyCommandRecorder::BeginCopyPass() { - return Common::UniqueRef(new DummyCopyPassCommandRecorder(dummyCommandBuffer)); + return Common::UniquePtr(new DummyCopyPassCommandRecorder(dummyCommandBuffer)); } - Common::UniqueRef DummyCommandRecorder::BeginComputePass() + Common::UniquePtr DummyCommandRecorder::BeginComputePass() { - return Common::UniqueRef(new DummyComputePassCommandRecorder(dummyCommandBuffer)); + return Common::UniquePtr(new DummyComputePassCommandRecorder(dummyCommandBuffer)); } - Common::UniqueRef DummyCommandRecorder::BeginRasterPass(const RasterPassBeginInfo& beginInfo) + Common::UniquePtr DummyCommandRecorder::BeginRasterPass(const RasterPassBeginInfo& beginInfo) { - return Common::UniqueRef(new DummyRasterPassCommandRecorder(dummyCommandBuffer)); + return Common::UniquePtr(new DummyRasterPassCommandRecorder(dummyCommandBuffer)); } void DummyCommandRecorder::End() diff --git a/Engine/Source/RHI-Dummy/Src/Device.cpp b/Engine/Source/RHI-Dummy/Src/Device.cpp index 3b75ecadc..6479231e5 100644 --- a/Engine/Source/RHI-Dummy/Src/Device.cpp +++ b/Engine/Source/RHI-Dummy/Src/Device.cpp @@ -38,72 +38,72 @@ namespace RHI::Dummy { return dummyQueue.Get(); } - Common::UniqueRef DummyDevice::CreateSurface(const SurfaceCreateInfo& createInfo) + Common::UniquePtr DummyDevice::CreateSurface(const SurfaceCreateInfo& createInfo) { return { new DummySurface(createInfo) }; } - Common::UniqueRef DummyDevice::CreateSwapChain(const SwapChainCreateInfo& createInfo) + Common::UniquePtr DummyDevice::CreateSwapChain(const SwapChainCreateInfo& createInfo) { return { new DummySwapChain(createInfo) }; } - Common::UniqueRef DummyDevice::CreateBuffer(const BufferCreateInfo& createInfo) + Common::UniquePtr DummyDevice::CreateBuffer(const BufferCreateInfo& createInfo) { return { new DummyBuffer(createInfo) }; } - Common::UniqueRef DummyDevice::CreateTexture(const TextureCreateInfo& createInfo) + Common::UniquePtr DummyDevice::CreateTexture(const TextureCreateInfo& createInfo) { return { new DummyTexture(createInfo) }; } - Common::UniqueRef DummyDevice::CreateSampler(const SamplerCreateInfo& createInfo) + Common::UniquePtr DummyDevice::CreateSampler(const SamplerCreateInfo& createInfo) { return { new DummySampler(createInfo) }; } - Common::UniqueRef DummyDevice::CreateBindGroupLayout(const BindGroupLayoutCreateInfo& createInfo) + Common::UniquePtr DummyDevice::CreateBindGroupLayout(const BindGroupLayoutCreateInfo& createInfo) { return { new DummyBindGroupLayout(createInfo) }; } - Common::UniqueRef DummyDevice::CreateBindGroup(const BindGroupCreateInfo& createInfo) + Common::UniquePtr DummyDevice::CreateBindGroup(const BindGroupCreateInfo& createInfo) { return { new DummyBindGroup(createInfo) }; } - Common::UniqueRef DummyDevice::CreatePipelineLayout(const PipelineLayoutCreateInfo& createInfo) + Common::UniquePtr DummyDevice::CreatePipelineLayout(const PipelineLayoutCreateInfo& createInfo) { return { new DummyPipelineLayout(createInfo) }; } - Common::UniqueRef DummyDevice::CreateShaderModule(const ShaderModuleCreateInfo& createInfo) + Common::UniquePtr DummyDevice::CreateShaderModule(const ShaderModuleCreateInfo& createInfo) { return { new DummyShaderModule(createInfo) }; } - Common::UniqueRef DummyDevice::CreateComputePipeline(const ComputePipelineCreateInfo& createInfo) + Common::UniquePtr DummyDevice::CreateComputePipeline(const ComputePipelineCreateInfo& createInfo) { return { new DummyComputePipeline(createInfo) }; } - Common::UniqueRef DummyDevice::CreateRasterPipeline(const RasterPipelineCreateInfo& createInfo) + Common::UniquePtr DummyDevice::CreateRasterPipeline(const RasterPipelineCreateInfo& createInfo) { return { new DummyRasterPipeline(createInfo) }; } - Common::UniqueRef DummyDevice::CreateCommandBuffer() + Common::UniquePtr DummyDevice::CreateCommandBuffer() { return { new DummyCommandBuffer() }; } - Common::UniqueRef DummyDevice::CreateFence(const bool bInitAsSignaled) + Common::UniquePtr DummyDevice::CreateFence(const bool bInitAsSignaled) { return { new DummyFence(*this, bInitAsSignaled) }; } - Common::UniqueRef DummyDevice::CreateSemaphore() + Common::UniquePtr DummyDevice::CreateSemaphore() { return { new DummySemaphore(*this) }; } diff --git a/Engine/Source/RHI-Dummy/Src/Gpu.cpp b/Engine/Source/RHI-Dummy/Src/Gpu.cpp index 255e499bf..2d9316678 100644 --- a/Engine/Source/RHI-Dummy/Src/Gpu.cpp +++ b/Engine/Source/RHI-Dummy/Src/Gpu.cpp @@ -15,7 +15,7 @@ namespace RHI::Dummy { return {}; } - Common::UniqueRef DummyGpu::RequestDevice(const DeviceCreateInfo& createInfo) + Common::UniquePtr DummyGpu::RequestDevice(const DeviceCreateInfo& createInfo) { return { new DummyDevice(createInfo) }; } diff --git a/Engine/Source/RHI-Dummy/Src/Texture.cpp b/Engine/Source/RHI-Dummy/Src/Texture.cpp index 55977e5ec..9dca25f7e 100644 --- a/Engine/Source/RHI-Dummy/Src/Texture.cpp +++ b/Engine/Source/RHI-Dummy/Src/Texture.cpp @@ -13,8 +13,8 @@ namespace RHI::Dummy { DummyTexture::~DummyTexture() = default; - Common::UniqueRef DummyTexture::CreateTextureView(const TextureViewCreateInfo& createInfo) + Common::UniquePtr DummyTexture::CreateTextureView(const TextureViewCreateInfo& createInfo) { - return Common::UniqueRef(new DummyTextureView(createInfo)); + return Common::UniquePtr(new DummyTextureView(createInfo)); } } diff --git a/Engine/Source/RHI-Vulkan/Include/RHI/Vulkan/Buffer.h b/Engine/Source/RHI-Vulkan/Include/RHI/Vulkan/Buffer.h index 25a683f56..5f7dda84c 100644 --- a/Engine/Source/RHI-Vulkan/Include/RHI/Vulkan/Buffer.h +++ b/Engine/Source/RHI-Vulkan/Include/RHI/Vulkan/Buffer.h @@ -21,7 +21,7 @@ namespace RHI::Vulkan { void* Map(MapMode inMapMode, size_t inOffset, size_t inLength) override; void UnMap() override; - Common::UniqueRef CreateBufferView(const BufferViewCreateInfo& inCreateInfo) override; + Common::UniquePtr CreateBufferView(const BufferViewCreateInfo& inCreateInfo) override; VkBuffer GetNative() const; BufferUsageFlags GetUsages() const; diff --git a/Engine/Source/RHI-Vulkan/Include/RHI/Vulkan/CommandBuffer.h b/Engine/Source/RHI-Vulkan/Include/RHI/Vulkan/CommandBuffer.h index bb8f4022e..52141746f 100644 --- a/Engine/Source/RHI-Vulkan/Include/RHI/Vulkan/CommandBuffer.h +++ b/Engine/Source/RHI-Vulkan/Include/RHI/Vulkan/CommandBuffer.h @@ -19,7 +19,7 @@ namespace RHI::Vulkan { VulkanCommandBuffer(VulkanDevice& inDevice, VkCommandPool inNativeCmdPool); ~VulkanCommandBuffer() override; - Common::UniqueRef Begin() override; + Common::UniquePtr Begin() override; VkCommandBuffer GetNative() const; diff --git a/Engine/Source/RHI-Vulkan/Include/RHI/Vulkan/CommandRecorder.h b/Engine/Source/RHI-Vulkan/Include/RHI/Vulkan/CommandRecorder.h index 3965710b8..31c5deb51 100644 --- a/Engine/Source/RHI-Vulkan/Include/RHI/Vulkan/CommandRecorder.h +++ b/Engine/Source/RHI-Vulkan/Include/RHI/Vulkan/CommandRecorder.h @@ -22,9 +22,9 @@ namespace RHI::Vulkan { ~VulkanCommandRecorder() override; void ResourceBarrier(const Barrier& inBarrier) override; - Common::UniqueRef BeginCopyPass() override; - Common::UniqueRef BeginComputePass() override; - Common::UniqueRef BeginRasterPass(const RasterPassBeginInfo& inBeginInfo) override; + Common::UniquePtr BeginCopyPass() override; + Common::UniquePtr BeginComputePass() override; + Common::UniquePtr BeginRasterPass(const RasterPassBeginInfo& inBeginInfo) override; void End() override; private: diff --git a/Engine/Source/RHI-Vulkan/Include/RHI/Vulkan/Device.h b/Engine/Source/RHI-Vulkan/Include/RHI/Vulkan/Device.h index a29ed5abb..aa7578604 100644 --- a/Engine/Source/RHI-Vulkan/Include/RHI/Vulkan/Device.h +++ b/Engine/Source/RHI-Vulkan/Include/RHI/Vulkan/Device.h @@ -25,20 +25,20 @@ namespace RHI::Vulkan { size_t GetQueueNum(QueueType inType) override; Queue* GetQueue(QueueType inType, size_t inIndex) override; - Common::UniqueRef CreateSurface(const SurfaceCreateInfo& inCreateInfo) override; - Common::UniqueRef CreateSwapChain(const SwapChainCreateInfo& inCreateInfo) override; - Common::UniqueRef CreateBuffer(const BufferCreateInfo& inCreateInfo) override; - Common::UniqueRef CreateTexture(const TextureCreateInfo& inCreateInfo) override; - Common::UniqueRef CreateSampler(const SamplerCreateInfo& inCreateInfo) override; - Common::UniqueRef CreateBindGroupLayout(const BindGroupLayoutCreateInfo& inCreateInfo) override; - Common::UniqueRef CreateBindGroup(const BindGroupCreateInfo& inCreateInfo) override; - Common::UniqueRef CreatePipelineLayout(const PipelineLayoutCreateInfo& inCreateInfo) override; - Common::UniqueRef CreateShaderModule(const ShaderModuleCreateInfo& inCreateInfo) override; - Common::UniqueRef CreateComputePipeline(const ComputePipelineCreateInfo& inCreateInfo) override; - Common::UniqueRef CreateRasterPipeline(const RasterPipelineCreateInfo& inCreateInfo) override; - Common::UniqueRef CreateCommandBuffer() override; - Common::UniqueRef CreateFence(bool initAsSignaled) override; - Common::UniqueRef CreateSemaphore() override; + Common::UniquePtr CreateSurface(const SurfaceCreateInfo& inCreateInfo) override; + Common::UniquePtr CreateSwapChain(const SwapChainCreateInfo& inCreateInfo) override; + Common::UniquePtr CreateBuffer(const BufferCreateInfo& inCreateInfo) override; + Common::UniquePtr CreateTexture(const TextureCreateInfo& inCreateInfo) override; + Common::UniquePtr CreateSampler(const SamplerCreateInfo& inCreateInfo) override; + Common::UniquePtr CreateBindGroupLayout(const BindGroupLayoutCreateInfo& inCreateInfo) override; + Common::UniquePtr CreateBindGroup(const BindGroupCreateInfo& inCreateInfo) override; + Common::UniquePtr CreatePipelineLayout(const PipelineLayoutCreateInfo& inCreateInfo) override; + Common::UniquePtr CreateShaderModule(const ShaderModuleCreateInfo& inCreateInfo) override; + Common::UniquePtr CreateComputePipeline(const ComputePipelineCreateInfo& inCreateInfo) override; + Common::UniquePtr CreateRasterPipeline(const RasterPipelineCreateInfo& inCreateInfo) override; + Common::UniquePtr CreateCommandBuffer() override; + Common::UniquePtr CreateFence(bool initAsSignaled) override; + Common::UniquePtr CreateSemaphore() override; bool CheckSwapChainFormatSupport(Surface* inSurface, PixelFormat inFormat) override; TextureSubResourceCopyFootprint GetTextureSubResourceCopyFootprint(const Texture& texture, const TextureSubResourceInfo& subResourceInfo) override; @@ -61,7 +61,7 @@ namespace RHI::Vulkan { VkDevice nativeDevice; VmaAllocator nativeAllocator; std::unordered_map> queueFamilyMappings; - std::unordered_map>> queues; + std::unordered_map>> queues; std::unordered_map nativeCmdPools; }; } diff --git a/Engine/Source/RHI-Vulkan/Include/RHI/Vulkan/Gpu.h b/Engine/Source/RHI-Vulkan/Include/RHI/Vulkan/Gpu.h index b0215db51..55ffe1563 100644 --- a/Engine/Source/RHI-Vulkan/Include/RHI/Vulkan/Gpu.h +++ b/Engine/Source/RHI-Vulkan/Include/RHI/Vulkan/Gpu.h @@ -18,7 +18,7 @@ namespace RHI::Vulkan { ~VulkanGpu() override; GpuProperty GetProperty() override; - Common::UniqueRef RequestDevice(const DeviceCreateInfo& inCreateInfo) override; + Common::UniquePtr RequestDevice(const DeviceCreateInfo& inCreateInfo) override; VkPhysicalDevice GetNative() const; VulkanInstance& GetInstance() const; diff --git a/Engine/Source/RHI-Vulkan/Include/RHI/Vulkan/Instance.h b/Engine/Source/RHI-Vulkan/Include/RHI/Vulkan/Instance.h index a7a16121f..3ff02b2b8 100644 --- a/Engine/Source/RHI-Vulkan/Include/RHI/Vulkan/Instance.h +++ b/Engine/Source/RHI-Vulkan/Include/RHI/Vulkan/Instance.h @@ -54,7 +54,7 @@ namespace RHI::Vulkan { #endif VkInstance nativeInstance; std::vector nativePhysicalDevices; - std::vector> gpus; + std::vector> gpus; std::unordered_map dynamicFuncPointers; }; } diff --git a/Engine/Source/RHI-Vulkan/Include/RHI/Vulkan/Texture.h b/Engine/Source/RHI-Vulkan/Include/RHI/Vulkan/Texture.h index ce8269b06..ecadd0bb8 100644 --- a/Engine/Source/RHI-Vulkan/Include/RHI/Vulkan/Texture.h +++ b/Engine/Source/RHI-Vulkan/Include/RHI/Vulkan/Texture.h @@ -23,7 +23,7 @@ namespace RHI::Vulkan { VulkanTexture(VulkanDevice& inDevice, const TextureCreateInfo& inCreateInfo); ~VulkanTexture() override; - Common::UniqueRef CreateTextureView(const TextureViewCreateInfo& inCreateInfo) override; + Common::UniquePtr CreateTextureView(const TextureViewCreateInfo& inCreateInfo) override; VkImage GetNative() const; VkImageSubresourceRange GetNativeSubResourceFullRange() const; diff --git a/Engine/Source/RHI-Vulkan/Src/Buffer.cpp b/Engine/Source/RHI-Vulkan/Src/Buffer.cpp index cf76de313..ffd8456b7 100644 --- a/Engine/Source/RHI-Vulkan/Src/Buffer.cpp +++ b/Engine/Source/RHI-Vulkan/Src/Buffer.cpp @@ -40,9 +40,9 @@ namespace RHI::Vulkan { vmaUnmapMemory(device.GetNativeAllocator(), nativeAllocation); } - Common::UniqueRef VulkanBuffer::CreateBufferView(const BufferViewCreateInfo& inCreateInfo) + Common::UniquePtr VulkanBuffer::CreateBufferView(const BufferViewCreateInfo& inCreateInfo) { - return Common::UniqueRef(new VulkanBufferView(*this, inCreateInfo)); + return Common::UniquePtr(new VulkanBufferView(*this, inCreateInfo)); } void VulkanBuffer::CreateNativeBuffer(const BufferCreateInfo& inCreateInfo) diff --git a/Engine/Source/RHI-Vulkan/Src/CommandBuffer.cpp b/Engine/Source/RHI-Vulkan/Src/CommandBuffer.cpp index a55668d38..ee858efe7 100644 --- a/Engine/Source/RHI-Vulkan/Src/CommandBuffer.cpp +++ b/Engine/Source/RHI-Vulkan/Src/CommandBuffer.cpp @@ -23,7 +23,7 @@ namespace RHI::Vulkan { } } - Common::UniqueRef VulkanCommandBuffer::Begin() + Common::UniquePtr VulkanCommandBuffer::Begin() { VkCommandBufferBeginInfo beginInfo = {}; beginInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO; diff --git a/Engine/Source/RHI-Vulkan/Src/CommandRecorder.cpp b/Engine/Source/RHI-Vulkan/Src/CommandRecorder.cpp index 2e690d908..92ef7f8d8 100644 --- a/Engine/Source/RHI-Vulkan/Src/CommandRecorder.cpp +++ b/Engine/Source/RHI-Vulkan/Src/CommandRecorder.cpp @@ -209,19 +209,19 @@ namespace RHI::Vulkan { } } - Common::UniqueRef VulkanCommandRecorder::BeginCopyPass() + Common::UniquePtr VulkanCommandRecorder::BeginCopyPass() { - return Common::UniqueRef(new VulkanCopyPassCommandRecorder(device, *this, commandBuffer)); + return Common::UniquePtr(new VulkanCopyPassCommandRecorder(device, *this, commandBuffer)); } - Common::UniqueRef VulkanCommandRecorder::BeginComputePass() + Common::UniquePtr VulkanCommandRecorder::BeginComputePass() { - return Common::UniqueRef(new VulkanComputePassCommandRecorder(device, *this, commandBuffer)); + return Common::UniquePtr(new VulkanComputePassCommandRecorder(device, *this, commandBuffer)); } - Common::UniqueRef VulkanCommandRecorder::BeginRasterPass(const RasterPassBeginInfo& inBeginInfo) + Common::UniquePtr VulkanCommandRecorder::BeginRasterPass(const RasterPassBeginInfo& inBeginInfo) { - return Common::UniqueRef(new VulkanRasterPassCommandRecorder(device, *this, commandBuffer, inBeginInfo)); + return Common::UniquePtr(new VulkanRasterPassCommandRecorder(device, *this, commandBuffer, inBeginInfo)); } void VulkanCommandRecorder::End() diff --git a/Engine/Source/RHI-Vulkan/Src/Device.cpp b/Engine/Source/RHI-Vulkan/Src/Device.cpp index 1814a48ad..d98ee1177 100644 --- a/Engine/Source/RHI-Vulkan/Src/Device.cpp +++ b/Engine/Source/RHI-Vulkan/Src/Device.cpp @@ -72,72 +72,72 @@ namespace RHI::Vulkan { return queueArray[inIndex].Get(); } - Common::UniqueRef VulkanDevice::CreateSurface(const SurfaceCreateInfo& inCreateInfo) + Common::UniquePtr VulkanDevice::CreateSurface(const SurfaceCreateInfo& inCreateInfo) { return { new VulkanSurface(*this, inCreateInfo) }; } - Common::UniqueRef VulkanDevice::CreateSwapChain(const SwapChainCreateInfo& inCreateInfo) + Common::UniquePtr VulkanDevice::CreateSwapChain(const SwapChainCreateInfo& inCreateInfo) { return { new VulkanSwapChain(*this, inCreateInfo) }; } - Common::UniqueRef VulkanDevice::CreateBuffer(const BufferCreateInfo& inCreateInfo) + Common::UniquePtr VulkanDevice::CreateBuffer(const BufferCreateInfo& inCreateInfo) { return { new VulkanBuffer(*this, inCreateInfo) }; } - Common::UniqueRef VulkanDevice::CreateTexture(const TextureCreateInfo& inCreateInfo) + Common::UniquePtr VulkanDevice::CreateTexture(const TextureCreateInfo& inCreateInfo) { return { new VulkanTexture(*this, inCreateInfo) }; } - Common::UniqueRef VulkanDevice::CreateSampler(const SamplerCreateInfo& inCreateInfo) + Common::UniquePtr VulkanDevice::CreateSampler(const SamplerCreateInfo& inCreateInfo) { return { new VulkanSampler(*this, inCreateInfo) }; } - Common::UniqueRef VulkanDevice::CreateBindGroupLayout(const BindGroupLayoutCreateInfo& inCreateInfo) + Common::UniquePtr VulkanDevice::CreateBindGroupLayout(const BindGroupLayoutCreateInfo& inCreateInfo) { return { new VulkanBindGroupLayout(*this, inCreateInfo) }; } - Common::UniqueRef VulkanDevice::CreateBindGroup(const BindGroupCreateInfo& inCreateInfo) + Common::UniquePtr VulkanDevice::CreateBindGroup(const BindGroupCreateInfo& inCreateInfo) { return { new VulkanBindGroup(*this, inCreateInfo) }; } - Common::UniqueRef VulkanDevice::CreatePipelineLayout(const PipelineLayoutCreateInfo& inCreateInfo) + Common::UniquePtr VulkanDevice::CreatePipelineLayout(const PipelineLayoutCreateInfo& inCreateInfo) { return { new VulkanPipelineLayout(*this, inCreateInfo) }; } - Common::UniqueRef VulkanDevice::CreateShaderModule(const ShaderModuleCreateInfo& inCreateInfo) + Common::UniquePtr VulkanDevice::CreateShaderModule(const ShaderModuleCreateInfo& inCreateInfo) { return { new VulkanShaderModule(*this, inCreateInfo) }; } - Common::UniqueRef VulkanDevice::CreateComputePipeline(const ComputePipelineCreateInfo& inCreateInfo) + Common::UniquePtr VulkanDevice::CreateComputePipeline(const ComputePipelineCreateInfo& inCreateInfo) { return { new VulkanComputePipeline(*this, inCreateInfo) }; } - Common::UniqueRef VulkanDevice::CreateRasterPipeline(const RasterPipelineCreateInfo& inCreateInfo) + Common::UniquePtr VulkanDevice::CreateRasterPipeline(const RasterPipelineCreateInfo& inCreateInfo) { return { new VulkanRasterPipeline(*this, inCreateInfo) }; } - Common::UniqueRef VulkanDevice::CreateCommandBuffer() + Common::UniquePtr VulkanDevice::CreateCommandBuffer() { return { new VulkanCommandBuffer(*this, nativeCmdPools[QueueType::graphics]) }; } - Common::UniqueRef VulkanDevice::CreateFence(const bool initAsSignaled) + Common::UniquePtr VulkanDevice::CreateFence(const bool initAsSignaled) { return { new VulkanFence(*this, initAsSignaled) }; } - Common::UniqueRef VulkanDevice::CreateSemaphore() + Common::UniquePtr VulkanDevice::CreateSemaphore() { return { new VulkanSemaphore(*this) }; } @@ -260,9 +260,6 @@ namespace RHI::Vulkan { dynamicRenderingFeatures.dynamicRendering = VK_TRUE; deviceCreateInfo.pNext = &dynamicRenderingFeatures; - deviceCreateInfo.ppEnabledExtensionNames = requiredExtensions.data(); - deviceCreateInfo.enabledExtensionCount = static_cast(requiredExtensions.size()); - #if PLATFORM_MACOS // MoltenVK not support use vkCmdSetPrimitiveTopology() directly current VkPhysicalDeviceExtendedDynamicStateFeaturesEXT extendedDynamicStateFeatures = {}; @@ -271,6 +268,9 @@ namespace RHI::Vulkan { dynamicRenderingFeatures.pNext = &extendedDynamicStateFeatures; #endif + deviceCreateInfo.ppEnabledExtensionNames = requiredExtensions.data(); + deviceCreateInfo.enabledExtensionCount = static_cast(requiredExtensions.size()); + #if BUILD_CONFIG_DEBUG deviceCreateInfo.enabledLayerCount = static_cast(requiredValidationLayers.size()); deviceCreateInfo.ppEnabledLayerNames = requiredValidationLayers.data(); @@ -288,7 +288,7 @@ namespace RHI::Vulkan { for (auto [queueType, queueFamilyInfo] : queueFamilyMappings) { auto [queueFamilyIndex, queueNum] = queueFamilyInfo; - std::vector> tempQueues(queueNum); + std::vector> tempQueues(queueNum); for (auto i = 0; i < tempQueues.size(); i++) { VkQueue queue; vkGetDeviceQueue(nativeDevice, queueFamilyIndex, i, &queue); diff --git a/Engine/Source/RHI-Vulkan/Src/Gpu.cpp b/Engine/Source/RHI-Vulkan/Src/Gpu.cpp index cda43d49d..f5647bd82 100644 --- a/Engine/Source/RHI-Vulkan/Src/Gpu.cpp +++ b/Engine/Source/RHI-Vulkan/Src/Gpu.cpp @@ -27,7 +27,7 @@ namespace RHI::Vulkan { return property; } - Common::UniqueRef VulkanGpu::RequestDevice(const DeviceCreateInfo& inCreateInfo) + Common::UniquePtr VulkanGpu::RequestDevice(const DeviceCreateInfo& inCreateInfo) { return { new VulkanDevice(*this, inCreateInfo) }; } diff --git a/Engine/Source/RHI-Vulkan/Src/Texture.cpp b/Engine/Source/RHI-Vulkan/Src/Texture.cpp index f44c2a527..61f6163a8 100644 --- a/Engine/Source/RHI-Vulkan/Src/Texture.cpp +++ b/Engine/Source/RHI-Vulkan/Src/Texture.cpp @@ -40,9 +40,9 @@ namespace RHI::Vulkan { } } - Common::UniqueRef VulkanTexture::CreateTextureView(const TextureViewCreateInfo& inCreateInfo) + Common::UniquePtr VulkanTexture::CreateTextureView(const TextureViewCreateInfo& inCreateInfo) { - return Common::UniqueRef(new VulkanTextureView(*this, device, inCreateInfo)); + return Common::UniquePtr(new VulkanTextureView(*this, device, inCreateInfo)); } VkImage VulkanTexture::GetNative() const diff --git a/Engine/Source/RHI/Include/RHI/Buffer.h b/Engine/Source/RHI/Include/RHI/Buffer.h index de6e98423..80ceec45c 100644 --- a/Engine/Source/RHI/Include/RHI/Buffer.h +++ b/Engine/Source/RHI/Include/RHI/Buffer.h @@ -37,7 +37,7 @@ namespace RHI { const BufferCreateInfo& GetCreateInfo() const; virtual void* Map(MapMode mapMode, size_t offset, size_t length) = 0; virtual void UnMap() = 0; - virtual Common::UniqueRef CreateBufferView(const BufferViewCreateInfo& createInfo) = 0; + virtual Common::UniquePtr CreateBufferView(const BufferViewCreateInfo& createInfo) = 0; protected: explicit Buffer(const BufferCreateInfo& inCreateInfo); diff --git a/Engine/Source/RHI/Include/RHI/CommandBuffer.h b/Engine/Source/RHI/Include/RHI/CommandBuffer.h index 22104403e..9209e6e58 100644 --- a/Engine/Source/RHI/Include/RHI/CommandBuffer.h +++ b/Engine/Source/RHI/Include/RHI/CommandBuffer.h @@ -15,7 +15,7 @@ namespace RHI { NonCopyable(CommandBuffer) virtual ~CommandBuffer(); - virtual Common::UniqueRef Begin() = 0; + virtual Common::UniquePtr Begin() = 0; protected: CommandBuffer(); diff --git a/Engine/Source/RHI/Include/RHI/CommandRecorder.h b/Engine/Source/RHI/Include/RHI/CommandRecorder.h index 9c44d6b84..fcd40695d 100644 --- a/Engine/Source/RHI/Include/RHI/CommandRecorder.h +++ b/Engine/Source/RHI/Include/RHI/CommandRecorder.h @@ -246,9 +246,9 @@ namespace RHI { NonCopyable(CommandRecorder) ~CommandRecorder() override; - virtual Common::UniqueRef BeginCopyPass() = 0; - virtual Common::UniqueRef BeginComputePass() = 0; - virtual Common::UniqueRef BeginRasterPass(const RasterPassBeginInfo& beginInfo) = 0; + virtual Common::UniquePtr BeginCopyPass() = 0; + virtual Common::UniquePtr BeginComputePass() = 0; + virtual Common::UniquePtr BeginRasterPass(const RasterPassBeginInfo& beginInfo) = 0; virtual void End() = 0; protected: diff --git a/Engine/Source/RHI/Include/RHI/Device.h b/Engine/Source/RHI/Include/RHI/Device.h index f7b564900..f1ecce2d9 100644 --- a/Engine/Source/RHI/Include/RHI/Device.h +++ b/Engine/Source/RHI/Include/RHI/Device.h @@ -64,20 +64,20 @@ namespace RHI { virtual size_t GetQueueNum(QueueType type) = 0; virtual Queue* GetQueue(QueueType type, size_t index) = 0; - virtual Common::UniqueRef CreateSurface(const SurfaceCreateInfo& createInfo) = 0; - virtual Common::UniqueRef CreateSwapChain(const SwapChainCreateInfo& createInfo) = 0; - virtual Common::UniqueRef CreateBuffer(const BufferCreateInfo& createInfo) = 0; - virtual Common::UniqueRef CreateTexture(const TextureCreateInfo& createInfo) = 0; - virtual Common::UniqueRef CreateSampler(const SamplerCreateInfo& createInfo) = 0; - virtual Common::UniqueRef CreateBindGroupLayout(const BindGroupLayoutCreateInfo& createInfo) = 0; - virtual Common::UniqueRef CreateBindGroup(const BindGroupCreateInfo& createInfo) = 0; - virtual Common::UniqueRef CreatePipelineLayout(const PipelineLayoutCreateInfo& createInfo) = 0; - virtual Common::UniqueRef CreateShaderModule(const ShaderModuleCreateInfo& createInfo) = 0; - virtual Common::UniqueRef CreateComputePipeline(const ComputePipelineCreateInfo& createInfo) = 0; - virtual Common::UniqueRef CreateRasterPipeline(const RasterPipelineCreateInfo& createInfo) = 0; - virtual Common::UniqueRef CreateCommandBuffer() = 0; - virtual Common::UniqueRef CreateFence(bool bInitAsSignaled) = 0; - virtual Common::UniqueRef CreateSemaphore() = 0; + virtual Common::UniquePtr CreateSurface(const SurfaceCreateInfo& createInfo) = 0; + virtual Common::UniquePtr CreateSwapChain(const SwapChainCreateInfo& createInfo) = 0; + virtual Common::UniquePtr CreateBuffer(const BufferCreateInfo& createInfo) = 0; + virtual Common::UniquePtr CreateTexture(const TextureCreateInfo& createInfo) = 0; + virtual Common::UniquePtr CreateSampler(const SamplerCreateInfo& createInfo) = 0; + virtual Common::UniquePtr CreateBindGroupLayout(const BindGroupLayoutCreateInfo& createInfo) = 0; + virtual Common::UniquePtr CreateBindGroup(const BindGroupCreateInfo& createInfo) = 0; + virtual Common::UniquePtr CreatePipelineLayout(const PipelineLayoutCreateInfo& createInfo) = 0; + virtual Common::UniquePtr CreateShaderModule(const ShaderModuleCreateInfo& createInfo) = 0; + virtual Common::UniquePtr CreateComputePipeline(const ComputePipelineCreateInfo& createInfo) = 0; + virtual Common::UniquePtr CreateRasterPipeline(const RasterPipelineCreateInfo& createInfo) = 0; + virtual Common::UniquePtr CreateCommandBuffer() = 0; + virtual Common::UniquePtr CreateFence(bool bInitAsSignaled) = 0; + virtual Common::UniquePtr CreateSemaphore() = 0; virtual bool CheckSwapChainFormatSupport(Surface* surface, PixelFormat format) = 0; virtual TextureSubResourceCopyFootprint GetTextureSubResourceCopyFootprint(const Texture& texture, const TextureSubResourceInfo& subResourceInfo) = 0; diff --git a/Engine/Source/RHI/Include/RHI/Gpu.h b/Engine/Source/RHI/Include/RHI/Gpu.h index 8a298ee19..91d64ac50 100644 --- a/Engine/Source/RHI/Include/RHI/Gpu.h +++ b/Engine/Source/RHI/Include/RHI/Gpu.h @@ -24,7 +24,7 @@ namespace RHI { NonCopyable(Gpu) virtual ~Gpu(); virtual GpuProperty GetProperty() = 0; - virtual Common::UniqueRef RequestDevice(const DeviceCreateInfo& createInfo) = 0; + virtual Common::UniquePtr RequestDevice(const DeviceCreateInfo& createInfo) = 0; protected: Gpu(); diff --git a/Engine/Source/RHI/Include/RHI/Texture.h b/Engine/Source/RHI/Include/RHI/Texture.h index 9d73c0a67..132a40623 100644 --- a/Engine/Source/RHI/Include/RHI/Texture.h +++ b/Engine/Source/RHI/Include/RHI/Texture.h @@ -46,7 +46,7 @@ namespace RHI { virtual ~Texture(); const TextureCreateInfo& GetCreateInfo() const; - virtual Common::UniqueRef CreateTextureView(const TextureViewCreateInfo& createInfo) = 0; + virtual Common::UniquePtr CreateTextureView(const TextureViewCreateInfo& createInfo) = 0; protected: explicit Texture(const TextureCreateInfo& inCreateInfo); diff --git a/Engine/Source/Render/Include/Render/RenderCache.h b/Engine/Source/Render/Include/Render/RenderCache.h index ffdb9873e..2bbb1430e 100644 --- a/Engine/Source/Render/Include/Render/RenderCache.h +++ b/Engine/Source/Render/Include/Render/RenderCache.h @@ -142,7 +142,7 @@ namespace Render { Sampler(RHI::Device& inDevice, const RSamplerDesc& inDesc); - Common::UniqueRef rhiHandle; + Common::UniquePtr rhiHandle; }; class BindGroupLayout { @@ -159,7 +159,7 @@ namespace Render { BindGroupLayout(RHI::Device& inDevice, const BindGroupLayoutDesc& inDesc); RBindingMap bindings; - Common::UniqueRef rhiHandle; + Common::UniquePtr rhiHandle; }; class PipelineLayout { @@ -184,8 +184,8 @@ namespace Render { void CreateRHIPipelineLayout(RHI::Device& device); size_t hash; - std::unordered_map> bindGroupLayouts; - Common::UniqueRef rhiHandle; + std::unordered_map> bindGroupLayouts; + Common::UniquePtr rhiHandle; }; class ComputePipelineState { @@ -204,7 +204,7 @@ namespace Render { size_t hash; PipelineLayout* pipelineLayout; - Common::UniqueRef rhiHandle; + Common::UniquePtr rhiHandle; }; class RasterPipelineState { @@ -222,7 +222,7 @@ namespace Render { size_t hash; PipelineLayout* pipelineLayout; - Common::UniqueRef rhiHandle; + Common::UniquePtr rhiHandle; }; class SamplerCache { @@ -236,7 +236,7 @@ namespace Render { explicit SamplerCache(RHI::Device& inDevice); RHI::Device& device; - std::unordered_map> samplers; + std::unordered_map> samplers; }; class PipelineCache { @@ -253,8 +253,8 @@ namespace Render { explicit PipelineCache(RHI::Device& inDevice); RHI::Device& device; - std::unordered_map> computePipelines; - std::unordered_map> rasterPipelines; + std::unordered_map> computePipelines; + std::unordered_map> rasterPipelines; }; class ResourceViewCache { @@ -272,7 +272,7 @@ namespace Render { explicit ResourceViewCache(RHI::Device& inDevice); RHI::Device& device; - std::unordered_map>> bufferViews; - std::unordered_map>> textureViews; + std::unordered_map>> bufferViews; + std::unordered_map>> textureViews; }; } diff --git a/Engine/Source/Render/Include/Render/RenderGraph.h b/Engine/Source/Render/Include/Render/RenderGraph.h index 3bc1bc093..412b2c674 100644 --- a/Engine/Source/Render/Include/Render/RenderGraph.h +++ b/Engine/Source/Render/Include/Render/RenderGraph.h @@ -6,6 +6,7 @@ #include #include +#include #include #include @@ -213,6 +214,7 @@ namespace Render { RGBindGroupDesc& Sampler(std::string inName, RHI::Sampler* inSampler); RGBindGroupDesc& UniformBuffer(std::string inName, RGBufferViewRef bufferView); RGBindGroupDesc& StorageBuffer(std::string inName, RGBufferViewRef bufferView); + RGBindGroupDesc& RwStorageBuffer(std::string inName, RGBufferViewRef bufferView); RGBindGroupDesc& Texture(std::string inName, RGTextureViewRef textureView); RGBindGroupDesc& StorageTexture(std::string inName, RGTextureViewRef textureView); }; @@ -233,6 +235,16 @@ namespace Render { using RGBindGroupRef = RGBindGroup*; + struct RGBufferUploadInfo { + void* data; + size_t size; + size_t srcOffset; + size_t dstOffset; + + RGBufferUploadInfo(); + RGBufferUploadInfo(void* inData, size_t inSize, size_t inSrcOffset = 0, size_t inDstOffset = 0); + }; + class RGPass { public: virtual ~RGPass(); @@ -251,6 +263,7 @@ namespace Render { using RGCopyPassExecuteFunc = std::function; using RGComputePassExecuteFunc = std::function; using RGRasterPassExecuteFunc = std::function; + using RGCommonPassExecuteFunc = std::function; class RGCopyPass final : public RGPass { public: @@ -259,11 +272,17 @@ namespace Render { private: friend class RGBuilder; - // TODO pre/post execute func - RGCopyPass(std::string inName, RGCopyPassDesc inPassDesc, RGCopyPassExecuteFunc inFunc); + RGCopyPass( + std::string inName, + RGCopyPassDesc inPassDesc, + RGCopyPassExecuteFunc inFunc, + RGCommonPassExecuteFunc inPreExecuteFunc = {}, + RGCommonPassExecuteFunc inPostExecuteFunc = {}); RGCopyPassDesc passDesc; - RGCopyPassExecuteFunc func; + RGCopyPassExecuteFunc passFunc; + RGCommonPassExecuteFunc prePassFunc; + RGCommonPassExecuteFunc postPassFunc; }; class RGComputePass final : public RGPass { @@ -273,10 +292,16 @@ namespace Render { private: friend class RGBuilder; - // TODO pre/post execute func - RGComputePass(std::string inName, std::vector inBindGroups, RGComputePassExecuteFunc inFunc); + RGComputePass( + std::string inName, + std::vector inBindGroups, + RGComputePassExecuteFunc inFunc, + RGCommonPassExecuteFunc inPreExecuteFunc = {}, + RGCommonPassExecuteFunc inPostExecuteFunc = {}); - RGComputePassExecuteFunc func; + RGComputePassExecuteFunc passFunc; + RGCommonPassExecuteFunc prePassFunc; + RGCommonPassExecuteFunc postPassFunc; std::vector bindGroups; }; @@ -287,11 +312,17 @@ namespace Render { private: friend class RGBuilder; - // TODO pre/post execute func - RGRasterPass(std::string inName, RGRasterPassDesc inPassDesc, std::vector inBindGroupds, RGRasterPassExecuteFunc inFunc); + RGRasterPass( + std::string inName, RGRasterPassDesc inPassDesc, + std::vector inBindGroups, + RGRasterPassExecuteFunc inFunc, + RGCommonPassExecuteFunc inPreExecuteFunc = {}, + RGCommonPassExecuteFunc inPostExecuteFunc = {}); RGRasterPassDesc passDesc; - RGRasterPassExecuteFunc func; + RGRasterPassExecuteFunc passFunc; + RGCommonPassExecuteFunc prePassFunc; + RGCommonPassExecuteFunc postPassFunc; std::vector bindGroups; }; @@ -316,16 +347,14 @@ namespace Render { RGBufferRef ImportBuffer(RHI::Buffer* inBuffer, RHI::BufferState inInitialState); RGTextureRef ImportTexture(RHI::Texture* inTexture, RHI::TextureState inInitialState); RGBindGroupRef AllocateBindGroup(const RGBindGroupDesc& inDesc); - void AddCopyPass(const std::string& inName, const RGCopyPassDesc& inPassDesc, const RGCopyPassExecuteFunc& inFunc, bool inAsyncCopy = false); - void AddComputePass(const std::string& inName, const std::vector& inBindGroups, const RGComputePassExecuteFunc& inFunc, bool inAsyncCompute = false); - void AddRasterPass(const std::string& inName, const RGRasterPassDesc& inPassDesc, const std::vector& inBindGroupds, const RGRasterPassExecuteFunc& inFunc); + void QueueBufferUpload(RGBufferRef inBuffer, const RGBufferUploadInfo& inUploadInfo); + void AddCopyPass(const std::string& inName, const RGCopyPassDesc& inPassDesc, const RGCopyPassExecuteFunc& inFunc, bool inAsyncCopy = false, const RGCommonPassExecuteFunc& inPreExecuteFunc = {}, const RGCommonPassExecuteFunc& inPostExecuteFunc = {}); + void AddComputePass(const std::string& inName, const std::vector& inBindGroups, const RGComputePassExecuteFunc& inFunc, bool inAsyncCompute = false, const RGCommonPassExecuteFunc& inPreExecuteFunc = {}, const RGCommonPassExecuteFunc& inPostExecuteFunc = {}); + void AddRasterPass(const std::string& inName, const RGRasterPassDesc& inPassDesc, const std::vector& inBindGroups, const RGRasterPassExecuteFunc& inFunc, const RGCommonPassExecuteFunc& inPreExecuteFunc = {}, const RGCommonPassExecuteFunc& inPostExecuteFunc = {}); void AddSyncPoint(); - void Execute(const RGExecuteInfo& inExecuteInfo); - - // TODO upload interface - // TODO make private // execute + void Execute(const RGExecuteInfo& inExecuteInfo); RHI::Buffer* GetRHI(RGBufferRef inBuffer) const; RHI::Texture* GetRHI(RGTextureRef inTexture) const; RHI::BufferView* GetRHI(RGBufferViewRef inBufferView) const; @@ -334,8 +363,8 @@ namespace Render { private: struct AsyncTimelineExecuteContext { - std::unordered_map> queueCmdBufferMap; - std::unordered_map> queueSemaphoreToSignalMap; + std::unordered_map> queueCmdBufferMap; + std::unordered_map> queueSemaphoreToSignalMap; AsyncTimelineExecuteContext(); AsyncTimelineExecuteContext(AsyncTimelineExecuteContext&& inOther) noexcept; @@ -352,7 +381,10 @@ namespace Render { void ExecuteCopyPass(RHI::CommandRecorder& inRecoder, RGCopyPass* inCopyPass); void ExecuteComputePass(RHI::CommandRecorder& inRecoder, RGComputePass* inComputePass); void ExecuteRasterPass(RHI::CommandRecorder& inRecoder, RGRasterPass* inRasterPass); + void PerformBufferUploads(); + void WaitBufferUploadsFinish() const; void DevirtualizeViewsCreatedOnImportedResources(); + void DevirtualizeResource(RGResourceRef inResource); void DevirtualizeResources(const std::unordered_set& inResources); void DevirtualizeBindGroupsAndViews(const std::vector& inBindGroups); void DevirtualizeAttachmentViews(const RGRasterPassDesc& inDesc); @@ -366,12 +398,13 @@ namespace Render { bool executed; RHI::Device& device; - std::vector> resources; - std::vector> views; - std::vector> bindGroups; - std::vector> passes; + std::vector> resources; + std::vector> views; + std::vector> bindGroups; + std::vector> passes; std::unordered_map> recordingAsyncTimeline; std::vector>> asyncTimelines; + std::unordered_map bufferUploads; // execute context std::unordered_map resourceReadCounts; @@ -383,6 +416,7 @@ namespace Render { std::vector asyncTimelineExecuteContexts; std::unordered_map> devirtualizedResources; std::unordered_map> devirtualizedResourceViews; - std::unordered_map> devirtualizedBindGroups; + std::unordered_map> devirtualizedBindGroups; + std::vector> bufferUploadTasks; }; } diff --git a/Engine/Source/Render/Include/Render/RenderModule.h b/Engine/Source/Render/Include/Render/RenderModule.h index 4c85772bf..83a78f1e3 100644 --- a/Engine/Source/Render/Include/Render/RenderModule.h +++ b/Engine/Source/Render/Include/Render/RenderModule.h @@ -4,14 +4,13 @@ #pragma once -#include -#include #include #include +#include #include #include +#include #include -#include namespace Render { struct RenderModuleInitParams { @@ -30,25 +29,13 @@ namespace Render { void Initialize(const RenderModuleInitParams& inParams); void DeInitialize(); RHI::Device* GetDevice() const; - Common::UniqueRef NewScene(); - Common::UniqueRef NewView(); - void ShutdownRenderingThread(); - void FlushAllRenderingCommands() const; - template auto EnqueueRenderingCommand(F&& command, Args&&... args); + Render::RenderThread& GetRenderThread() const; + Common::UniquePtr NewScene(); + Common::UniquePtr NewView(); private: bool initialized; - Common::UniqueRef renderingThread; RHI::Instance* rhiInstance; - Common::UniqueRef rhiDevice; + Common::UniquePtr rhiDevice; }; } - -namespace Render { - template - auto RenderModule::EnqueueRenderingCommand(F&& command, Args&&... args) - { - Assert(renderingThread != nullptr); - return renderingThread->EmplaceTask(std::forward(command), std::forward(args)...); - } -} diff --git a/Engine/Source/Render/Include/Render/RenderThread.h b/Engine/Source/Render/Include/Render/RenderThread.h new file mode 100644 index 000000000..114992bae --- /dev/null +++ b/Engine/Source/Render/Include/Render/RenderThread.h @@ -0,0 +1,78 @@ +// +// Created by johnk on 2025/2/11. +// + +#pragma once + +#include +#include +#include + +namespace Render { + class RenderThread { + public: + static RenderThread& Get(); + + ~RenderThread(); + + void Start(); + void Stop(); + void Flush() const; + template auto EmplaceTask(F&& inTask, Args&&... inArgs); + + private: + RenderThread(); + + Common::UniquePtr thread; + }; + + class RenderWorkerThreads { + public: + static RenderWorkerThreads& Get(); + + ~RenderWorkerThreads(); + + void Start(); + void Stop(); + template auto EmplaceTask(F&& inTask, Args&&... inArgs); + template void ExecuteTasks(size_t inTaskNum, F&& inTask, Args&&... inArgs); + + private: + RenderWorkerThreads(); + + Common::UniquePtr threads; + }; +} + +namespace Render { + template + auto RenderThread::EmplaceTask(F&& inTask, Args&&... inArgs) + { + Assert(thread != nullptr); + return thread->EmplaceTask(std::forward(inTask), std::forward(inArgs)...); + } + + template + auto RenderWorkerThreads::EmplaceTask(F&& inTask, Args&&... inArgs) + { + using RetType = std::invoke_result_t; + + Assert(threads != nullptr); + auto packedTask = std::bind(std::forward(inTask), std::forward(inArgs)...); + return threads->EmplaceTask([packedTask]() -> RetType { + Core::ThreadContext::SetTag(Core::ThreadTag::renderWorker); + return packedTask(); + }); + } + + template + void RenderWorkerThreads::ExecuteTasks(size_t inTaskNum, F&& inTask, Args&&... inArgs) + { + Assert(threads != nullptr); + auto packedTask = std::bind(std::forward(inTask), std::placeholders::_1, std::forward(inArgs)...); + threads->ExecuteTasks(inTaskNum, [packedTask](size_t inIndex) -> void { + Core::ThreadContext::SetTag(Core::ThreadTag::renderWorker); + packedTask(inIndex); + }); + } +} diff --git a/Engine/Source/Render/Include/Render/ResourcePool.h b/Engine/Source/Render/Include/Render/ResourcePool.h index db4dd2d38..5b5920177 100644 --- a/Engine/Source/Render/Include/Render/ResourcePool.h +++ b/Engine/Source/Render/Include/Render/ResourcePool.h @@ -20,14 +20,14 @@ namespace Render { public: using DescType = typename RHIResTraits::DescType; - explicit PooledResource(Common::UniqueRef&& inRhiHandle, DescType inDesc); + explicit PooledResource(Common::UniquePtr&& inRhiHandle, DescType inDesc); ~PooledResource(); RHIRes* GetRHI() const; const DescType& GetDesc() const; private: - Common::UniqueRef rhiHandle; + Common::UniquePtr rhiHandle; DescType desc; }; @@ -35,32 +35,33 @@ namespace Render { using PooledTexture = PooledResource; using PooledBufferDesc = RHI::BufferCreateInfo; using PooledTextureDesc = RHI::TextureCreateInfo; - using PooledBufferRef = Common::SharedRef; - using PooledTextureRef = Common::SharedRef; + using PooledBufferRef = Common::SharedPtr; + using PooledTextureRef = Common::SharedPtr; template struct PooledResTraits {}; template - class RGResourcePool { + class ResourcePool { public: using ResRefType = typename PooledResTraits::RefType; using DescType = typename PooledResTraits::DescType; - static RGResourcePool& Get(RHI::Device& device); + static ResourcePool& Get(RHI::Device& device); ResRefType Allocate(const DescType& desc); - void GarbageCollect(); + size_t Size() const; + void Tick(); private: - explicit RGResourcePool(RHI::Device& inDevice); + explicit ResourcePool(RHI::Device& inDevice); RHI::Device& device; - std::vector pooledResources; + std::vector> pooledResourceAndAges; }; - using BufferPool = RGResourcePool; - using TexturePool = RGResourcePool; + using BufferPool = ResourcePool; + using TexturePool = ResourcePool; } namespace Render { @@ -75,7 +76,7 @@ namespace Render { }; template - PooledResource::PooledResource(Common::UniqueRef&& inRhiHandle, DescType inDesc) + PooledResource::PooledResource(Common::UniquePtr&& inRhiHandle, DescType inDesc) : rhiHandle(std::move(inRhiHandle)) , desc(std::move(inDesc)) { @@ -121,41 +122,56 @@ namespace Render { }; template - RGResourcePool& RGResourcePool::Get(RHI::Device& device) + ResourcePool& ResourcePool::Get(RHI::Device& device) { - static std::unordered_map> deviceMap; + static std::unordered_map> deviceMap; if (!deviceMap.contains(&device)) { - deviceMap.emplace(std::make_pair(&device, Common::UniqueRef(new RGResourcePool(device)))); + deviceMap.emplace(std::make_pair(&device, Common::UniquePtr(new ResourcePool(device)))); } return *deviceMap.at(&device); } template - RGResourcePool::RGResourcePool(RHI::Device& inDevice) + ResourcePool::ResourcePool(RHI::Device& inDevice) : device(inDevice) { } template - typename RGResourcePool::ResRefType RGResourcePool::Allocate(const DescType& desc) + typename ResourcePool::ResRefType ResourcePool::Allocate(const DescType& desc) { - for (const auto& pooledResource : pooledResources) { + for (auto& [pooledResource, age] : pooledResourceAndAges) { if (pooledResource.RefCount() == 1 && desc == pooledResource->GetDesc()) { + age = 0; return pooledResource; } } auto result = PooledResTraits::CreateResource(device, desc); - pooledResources.push_back(result); + pooledResourceAndAges.emplace_back(result, 0); return result; } template - void RGResourcePool::GarbageCollect() + size_t ResourcePool::Size() const { - // TODO maybe we need add a age check ? >= 2 frame not be used == need release - for (auto i = 0; i < pooledResources.size();) { - if (pooledResources[i].RefCount() <= 1) { - pooledResources.erase(pooledResources.begin() + i); + return pooledResourceAndAges.size(); + } + + template + void ResourcePool::Tick() + { + for (auto i = 0; i < pooledResourceAndAges.size();) { + bool needRelease = false; + auto& [pooledResource, age] = pooledResourceAndAges[i]; + + if (pooledResource.RefCount() <= 1) { + needRelease = ++age >= 2; + } else { + age = 0; + } + + if (needRelease) { // NOLINT + pooledResourceAndAges.erase(pooledResourceAndAges.begin() + i); } else { i++; } diff --git a/Engine/Source/Render/Include/Render/Shader.h b/Engine/Source/Render/Include/Render/Shader.h index 84c142eeb..b991d53ca 100644 --- a/Engine/Source/Render/Include/Render/Shader.h +++ b/Engine/Source/Render/Include/Render/Shader.h @@ -148,7 +148,7 @@ namespace Render { [[nodiscard]] const ShaderArchive& GetArchive(const typename T::VariantSet& variantSet) const; - std::unordered_map>> shaderModules; + std::unordered_map>> shaderModules; }; class GlobalShaderRegistry { @@ -263,7 +263,7 @@ namespace Render { class VariantSet : public Render::VariantSetImpl<__VA_ARGS__> {}; #define NonVariant \ - RangedIntShaderVariantField(_PlaceholderVariantField, "__PLACEHOLDER_VARIANT", 0, 0); \ + RangedIntShaderVariantField(_PlaceholderVariantField, "__PLACEHOLDER_VARIANT", 0, 0); /* NOLINT */ \ VariantSet(_PlaceholderVariantField); #define RegisterGlobalShader(inClass) \ diff --git a/Engine/Source/Render/SharedSrc/RenderModule.cpp b/Engine/Source/Render/SharedSrc/RenderModule.cpp index f446befc6..b37ff2c8a 100644 --- a/Engine/Source/Render/SharedSrc/RenderModule.cpp +++ b/Engine/Source/Render/SharedSrc/RenderModule.cpp @@ -34,8 +34,8 @@ namespace Render { { Assert(!initialized); - renderingThread = Common::MakeUnique("RenderingThread"); - renderingThread->EmplaceTask([]() -> void { Core::ThreadContext::SetTag(Core::ThreadTag::render); }); + RenderThread::Get().Start(); + RenderWorkerThreads::Get().Start(); rhiInstance = RHI::Instance::GetByType(inParams.rhiType); rhiDevice = rhiInstance->GetGpu(0)->RequestDevice( @@ -49,7 +49,9 @@ namespace Render { void RenderModule::DeInitialize() { - renderingThread = nullptr; + RenderThread::Get().Stop(); + RenderWorkerThreads::Get().Stop(); + rhiInstance = nullptr; rhiDevice = nullptr; initialized = false; @@ -60,25 +62,19 @@ namespace Render { return rhiDevice.Get(); } - Common::UniqueRef RenderModule::NewScene() // NOLINT - { - return new Scene(); - } - - Common::UniqueRef RenderModule::NewView() // NOLINT + Render::RenderThread& RenderModule::GetRenderThread() const // NOLINT { - return new View(); + return RenderThread::Get(); } - void RenderModule::ShutdownRenderingThread() + Common::UniquePtr RenderModule::NewScene() // NOLINT { - renderingThread = nullptr; + return new Scene(); } - void RenderModule::FlushAllRenderingCommands() const + Common::UniquePtr RenderModule::NewView() // NOLINT { - Assert(renderingThread != nullptr); - renderingThread->Flush(); + return new View(); } } diff --git a/Engine/Source/Render/Src/RenderCache.cpp b/Engine/Source/Render/Src/RenderCache.cpp index a451847e3..ce68b0245 100644 --- a/Engine/Source/Render/Src/RenderCache.cpp +++ b/Engine/Source/Render/Src/RenderCache.cpp @@ -22,7 +22,7 @@ namespace Render { auto hash = desc.Hash(); auto iter = pipelineLayouts.find(hash); if (iter == pipelineLayouts.end()) { - pipelineLayouts[hash] = Common::UniqueRef(new PipelineLayout(device, desc, hash)); + pipelineLayouts[hash] = Common::UniquePtr(new PipelineLayout(device, desc, hash)); } return pipelineLayouts[hash].Get(); } @@ -31,16 +31,16 @@ namespace Render { explicit PipelineLayoutCache(RHI::Device& inDevice); RHI::Device& device; - std::unordered_map> pipelineLayouts; + std::unordered_map> pipelineLayouts; }; PipelineLayoutCache& PipelineLayoutCache::Get(RHI::Device& device) { - static std::unordered_map> map; + static std::unordered_map> map; if (const auto iter = map.find(&device); iter == map.end()) { - map[&device] = Common::UniqueRef(new PipelineLayoutCache(device)); + map[&device] = Common::UniquePtr(new PipelineLayoutCache(device)); } return *map[&device]; } @@ -389,7 +389,7 @@ namespace Render { BindGroupLayoutDesc desc; desc.layoutIndex = layoutIndex; desc.binding = binding; - bindGroupLayouts[layoutIndex] = Common::UniqueRef(new BindGroupLayout(device, desc)); + bindGroupLayouts[layoutIndex] = Common::UniquePtr(new BindGroupLayout(device, desc)); } } @@ -500,11 +500,11 @@ namespace Render { SamplerCache& SamplerCache::Get(RHI::Device& device) { - static std::unordered_map> map; + static std::unordered_map> map; const auto iter = map.find(&device); if (iter == map.end()) { - map[&device] = Common::UniqueRef(new SamplerCache(device)); + map[&device] = Common::UniquePtr(new SamplerCache(device)); } return *map[&device]; } @@ -521,18 +521,18 @@ namespace Render { const size_t hash = Common::HashUtils::CityHash(&desc, sizeof(RSamplerDesc)); if (const auto iter = samplers.find(hash); iter == samplers.end()) { - samplers[hash] = Common::UniqueRef(new Sampler(device, desc)); + samplers[hash] = Common::UniquePtr(new Sampler(device, desc)); } return samplers[hash].Get(); } PipelineCache& PipelineCache::Get(RHI::Device& device) { - static std::unordered_map> map; + static std::unordered_map> map; if (const auto iter = map.find(&device); iter == map.end()) { - map[&device] = Common::UniqueRef(new PipelineCache(device)); + map[&device] = Common::UniquePtr(new PipelineCache(device)); } return *map[&device]; } @@ -556,7 +556,7 @@ namespace Render { const auto hash = desc.Hash(); if (const auto iter = computePipelines.find(hash); iter == computePipelines.end()) { - computePipelines[hash] = Common::UniqueRef(new ComputePipelineState(device, desc, hash)); + computePipelines[hash] = Common::UniquePtr(new ComputePipelineState(device, desc, hash)); } return computePipelines[hash].Get(); } @@ -566,17 +566,17 @@ namespace Render { const auto hash = desc.Hash(); if (const auto iter = rasterPipelines.find(hash); iter == rasterPipelines.end()) { - rasterPipelines[hash] = Common::UniqueRef(new RasterPipelineState(device, desc, hash)); + rasterPipelines[hash] = Common::UniquePtr(new RasterPipelineState(device, desc, hash)); } return rasterPipelines[hash].Get(); } ResourceViewCache& ResourceViewCache::Get(RHI::Device& device) { - static std::unordered_map> map; + static std::unordered_map> map; if (!map.contains(&device)) { - map.emplace(std::make_pair(&device, Common::UniqueRef(new ResourceViewCache(device)))); + map.emplace(std::make_pair(&device, Common::UniquePtr(new ResourceViewCache(device)))); } return *map.at(&device); } @@ -617,7 +617,7 @@ namespace Render { auto hash = inDesc.Hash(); if (const auto iter = views.find(hash); iter == views.end()) { - views.emplace(std::make_pair(hash, Common::UniqueRef(buffer->CreateBufferView(inDesc)))); + views.emplace(std::make_pair(hash, Common::UniquePtr(buffer->CreateBufferView(inDesc)))); } return views.at(hash).Get(); } @@ -629,7 +629,7 @@ namespace Render { auto hash = inDesc.Hash(); if (const auto iter = views.find(hash); iter == views.end()) { - views.emplace(std::make_pair(hash, Common::UniqueRef(texture->CreateTextureView(inDesc)))); + views.emplace(std::make_pair(hash, Common::UniquePtr(texture->CreateTextureView(inDesc)))); } return views.at(hash).Get(); } diff --git a/Engine/Source/Render/Src/RenderGraph.cpp b/Engine/Source/Render/Src/RenderGraph.cpp index e56ab767e..374967242 100644 --- a/Engine/Source/Render/Src/RenderGraph.cpp +++ b/Engine/Source/Render/Src/RenderGraph.cpp @@ -5,22 +5,23 @@ #include #include +#include #include namespace Render::Internal { static void ComputeReadsWritesForBindGroup(const RGBindGroupDesc& inDesc, std::unordered_set& outReads, std::unordered_set& outWrites) { - for (const auto& [name, item] : inDesc.items) { - if (item.type == RHI::BindingType::uniformBuffer) { - outReads.emplace(std::get(item.view)->GetResource()); - } else if (item.type == RHI::BindingType::storageBuffer) { - outReads.emplace(std::get(item.view)->GetResource()); - } else if (item.type == RHI::BindingType::rwStorageBuffer) { - outWrites.emplace(std::get(item.view)->GetResource()); - } else if (item.type == RHI::BindingType::texture) { - outReads.emplace(std::get(item.view)->GetResource()); - } else if (item.type == RHI::BindingType::storageTexture) { - outWrites.emplace(std::get(item.view)->GetResource()); + for (const auto& [type, view] : inDesc.items | std::views::values) { + if (type == RHI::BindingType::uniformBuffer) { + outReads.emplace(std::get(view)->GetResource()); + } else if (type == RHI::BindingType::storageBuffer) { + outReads.emplace(std::get(view)->GetResource()); + } else if (type == RHI::BindingType::rwStorageBuffer) { + outWrites.emplace(std::get(view)->GetResource()); + } else if (type == RHI::BindingType::texture) { + outReads.emplace(std::get(view)->GetResource()); + } else if (type == RHI::BindingType::storageTexture) { + outWrites.emplace(std::get(view)->GetResource()); } else { Unimplement(); } @@ -275,6 +276,17 @@ namespace Render { return *this; } + RGBindGroupDesc& RGBindGroupDesc::RwStorageBuffer(std::string inName, RGBufferViewRef bufferView) + { + Assert(!items.contains(inName)); + + RGBindItemDesc item; + item.type = RHI::BindingType::rwStorageBuffer; + item.view = bufferView; + items.emplace(std::make_pair(std::move(inName), item)); + return *this; + } + RGBindGroupDesc& RGBindGroupDesc::Texture(std::string inName, RGTextureViewRef textureView) { Assert(!items.contains(inName)); @@ -309,6 +321,22 @@ namespace Render { return desc; } + RGBufferUploadInfo::RGBufferUploadInfo() + : data(nullptr) + , size(0) + , srcOffset(0) + , dstOffset(0) + { + } + + RGBufferUploadInfo::RGBufferUploadInfo(void* inData, size_t inSize, size_t inSrcOffset, size_t inDstOffset) + : data(inData) + , size(inSize) + , srcOffset(inSrcOffset) + , dstOffset(inDstOffset) + { + } + RGPass::RGPass(std::string inName, RGPassType inType) : name(std::move(inName)) , type(inType) @@ -317,29 +345,35 @@ namespace Render { RGPass::~RGPass() = default; - RGCopyPass::RGCopyPass(std::string inName, RGCopyPassDesc inPassDesc, RGCopyPassExecuteFunc inFunc) + RGCopyPass::RGCopyPass(std::string inName, RGCopyPassDesc inPassDesc, RGCopyPassExecuteFunc inFunc, RGCommonPassExecuteFunc inPreExecuteFunc, RGCommonPassExecuteFunc inPostExecuteFunc) : RGPass(std::move(inName), RGPassType::copy) , passDesc(std::move(inPassDesc)) - , func(std::move(inFunc)) + , passFunc(std::move(inFunc)) + , prePassFunc(std::move(inPreExecuteFunc)) + , postPassFunc(std::move(inPostExecuteFunc)) { } RGCopyPass::~RGCopyPass() = default; - RGComputePass::RGComputePass(std::string inName, std::vector inBindGroups, RGComputePassExecuteFunc inFunc) + RGComputePass::RGComputePass(std::string inName, std::vector inBindGroups, RGComputePassExecuteFunc inFunc, RGCommonPassExecuteFunc inPreExecuteFunc, RGCommonPassExecuteFunc inPostExecuteFunc) : RGPass(std::move(inName), RGPassType::compute) - , func(std::move(inFunc)) + , passFunc(std::move(inFunc)) + , prePassFunc(std::move(inPreExecuteFunc)) + , postPassFunc(std::move(inPostExecuteFunc)) , bindGroups(std::move(inBindGroups)) { } RGComputePass::~RGComputePass() = default; - RGRasterPass::RGRasterPass(std::string inName, RGRasterPassDesc inPassDesc, std::vector inBindGroupds, RGRasterPassExecuteFunc inFunc) + RGRasterPass::RGRasterPass(std::string inName, RGRasterPassDesc inPassDesc, std::vector inBindGroups, RGRasterPassExecuteFunc inFunc, RGCommonPassExecuteFunc inPreExecuteFunc, RGCommonPassExecuteFunc inPostExecuteFunc) : RGPass(std::move(inName), RGPassType::raster) , passDesc(std::move(inPassDesc)) - , bindGroups(std::move(inBindGroupds)) - , func(std::move(inFunc)) + , passFunc(std::move(inFunc)) + , prePassFunc(std::move(inPreExecuteFunc)) + , postPassFunc(std::move(inPostExecuteFunc)) + , bindGroups(std::move(inBindGroups)) { } @@ -408,24 +442,30 @@ namespace Render { return bindGroups.back().Get(); } - void RGBuilder::AddCopyPass(const std::string& inName, const RGCopyPassDesc& inPassDesc, const RGCopyPassExecuteFunc& inFunc, bool inAsyncCopy) + void RGBuilder::QueueBufferUpload(RGBufferRef inBuffer, const RGBufferUploadInfo& inUploadInfo) + { + Assert((inBuffer->GetDesc().usages & RHI::BufferUsageBits::mapWrite) != RHI::BufferUsageFlags::null); + bufferUploads.emplace(inBuffer, inUploadInfo); + } + + void RGBuilder::AddCopyPass(const std::string& inName, const RGCopyPassDesc& inPassDesc, const RGCopyPassExecuteFunc& inFunc, bool inAsyncCopy, const RGCommonPassExecuteFunc& inPreExecuteFunc, const RGCommonPassExecuteFunc& inPostExecuteFunc) { Assert(!executed); - const auto& pass = passes.emplace_back(new RGCopyPass(inName, inPassDesc, inFunc)); + const auto& pass = passes.emplace_back(new RGCopyPass(inName, inPassDesc, inFunc, inPreExecuteFunc, inPostExecuteFunc)); recordingAsyncTimeline[inAsyncCopy ? RGQueueType::asyncCopy : RGQueueType::main].emplace_back(pass.Get()); } - void RGBuilder::AddComputePass(const std::string& inName, const std::vector& inBindGroups, const RGComputePassExecuteFunc& inFunc, bool inAsyncCompute) + void RGBuilder::AddComputePass(const std::string& inName, const std::vector& inBindGroups, const RGComputePassExecuteFunc& inFunc, bool inAsyncCompute, const RGCommonPassExecuteFunc& inPreExecuteFunc, const RGCommonPassExecuteFunc& inPostExecuteFunc) { Assert(!executed); - const auto& pass = passes.emplace_back(new RGComputePass(inName, inBindGroups, inFunc)); + const auto& pass = passes.emplace_back(new RGComputePass(inName, inBindGroups, inFunc, inPreExecuteFunc, inPostExecuteFunc)); recordingAsyncTimeline[inAsyncCompute ? RGQueueType::asyncCompute : RGQueueType::main].emplace_back(pass.Get()); } - void RGBuilder::AddRasterPass(const std::string& inName, const RGRasterPassDesc& inPassDesc, const std::vector& inBindGroupds, const RGRasterPassExecuteFunc& inFunc) + void RGBuilder::AddRasterPass(const std::string& inName, const RGRasterPassDesc& inPassDesc, const std::vector& inBindGroups, const RGRasterPassExecuteFunc& inFunc, const RGCommonPassExecuteFunc& inPreExecuteFunc, const RGCommonPassExecuteFunc& inPostExecuteFunc) { Assert(!executed); - const auto& pass = passes.emplace_back(new RGRasterPass(inName, inPassDesc, inBindGroupds, inFunc)); + const auto& pass = passes.emplace_back(new RGRasterPass(inName, inPassDesc, inBindGroups, inFunc, inPreExecuteFunc, inPostExecuteFunc)); recordingAsyncTimeline[RGQueueType::main].emplace_back(pass.Get()); } @@ -509,11 +549,13 @@ namespace Render { void RGBuilder::ExecuteInternal(const RGExecuteInfo& inExecuteInfo) // NOLINT { + PerformBufferUploads(); DevirtualizeViewsCreatedOnImportedResources(); const auto asyncTimelineNum = asyncTimelines.size(); asyncTimelineExecuteContexts.reserve(asyncTimelineNum); + WaitBufferUploadsFinish(); for (const auto& queuePasses : asyncTimelines) { const bool isFirstAsyncTimeline = asyncTimelineExecuteContexts.empty(); const bool isLastAsyncTimeline = asyncTimelineExecuteContexts.size() + 1 == asyncTimelines.size(); @@ -527,7 +569,7 @@ namespace Render { } else { // wait all cmd buffers in last async timeline executed for (const AsyncTimelineExecuteContext& lastContext = asyncTimelineExecuteContexts.back(); - const auto& [queue, semaphore] : lastContext.queueSemaphoreToSignalMap) { + const auto& semaphore : lastContext.queueSemaphoreToSignalMap | std::views::values) { semaphoresToWait.emplace_back(semaphore.Get()); } } @@ -656,7 +698,7 @@ namespace Render { queueReadsVec.reserve(queuePasses.size()); queueWritesVec.reserve(queuePasses.size()); - for (const auto& [queueType, passes] : queuePasses) { + for (const auto& passes : queuePasses | std::views::values) { auto& queueReads = queueReadsVec.emplace_back(); auto& queueWrites = queueWritesVec.emplace_back(); collectQueueReadWrites(passes, queueReads, queueWrites); @@ -739,11 +781,17 @@ namespace Render { DevirtualizeResources(passWritesMap.at(inCopyPass)); { TransitionResourcesForCopyPassDesc(inRecoder, inCopyPass->passDesc); + if (inCopyPass->prePassFunc) { + inCopyPass->prePassFunc(*this, inRecoder); + } { const auto copyPassRecoder = inRecoder.BeginCopyPass(); - inCopyPass->func(*this, *copyPassRecoder); + inCopyPass->passFunc(*this, *copyPassRecoder); copyPassRecoder->EndPass(); } + if (inCopyPass->postPassFunc) { + inCopyPass->postPassFunc(*this, inRecoder); + } } FinalizePassResources(passReadsMap.at(inCopyPass)); } @@ -754,11 +802,17 @@ namespace Render { DevirtualizeBindGroupsAndViews(inComputePass->bindGroups); { TransitionResourcesForBindGroups(inRecoder, inComputePass->bindGroups); + if (inComputePass->prePassFunc) { + inComputePass->prePassFunc(*this, inRecoder); + } { const auto computePassRecoder = inRecoder.BeginComputePass(); - inComputePass->func(*this, *computePassRecoder); + inComputePass->passFunc(*this, *computePassRecoder); computePassRecoder->EndPass(); } + if (inComputePass->postPassFunc) { + inComputePass->postPassFunc(*this, inRecoder); + } } FinalizePassResources(passReadsMap.at(inComputePass)); FinalizePassBindGroups(inComputePass->bindGroups); @@ -772,16 +826,45 @@ namespace Render { { TransitionResourcesForBindGroups(inRecoder, inRasterPass->bindGroups); TransitionResourcesForRasterPassDesc(inRecoder, inRasterPass->passDesc); + if (inRasterPass->prePassFunc) { + inRasterPass->prePassFunc(*this, inRecoder); + } { const auto rasterPassRecoder = inRecoder.BeginRasterPass(Internal::GetRHIRasterPassBeginInfo(*this, inRasterPass->passDesc)); - inRasterPass->func(*this, *rasterPassRecoder); + inRasterPass->passFunc(*this, *rasterPassRecoder); rasterPassRecoder->EndPass(); } + if (inRasterPass->postPassFunc) { + inRasterPass->postPassFunc(*this, inRecoder); + } } FinalizePassResources(passReadsMap.at(inRasterPass)); FinalizePassBindGroups(inRasterPass->bindGroups); } + void RGBuilder::PerformBufferUploads() + { + bufferUploadTasks.reserve(bufferUploads.size()); + for (const auto& [buffer, uploadInfo] : bufferUploads) { + DevirtualizeResource(buffer); + auto* rhiBuffer = GetRHI(buffer); + + bufferUploadTasks.emplace_back(RenderWorkerThreads::Get().EmplaceTask([rhiBuffer, uploadInfo]() -> void { + const auto* src = static_cast(uploadInfo.data) + uploadInfo.srcOffset; + auto* dst = rhiBuffer->Map(RHI::MapMode::write, uploadInfo.dstOffset, uploadInfo.size); + memcpy(dst, src, uploadInfo.size); + rhiBuffer->UnMap(); + })); + } + } + + void RGBuilder::WaitBufferUploadsFinish() const + { + for (const auto& task : bufferUploadTasks) { + task.wait(); + } + } + void RGBuilder::DevirtualizeViewsCreatedOnImportedResources() { for (const auto& view : views) { @@ -804,22 +887,27 @@ namespace Render { } } + void RGBuilder::DevirtualizeResource(RGResourceRef inResource) + { + if (inResource->imported + || culledResources.contains(inResource) + || devirtualizedResources.contains(inResource)) { + return; + } + + if (inResource->type == RGResType::buffer) { + devirtualizedResources.emplace(std::make_pair(inResource, BufferPool::Get(device).Allocate(static_cast(inResource)->desc))); + } else if (inResource->type == RGResType::texture) { + devirtualizedResources.emplace(std::make_pair(inResource, TexturePool::Get(device).Allocate(static_cast(inResource)->desc))); + } else { + Unimplement(); + } + } + void RGBuilder::DevirtualizeResources(const std::unordered_set& inResources) { for (auto* resource : inResources) { - if (resource->imported - || culledResources.contains(resource) - || devirtualizedResources.contains(resource)) { - continue; - } - - if (resource->type == RGResType::buffer) { - devirtualizedResources.emplace(std::make_pair(resource, BufferPool::Get(device).Allocate(static_cast(resource)->desc))); - } else if (resource->type == RGResType::texture) { - devirtualizedResources.emplace(std::make_pair(resource, TexturePool::Get(device).Allocate(static_cast(resource)->desc))); - } else { - Unimplement(); - } + DevirtualizeResource(resource); } } @@ -833,7 +921,7 @@ namespace Render { const auto* binding = layout->GetBinding(name); Assert(binding != nullptr); - if (item.type == RHI::BindingType::uniformBuffer || item.type == RHI::BindingType::storageBuffer) { + if (item.type == RHI::BindingType::uniformBuffer || item.type == RHI::BindingType::storageBuffer || item.type == RHI::BindingType::rwStorageBuffer) { auto* bufferView = std::get(item.view); if (!devirtualizedResourceViews.contains(bufferView)) { devirtualizedResourceViews.emplace(std::make_pair(bufferView, ResourceViewCache::Get(device).GetOrCreate(GetRHI(bufferView->GetBuffer()), bufferView->desc))); @@ -931,16 +1019,18 @@ namespace Render { void RGBuilder::TransitionResourcesForBindGroups(RHI::CommandCommandRecorder& inRecoder, const std::vector& inBindGroups) { for (auto* bindGroup : inBindGroups) { - for (const auto& [name, item] : bindGroup->desc.items) { - if (item.type == RHI::BindingType::uniformBuffer) { - TransitionBuffer(inRecoder, std::get(item.view)->GetBuffer(), RHI::BufferState::shaderReadOnly); - } else if (item.type == RHI::BindingType::storageBuffer) { - TransitionBuffer(inRecoder, std::get(item.view)->GetBuffer(), RHI::BufferState::storage); - } else if (item.type == RHI::BindingType::texture) { - TransitionTexture(inRecoder, std::get(item.view)->GetTexture(), RHI::TextureState::shaderReadOnly); - } else if (item.type == RHI::BindingType::storageTexture) { - TransitionTexture(inRecoder, std::get(item.view)->GetTexture(), RHI::TextureState::storage); - } else if (item.type == RHI::BindingType::sampler) {} else { + for (const auto& [type, view] : bindGroup->desc.items | std::views::values) { + if (type == RHI::BindingType::uniformBuffer) { + TransitionBuffer(inRecoder, std::get(view)->GetBuffer(), RHI::BufferState::shaderReadOnly); + } else if (type == RHI::BindingType::storageBuffer) { + TransitionBuffer(inRecoder, std::get(view)->GetBuffer(), RHI::BufferState::storage); + } else if (type == RHI::BindingType::rwStorageBuffer) { + TransitionBuffer(inRecoder, std::get(view)->GetBuffer(), RHI::BufferState::rwStorage); + } else if (type == RHI::BindingType::texture) { + TransitionTexture(inRecoder, std::get(view)->GetTexture(), RHI::TextureState::shaderReadOnly); + } else if (type == RHI::BindingType::storageTexture) { + TransitionTexture(inRecoder, std::get(view)->GetTexture(), RHI::TextureState::storage); + } else if (type == RHI::BindingType::sampler) {} else { Unimplement(); } } diff --git a/Engine/Source/Render/Src/RenderThread.cpp b/Engine/Source/Render/Src/RenderThread.cpp new file mode 100644 index 000000000..9333ff6c2 --- /dev/null +++ b/Engine/Source/Render/Src/RenderThread.cpp @@ -0,0 +1,58 @@ +// +// Created by johnk on 2025/2/11. +// + +#include + +namespace Render { + RenderThread& RenderThread::Get() + { + static RenderThread instance; + return instance; + } + + RenderThread::RenderThread() = default; + + RenderThread::~RenderThread() = default; + + void RenderThread::Start() + { + Assert(thread == nullptr); + thread = Common::MakeUnique("RenderingThread"); + thread->EmplaceTask([]() -> void { Core::ThreadContext::SetTag(Core::ThreadTag::render); }); + } + + void RenderThread::Stop() + { + Assert(thread != nullptr); + thread = nullptr; + } + + void RenderThread::Flush() const + { + Assert(thread != nullptr); + thread->Flush(); + } + + RenderWorkerThreads& RenderWorkerThreads::Get() + { + static RenderWorkerThreads instance; + return instance; + } + + RenderWorkerThreads::RenderWorkerThreads() = default; + + RenderWorkerThreads::~RenderWorkerThreads() = default; + + void RenderWorkerThreads::Start() + { + Assert(threads == nullptr); + threads = Common::MakeUnique("RenderWorkers", 8); + } + + void RenderWorkerThreads::Stop() + { + Assert(threads != nullptr); + threads = nullptr; + } +} diff --git a/Engine/Source/Render/Src/ShaderCompiler.cpp b/Engine/Source/Render/Src/ShaderCompiler.cpp index 5cbbfa39e..d8422cacc 100644 --- a/Engine/Source/Render/Src/ShaderCompiler.cpp +++ b/Engine/Source/Render/Src/ShaderCompiler.cpp @@ -332,11 +332,11 @@ namespace Render { std::future ShaderCompiler::Compile(const ShaderCompileInput& inInput, const ShaderCompileOptions& inOptions) { - return threadPool.EmplaceTask([](const ShaderCompileInput& input, const ShaderCompileOptions& options) -> ShaderCompileOutput { + return threadPool.EmplaceTask([inInput, inOptions]() -> ShaderCompileOutput { ShaderCompileOutput output; - CompileDxilOrSpriv(input, options, output); + CompileDxilOrSpriv(inInput, inOptions, output); return output; - }, inInput, inOptions); + }); } ShaderTypeCompiler& ShaderTypeCompiler::Get() @@ -354,10 +354,10 @@ namespace Render { std::future ShaderTypeCompiler::Compile(const std::vector& inShaderTypes, const ShaderCompileOptions& inOptions) { - return threadPool.EmplaceTask([](const std::vector& shaderTypes, const ShaderCompileOptions& options) -> ShaderTypeCompileResult { + return threadPool.EmplaceTask([inShaderTypes, inOptions]() -> ShaderTypeCompileResult { std::unordered_map>> compileOutputs; - compileOutputs.reserve(shaderTypes.size()); - for (auto* shaderType : shaderTypes) { + compileOutputs.reserve(inShaderTypes.size()); + for (auto* shaderType : inShaderTypes) { auto typeKey = shaderType->GetKey(); auto stage = shaderType->GetStage(); const auto& entryPoint = shaderType->GetEntryPoint(); @@ -375,7 +375,7 @@ namespace Render { input.stage = stage; input.definitions = shaderType->GetDefinitions(variantKey); - variantCompileOutputs.emplace(std::make_pair(variantKey, ShaderCompiler::Get().Compile(input, options))); + variantCompileOutputs.emplace(std::make_pair(variantKey, ShaderCompiler::Get().Compile(input, inOptions))); } } @@ -399,7 +399,7 @@ namespace Render { } result.success = result.errorInfos.empty(); return result; - }, inShaderTypes, inOptions); + }); } std::future ShaderTypeCompiler::CompileGlobalShaderTypes(const ShaderCompileOptions& inOptions) diff --git a/Engine/Source/Render/Test/ResourcePoolTest.cpp b/Engine/Source/Render/Test/ResourcePoolTest.cpp index fc51f11b0..6045f3fd2 100644 --- a/Engine/Source/Render/Test/ResourcePoolTest.cpp +++ b/Engine/Source/Render/Test/ResourcePoolTest.cpp @@ -21,7 +21,7 @@ struct ResourcePoolTest : testing::Test { void TearDown() override {} RHI::Instance* instance; - Common::UniqueRef device; + Common::UniquePtr device; }; TEST_F(ResourcePoolTest, BasicTest) @@ -38,22 +38,34 @@ TEST_F(ResourcePoolTest, BasicTest) textureDesc.samples = 1; textureDesc.initialState = RHI::TextureState::undefined; PooledTextureRef t1 = texturePool.Allocate(textureDesc); + ASSERT_EQ(texturePool.Size(), 1); textureDesc.width = 1024; textureDesc.height = 1024; textureDesc.depthOrArraySize = 1; PooledTextureRef t2 = texturePool.Allocate(textureDesc); + ASSERT_EQ(texturePool.Size(), 2); textureDesc.width = 1920; textureDesc.height = 1080; textureDesc.depthOrArraySize = 1; - const PooledTextureRef t3 = texturePool.Allocate(textureDesc); + PooledTextureRef t3 = texturePool.Allocate(textureDesc); ASSERT_NE(t1.Get(), t3.Get()); + ASSERT_EQ(texturePool.Size(), 3); auto* texturePtr = t1.Get(); t1.Reset(); const PooledTextureRef t4 = texturePool.Allocate(textureDesc); ASSERT_EQ(texturePtr, t4.Get()); + ASSERT_EQ(texturePool.Size(), 3); - texturePool.GarbageCollect(); + t2.Reset(); + t3.Reset(); + ASSERT_EQ(texturePool.Size(), 3); + + texturePool.Tick(); + ASSERT_EQ(texturePool.Size(), 3); + + texturePool.Tick(); + ASSERT_EQ(texturePool.Size(), 1); } diff --git a/Engine/Source/Runtime/Include/Runtime/Asset.h b/Engine/Source/Runtime/Include/Runtime/Asset.h index c8de6d6d8..dacf7c808 100644 --- a/Engine/Source/Runtime/Include/Runtime/Asset.h +++ b/Engine/Source/Runtime/Include/Runtime/Asset.h @@ -29,21 +29,21 @@ namespace Runtime { }; template A> - class AssetRef { + class AssetPtr { public: - template A2> AssetRef(Common::SharedRef& inRef); // NOLINT - template A2> AssetRef(Common::SharedRef&& inRef) noexcept; // NOLINT - AssetRef(A* pointer); // NOLINT - AssetRef(AssetRef& other); // NOLINT - AssetRef(AssetRef&& other) noexcept; // NOLINT - AssetRef(); - ~AssetRef(); - - template A2> AssetRef& operator=(Common::SharedRef& inRef); - template A2> AssetRef& operator=(Common::SharedRef&& inRef) noexcept; - AssetRef& operator=(A* pointer); - AssetRef& operator=(AssetRef& other); // NOLINT - AssetRef& operator=(AssetRef&& other) noexcept; + template A2> AssetPtr(Common::SharedPtr& sharedPtr); // NOLINT + template A2> AssetPtr(Common::SharedPtr&& sharedPtr) noexcept; // NOLINT + AssetPtr(A* pointer); // NOLINT + AssetPtr(AssetPtr& other); // NOLINT + AssetPtr(AssetPtr&& other) noexcept; // NOLINT + AssetPtr(); + ~AssetPtr(); + + template A2> AssetPtr& operator=(Common::SharedPtr& sharedPtr); + template A2> AssetPtr& operator=(Common::SharedPtr&& sharedPtr) noexcept; + AssetPtr& operator=(A* pointer); + AssetPtr& operator=(AssetPtr& other); // NOLINT + AssetPtr& operator=(AssetPtr&& other) noexcept; const Core::Uri& Uri() const; A* operator->() const noexcept; @@ -53,60 +53,60 @@ namespace Runtime { A* Get() const; void Reset(A* pointer = nullptr); auto RefCount() const; - Common::SharedRef& GetSharedRef(); - template A2> AssetRef StaticCast(); - template A2> AssetRef DynamicCast(); - template A2> AssetRef ReinterpretCast(); + Common::SharedPtr& GetSharedRef(); + template A2> AssetPtr StaticCast(); + template A2> AssetPtr DynamicCast(); + template A2> AssetPtr ReinterpretCast(); private: - Common::SharedRef ref; + Common::SharedPtr ptr; }; template A> - class WeakAssetRef { + class WeakAssetPtr { public: - template A2> WeakAssetRef(AssetRef& inRef); // NOLINT - WeakAssetRef(WeakAssetRef& other); // NOLINT - WeakAssetRef(WeakAssetRef&& other) noexcept; // NOLINT + template A2> WeakAssetPtr(AssetPtr& assetPtr); // NOLINT + WeakAssetPtr(WeakAssetPtr& other); // NOLINT + WeakAssetPtr(WeakAssetPtr&& other) noexcept; // NOLINT - template A2> WeakAssetRef& operator=(AssetRef& inRef); - WeakAssetRef& operator=(WeakAssetRef& other); // NOLINT - WeakAssetRef& operator=(WeakAssetRef&& other) noexcept; + template A2> WeakAssetPtr& operator=(AssetPtr& assetPtr); + WeakAssetPtr& operator=(WeakAssetPtr& other); // NOLINT + WeakAssetPtr& operator=(WeakAssetPtr&& other) noexcept; void Reset(); bool Expired() const; - AssetRef Lock() const; + AssetPtr Lock() const; private: - Common::WeakRef ref; + Common::WeakPtr ptr; }; template A> - class SoftAssetRef { + class SoftAssetPtr { public: - SoftAssetRef(); - explicit SoftAssetRef(Core::Uri inUri); - explicit SoftAssetRef(AssetRef& inAsset); - SoftAssetRef(const SoftAssetRef& other); - SoftAssetRef(SoftAssetRef&& other) noexcept; - ~SoftAssetRef(); - - SoftAssetRef& operator=(Core::Uri inUri); - SoftAssetRef& operator=(AssetRef& inAsset); - SoftAssetRef& operator=(const SoftAssetRef& other); - SoftAssetRef& operator=(SoftAssetRef&& other) noexcept; + SoftAssetPtr(); + explicit SoftAssetPtr(Core::Uri inUri); + explicit SoftAssetPtr(AssetPtr& inAsset); + SoftAssetPtr(const SoftAssetPtr& other); + SoftAssetPtr(SoftAssetPtr&& other) noexcept; + ~SoftAssetPtr(); + + SoftAssetPtr& operator=(Core::Uri inUri); + SoftAssetPtr& operator=(AssetPtr& inAsset); + SoftAssetPtr& operator=(const SoftAssetPtr& other); + SoftAssetPtr& operator=(SoftAssetPtr&& other) noexcept; bool Empty() const; bool Loaded() const; - AssetRef Get() const; + AssetPtr Get() const; void Reset(); const Core::Uri& Uri() const; private: Core::Uri uri; - AssetRef asset; + AssetPtr asset; }; - template A> using OnAssetLoaded = std::function)>; + template A> using OnAssetLoaded = std::function)>; template A> using OnSoftAssetLoaded = std::function; class RUNTIME_API AssetManager { @@ -114,35 +114,35 @@ namespace Runtime { static AssetManager& Get(); ~AssetManager(); - template A> AssetRef SyncLoad(const Core::Uri& uri); - template A> void SyncLoadSoft(SoftAssetRef& softAssetRef); + template A> AssetPtr SyncLoad(const Core::Uri& uri); + template A> void SyncLoadSoft(SoftAssetPtr& softAssetRef); template A> void AsyncLoad(const Core::Uri& uri, const OnAssetLoaded& onAssetLoaded); - template A> void AsyncLoadSoft(SoftAssetRef& softAssetRef, const OnSoftAssetLoaded& onSoftAssetLoaded); - template A> void Save(const AssetRef& assetRef); - template A> void SaveSoft(const SoftAssetRef& softAssetRef); + template A> void AsyncLoadSoft(SoftAssetPtr& softAssetRef, const OnSoftAssetLoaded& onSoftAssetLoaded); + template A> void Save(const AssetPtr& assetRef); + template A> void SaveSoft(const SoftAssetPtr& softAssetRef); private: - template A> AssetRef LoadInternal(const Core::Uri& uri); + template A> AssetPtr LoadInternal(const Core::Uri& uri); AssetManager(); std::mutex mutex; - std::unordered_map> weakAssetRefs; + std::unordered_map> weakAssetRefs; Common::ThreadPool threadPool; }; } namespace Common { template A> - struct Serializer> { + struct Serializer> { static constexpr size_t typeId = Common::HashUtils::StrCrc32("Runtime::AssetRef"); - static size_t Serialize(BinarySerializeStream& stream, const Runtime::AssetRef& value) + static size_t Serialize(BinarySerializeStream& stream, const Runtime::AssetPtr& value) { return Serializer::Serialize(stream, value); } - static size_t Deserialize(BinaryDeserializeStream& stream, Runtime::AssetRef& value) + static size_t Deserialize(BinaryDeserializeStream& stream, Runtime::AssetPtr& value) { Core::Uri uri; const auto deserialized = Serializer::Deserialize(stream, uri); @@ -152,15 +152,15 @@ namespace Common { }; template A> - struct Serializer> { + struct Serializer> { static constexpr size_t typeId = Common::HashUtils::StrCrc32("Runtime::SoftAssetRef"); - static size_t Serialize(BinarySerializeStream& stream, const Runtime::SoftAssetRef& value) + static size_t Serialize(BinarySerializeStream& stream, const Runtime::SoftAssetPtr& value) { return Serializer::Serialize(stream, value); } - static size_t Deserialize(BinaryDeserializeStream& stream, Runtime::SoftAssetRef& value) + static size_t Deserialize(BinaryDeserializeStream& stream, Runtime::SoftAssetPtr& value) { Core::Uri uri; const auto deserialized = Serializer::Deserialize(stream, uri); @@ -173,254 +173,254 @@ namespace Common { namespace Runtime { template A> template A2> - AssetRef::AssetRef(Common::SharedRef& inRef) - : ref(inRef) + AssetPtr::AssetPtr(Common::SharedPtr& sharedPtr) + : ptr(sharedPtr) { } template A> template A2> - AssetRef::AssetRef(Common::SharedRef&& inRef) noexcept - : ref(std::move(inRef)) + AssetPtr::AssetPtr(Common::SharedPtr&& sharedPtr) noexcept + : ptr(std::move(sharedPtr)) { } template A> - AssetRef::AssetRef(A* pointer) - : ref(pointer) + AssetPtr::AssetPtr(A* pointer) + : ptr(pointer) { } template A> - AssetRef::AssetRef(AssetRef& other) - : ref(other.ref) + AssetPtr::AssetPtr(AssetPtr& other) + : ptr(other.ptr) { } template A> - AssetRef::AssetRef(AssetRef&& other) noexcept - : ref(std::move(other.ref)) + AssetPtr::AssetPtr(AssetPtr&& other) noexcept + : ptr(std::move(other.ptr)) { } template A> - AssetRef::AssetRef() = default; + AssetPtr::AssetPtr() = default; template A> - AssetRef::~AssetRef() = default; + AssetPtr::~AssetPtr() = default; template A> template A2> - AssetRef& AssetRef::operator=(Common::SharedRef& inRef) + AssetPtr& AssetPtr::operator=(Common::SharedPtr& sharedPtr) { - ref = inRef; + ptr = sharedPtr; return *this; } template A> template A2> - AssetRef& AssetRef::operator=(Common::SharedRef&& inRef) noexcept + AssetPtr& AssetPtr::operator=(Common::SharedPtr&& sharedPtr) noexcept { - ref = inRef; + ptr = sharedPtr; return *this; } template A> - AssetRef& AssetRef::operator=(A* pointer) + AssetPtr& AssetPtr::operator=(A* pointer) { - ref = pointer; + ptr = pointer; return *this; } template A> - AssetRef& AssetRef::operator=(AssetRef& other) + AssetPtr& AssetPtr::operator=(AssetPtr& other) { - ref = other.ref; + ptr = other.ptr; return *this; } template A> - AssetRef& AssetRef::operator=(AssetRef&& other) noexcept + AssetPtr& AssetPtr::operator=(AssetPtr&& other) noexcept { - ref = std::move(other.ref); + ptr = std::move(other.ptr); return *this; } template A> - const Core::Uri& AssetRef::Uri() const + const Core::Uri& AssetPtr::Uri() const { - Assert(ref != nullptr); - return ref->uri; + Assert(ptr != nullptr); + return ptr->uri; } template A> - A* AssetRef::operator->() const noexcept + A* AssetPtr::operator->() const noexcept { - return ref.operator->(); + return ptr.operator->(); } template A> - A& AssetRef::operator*() const noexcept + A& AssetPtr::operator*() const noexcept { - return ref.operator*(); + return ptr.operator*(); } template A> - bool AssetRef::operator==(nullptr_t) const noexcept + bool AssetPtr::operator==(nullptr_t) const noexcept { - return ref == nullptr; + return ptr == nullptr; } template A> - bool AssetRef::operator!=(nullptr_t) const noexcept + bool AssetPtr::operator!=(nullptr_t) const noexcept { - return ref != nullptr; + return ptr != nullptr; } template A> - A* AssetRef::Get() const + A* AssetPtr::Get() const { - return ref.Get(); + return ptr.Get(); } template A> - void AssetRef::Reset(A* pointer) + void AssetPtr::Reset(A* pointer) { - ref.Reset(pointer); + ptr.Reset(pointer); } template A> - auto AssetRef::RefCount() const + auto AssetPtr::RefCount() const { - return ref.RefCount(); + return ptr.RefCount(); } template A> - Common::SharedRef& AssetRef::GetSharedRef() + Common::SharedPtr& AssetPtr::GetSharedRef() { - return ref; + return ptr; } template A> template A2> - AssetRef AssetRef::StaticCast() + AssetPtr AssetPtr::StaticCast() { - return ref.template StaticCast(); + return ptr.template StaticCast(); } template A> template A2> - AssetRef AssetRef::DynamicCast() + AssetPtr AssetPtr::DynamicCast() { - return ref.template DynamicCast(); + return ptr.template DynamicCast(); } template A> template A2> - AssetRef AssetRef::ReinterpretCast() + AssetPtr AssetPtr::ReinterpretCast() { - return ref.template ReinterpretCast(); + return ptr.template ReinterpretCast(); } template A> template A2> - WeakAssetRef::WeakAssetRef(AssetRef& inRef) - : ref(inRef.GetSharedRef()) + WeakAssetPtr::WeakAssetPtr(AssetPtr& assetPtr) + : ptr(assetPtr.GetSharedRef()) { } template A> - WeakAssetRef::WeakAssetRef(WeakAssetRef& other) - : ref(other.ref) + WeakAssetPtr::WeakAssetPtr(WeakAssetPtr& other) + : ptr(other.ptr) { } template A> - WeakAssetRef::WeakAssetRef(WeakAssetRef&& other) noexcept - : ref(std::move(other.ref)) + WeakAssetPtr::WeakAssetPtr(WeakAssetPtr&& other) noexcept + : ptr(std::move(other.ptr)) { } template A> template A2> - WeakAssetRef& WeakAssetRef::operator=(AssetRef& inRef) + WeakAssetPtr& WeakAssetPtr::operator=(AssetPtr& assetPtr) { - ref = inRef.GetSharedRef(); + ptr = assetPtr.GetSharedRef(); return *this; } template A> - WeakAssetRef& WeakAssetRef::operator=(WeakAssetRef& other) + WeakAssetPtr& WeakAssetPtr::operator=(WeakAssetPtr& other) { - ref = other.ref; + ptr = other.ptr; return *this; } template A> - WeakAssetRef& WeakAssetRef::operator=(WeakAssetRef&& other) noexcept + WeakAssetPtr& WeakAssetPtr::operator=(WeakAssetPtr&& other) noexcept { - ref = std::move(other.ref); + ptr = std::move(other.ptr); return *this; } template A> - void WeakAssetRef::Reset() + void WeakAssetPtr::Reset() { - ref.Reset(); + ptr.Reset(); } template A> - bool WeakAssetRef::Expired() const + bool WeakAssetPtr::Expired() const { - return ref.Expired(); + return ptr.Expired(); } template A> - AssetRef WeakAssetRef::Lock() const + AssetPtr WeakAssetPtr::Lock() const { - return ref.Lock(); + return ptr.Lock(); } template A> - SoftAssetRef::SoftAssetRef() + SoftAssetPtr::SoftAssetPtr() : uri() , asset() { } template A> - SoftAssetRef::SoftAssetRef(Core::Uri inUri) + SoftAssetPtr::SoftAssetPtr(Core::Uri inUri) : uri(std::move(inUri)) , asset() { } template A> - SoftAssetRef::SoftAssetRef(AssetRef& inAsset) + SoftAssetPtr::SoftAssetPtr(AssetPtr& inAsset) : uri(inAsset.Uri()) , asset(inAsset) { } template A> - SoftAssetRef::SoftAssetRef(const SoftAssetRef& other) + SoftAssetPtr::SoftAssetPtr(const SoftAssetPtr& other) : uri(other.uri) , asset(other.asset) { } template A> - SoftAssetRef::SoftAssetRef(SoftAssetRef&& other) noexcept + SoftAssetPtr::SoftAssetPtr(SoftAssetPtr&& other) noexcept : uri(std::move(other.uri)) , asset(std::move(other.asset)) { } template A> - SoftAssetRef::~SoftAssetRef() = default; + SoftAssetPtr::~SoftAssetPtr() = default; template A> - SoftAssetRef& SoftAssetRef::operator=(Core::Uri inUri) + SoftAssetPtr& SoftAssetPtr::operator=(Core::Uri inUri) { uri = std::move(inUri); asset = nullptr; @@ -428,7 +428,7 @@ namespace Runtime { } template A> - SoftAssetRef& SoftAssetRef::operator=(AssetRef& inAsset) + SoftAssetPtr& SoftAssetPtr::operator=(AssetPtr& inAsset) { uri = inAsset.Uri(); asset = inAsset; @@ -436,7 +436,7 @@ namespace Runtime { } template A> - SoftAssetRef& SoftAssetRef::operator=(const SoftAssetRef& other) + SoftAssetPtr& SoftAssetPtr::operator=(const SoftAssetPtr& other) { uri = other.uri; asset = other.asset; @@ -444,7 +444,7 @@ namespace Runtime { } template A> - SoftAssetRef& SoftAssetRef::operator=(SoftAssetRef&& other) noexcept + SoftAssetPtr& SoftAssetPtr::operator=(SoftAssetPtr&& other) noexcept { uri = std::move(other.uri); asset = std::move(other.asset); @@ -452,47 +452,47 @@ namespace Runtime { } template A> - bool SoftAssetRef::Empty() const + bool SoftAssetPtr::Empty() const { return uri.Empty(); } template A> - bool SoftAssetRef::Loaded() const + bool SoftAssetPtr::Loaded() const { return asset != nullptr; } template A> - AssetRef SoftAssetRef::Get() const + AssetPtr SoftAssetPtr::Get() const { return asset; } template A> - void SoftAssetRef::Reset() + void SoftAssetPtr::Reset() { asset = nullptr; } template A> - const Core::Uri& SoftAssetRef::Uri() const + const Core::Uri& SoftAssetPtr::Uri() const { return uri; } template A> - AssetRef AssetManager::SyncLoad(const Core::Uri& uri) + AssetPtr AssetManager::SyncLoad(const Core::Uri& uri) { auto iter = weakAssetRefs.find(uri); if (iter != weakAssetRefs.end() && !iter->second.Expired()) { return iter->second.Lock().StaticCast(); } - AssetRef result = LoadInternal(uri); - AssetRef tempRef = result.template StaticCast(); + AssetPtr result = LoadInternal(uri); + AssetPtr tempRef = result.template StaticCast(); if (iter == weakAssetRefs.end()) { - weakAssetRefs.emplace(std::make_pair(uri, WeakAssetRef(tempRef))); + weakAssetRefs.emplace(std::make_pair(uri, WeakAssetPtr(tempRef))); } else { iter->second = tempRef; } @@ -500,7 +500,7 @@ namespace Runtime { } template A> - void AssetManager::SyncLoadSoft(SoftAssetRef& softAssetRef) + void AssetManager::SyncLoadSoft(SoftAssetPtr& softAssetRef) { softAssetRef = SyncLoad(softAssetRef.Uri()); } @@ -509,7 +509,7 @@ namespace Runtime { void AssetManager::AsyncLoad(const Core::Uri& uri, const OnAssetLoaded& onAssetLoaded) { threadPool.EmplaceTask([=]() -> void { - AssetRef result = nullptr; + AssetPtr result = nullptr; { std::unique_lock lock(mutex); auto iter = weakAssetRefs.find(uri); @@ -522,12 +522,12 @@ namespace Runtime { result = LoadInternal(uri); } - AssetRef tempRef = result.template StaticCast(); + AssetPtr tempRef = result.template StaticCast(); { std::unique_lock lock(mutex); auto iter = weakAssetRefs.find(uri); if (iter == weakAssetRefs.end()) { - weakAssetRefs.emplace(std::make_pair(uri, WeakAssetRef(tempRef))); + weakAssetRefs.emplace(std::make_pair(uri, WeakAssetPtr(tempRef))); } else { iter->second = tempRef; } @@ -538,10 +538,10 @@ namespace Runtime { } template A> - void AssetManager::AsyncLoadSoft(SoftAssetRef& softAssetRef, const OnSoftAssetLoaded& onSoftAssetLoaded) + void AssetManager::AsyncLoadSoft(SoftAssetPtr& softAssetRef, const OnSoftAssetLoaded& onSoftAssetLoaded) { threadPool.EmplaceTask([this, softAssetRef, onSoftAssetLoaded]() -> void { - AsyncLoad(softAssetRef.Uri(), [&](AssetRef& ref) -> void { + AsyncLoad(softAssetRef.Uri(), [&](AssetPtr& ref) -> void { softAssetRef = ref; onSoftAssetLoaded(); }); @@ -549,7 +549,7 @@ namespace Runtime { } template A> - void AssetManager::Save(const AssetRef& assetRef) + void AssetManager::Save(const AssetPtr& assetRef) { if (assetRef == nullptr) { return; @@ -564,19 +564,19 @@ namespace Runtime { } template A> - void AssetManager::SaveSoft(const SoftAssetRef& softAssetRef) + void AssetManager::SaveSoft(const SoftAssetPtr& softAssetRef) { Save(softAssetRef.Uri()); } template A> - AssetRef AssetManager::LoadInternal(const Core::Uri& uri) + AssetPtr AssetManager::LoadInternal(const Core::Uri& uri) { Core::AssetUriParser parser(uri); auto pathString = parser.AbsoluteFilePath().String(); Common::BinaryFileDeserializeStream stream(pathString); - AssetRef result = Common::SharedRef(new A()); + AssetPtr result = Common::SharedPtr(new A()); Mirror::Any ref = std::ref(*result.Get()); ref.Deserialize(stream); diff --git a/Engine/Source/Runtime/Include/Runtime/ECS.h b/Engine/Source/Runtime/Include/Runtime/ECS.h index 5719ccbef..4da239072 100644 --- a/Engine/Source/Runtime/Include/Runtime/ECS.h +++ b/Engine/Source/Runtime/Include/Runtime/ECS.h @@ -143,7 +143,7 @@ namespace Runtime::Internal { class SystemFactory { public: explicit SystemFactory(SystemClass inClass); - Common::UniqueRef Build(ECRegistry& inRegistry) const; + Common::UniquePtr Build(ECRegistry& inRegistry) const; std::unordered_map GetArguments(); const std::unordered_map& GetArguments() const; SystemClass GetClass() const; @@ -595,7 +595,7 @@ namespace Runtime { private: struct SystemContext { const Internal::SystemFactory& factory; - Common::UniqueRef instance; + Common::UniquePtr instance; }; struct SystemGroupContext { diff --git a/Engine/Source/Runtime/Include/Runtime/Engine.h b/Engine/Source/Runtime/Include/Runtime/Engine.h index 97427f0bf..80fa5c3a9 100644 --- a/Engine/Source/Runtime/Include/Runtime/Engine.h +++ b/Engine/Source/Runtime/Include/Runtime/Engine.h @@ -30,7 +30,7 @@ namespace Runtime { void UnmountWorld(World* inWorld); Render::RenderModule& GetRenderModule() const; void Tick(float inDeltaTimeSeconds) const; - Common::UniqueRef CreateWorld(const std::string& inName = "") const; + Common::UniquePtr CreateWorld(const std::string& inName = "") const; protected: explicit Engine(const EngineInitParams& inParams); @@ -61,6 +61,6 @@ namespace Runtime { static Engine& Get(); private: - static Common::UniqueRef engine; + static Common::UniquePtr engine; }; } diff --git a/Engine/Source/Runtime/Include/Runtime/System/Scene.h b/Engine/Source/Runtime/Include/Runtime/System/Scene.h index b5f38fbce..bc87448c6 100644 --- a/Engine/Source/Runtime/Include/Runtime/System/Scene.h +++ b/Engine/Source/Runtime/Include/Runtime/System/Scene.h @@ -34,7 +34,7 @@ namespace Runtime { void RemoveLightSceneProxy(Entity e); Render::RenderModule& renderModule; - Common::UniqueRef scene; + Common::UniquePtr scene; Observer transformUpdatedObserver; EventsObserver directionalLightsObserver; EventsObserver pointLightsObserver; diff --git a/Engine/Source/Runtime/Src/ECS.cpp b/Engine/Source/Runtime/Src/ECS.cpp index d5572c519..1b6f1e29f 100644 --- a/Engine/Source/Runtime/Src/ECS.cpp +++ b/Engine/Source/Runtime/Src/ECS.cpp @@ -344,7 +344,7 @@ namespace Runtime::Internal { BuildArgumentLists(); } - Common::UniqueRef SystemFactory::Build(ECRegistry& inRegistry) const + Common::UniquePtr SystemFactory::Build(ECRegistry& inRegistry) const { const Mirror::Any system = clazz->New(inRegistry); const Mirror::Any systemRef = system.Deref(); diff --git a/Engine/Source/Runtime/Src/Engine.cpp b/Engine/Source/Runtime/Src/Engine.cpp index 288217b55..d9376716d 100644 --- a/Engine/Source/Runtime/Src/Engine.cpp +++ b/Engine/Source/Runtime/Src/Engine.cpp @@ -58,7 +58,7 @@ namespace Runtime { // TODO emplace render thread task, like wait fence, console command copy } - Common::UniqueRef Engine::CreateWorld(const std::string& inName) const // NOLINT + Common::UniquePtr Engine::CreateWorld(const std::string& inName) const // NOLINT { return new World(inName); } @@ -84,7 +84,7 @@ namespace Runtime { LogInfo(Render, "RHI type: {}", inRhiTypeStr); } - Common::UniqueRef EngineHolder::engine = nullptr; + Common::UniquePtr EngineHolder::engine = nullptr; MinEngine::MinEngine(const EngineInitParams& inParams) : Engine(inParams) diff --git a/Engine/Source/Runtime/Test/AssetTest.cpp b/Engine/Source/Runtime/Test/AssetTest.cpp index 651c5af19..5348e58c2 100644 --- a/Engine/Source/Runtime/Test/AssetTest.cpp +++ b/Engine/Source/Runtime/Test/AssetTest.cpp @@ -8,14 +8,14 @@ TEST(AssetTest, AssetRefTest0) { - AssetRef a0 = MakeShared(); + AssetPtr a0 = MakeShared(); ASSERT_EQ(a0.RefCount(), 1); - AssetRef a1 = a0; + AssetPtr a1 = a0; ASSERT_EQ(a0.RefCount(), 2); ASSERT_EQ(a1.RefCount(), 2); - AssetRef a2 = a1.StaticCast(); + AssetPtr a2 = a1.StaticCast(); ASSERT_EQ(a0.RefCount(), 3); ASSERT_EQ(a1.RefCount(), 3); ASSERT_EQ(a2.RefCount(), 3); @@ -23,15 +23,15 @@ TEST(AssetTest, AssetRefTest0) TEST(AssetTest, AssetRefTest1) { - AssetRef a0 = MakeShared(); - AssetRef a1 = std::move(a0); + AssetPtr a0 = MakeShared(); + AssetPtr a1 = std::move(a0); ASSERT_EQ(a1.RefCount(), 1); - WeakAssetRef w0 = a1; + WeakAssetPtr w0 = a1; ASSERT_FALSE(w0.Expired()); - AssetRef a2 = a1.StaticCast(); - WeakAssetRef w1 = a2; + AssetPtr a2 = a1.StaticCast(); + WeakAssetPtr w1 = a2; ASSERT_FALSE(w1.Expired()); a1.Reset(); @@ -44,10 +44,10 @@ TEST(AssetTest, SaveLoadTest) { static Core::Uri uri("asset://Engine/Test/Generated/Runtime/AssetTest.SaveLoadTest"); - AssetRef asset = MakeShared(uri, 1, "hello"); + AssetPtr asset = MakeShared(uri, 1, "hello"); AssetManager::Get().Save(asset); - AssetRef restore = AssetManager::Get().SyncLoad(uri); + AssetPtr restore = AssetManager::Get().SyncLoad(uri); ASSERT_EQ(restore.Uri(), uri); ASSERT_EQ(restore->a, 1); ASSERT_EQ(restore->b, "hello"); @@ -57,10 +57,10 @@ TEST(AssetTest, AsyncLoadTest) { static Core::Uri uri("asset://Engine/Test/Generated/Runtime/AssetTest.SaveLoadTest"); - AssetRef asset = MakeShared(uri, 1, "hello"); + AssetPtr asset = MakeShared(uri, 1, "hello"); AssetManager::Get().Save(asset); - AssetManager::Get().AsyncLoad(uri, [&](AssetRef restore) -> void { + AssetManager::Get().AsyncLoad(uri, [&](AssetPtr restore) -> void { ASSERT_EQ(restore.Uri(), uri); ASSERT_EQ(restore->a, 1); ASSERT_EQ(restore->b, "hello"); diff --git a/Sample/Base/Application.h b/Sample/Base/Application.h index 0298d9f74..fe72e97fe 100644 --- a/Sample/Base/Application.h +++ b/Sample/Base/Application.h @@ -67,7 +67,7 @@ class Application { UVec2 windowExtent; RHI::RHIType rhiType; RHI::Instance* instance; - UniqueRef camera; + UniquePtr camera; FVec2 mousePos; std::array(MouseButton::max)> mouseButtonsStatus; std::chrono::time_point lastTime; diff --git a/Sample/RHI-ParallelCompute/ParallelCompute.cpp b/Sample/RHI-ParallelCompute/ParallelCompute.cpp index fcc99315a..be060f611 100644 --- a/Sample/RHI-ParallelCompute/ParallelCompute.cpp +++ b/Sample/RHI-ParallelCompute/ParallelCompute.cpp @@ -71,7 +71,7 @@ class ParallelCompute final : public Application { .SetUsages(BufferUsageBits::mapWrite | BufferUsageBits::copySrc) .SetInitialState(BufferState::staging); - const UniqueRef stagingBuf = device->CreateBuffer(bufInfo); + const UniquePtr stagingBuf = device->CreateBuffer(bufInfo); if (stagingBuf != nullptr) { auto* mapPointer = stagingBuf->Map(MapMode::write, 0, bufInfo.size); memcpy(mapPointer, data.data(), bufInfo.size); @@ -91,10 +91,10 @@ class ParallelCompute final : public Application { .SetExtendStorage(sizeof(PackedVec)); inputBufferView = inputBuffer->CreateBufferView(inputBufViewInfo); - const UniqueRef copyCmd = device->CreateCommandBuffer(); - const UniqueRef recorder = copyCmd->Begin(); + const UniquePtr copyCmd = device->CreateCommandBuffer(); + const UniquePtr recorder = copyCmd->Begin(); { - const UniqueRef copyRecorder = recorder->BeginCopyPass(); + const UniquePtr copyRecorder = recorder->BeginCopyPass(); copyRecorder->ResourceBarrier(Barrier::Transition(inputBuffer.Get(), BufferState::undefined, BufferState::copyDst)); copyRecorder->CopyBufferToBuffer( stagingBuf.Get(), @@ -105,7 +105,7 @@ class ParallelCompute final : public Application { } recorder->End(); - const UniqueRef mFence = device->CreateFence(false); + const UniquePtr mFence = device->CreateFence(false); QueueSubmitInfo submitInfo {}; submitInfo.signalFence = mFence.Get(); queue->Submit(copyCmd.Get(), submitInfo); @@ -168,17 +168,17 @@ class ParallelCompute final : public Application { void BuildCmdBufferAndSubmit() { - UniqueRef recorder = commandBuffer->Begin(); + UniquePtr recorder = commandBuffer->Begin(); // do compute work - UniqueRef computeRecorder = recorder->BeginComputePass(); + UniquePtr computeRecorder = recorder->BeginComputePass(); computeRecorder->SetPipeline(pipeline.Get()); computeRecorder->SetBindGroup(0, bindGroup.Get()); computeRecorder->Dispatch(1, 1, 1); computeRecorder->EndPass(); // read back to host buffer - UniqueRef copyRecorder = recorder->BeginCopyPass(); + UniquePtr copyRecorder = recorder->BeginCopyPass(); copyRecorder->ResourceBarrier(Barrier::Transition(outputBuffer.Get(), BufferState::rwStorage, BufferState::copySrc)); copyRecorder->CopyBufferToBuffer( outputBuffer.Get(), @@ -202,24 +202,24 @@ class ParallelCompute final : public Application { const int dataNum = 32; Gpu* gpu = nullptr; - UniqueRef device; + UniquePtr device; Queue* queue = nullptr; - UniqueRef inputBuffer; - UniqueRef inputBufferView; - UniqueRef outputBuffer; - UniqueRef outputBufferView; - UniqueRef readbackBuffer; - UniqueRef bindGroupLayout; - UniqueRef bindGroup; - UniqueRef sampler; - UniqueRef cmdBuffer; - UniqueRef pipelineLayout; - UniqueRef pipeline; - UniqueRef computeShader; - UniqueRef fence; + UniquePtr inputBuffer; + UniquePtr inputBufferView; + UniquePtr outputBuffer; + UniquePtr outputBufferView; + UniquePtr readbackBuffer; + UniquePtr bindGroupLayout; + UniquePtr bindGroup; + UniquePtr sampler; + UniquePtr cmdBuffer; + UniquePtr pipelineLayout; + UniquePtr pipeline; + UniquePtr computeShader; + UniquePtr fence; ShaderCompileOutput csOutPut; - UniqueRef csShaderModule; - UniqueRef commandBuffer; + UniquePtr csShaderModule; + UniquePtr commandBuffer; }; int main(int argc, char* argv[]) diff --git a/Sample/RHI-SSAO/GLTFParser.cpp b/Sample/RHI-SSAO/GLTFParser.cpp index 9fa15ceef..047d5bf5a 100644 --- a/Sample/RHI-SSAO/GLTFParser.cpp +++ b/Sample/RHI-SSAO/GLTFParser.cpp @@ -40,8 +40,8 @@ void Model::LoadFromFile(const std::string& path) LoadMaterials(scene); - SharedRef parentForRoot = nullptr; - rootNode = SharedRef(new Node(parentForRoot)); + SharedPtr parentForRoot = nullptr; + rootNode = SharedPtr(new Node(parentForRoot)); for (unsigned int i = 0; i < scene->mRootNode->mNumChildren; i++) { LoadNode(scene, scene->mRootNode->mChildren[i], rootNode); } @@ -54,7 +54,7 @@ void Model::LoadMaterials(const aiScene* scene) for (unsigned int i = 0; i < scene->mNumMaterials; i++) { const auto* material = scene->mMaterials[i]; - SharedRef mMaterial = new MaterialData(); + SharedPtr mMaterial = new MaterialData(); mMaterial->baseColorTexture = LoadMaterialTexture(scene, material, aiTextureType_DIFFUSE, fromEmbedded); mMaterial->normalTexture = LoadMaterialTexture(scene, material, aiTextureType_NORMALS, fromEmbedded); @@ -62,7 +62,7 @@ void Model::LoadMaterials(const aiScene* scene) } } -UniqueRef Model::LoadMaterialTexture(const aiScene* scene, const aiMaterial* mat, aiTextureType type, bool fromEmbedded) const +UniquePtr Model::LoadMaterialTexture(const aiScene* scene, const aiMaterial* mat, aiTextureType type, bool fromEmbedded) const { if (mat->GetTextureCount(type) == 0) { return nullptr; @@ -84,7 +84,7 @@ UniqueRef Model::LoadMaterialTexture(const aiScene* scene, const ai data = stbi_load(filePath.c_str(), &width, &height, &comp,0); } - UniqueRef mTexData = new TextureData(); + UniquePtr mTexData = new TextureData(); // Most device don`t support RGB only on Vulkan, so convert if necessary if (comp == 3) { @@ -111,9 +111,9 @@ UniqueRef Model::LoadMaterialTexture(const aiScene* scene, const ai return mTexData; } -void Model::LoadNode(const aiScene* scene, aiNode* node, SharedRef& parent) +void Model::LoadNode(const aiScene* scene, aiNode* node, SharedPtr& parent) { - SharedRef mNode = new Node(parent); + SharedPtr mNode = new Node(parent); // the layout of matrix in assimp math lib is row major, which is equal to expolsion math lib memcpy(mNode->matrix.data, &node->mTransformation.a1, sizeof(Common::FMat4x4)); @@ -184,7 +184,7 @@ void Model::LoadNode(const aiScene* scene, aiNode* node, SharedRef& parent } } - UniqueRef mMesh = new Mesh(indexStart, indexCount, vertexStart, vertexCount, materialDatas[mesh->mMaterialIndex]); + UniquePtr mMesh = new Mesh(indexStart, indexCount, vertexStart, vertexCount, materialDatas[mesh->mMaterialIndex]); // cache meshes in model instead of node, for the convenience of reading them meshes.emplace_back(std::move(mMesh)); diff --git a/Sample/RHI-SSAO/GLTFParser.h b/Sample/RHI-SSAO/GLTFParser.h index 040532b64..26b74e37f 100644 --- a/Sample/RHI-SSAO/GLTFParser.h +++ b/Sample/RHI-SSAO/GLTFParser.h @@ -25,8 +25,8 @@ struct TextureData { struct MaterialData { - Common::UniqueRef baseColorTexture = nullptr; - Common::UniqueRef normalTexture = nullptr; + Common::UniquePtr baseColorTexture = nullptr; + Common::UniquePtr normalTexture = nullptr; }; struct Vertex { @@ -45,9 +45,9 @@ struct Mesh { uint32_t firstVertex; uint32_t vertexCount; - Common::SharedRef materialData; + Common::SharedPtr materialData; - Mesh(uint32_t firstIndex, uint32_t indexCount, uint32_t firstVertex, uint32_t vertexCount, Common::SharedRef& material) + Mesh(uint32_t firstIndex, uint32_t indexCount, uint32_t firstVertex, uint32_t vertexCount, Common::SharedPtr& material) : firstIndex(firstIndex) , indexCount(indexCount) , firstVertex(firstVertex) @@ -60,14 +60,14 @@ struct Mesh { }; struct Node { - explicit Node(Common::SharedRef& p) - : parent(Common::WeakRef(p)) + explicit Node(Common::SharedPtr& p) + : parent(Common::WeakPtr(p)) , matrix(Common::FMat4x4Consts::identity) { } - Common::WeakRef parent; - std::vector> children; + Common::WeakPtr parent; + std::vector> children; Common::FMat4x4 matrix; @@ -82,11 +82,11 @@ class Model { ~Model() = default; void LoadFromFile(const std::string& path); - void LoadNode(const aiScene* scene, aiNode* node, Common::SharedRef& parent); + void LoadNode(const aiScene* scene, aiNode* node, Common::SharedPtr& parent); void LoadMaterials(const aiScene* scene); private: - Common::UniqueRef LoadMaterialTexture(const aiScene* scene, const aiMaterial* mat, aiTextureType type, bool fromEmbedded) const; + Common::UniquePtr LoadMaterialTexture(const aiScene* scene, const aiMaterial* mat, aiTextureType type, bool fromEmbedded) const; void CreateEmptyTexture() const { @@ -97,13 +97,13 @@ class Model { } public: - Common::SharedRef rootNode; - std::vector> materialDatas; + Common::SharedPtr rootNode; + std::vector> materialDatas; std::vector rawIndBuffer; std::vector rawVertBuffer; - std::vector> meshes; + std::vector> meshes; std::string directory; private: - Common::UniqueRef emptyTexture = nullptr; + Common::UniquePtr emptyTexture = nullptr; }; diff --git a/Sample/RHI-SSAO/SSAOApplication.cpp b/Sample/RHI-SSAO/SSAOApplication.cpp index ce7702e7d..32241a98a 100644 --- a/Sample/RHI-SSAO/SSAOApplication.cpp +++ b/Sample/RHI-SSAO/SSAOApplication.cpp @@ -52,14 +52,14 @@ class SSAOApplication final : public Application { const auto backTextureIndex = swapChain->AcquireBackTexture(backBufferReadySemaphores[nextFrameIndex].Get()); inflightFences[nextFrameIndex]->Reset(); - const UniqueRef commandRecorder = commandBuffers[nextFrameIndex]->Begin(); + const UniquePtr commandRecorder = commandBuffers[nextFrameIndex]->Begin(); { commandRecorder->ResourceBarrier(Barrier::Transition(gBufferPos.texture.Get(), TextureState::shaderReadOnly, TextureState::renderTarget)); commandRecorder->ResourceBarrier(Barrier::Transition(gBufferNormal.texture.Get(), TextureState::shaderReadOnly, TextureState::renderTarget)); commandRecorder->ResourceBarrier(Barrier::Transition(gBufferAlbedo.texture.Get(), TextureState::shaderReadOnly, TextureState::renderTarget)); commandRecorder->ResourceBarrier(Barrier::Transition(gBufferDepth.texture.Get(), TextureState::depthStencilReadonly, TextureState::depthStencilWrite)); - const UniqueRef rasterRecorder = commandRecorder->BeginRasterPass( + const UniquePtr rasterRecorder = commandRecorder->BeginRasterPass( RasterPassBeginInfo() .AddColorAttachment(RHI::ColorAttachment(gBufferPos.rtv.Get(), LoadOp::clear, StoreOp::store, LinearColorConsts::black)) .AddColorAttachment(RHI::ColorAttachment(gBufferNormal.rtv.Get(), LoadOp::clear, StoreOp::store, LinearColorConsts::black)) @@ -91,7 +91,7 @@ class SSAOApplication final : public Application { // ssao commandRecorder->ResourceBarrier(Barrier::Transition(ssaoOutput.texture.Get(), TextureState::shaderReadOnly, TextureState::renderTarget)); - const UniqueRef rasterRecorder = commandRecorder->BeginRasterPass( + const UniquePtr rasterRecorder = commandRecorder->BeginRasterPass( RasterPassBeginInfo() .AddColorAttachment(RHI::ColorAttachment(ssaoOutput.rtv.Get(), LoadOp::clear, StoreOp::store, LinearColorConsts::black))); { @@ -112,7 +112,7 @@ class SSAOApplication final : public Application { // ssaoBlur commandRecorder->ResourceBarrier(Barrier::Transition(ssaoBlurOutput.texture.Get(), TextureState::shaderReadOnly, TextureState::renderTarget)); - const UniqueRef rasterRecorder = commandRecorder->BeginRasterPass( + const UniquePtr rasterRecorder = commandRecorder->BeginRasterPass( RasterPassBeginInfo() .AddColorAttachment(RHI::ColorAttachment(ssaoBlurOutput.rtv.Get(), LoadOp::clear, StoreOp::store, LinearColorConsts::black))); { @@ -132,7 +132,7 @@ class SSAOApplication final : public Application { { // composition commandRecorder->ResourceBarrier(Barrier::Transition(swapChainTextures[backTextureIndex], TextureState::present, TextureState::renderTarget)); - const UniqueRef rasterRecorder = commandRecorder->BeginRasterPass( + const UniquePtr rasterRecorder = commandRecorder->BeginRasterPass( RasterPassBeginInfo() .AddColorAttachment(RHI::ColorAttachment(swapChainTextureViews[backTextureIndex].Get(), LoadOp::clear, StoreOp::store, LinearColorConsts::black))); { @@ -163,7 +163,7 @@ class SSAOApplication final : public Application { void OnDestroy() override { - const UniqueRef fence = device->CreateFence(false); + const UniquePtr fence = device->CreateFence(false); graphicsQueue->Flush(fence.Get()); fence->Wait(); } @@ -175,38 +175,38 @@ class SSAOApplication final : public Application { PixelFormat swapChainFormat = PixelFormat::max; Gpu* gpu = nullptr; - UniqueRef device = nullptr; + UniquePtr device = nullptr; Queue* graphicsQueue = nullptr; - UniqueRef surface = nullptr; - UniqueRef swapChain = nullptr; - UniqueRef vertexBuffer = nullptr; - UniqueRef vertexBufferView = nullptr; - UniqueRef indexBuffer = nullptr; - UniqueRef indexBufferView = nullptr; + UniquePtr surface = nullptr; + UniquePtr swapChain = nullptr; + UniquePtr vertexBuffer = nullptr; + UniquePtr vertexBufferView = nullptr; + UniquePtr indexBuffer = nullptr; + UniquePtr indexBufferView = nullptr; std::array swapChainTextures {}; - std::array, backBufferCount> swapChainTextureViews {}; + std::array, backBufferCount> swapChainTextureViews {}; - UniqueRef quadVertexBuffer = nullptr; - UniqueRef quadVertexBufferView = nullptr; - UniqueRef quadIndexBuffer = nullptr; - UniqueRef quadIndexBufferView = nullptr; + UniquePtr quadVertexBuffer = nullptr; + UniquePtr quadVertexBufferView = nullptr; + UniquePtr quadIndexBuffer = nullptr; + UniquePtr quadIndexBufferView = nullptr; - std::array, backBufferCount> commandBuffers {}; - std::array, backBufferCount> backBufferReadySemaphores {}; - std::array, backBufferCount> renderFinishedSemaphores {}; - std::array, backBufferCount> inflightFences {}; + std::array, backBufferCount> commandBuffers {}; + std::array, backBufferCount> backBufferReadySemaphores {}; + std::array, backBufferCount> renderFinishedSemaphores {}; + std::array, backBufferCount> inflightFences {}; uint8_t nextFrameIndex = 0; - UniqueRef sampler = nullptr; - UniqueRef noiseSampler = nullptr; + UniquePtr sampler = nullptr; + UniquePtr noiseSampler = nullptr; struct Renderable { uint32_t indexCount; uint32_t firstIndex; - UniqueRef bindGroup; - UniqueRef diffuseColorMap; - UniqueRef diffuseColorMapView; + UniquePtr bindGroup; + UniquePtr diffuseColorMap; + UniquePtr diffuseColorMapView; Renderable(Instance& instance, Device& device, BindGroupLayout& bindGroupLayout, Render::ShaderReflectionData& gBufferPsReflectionData, Sampler& sampler, const Mesh& mesh) { indexCount = mesh.indexCount; @@ -242,7 +242,7 @@ class SSAOApplication final : public Application { .SetUsages(BufferUsageBits::uniform | BufferUsageBits::mapWrite | BufferUsageBits::copySrc) .SetInitialState(BufferState::staging); - const UniqueRef pixelBuffer = device.CreateBuffer(bufferCreateInfo); + const UniquePtr pixelBuffer = device.CreateBuffer(bufferCreateInfo); if (pixelBuffer != nullptr) { auto* data = pixelBuffer->Map(MapMode::write, 0, bufferCreateInfo.size); for (auto i = 0; i < texData->height; i++) { @@ -254,10 +254,10 @@ class SSAOApplication final : public Application { pixelBuffer->UnMap(); } - const UniqueRef texCommandBuffer = device.CreateCommandBuffer(); - const UniqueRef commandRecorder = texCommandBuffer->Begin(); + const UniquePtr texCommandBuffer = device.CreateCommandBuffer(); + const UniquePtr commandRecorder = texCommandBuffer->Begin(); { - const UniqueRef copyRecorder = commandRecorder->BeginCopyPass(); + const UniquePtr copyRecorder = commandRecorder->BeginCopyPass(); { copyRecorder->ResourceBarrier(Barrier::Transition(diffuseColorMap.Get(), TextureState::undefined, TextureState::copyDst)); copyRecorder->CopyBufferToTexture( @@ -270,7 +270,7 @@ class SSAOApplication final : public Application { } commandRecorder->End(); - const UniqueRef fence = device.CreateFence(false); + const UniquePtr fence = device.CreateFence(false); QueueSubmitInfo submitInfo {}; submitInfo.signalFence = fence.Get(); device.GetQueue(QueueType::graphics, 0)->Submit(texCommandBuffer.Get(), submitInfo); @@ -284,12 +284,12 @@ class SSAOApplication final : public Application { } }; - UniqueRef model = nullptr; - std::vector> renderables; + UniquePtr model = nullptr; + std::vector> renderables; struct UBuffer { - UniqueRef buf; - UniqueRef bufView; + UniquePtr buf; + UniquePtr bufView; }; struct UniformBuffers { @@ -315,19 +315,19 @@ class SSAOApplication final : public Application { } ubossaoParams; struct Noise { - UniqueRef tex; - UniqueRef view; + UniquePtr tex; + UniquePtr view; } noise; struct ShaderObjects { - UniqueRef gBufferVs; - UniqueRef gBufferPs; - UniqueRef ssaoVs; - UniqueRef ssaoPs; - UniqueRef ssaoBlurVs; - UniqueRef ssaoBlurPs; - UniqueRef compositionVs; - UniqueRef compositionPs; + UniquePtr gBufferVs; + UniquePtr gBufferPs; + UniquePtr ssaoVs; + UniquePtr ssaoPs; + UniquePtr ssaoBlurVs; + UniquePtr ssaoBlurPs; + UniquePtr compositionVs; + UniquePtr compositionPs; ShaderCompileOutput gBufferVsCompileOutput; ShaderCompileOutput gBufferPsCompileOutput; ShaderCompileOutput ssaoVsCompileOutput; @@ -339,47 +339,47 @@ class SSAOApplication final : public Application { } shaderObjects; struct Pipelines { - UniqueRef gBuffer; - UniqueRef ssao; - UniqueRef ssaoBlur; - UniqueRef composition; + UniquePtr gBuffer; + UniquePtr ssao; + UniquePtr ssaoBlur; + UniquePtr composition; } pipelines; struct PipelineLayouts { - UniqueRef gBuffer; - UniqueRef ssao; - UniqueRef ssaoBlur; - UniqueRef composition; + UniquePtr gBuffer; + UniquePtr ssao; + UniquePtr ssaoBlur; + UniquePtr composition; } pipelineLayouts; - UniqueRef renderableLayout; + UniquePtr renderableLayout; struct BindGroupLayouts { - UniqueRef gBuffer; - UniqueRef ssao; - UniqueRef ssaoBlur; - UniqueRef composition; + UniquePtr gBuffer; + UniquePtr ssao; + UniquePtr ssaoBlur; + UniquePtr composition; } bindGroupLayouts; struct BindGroups { - UniqueRef scene; - UniqueRef ssao; - UniqueRef ssaoBlur; - UniqueRef composition; + UniquePtr scene; + UniquePtr ssao; + UniquePtr ssaoBlur; + UniquePtr composition; } bindGroups; struct ColorAttachment { - UniqueRef texture; - UniqueRef rtv; - UniqueRef srv; + UniquePtr texture; + UniquePtr rtv; + UniquePtr srv; }; ColorAttachment gBufferPos; ColorAttachment gBufferNormal; ColorAttachment gBufferAlbedo; struct { - UniqueRef texture; - UniqueRef view; + UniquePtr texture; + UniquePtr view; } gBufferDepth; ColorAttachment ssaoOutput; @@ -757,7 +757,7 @@ class SSAOApplication final : public Application { .SetUsages(BufferUsageBits::mapWrite | BufferUsageBits::copySrc) .SetInitialState(BufferState::staging); - const UniqueRef pixelBuffer = device->CreateBuffer(bufferCreateInfo); + const UniquePtr pixelBuffer = device->CreateBuffer(bufferCreateInfo); if (pixelBuffer != nullptr) { auto* data = pixelBuffer->Map(MapMode::write, 0, bufferCreateInfo.size); memcpy(data, ssaoNoise.data(), bufferCreateInfo.size); @@ -789,11 +789,11 @@ class SSAOApplication final : public Application { .SetAddressModeU(AddressMode::repeat) .SetAddressModeV(AddressMode::repeat)); - const UniqueRef texCommandBuffer = device->CreateCommandBuffer(); + const UniquePtr texCommandBuffer = device->CreateCommandBuffer(); - const UniqueRef commandRecorder = texCommandBuffer->Begin(); + const UniquePtr commandRecorder = texCommandBuffer->Begin(); { - const UniqueRef copyRecorder = commandRecorder->BeginCopyPass(); + const UniquePtr copyRecorder = commandRecorder->BeginCopyPass(); { copyRecorder->ResourceBarrier(Barrier::Transition(noise.tex.Get(), TextureState::undefined, TextureState::copyDst)); copyRecorder->CopyBufferToTexture( @@ -806,7 +806,7 @@ class SSAOApplication final : public Application { } commandRecorder->End(); - const UniqueRef fence = device->CreateFence(false); + const UniquePtr fence = device->CreateFence(false); QueueSubmitInfo submitInfo {}; submitInfo.signalFence = fence.Get(); graphicsQueue->Submit(texCommandBuffer.Get(), submitInfo); @@ -866,7 +866,7 @@ class SSAOApplication final : public Application { .SetType(TextureViewType::textureBinding)); } - void CompileShaderAndCreateShaderModule(UniqueRef& outShaderModule, ShaderCompileOutput& outCompileOutput, const std::string& fileName, const std::string& entryPoint, ShaderStageBits shaderStage) const + void CompileShaderAndCreateShaderModule(UniquePtr& outShaderModule, ShaderCompileOutput& outCompileOutput, const std::string& fileName, const std::string& entryPoint, ShaderStageBits shaderStage) const { const std::vector includePath { "../Test/Sample/RHI-SSAO/Shader"}; outCompileOutput = CompileShader(fileName, entryPoint, shaderStage, includePath); diff --git a/Sample/RHI-TexSampling/TexSampling.cpp b/Sample/RHI-TexSampling/TexSampling.cpp index b84e34724..bcf13dbd9 100644 --- a/Sample/RHI-TexSampling/TexSampling.cpp +++ b/Sample/RHI-TexSampling/TexSampling.cpp @@ -42,10 +42,10 @@ class TexSamplingApplication final : public Application { const auto backTextureIndex = swapChain->AcquireBackTexture(backBufferReadySemaphores[nextFrameIndex].Get()); inflightFences[nextFrameIndex]->Reset(); - const UniqueRef commandRecorder = commandBuffers[nextFrameIndex]->Begin(); + const UniquePtr commandRecorder = commandBuffers[nextFrameIndex]->Begin(); { commandRecorder->ResourceBarrier(Barrier::Transition(swapChainTextures[backTextureIndex], TextureState::present, TextureState::renderTarget)); - const UniqueRef rasterRecorder = commandRecorder->BeginRasterPass( + const UniquePtr rasterRecorder = commandRecorder->BeginRasterPass( RasterPassBeginInfo() .AddColorAttachment(ColorAttachment(swapChainTextureViews[backTextureIndex].Get(), LoadOp::clear, StoreOp::store, LinearColorConsts::black))); { @@ -75,7 +75,7 @@ class TexSamplingApplication final : public Application { void OnDestroy() override { - const UniqueRef fence = device->CreateFence(false); + const UniquePtr fence = device->CreateFence(false); graphicsQueue->Flush(fence.Get()); fence->Wait(); } @@ -249,9 +249,9 @@ class TexSamplingApplication final : public Application { sampler = device->CreateSampler(SamplerCreateInfo()); texCommandBuffer = device->CreateCommandBuffer(); - const UniqueRef commandRecorder = texCommandBuffer->Begin(); + const UniquePtr commandRecorder = texCommandBuffer->Begin(); { - const UniqueRef copyRecorder = commandRecorder->BeginCopyPass(); + const UniquePtr copyRecorder = commandRecorder->BeginCopyPass(); { copyRecorder->ResourceBarrier(Barrier::Transition(sampleTexture.Get(), TextureState::undefined, TextureState::copyDst)); copyRecorder->CopyBufferToTexture( @@ -264,7 +264,7 @@ class TexSamplingApplication final : public Application { } commandRecorder->End(); - const UniqueRef fence = device->CreateFence(false); + const UniquePtr fence = device->CreateFence(false); QueueSubmitInfo submitInfo {}; submitInfo.signalFence = fence.Get(); graphicsQueue->Submit(texCommandBuffer.Get(), submitInfo); @@ -379,35 +379,35 @@ class TexSamplingApplication final : public Application { PixelFormat swapChainFormat = PixelFormat::max; Gpu* gpu = nullptr; - UniqueRef device; + UniquePtr device; Queue* graphicsQueue = nullptr; - UniqueRef surface; - UniqueRef swapChain; - UniqueRef vertexBuffer; - UniqueRef vertexBufferView; - UniqueRef indexBuffer; - UniqueRef indexBufferView; - UniqueRef bindGroupLayout; - UniqueRef bindGroup; - UniqueRef sampleTexture; - UniqueRef sampleTextureView; - UniqueRef sampler; - UniqueRef uniformBuffer; - UniqueRef uniformBufferView; - UniqueRef texCommandBuffer; - UniqueRef pixelBuffer; + UniquePtr surface; + UniquePtr swapChain; + UniquePtr vertexBuffer; + UniquePtr vertexBufferView; + UniquePtr indexBuffer; + UniquePtr indexBufferView; + UniquePtr bindGroupLayout; + UniquePtr bindGroup; + UniquePtr sampleTexture; + UniquePtr sampleTextureView; + UniquePtr sampler; + UniquePtr uniformBuffer; + UniquePtr uniformBufferView; + UniquePtr texCommandBuffer; + UniquePtr pixelBuffer; std::array swapChainTextures {}; - std::array, backBufferCount> swapChainTextureViews; - UniqueRef pipelineLayout; - UniqueRef pipeline; - UniqueRef vertexShader; + std::array, backBufferCount> swapChainTextureViews; + UniquePtr pipelineLayout; + UniquePtr pipeline; + UniquePtr vertexShader; ShaderCompileOutput vsCompileOutput; - UniqueRef pixelShader; + UniquePtr pixelShader; ShaderCompileOutput psCompileOutput; - std::array, backBufferCount> commandBuffers; - std::array, backBufferCount> backBufferReadySemaphores; - std::array, backBufferCount> renderFinishedSemaphores; - std::array, backBufferCount> inflightFences; + std::array, backBufferCount> commandBuffers; + std::array, backBufferCount> backBufferReadySemaphores; + std::array, backBufferCount> renderFinishedSemaphores; + std::array, backBufferCount> inflightFences; uint8_t nextFrameIndex = 0; }; diff --git a/Sample/RHI-Triangle/Triangle.cpp b/Sample/RHI-Triangle/Triangle.cpp index 005d36e2f..3385bbd4b 100644 --- a/Sample/RHI-Triangle/Triangle.cpp +++ b/Sample/RHI-Triangle/Triangle.cpp @@ -41,10 +41,10 @@ class TriangleApplication final : public Application { const auto backTextureIndex = swapChain->AcquireBackTexture(backBufferReadySemaphores[nextFrameIndex].Get()); inflightFences[nextFrameIndex]->Reset(); - const UniqueRef commandRecorder = commandBuffers[nextFrameIndex]->Begin(); + const UniquePtr commandRecorder = commandBuffers[nextFrameIndex]->Begin(); { commandRecorder->ResourceBarrier(Barrier::Transition(swapChainTextures[backTextureIndex], TextureState::present, TextureState::renderTarget)); - const UniqueRef rasterRecorder = commandRecorder->BeginRasterPass( + const UniquePtr rasterRecorder = commandRecorder->BeginRasterPass( RasterPassBeginInfo() .AddColorAttachment(ColorAttachment(swapChainTextureViews[backTextureIndex].Get(), LoadOp::clear, StoreOp::store, LinearColorConsts::black))); { @@ -73,7 +73,7 @@ class TriangleApplication final : public Application { void OnDestroy() override { - const UniqueRef fence = device->CreateFence(false); + const UniquePtr fence = device->CreateFence(false); graphicsQueue->Flush(fence.Get()); fence->Wait(); } @@ -213,24 +213,24 @@ class TriangleApplication final : public Application { PixelFormat swapChainFormat = PixelFormat::max; Gpu* gpu = nullptr; - UniqueRef device; + UniquePtr device; Queue* graphicsQueue = nullptr; - UniqueRef surface; - UniqueRef swapChain; - UniqueRef vertexBuffer; - UniqueRef vertexBufferView; + UniquePtr surface; + UniquePtr swapChain; + UniquePtr vertexBuffer; + UniquePtr vertexBufferView; std::array swapChainTextures {}; - std::array, backBufferCount> swapChainTextureViews; - UniqueRef pipelineLayout; - UniqueRef pipeline; - UniqueRef vertexShader; + std::array, backBufferCount> swapChainTextureViews; + UniquePtr pipelineLayout; + UniquePtr pipeline; + UniquePtr vertexShader; ShaderCompileOutput vsCompileOutput; - UniqueRef pixelShader; + UniquePtr pixelShader; ShaderCompileOutput psCompileOutput; - std::array, backBufferCount> commandBuffers; - std::array, backBufferCount> backBufferReadySemaphores; - std::array, backBufferCount> renderFinishedSemaphores; - std::array, backBufferCount> inflightFences; + std::array, backBufferCount> commandBuffers; + std::array, backBufferCount> backBufferReadySemaphores; + std::array, backBufferCount> renderFinishedSemaphores; + std::array, backBufferCount> inflightFences; uint8_t nextFrameIndex = 0; }; diff --git a/Sample/Rendering-Triangle/Triangle.cpp b/Sample/Rendering-Triangle/Triangle.cpp index aefea9188..e970a73cc 100644 --- a/Sample/Rendering-Triangle/Triangle.cpp +++ b/Sample/Rendering-Triangle/Triangle.cpp @@ -6,6 +6,7 @@ #include #include #include +#include using namespace Common; using namespace Render; @@ -61,21 +62,22 @@ class TriangleApplication final : public Application { void CreateTriangleVertexBuffer(); void CreateSyncObjects(); - PixelFormat swapChainFormat = PixelFormat::max; + PixelFormat swapChainFormat; ShaderInstance triangleVS; ShaderInstance trianglePS; - UniqueRef device; - UniqueRef surface; - UniqueRef swapChain; + UniquePtr device; + UniquePtr surface; + UniquePtr swapChain; std::array swapChainTextures {}; - UniqueRef triangleVertexBuffer; - UniqueRef imageReadySemaphore; - UniqueRef renderFinishedSemaphore; - UniqueRef frameFence; + UniquePtr triangleVertexBuffer; + UniquePtr imageReadySemaphore; + UniquePtr renderFinishedSemaphore; + UniquePtr frameFence; }; TriangleApplication::TriangleApplication(const std::string& inName) : Application(inName) + , swapChainFormat(PixelFormat::max) { } @@ -83,6 +85,7 @@ TriangleApplication::~TriangleApplication() = default; void TriangleApplication::OnCreate() { + RenderWorkerThreads::Get().Start(); CreateDevice(); CompileAllShaders(); CreateSwapChain(); @@ -97,17 +100,17 @@ void TriangleApplication::OnDrawFrame() auto* pso = PipelineCache::Get(*device).GetOrCreate( RasterPipelineStateDesc() - .SetVertexShader(triangleVS) - .SetPixelShader(trianglePS) - .SetVertexState( - RVertexState() - .AddVertexBufferLayout( - RVertexBufferLayout(VertexStepMode::perVertex, sizeof(Vertex)) - .AddAttribute(RVertexAttribute(RVertexBinding("POSITION", 0), VertexFormat::float32X3, offsetof(Vertex, position))) - .AddAttribute(RVertexAttribute(RVertexBinding("COLOR", 0), VertexFormat::float32X3, offsetof(Vertex, color))))) - .SetFragmentState( - RFragmentState() - .AddColorTarget(ColorTargetState(swapChainFormat, ColorWriteBits::all, false)))); + .SetVertexShader(triangleVS) + .SetPixelShader(trianglePS) + .SetVertexState( + RVertexState() + .AddVertexBufferLayout( + RVertexBufferLayout(VertexStepMode::perVertex, sizeof(Vertex)) + .AddAttribute(RVertexAttribute(RVertexBinding("POSITION", 0), VertexFormat::float32X3, offsetof(Vertex, position))) + .AddAttribute(RVertexAttribute(RVertexBinding("COLOR", 0), VertexFormat::float32X3, offsetof(Vertex, color))))) + .SetFragmentState( + RFragmentState() + .AddColorTarget(ColorTargetState(swapChainFormat, ColorWriteBits::all, false)))); RGBuilder builder(*device); auto* backTexture = builder.ImportTexture(swapChainTextures[backTextureIndex], TextureState::present); @@ -118,15 +121,18 @@ void TriangleApplication::OnDrawFrame() builder.AddRasterPass( "BasePass", RGRasterPassDesc() - .AddColorAttachment(RGColorAttachment(backTextureView, LoadOp::load, StoreOp::store)), + .AddColorAttachment(RGColorAttachment(backTextureView, LoadOp::clear, StoreOp::store)), {}, - [pso, vertexBufferView, backTexture, viewportWidth = GetWindowWidth(), viewportHeight = GetWindowHeight()](const RGBuilder& rg, RasterPassCommandRecorder& recorder) -> void { + [pso, vertexBufferView, viewportWidth = GetWindowWidth(), viewportHeight = GetWindowHeight()](const RGBuilder& rg, RasterPassCommandRecorder& recorder) -> void { recorder.SetPipeline(pso->GetRHI()); recorder.SetScissor(0, 0, viewportWidth, viewportHeight); recorder.SetViewport(0, 0, static_cast(viewportWidth), static_cast(viewportHeight), 0, 1); recorder.SetVertexBuffer(0, rg.GetRHI(vertexBufferView)); recorder.SetPrimitiveTopology(PrimitiveTopology::triangleList); recorder.Draw(3, 1, 0, 0); + }, + {}, + [backTexture](const RGBuilder& rg, CommandRecorder& recorder) -> void { recorder.ResourceBarrier(Barrier::Transition(rg.GetRHI(backTexture), TextureState::renderTarget, TextureState::present)); }); @@ -137,17 +143,21 @@ void TriangleApplication::OnDrawFrame() builder.Execute(executeInfo); swapChain->Present(renderFinishedSemaphore.Get()); frameFence->Wait(); + + BufferPool::Get(*device).Tick(); + TexturePool::Get(*device).Tick(); } void TriangleApplication::OnDestroy() { - const UniqueRef fence = device->CreateFence(false); + const UniquePtr fence = device->CreateFence(false); device->GetQueue(QueueType::graphics, 0)->Flush(fence.Get()); fence->Wait(); ResourceViewCache::Get(*device).Invalidate(); PipelineCache::Get(*device).Invalidate(); GlobalShaderRegistry::Get().InvalidateAll(); + RenderWorkerThreads::Get().Stop(); } void TriangleApplication::CreateDevice() @@ -208,9 +218,9 @@ void TriangleApplication::CreateSwapChain() void TriangleApplication::CreateTriangleVertexBuffer() { const std::vector vertices = { - {{-.5f, -.5f, 0.f}, {1.f, 0.f, 0.f}}, - {{.5f, -.5f, 0.f}, {0.f, 1.f, 0.f}}, - {{0.f, .5f, 0.f}, {0.f, 0.f, 1.f}}, + { { -.5f, -.5f, 0.f }, { 1.f, 0.f, 0.f } }, + { { .5f, -.5f, 0.f }, { 0.f, 1.f, 0.f } }, + { { 0.f, .5f, 0.f }, { 0.f, 0.f, 1.f } }, }; const BufferCreateInfo bufferCreateInfo = BufferCreateInfo()