From f328200c651346d2a6bda97d7425c28ac09ee298 Mon Sep 17 00:00:00 2001 From: wheremyfoodat <44909372+wheremyfoodat@users.noreply.github.com> Date: Sat, 22 Jul 2023 20:24:49 +0300 Subject: [PATCH 1/4] Add empty sw renderer class --- CMakeLists.txt | 7 +++++-- include/renderer_sw/renderer_sw.hpp | 17 +++++++++++++++++ src/core/renderer_sw/renderer_sw.cpp | 20 ++++++++++++++++++++ 3 files changed, 42 insertions(+), 2 deletions(-) create mode 100644 include/renderer_sw/renderer_sw.hpp create mode 100644 src/core/renderer_sw/renderer_sw.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 1d9c5b07..3af5ad00 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -126,6 +126,8 @@ set(FS_SOURCE_FILES src/core/fs/archive_self_ncch.cpp src/core/fs/archive_save_d src/core/fs/archive_ext_save_data.cpp src/core/fs/archive_ncch.cpp ) +set(RENDERER_SW_SOURCE_FILES src/core/renderer_sw/renderer_sw.cpp) + set(HEADER_FILES include/emulator.hpp include/helpers.hpp include/termcolor.hpp include/cpu.hpp include/cpu_dynarmic.hpp include/memory.hpp include/renderer.hpp include/kernel/kernel.hpp include/dynarmic_cp15.hpp include/kernel/resource_limits.hpp include/kernel/kernel_types.hpp @@ -150,7 +152,7 @@ set(HEADER_FILES include/emulator.hpp include/helpers.hpp include/termcolor.hpp include/result/result_gsp.hpp include/result/result_kernel.hpp include/result/result_os.hpp include/crypto/aes_engine.hpp include/metaprogramming.hpp include/PICA/pica_vertex.hpp include/config.hpp include/services/ir_user.hpp include/httpserver.hpp include/cheats.hpp - include/action_replay.hpp + include/action_replay.hpp include/renderer_sw/renderer_sw.hpp ) set(THIRD_PARTY_SOURCE_FILES third_party/imgui/imgui.cpp @@ -169,6 +171,7 @@ source_group("Source Files\\Core\\Kernel" FILES ${KERNEL_SOURCE_FILES}) source_group("Source Files\\Core\\Loader" FILES ${LOADER_SOURCE_FILES}) source_group("Source Files\\Core\\Services" FILES ${SERVICE_SOURCE_FILES}) source_group("Source Files\\Core\\PICA" FILES ${PICA_SOURCE_FILES}) +source_group("Source Files\\Core\\Software Renderer" FILES ${RENDERER_SW_SOURCE_FILES}) source_group("Source Files\\Third Party" FILES ${THIRD_PARTY_SOURCE_FILES}) set(RENDERER_GL_SOURCE_FILES "") # Empty by default unless we are compiling with the GL renderer @@ -205,7 +208,7 @@ endif() source_group("Header Files\\Core" FILES ${HEADER_FILES}) set(ALL_SOURCES ${SOURCE_FILES} ${FS_SOURCE_FILES} ${CRYPTO_SOURCE_FILES} ${KERNEL_SOURCE_FILES} ${LOADER_SOURCE_FILES} ${SERVICE_SOURCE_FILES} - ${PICA_SOURCE_FILES} ${THIRD_PARTY_SOURCE_FILES} ${HEADER_FILES}) + ${RENDERER_SW_SOURCE_FILES} ${PICA_SOURCE_FILES} ${THIRD_PARTY_SOURCE_FILES} ${HEADER_FILES}) if(ENABLE_OPENGL) # Add the OpenGL source files to ALL_SOURCES diff --git a/include/renderer_sw/renderer_sw.hpp b/include/renderer_sw/renderer_sw.hpp new file mode 100644 index 00000000..f638a51e --- /dev/null +++ b/include/renderer_sw/renderer_sw.hpp @@ -0,0 +1,17 @@ +#include "renderer.hpp" + +class GPU; + +class RendererSw final : public Renderer { + public: + RendererSw(GPU& gpu, const std::array& internalRegs); + ~RendererSw() override; + + void reset() override; + void display() override; + void initGraphicsContext() override; + void clearBuffer(u32 startAddress, u32 endAddress, u32 value, u32 control) override; + void displayTransfer(u32 inputAddr, u32 outputAddr, u32 inputSize, u32 outputSize, u32 flags) override; + void drawVertices(PICA::PrimType primType, std::span vertices) override; + void screenshot(const std::string& name) override; +}; \ No newline at end of file diff --git a/src/core/renderer_sw/renderer_sw.cpp b/src/core/renderer_sw/renderer_sw.cpp new file mode 100644 index 00000000..77689699 --- /dev/null +++ b/src/core/renderer_sw/renderer_sw.cpp @@ -0,0 +1,20 @@ +#include "renderer_sw/renderer_sw.hpp" + +RendererSw::RendererSw(GPU& gpu, const std::array& internalRegs) : Renderer(gpu, internalRegs) {} +RendererSw::~RendererSw() {} + +void RendererSw::reset() { printf("RendererSW: Unimplemented reset call\n"); } +void RendererSw::display() { printf("RendererSW: Unimplemented display call\n"); } + +void RendererSw::initGraphicsContext() { printf("RendererSW: Unimplemented initGraphicsContext call\n"); } +void RendererSw::clearBuffer(u32 startAddress, u32 endAddress, u32 value, u32 control) { printf("RendererSW: Unimplemented clearBuffer call\n"); } + +void RendererSw::displayTransfer(u32 inputAddr, u32 outputAddr, u32 inputSize, u32 outputSize, u32 flags) { + printf("RendererSW: Unimplemented displayTransfer call\n"); +} + +void RendererSw::drawVertices(PICA::PrimType primType, std::span vertices) { + printf("RendererSW: Unimplemented drawVertices call\n"); +} + +void RendererSw::screenshot(const std::string& name) { printf("RendererSW: Unimplemented screenshot call\n"); } \ No newline at end of file From ae4a4dfc291489f6b065a63fe20cd93f815fe825 Mon Sep 17 00:00:00 2001 From: wheremyfoodat <44909372+wheremyfoodat@users.noreply.github.com> Date: Sat, 22 Jul 2023 20:47:19 +0300 Subject: [PATCH 2/4] Hook up sw rendering backend --- include/renderer.hpp | 1 + src/core/PICA/gpu.cpp | 7 +++++++ src/emulator.cpp | 17 +++++++++-------- src/renderer.cpp | 9 ++++++--- 4 files changed, 23 insertions(+), 11 deletions(-) diff --git a/include/renderer.hpp b/include/renderer.hpp index e14afcea..970b8933 100644 --- a/include/renderer.hpp +++ b/include/renderer.hpp @@ -12,6 +12,7 @@ enum class RendererType : s8 { Null = 0, OpenGL = 1, Vulkan = 2, + Software = 3, }; class GPU; diff --git a/src/core/PICA/gpu.cpp b/src/core/PICA/gpu.cpp index d75b0ae5..d7c37925 100644 --- a/src/core/PICA/gpu.cpp +++ b/src/core/PICA/gpu.cpp @@ -8,6 +8,7 @@ #include "PICA/float_types.hpp" #include "PICA/regs.hpp" #include "renderer_null/renderer_null.hpp" +#include "renderer_sw/renderer_sw.hpp" #ifdef PANDA3DS_ENABLE_OPENGL #include "renderer_gl/renderer_gl.hpp" #endif @@ -25,6 +26,12 @@ GPU::GPU(Memory& mem, EmulatorConfig& config) : mem(mem), config(config) { renderer.reset(new RendererNull(*this, regs)); break; } + + case RendererType::Software: { + renderer.reset(new RendererSw(*this, regs)); + break; + } + #ifdef PANDA3DS_ENABLE_OPENGL case RendererType::OpenGL: { renderer.reset(new RendererGL(*this, regs)); diff --git a/src/emulator.cpp b/src/emulator.cpp index ce42d273..98c4c67f 100644 --- a/src/emulator.cpp +++ b/src/emulator.cpp @@ -1,8 +1,5 @@ #include "emulator.hpp" - -#ifdef PANDA3DS_ENABLE_OPENGL #include -#endif #ifdef _WIN32 #include @@ -27,13 +24,18 @@ Emulator::Emulator() Helpers::warn("Failed to initialize SDL2 GameController: %s", SDL_GetError()); } + // We need OpenGL for software rendering or for OpenGL if it's enabled + bool needOpenGL = config.rendererType == RendererType::Software; #ifdef PANDA3DS_ENABLE_OPENGL - if (config.rendererType == RendererType::OpenGL) { - // Request OpenGL 4.1 Core (Max available on MacOS) + needOpenGL = needOpenGL || (config.rendererType == RendererType::OpenGL); +#endif + + if (needOpenGL) { + // Demand 3.3 core for software renderer, or 4.1 core for OpenGL renderer (max available on MacOS) // MacOS gets mad if we don't explicitly demand a core profile SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE); - SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 4); - SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 1); + SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, config.rendererType == RendererType::Software ? 3 : 4); + SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, config.rendererType == RendererType::Software ? 3 : 1); window = SDL_CreateWindow("Alber", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, width, height, SDL_WINDOW_OPENGL); if (window == nullptr) { @@ -49,7 +51,6 @@ Emulator::Emulator() Helpers::panic("OpenGL init failed: %s", SDL_GetError()); } } -#endif if (SDL_WasInit(SDL_INIT_GAMECONTROLLER)) { gameController = SDL_GameControllerOpen(0); diff --git a/src/renderer.cpp b/src/renderer.cpp index 3ba29aea..22d0accb 100644 --- a/src/renderer.cpp +++ b/src/renderer.cpp @@ -13,9 +13,11 @@ std::optional Renderer::typeFromString(std::string inString) { // Huge table of possible names and misspellings // Please stop misspelling Vulkan as Vulcan static const std::unordered_map map = { - {"null", RendererType::Null}, {"nil", RendererType::Null}, {"none", RendererType::Null}, - {"gl", RendererType::OpenGL}, {"ogl", RendererType::OpenGL}, {"opengl", RendererType::OpenGL}, - {"vk", RendererType::Vulkan}, {"vulkan", RendererType::Vulkan}, {"vulcan", RendererType::Vulkan}, + {"null", RendererType::Null}, {"nil", RendererType::Null}, {"none", RendererType::Null}, + {"gl", RendererType::OpenGL}, {"ogl", RendererType::OpenGL}, {"opengl", RendererType::OpenGL}, + {"vk", RendererType::Vulkan}, {"vulkan", RendererType::Vulkan}, {"vulcan", RendererType::Vulkan}, + {"sw", RendererType::Software}, {"soft", RendererType::Software}, {"software", RendererType::Software}, + {"softrast", RendererType::Software}, }; if (auto search = map.find(inString); search != map.end()) { @@ -30,6 +32,7 @@ const char* Renderer::typeToString(RendererType rendererType) { case RendererType::Null: return "null"; case RendererType::OpenGL: return "opengl"; case RendererType::Vulkan: return "vulkan"; + case RendererType::Software: return "software"; default: return "Invalid"; } } \ No newline at end of file From 9da11b95d9072817eb8bc510dbec9d29cc98c023 Mon Sep 17 00:00:00 2001 From: wheremyfoodat <44909372+wheremyfoodat@users.noreply.github.com> Date: Sat, 22 Jul 2023 21:57:23 +0300 Subject: [PATCH 3/4] Add glm submodule --- .gitmodules | 3 +++ CMakeLists.txt | 1 + third_party/glm | 1 + 3 files changed, 5 insertions(+) create mode 160000 third_party/glm diff --git a/.gitmodules b/.gitmodules index 1b629d30..30c0036e 100644 --- a/.gitmodules +++ b/.gitmodules @@ -28,3 +28,6 @@ [submodule "third_party/cmrc"] path = third_party/cmrc url = https://github.com/vector-of-bool/cmrc +[submodule "third_party/glm"] + path = third_party/glm + url = https://github.com/g-truc/glm diff --git a/CMakeLists.txt b/CMakeLists.txt index 3af5ad00..df2fe581 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -50,6 +50,7 @@ add_subdirectory(third_party/SDL2) add_subdirectory(third_party/toml11) include_directories(${SDL2_INCLUDE_DIR}) include_directories(third_party/toml11) +include_directories(third_party/glm) add_subdirectory(third_party/cmrc) diff --git a/third_party/glm b/third_party/glm new file mode 160000 index 00000000..5c46b9c0 --- /dev/null +++ b/third_party/glm @@ -0,0 +1 @@ +Subproject commit 5c46b9c07008ae65cb81ab79cd677ecc1934b903 From 311d69fd2d5b2d658c35b75ba8768ce1ed222150 Mon Sep 17 00:00:00 2001 From: wheremyfoodat <44909372+wheremyfoodat@users.noreply.github.com> Date: Sat, 22 Jul 2023 22:15:44 +0300 Subject: [PATCH 4/4] Always build glad --- CMakeLists.txt | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index df2fe581..c84bf0c9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -64,6 +64,7 @@ target_include_directories(boost SYSTEM INTERFACE ${Boost_INCLUDE_DIR}) set(CRYPTOPP_BUILD_TESTING OFF) add_subdirectory(third_party/cryptopp) +add_subdirectory(third_party/glad) # Check for x64 if (CMAKE_SYSTEM_PROCESSOR STREQUAL "AMD64" OR CMAKE_SYSTEM_PROCESSOR STREQUAL "x86-64" OR CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64") @@ -178,8 +179,6 @@ source_group("Source Files\\Third Party" FILES ${THIRD_PARTY_SOURCE_FILES}) set(RENDERER_GL_SOURCE_FILES "") # Empty by default unless we are compiling with the GL renderer if(ENABLE_OPENGL) - add_subdirectory(third_party/glad) - set(RENDERER_GL_INCLUDE_FILES include/renderer_gl/opengl.hpp include/renderer_gl/renderer_gl.hpp include/renderer_gl/textures.hpp include/renderer_gl/surfaces.hpp include/renderer_gl/surface_cache.hpp @@ -222,11 +221,11 @@ if(ENABLE_LTO OR ENABLE_USER_BUILD) set_target_properties(Alber PROPERTIES INTERPROCEDURAL_OPTIMIZATION TRUE) endif() -target_link_libraries(Alber PRIVATE dynarmic SDL2-static cryptopp) +target_link_libraries(Alber PRIVATE dynarmic SDL2-static cryptopp glad) if(ENABLE_OPENGL) target_compile_definitions(Alber PUBLIC "PANDA3DS_ENABLE_OPENGL=1") - target_link_libraries(Alber PRIVATE glad resources_renderer_gl) + target_link_libraries(Alber PRIVATE resources_renderer_gl) endif() if(GPU_DEBUG_INFO)