diff --git a/.vscode/launch.json b/.vscode/launch.json index e1e2380..88a7367 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -21,6 +21,11 @@ "description": "Enable break on all exceptions", "text": "catch throw", "ignoreFailures": true + }, + { + "description": "Connect to valgrind", + "text": "${command:valgrind-task-integration.valgrindGdbArg}", + "ignoreFailures": true } ] }, @@ -74,7 +79,19 @@ "console": "integratedTerminal", "cwd": "${workspaceRoot}/bin/Debug", "environment": [], - "visualizerFile": "${workspaceRoot}/Seele.natvis" + "visualizerFile": "${workspaceRoot}/Seele.natvis", + "setupCommands": [ + { + "description": "Enable break on all exceptions", + "text": "catch throw", + "ignoreFailures": true + }, + { + "description": "Connect to valgrind", + "text": "${command:valgrind-task-integration.valgrindGdbArg}", + "ignoreFailures": true + } + ] }, { "name": "Test", diff --git a/cmake/SuperBuild.cmake b/cmake/SuperBuild.cmake index f508804..33cfdf4 100644 --- a/cmake/SuperBuild.cmake +++ b/cmake/SuperBuild.cmake @@ -38,6 +38,7 @@ list (APPEND EXTRA_CMAKE_ARGS list(APPEND DEPENDENCIES ktx) find_program(BASH_EXECUTABLE git-bash) +set(KTX_FEATURE_TESTS off) add_subdirectory(${KTX_ROOT} ${KTX_ROOT}) @@ -73,8 +74,8 @@ ExternalProject_Add(slang elseif(UNIX) ExternalProject_Add(slang SOURCE_DIR ${SLANG_ROOT} - BINARY_DIR ${SLANG_ROOT}/lib - CONFIGURE_COMMAND ${CMAKE_SOURCE_DIR}/premake5 --file=${CMAKE_SOURCE_DIR}/external/slang/premake5.lua gmake2 --build-location=build/linux + BINARY_DIR ${SLANG_ROOT} + CONFIGURE_COMMAND ${CMAKE_SOURCE_DIR}/premake5 --file=${CMAKE_SOURCE_DIR}/external/slang/premake5.lua gmake --arch=${CMAKE_PLATFORM} --deps=true --build-location=build/linux BUILD_COMMAND make -C ${CMAKE_SOURCE_DIR}/external/slang/build/linux config=${SLANG_CONFIG} INSTALL_COMMAND "") endif() diff --git a/external/slang b/external/slang index 627fc97..2e1a84a 160000 --- a/external/slang +++ b/external/slang @@ -1 +1 @@ -Subproject commit 627fc976bac5c2381dbace9c7925cb6a68b8de12 +Subproject commit 2e1a84add57efd9f8a50a88d0569a48ae4b6d834 diff --git a/src/Engine/ThreadPool.cpp b/src/Engine/ThreadPool.cpp index b21086d..21d212b 100644 --- a/src/Engine/ThreadPool.cpp +++ b/src/Engine/ThreadPool.cpp @@ -6,27 +6,42 @@ using namespace Seele; std::mutex Seele::promisesLock; List Seele::promises; -Event::Event(nullptr_t) -{ -} +//Event::Event(nullptr_t) +//{ +//} Event::Event(const std::string &name, const std::source_location &location) : name(name) , location(location) - , eventLock(std::make_unique()) { } Event::Event(const std::source_location &location) : name(location.function_name()) , location(location) - , eventLock(std::make_unique()) { } +Event::Event(Event&& other) + : name(std::move(other.name)) + , location(std::move(other.location)) +{ +} + +Event& Event::operator=(Event&& other) +{ + if(this != &other) + { + std::scoped_lock lock(eventLock, other.eventLock); + name = std::move(other.name); + location = std::move(other.location); + } + return *this; +} + void Event::raise() { - std::scoped_lock lock(*eventLock); + std::scoped_lock lock(eventLock); data = true; if(waitingJobs.size() > 0) { @@ -39,17 +54,17 @@ void Event::raise() } void Event::reset() { - std::scoped_lock lock(*eventLock); + std::scoped_lock lock(eventLock); data = false; } bool Event::await_ready() { - eventLock->lock(); + eventLock.lock(); bool result = data; if(result) { - eventLock->unlock(); + eventLock.unlock(); } return result; } @@ -58,14 +73,14 @@ void Event::await_suspend(std::coroutine_handle> h) { //h.promise().enqueue(this); waitingJobs.add(JobBase(&h.promise())); - eventLock->unlock(); + eventLock.unlock(); } void Event::await_suspend(std::coroutine_handle> h) { //h.promise().enqueue(this); waitingMainJobs.add(JobBase(&h.promise())); - eventLock->unlock(); + eventLock.unlock(); } ThreadPool::ThreadPool(uint32 threadCount) diff --git a/src/Engine/ThreadPool.h b/src/Engine/ThreadPool.h index 765a97a..f78b7d7 100644 --- a/src/Engine/ThreadPool.h +++ b/src/Engine/ThreadPool.h @@ -16,14 +16,14 @@ struct JobPromiseBase; struct Event { public: - Event(nullptr_t); + //Event(nullptr_t); Event(const std::string& name, const std::source_location& location = std::source_location::current()); Event(const std::source_location& location = std::source_location::current()); Event(const Event& other) = delete; - Event(Event&& other) = default; + Event(Event&& other); ~Event() = default; Event& operator=(const Event& other) = delete; - Event& operator=(Event&& other) = default; + Event& operator=(Event&& other); auto operator<=>(const Event& other) const { return name <=> other.name; @@ -34,7 +34,7 @@ public: } operator bool() { - std::scoped_lock lock(*eventLock); + std::scoped_lock lock(eventLock); return data; } @@ -60,7 +60,7 @@ public: private: std::string name; std::source_location location; - std::unique_ptr eventLock; + std::mutex eventLock; bool data = false; Array> waitingJobs; Array> waitingMainJobs; @@ -81,8 +81,14 @@ struct JobPromiseBase DONE }; JobPromiseBase(const std::source_location& location = std::source_location::current()) - : handle(std::coroutine_handle>::from_promise(*this)) - , finishedEvent(Event(location)) + : pad0(0x7472617453) + , handle(std::coroutine_handle>::from_promise(*this)) + , waitingFor(nullptr) + , continuation(nullptr) + , numRefs(0) + , finishedEvent(location) + , state(State::READY) + , pad1(0x646E45) { if constexpr(!MainJob) { @@ -165,14 +171,14 @@ struct JobPromiseBase } } } - uint64 pad0 = 0x7472617453; + uint64 pad0; std::coroutine_handle handle; - Event* waitingFor = nullptr; - JobPromiseBase* continuation = nullptr; - uint64 numRefs = 0; + Event* waitingFor; + JobPromiseBase* continuation; + uint64 numRefs; Event finishedEvent; - State state = State::READY; - uint64 pad1 = 0x646E45; + State state; + uint64 pad1; }; template diff --git a/src/Engine/Window/SceneView.cpp b/src/Engine/Window/SceneView.cpp index 67769a3..1acc24c 100644 --- a/src/Engine/Window/SceneView.cpp +++ b/src/Engine/Window/SceneView.cpp @@ -35,9 +35,9 @@ Seele::SceneView::SceneView(Gfx::PGraphics graphics, PWindow owner, const Viewpo //AssetRegistry::importFile("D:\\Private\\Programming\\Unreal Engine\\Assets\\Ely\\Ely.fbx"); //AssetRegistry::importFile("D:\\Private\\Programming\\Unreal Engine\\Assets\\Cube\\cube.obj"); //AssetRegistry::importFile("D:\\Private\\Programming\\Unreal Engine\\Assets\\Plane\\plane.fbx"); - PPrimitiveComponent plane = new PrimitiveComponent(AssetRegistry::findMesh("plane")); - plane->setRelativeScale(Vector(100, 100, 100)); - scene->addPrimitiveComponent(plane); + //PPrimitiveComponent plane = new PrimitiveComponent(AssetRegistry::findMesh("plane")); + //plane->setRelativeScale(Vector(100, 100, 100)); + //scene->addPrimitiveComponent(plane); for(uint32 i = 0; i < 100000; ++i) { diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index f4327b9..0275b54 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -7,6 +7,7 @@ include_directories(${Boost_INCLUDE_DIRS}) add_subdirectory(Engine/) target_link_libraries(Seele_unit_tests ${Boost_LIBRARIES}) +target_compile_definitions(Seele_unit_tests PRIVATE -DBOOST_TEST_DYN_LINK) target_precompile_headers(Seele_unit_tests PRIVATE