diff --git a/CMakeLists.txt b/CMakeLists.txt index bc407d3..1cb7f5c 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -76,6 +76,7 @@ if(${CMAKE_SYSTEM_NAME} STREQUAL "Windows") set(ENABLE_WINDOWS TRUE) set(ENABLE_VULKAN TRUE) + set(ENABLE_DX12 TRUE) set(NEEDS_HOSTED_SHADER_COMPILER FALSE) set(REQUIRED_SHADER_LANGUAGE "spirv") diff --git a/cmake/Common.cmake b/cmake/Common.cmake index 7c1cbc9..547aecd 100755 --- a/cmake/Common.cmake +++ b/cmake/Common.cmake @@ -29,4 +29,12 @@ macro(set_engine_properties target) if(ENABLE_METAL) target_compile_definitions(${target} PUBLIC ENABLE_METAL) endif() + + if(ENABLE_WEBGPU) + target_compile_definitions(${target} PUBLIC ENABLE_WEBGPU) + endif() + + if(ENABLE_DX12) + target_compile_definitions(${target} PUBLIC ENABLE_DX12) + endif() endmacro() diff --git a/engine/core/src/imgui_backend.cpp b/engine/core/src/imgui_backend.cpp index ee55afd..3036439 100644 --- a/engine/core/src/imgui_backend.cpp +++ b/engine/core/src/imgui_backend.cpp @@ -234,7 +234,7 @@ void imgui_backend::begin_frame(const float delta_time) { } for(const auto& dir_ent : std::filesystem::directory_iterator(data.current_path)) { - if(ImGui::Selectable(dir_ent.path().c_str(), data.selected_path == dir_ent.path(), ImGuiSelectableFlags_DontClosePopups)) { + if(ImGui::Selectable(dir_ent.path().string().c_str(), data.selected_path == dir_ent.path(), ImGuiSelectableFlags_DontClosePopups)) { if(dir_ent.is_directory()) data.current_path = dir_ent.path(); else diff --git a/engine/gfx/CMakeLists.txt b/engine/gfx/CMakeLists.txt index c3888bf..4ab028d 100755 --- a/engine/gfx/CMakeLists.txt +++ b/engine/gfx/CMakeLists.txt @@ -33,4 +33,4 @@ endif() if(ENABLE_WEBGPU) add_subdirectory(webgpu) -endif() +endif() \ No newline at end of file diff --git a/engine/gfx/dx12/CMakeLists.txt b/engine/gfx/dx12/CMakeLists.txt index a3cde0c..d2f0fe5 100755 --- a/engine/gfx/dx12/CMakeLists.txt +++ b/engine/gfx/dx12/CMakeLists.txt @@ -1,3 +1,3 @@ -add_library(GFXDX12 STATIC src/gfx_dummy.cpp) +add_library(GFXDX12 STATIC src/gfx_dx12.cpp) target_include_directories(GFXDX12 PUBLIC include) target_link_libraries(GFXDX12 PUBLIC GFX) \ No newline at end of file diff --git a/engine/gfx/dx12/include/gfx_dummy.hpp b/engine/gfx/dx12/include/gfx_dummy.hpp deleted file mode 100755 index ec46911..0000000 --- a/engine/gfx/dx12/include/gfx_dummy.hpp +++ /dev/null @@ -1,30 +0,0 @@ -#pragma once - -#include "gfx.hpp" - -class GFXDummy : public GFX { -public: - bool initialize() override; - void initializeView(void* native_handle, uint32_t width, uint32_t height) override; - - // buffer operations - GFXBuffer* createBuffer(void* data, GFXSize size, GFXBufferUsage usage) override; - void copyBuffer(GFXBuffer* buffer, void* data, GFXSize offset, GFXSize size) override; - - // texture operations - GFXTexture* createTexture(uint32_t width, uint32_t height, GFXPixelFormat format, GFXStorageMode storageMode, GFXTextureUsage usage) override; - void copyTexture(GFXTexture* texture, void* data, GFXSize size) override; - - // framebuffer operations - GFXFramebuffer* createFramebuffer(GFXFramebufferCreateInfo& info) override; - - // render pass operations - GFXRenderPass* createRenderPass(GFXRenderPassCreateInfo& info) override; - - // pipeline operations - GFXPipeline* createPipeline(GFXPipelineCreateInfo& info) override; - - void render(GFXCommandBuffer* command_buffer) override; - - const char* getName() override; -}; diff --git a/engine/gfx/dx12/include/gfx_dx12.hpp b/engine/gfx/dx12/include/gfx_dx12.hpp new file mode 100755 index 0000000..64f7e89 --- /dev/null +++ b/engine/gfx/dx12/include/gfx_dx12.hpp @@ -0,0 +1,13 @@ +#pragma once + +#include "gfx.hpp" + +class gfx_dx12 : public GFX { +public: + bool is_supported() override { return true; } + ShaderLanguage accepted_shader_language() override { return ShaderLanguage::HLSL; } + GFXContext required_context() override { return GFXContext::DirectX; } + bool initialize(const GFXCreateInfo& info) override; + + const char* get_name() override; +}; diff --git a/engine/gfx/dx12/src/gfx_dummy.cpp b/engine/gfx/dx12/src/gfx_dummy.cpp deleted file mode 100755 index 05f3b8b..0000000 --- a/engine/gfx/dx12/src/gfx_dummy.cpp +++ /dev/null @@ -1,46 +0,0 @@ -#include "gfx_dummy.hpp" - -bool GFXDummy::initialize() { - return true; -} - -void GFXDummy::initializeView(void* native_handle, uint32_t width, uint32_t height) { - -} - -GFXBuffer* GFXDummy::createBuffer(void* data, GFXSize size, GFXBufferUsage usage) { - return nullptr; -} - -void GFXDummy::copyBuffer(GFXBuffer* buffer, void* data, GFXSize offset, GFXSize size) { - -} - -GFXTexture* GFXDummy::createTexture(uint32_t width, uint32_t height, GFXPixelFormat format, GFXStorageMode storageMode, GFXTextureUsage usage) { - return nullptr; -} - -void GFXDummy::copyTexture(GFXTexture* texture, void* data, GFXSize size) { - -} - - -GFXFramebuffer* GFXDummy::createFramebuffer(GFXFramebufferCreateInfo& info) { - return nullptr; -} - -GFXRenderPass* GFXDummy::createRenderPass(GFXRenderPassCreateInfo& info) { - return nullptr; -} - -GFXPipeline* GFXDummy::createPipeline(GFXPipelineCreateInfo& info) { - return nullptr; -} - -void GFXDummy::render(GFXCommandBuffer* command_buffer) { - -} - -const char* GFXDummy::getName() { - return "None"; -} diff --git a/engine/gfx/dx12/src/gfx_dx12.cpp b/engine/gfx/dx12/src/gfx_dx12.cpp new file mode 100755 index 0000000..5b57a8f --- /dev/null +++ b/engine/gfx/dx12/src/gfx_dx12.cpp @@ -0,0 +1,19 @@ +#include "gfx_dx12.hpp" + +#include +#include +#include + +#include + +using namespace Microsoft::WRL; + +ComPtr g_Device; + +bool gfx_dx12::initialize(const GFXCreateInfo& info) { + return true; +} + +const char* gfx_dx12::get_name() { + return "DX12"; +} diff --git a/platforms/sdl/CMakeLists.txt b/platforms/sdl/CMakeLists.txt index 6deeadb..f467e84 100644 --- a/platforms/sdl/CMakeLists.txt +++ b/platforms/sdl/CMakeLists.txt @@ -12,6 +12,10 @@ if(ENABLE_VULKAN) set(EXTRA_SRC ${CMAKE_CURRENT_SOURCE_DIR}/sdl_vulkan.cpp ${EXTRA_SRC}) endif() +if(ENABLE_DX12) + set(EXTRA_LIBRARIES GFXDX12 ${EXTRA_LIBRARIES}) +endif() + if(TARGET SDL2::SDL2) set(EXTRA_LIBRARIES SDL2::SDL2 ${EXTRA_LIBRARIES}) endif() diff --git a/platforms/sdl/main.cpp.in b/platforms/sdl/main.cpp.in index 9fe8661..de7a719 100644 --- a/platforms/sdl/main.cpp.in +++ b/platforms/sdl/main.cpp.in @@ -8,6 +8,10 @@ #include #include +#ifdef ENABLE_DX12 +#include "gfx_dx12.hpp" +#endif + #ifdef ENABLE_VULKAN #include "gfx_vulkan.hpp" #endif @@ -18,7 +22,7 @@ #include "gfx_dummy.hpp" -#ifdef PLATFORM_WINDOWS +#if defined(PLATFORM_WINDOWS) && !defined(__MINGW32__) #include #pragma comment(lib, "windowsapp") #endif @@ -319,6 +323,11 @@ void platform::end_text_input() { } bool platform::supports_context(GFXContext context) { +#ifdef ENABLE_DX12 + if(context == GFXContext::DirectX) + return true; +#endif + #ifdef ENABLE_VULKAN if(context == GFXContext::Vulkan) return true; @@ -397,7 +406,7 @@ template void try_initialize() { if(gfx_interface == nullptr) { auto backend = new GFXBackend(); - const bool supported = backend->is_supported(); + const bool supported = backend->is_supported() && platform::supports_context(backend->required_context()); if(!supported) { prism::log("Failed to initialize GFX backend... trying next..."); } else { @@ -422,6 +431,10 @@ int main(int argc, char* argv[]) { engine = new prism::engine(argc, argv); // determine gfx context at the beginning +#ifdef ENABLE_DX12 + try_initialize(); +#endif + #ifdef ENABLE_METAL gfx_backend_order.emplace_back(gfx_backend_initializer{"metal", []{ try_initialize(); @@ -541,7 +554,7 @@ int main(int argc, char* argv[]) { return 0; } -#ifdef PLATFORM_WINDOWS +#if defined(PLATFORM_WINDOWS) && !defined(__MINGW32__) PlatformTheme platform::get_theme() { using namespace winrt::Windows::UI::ViewManagement;