diff --git a/.gitmodules b/.gitmodules index de38a1e..8a5e77d 100644 --- a/.gitmodules +++ b/.gitmodules @@ -10,3 +10,6 @@ [submodule "app/src/main/cpp/addons/Vulkan-Hpp"] path = app/src/main/cpp/addons/Vulkan-Hpp url = https://github.com/KhronosGroup/Vulkan-Hpp.git +[submodule "app/src/main/cpp/addons/VulkanMemoryAllocator"] + path = app/src/main/cpp/addons/VulkanMemoryAllocator + url = https://github.com/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator.git diff --git a/app/src/main/CMakeLists.txt b/app/src/main/CMakeLists.txt index fb9c191..882c227 100644 --- a/app/src/main/CMakeLists.txt +++ b/app/src/main/CMakeLists.txt @@ -59,8 +59,9 @@ target_sources(cosmic PRIVATE ${COSMIC_DIR}/iop/iop_intc.cpp ${COSMIC_DIR}/gpu/render_driver.cpp ${COSMIC_DIR}/gpu/exhibition_engine.cpp - ${COSMIC_DIR}/gpu/violet/graphics_layer.cpp - ${COSMIC_DIR}/gpu/violet/vulkan_functions.cpp + ${COSMIC_DIR}/gpu/graphics_layer.cpp + ${COSMIC_DIR}/gpu/vulcano/vulkan_functions.cpp + ${COSMIC_DIR}/gpu/vulcano/vram_allocator.cpp ${COSMIC_DIR}/os/system_state.cpp ${COSMIC_DIR}/java/device_handler.cpp ${COSMIC_DIR}/java/jclasses.cpp @@ -88,6 +89,7 @@ add_compile_definitions(VULKAN_HPP_ENABLE_DYNAMIC_LOADER_TOOL=0) include_directories(SYSTEM "${ADDONS_DIR}/Vulkan-Hpp") include_directories(SYSTEM "${ADDONS_DIR}/Vulkan-Hpp/Vulkan-Headers/include") +include_directories("${ADDONS_DIR}/VulkanMemoryAllocator/include") # Define a static library for Perfetto add_library(perfetto STATIC ${ADDONS_DIR}/perfetto/sdk/perfetto.cc) diff --git a/app/src/main/cpp/addons/VulkanMemoryAllocator b/app/src/main/cpp/addons/VulkanMemoryAllocator new file mode 160000 index 0000000..5e43c79 --- /dev/null +++ b/app/src/main/cpp/addons/VulkanMemoryAllocator @@ -0,0 +1 @@ +Subproject commit 5e43c795daf43dd09398d8307212e85025215052 diff --git a/app/src/main/cpp/addons/compile_this.cpp b/app/src/main/cpp/addons/compile_this.cpp index 8b13789..a4f24ff 100644 --- a/app/src/main/cpp/addons/compile_this.cpp +++ b/app/src/main/cpp/addons/compile_this.cpp @@ -1 +1,6 @@ - +// https://gpuopen-librariesandsdks.github.io/VulkanMemoryAllocator/html/quick_start.html#quick_start_project_setup +#define VMA_IMPLEMENTATION +#define VMA_VULKAN_VERSION 1002000 // Vulkan 1.2 +#define VMA_STATIC_VULKAN_FUNCTIONS 0 +#define VMA_DYNAMIC_VULKAN_FUNCTIONS 1 +#include diff --git a/app/src/main/cpp/cosmic/eeiv/ee_engine.cpp b/app/src/main/cpp/cosmic/eeiv/ee_engine.cpp index 09eb0c2..3417b0b 100644 --- a/app/src/main/cpp/cosmic/eeiv/ee_engine.cpp +++ b/app/src/main/cpp/cosmic/eeiv/ee_engine.cpp @@ -4,7 +4,7 @@ #include #include -#include +#include namespace cosmic::eeiv { EeMipsCore::EeMipsCore(std::shared_ptr& dma) : ctrl0(dma), @@ -19,10 +19,9 @@ namespace cosmic::eeiv { if (procCpuMode == EEExecutionMode::CachedInterpreter) eeExecutor = std::make_unique(*this); else if (procCpuMode == EEExecutionMode::JitRe) - eeExecutor = std::make_unique(*this); + eeExecutor = std::make_unique(*this); }; } - EeMipsCore::~EeMipsCore() { delete[] GPRs; } diff --git a/app/src/main/cpp/cosmic/gpu/exhibition_engine.h b/app/src/main/cpp/cosmic/gpu/exhibition_engine.h index 330a18b..1b50327 100644 --- a/app/src/main/cpp/cosmic/gpu/exhibition_engine.h +++ b/app/src/main/cpp/cosmic/gpu/exhibition_engine.h @@ -3,7 +3,7 @@ #include #include -#include +#include namespace cosmic::gpu { class ExhibitionEngine { public: @@ -13,7 +13,7 @@ namespace cosmic::gpu { jobject globalSurface; ANativeWindow* window; - violet::RenderApi graphics{violet::HardwareOpenGL}; - violet::VioletLayer scene{graphics}; + RenderApi graphics{HardwareOpenGL}; + GraphicsLayer scene{graphics}; }; } \ No newline at end of file diff --git a/app/src/main/cpp/cosmic/gpu/functions.h b/app/src/main/cpp/cosmic/gpu/functions.h new file mode 100644 index 0000000..79372a8 --- /dev/null +++ b/app/src/main/cpp/cosmic/gpu/functions.h @@ -0,0 +1,14 @@ +#pragma once + +#include +#include +#include +namespace cosmic::gpu { + class GraphicsLayer; + class GraphicsFunctionsRef { + public: + std::function, jobject)> setSurface; + std::function)> prepareGraphicsApi; + std::function)> displayApiVersion; + }; +} \ No newline at end of file diff --git a/app/src/main/cpp/cosmic/gpu/violet/graphics_layer.cpp b/app/src/main/cpp/cosmic/gpu/graphics_layer.cpp similarity index 81% rename from app/src/main/cpp/cosmic/gpu/violet/graphics_layer.cpp rename to app/src/main/cpp/cosmic/gpu/graphics_layer.cpp index 3568c99..67483ca 100644 --- a/app/src/main/cpp/cosmic/gpu/violet/graphics_layer.cpp +++ b/app/src/main/cpp/cosmic/gpu/graphics_layer.cpp @@ -1,11 +1,11 @@ #include -#include -namespace cosmic::gpu::violet { - static void startVulkanLayer(raw_reference layer) { +#include +namespace cosmic::gpu { + static void startVulkanLayer(raw_reference layer) { layer->app = vk::raii::Context(layer->hardware->vulkanInstanceAddr); layer->instance = createVulkanInstance(*layer->app); } - static void displayVersion(raw_reference layer) { + static void displayVersion(raw_reference layer) { #if !defined(NDEBUG) if (layer->graphicsApi == HardwareVulkan) { u32 version{layer->app->enumerateInstanceVersion()}; @@ -23,12 +23,12 @@ namespace cosmic::gpu::violet { return "OpenGLES"; case RenderApi::HardwareVulkan: return "Vulkan Driver"; - case SoftwareSuperSlow: + case SoftwareSlow: return "Software"; } return ""; } - void VioletLayer::updateLayer() { + void GraphicsLayer::updateLayer() { u32 functions{reloadReferences()}; u8 openGl{graphicsApi == HardwareOpenGL && functions == 0x0}; u8 vulkan{graphicsApi == HardwareVulkan && functions == 0x1}; @@ -39,18 +39,18 @@ namespace cosmic::gpu::violet { prepareGraphicsApi(*this); displayApiVersion(*this); } - VioletLayer::VioletLayer(RenderApi renderMode) : graphicsApi(renderMode) { + GraphicsLayer::GraphicsLayer(RenderApi renderMode) : graphicsApi(renderMode) { hardware = std::make_unique(); hardware->pickUserRender(renderMode); device->getStates()->customDriver.observer = [this]() { - graphicsApi = violet::HardwareVulkan; + graphicsApi = HardwareVulkan; hardware->pickUserRender(graphicsApi, true); updateLayer(); }; displayApiVersion = displayVersion; } - u32 VioletLayer::reloadReferences() { + u32 GraphicsLayer::reloadReferences() { u32 loaded{}; if (graphicsApi == HardwareVulkan) { prepareGraphicsApi = startVulkanLayer; diff --git a/app/src/main/cpp/cosmic/gpu/violet/graphics_layer.h b/app/src/main/cpp/cosmic/gpu/graphics_layer.h similarity index 70% rename from app/src/main/cpp/cosmic/gpu/violet/graphics_layer.h rename to app/src/main/cpp/cosmic/gpu/graphics_layer.h index a79680e..c9c816a 100644 --- a/app/src/main/cpp/cosmic/gpu/violet/graphics_layer.h +++ b/app/src/main/cpp/cosmic/gpu/graphics_layer.h @@ -1,13 +1,13 @@ #pragma once #include -#include -#include +#include +#include #include -namespace cosmic::gpu::violet { - class VioletLayer : public VioletFunctionsRef { +namespace cosmic::gpu { + class GraphicsLayer : public GraphicsFunctionsRef { public: - VioletLayer(RenderApi renderMode); + GraphicsLayer(RenderApi renderMode); std::variant render; u32 reloadReferences(); void updateLayer(); diff --git a/app/src/main/cpp/cosmic/gpu/render_driver.cpp b/app/src/main/cpp/cosmic/gpu/render_driver.cpp index 89a1e66..5079738 100644 --- a/app/src/main/cpp/cosmic/gpu/render_driver.cpp +++ b/app/src/main/cpp/cosmic/gpu/render_driver.cpp @@ -5,17 +5,17 @@ #include #include namespace cosmic::gpu { - void RenderDriver::pickUserRender(const violet::RenderApi api, bool reload) { + void RenderDriver::pickUserRender(const RenderApi api, bool reload) { if (driver && !reload) return; switch (api) { - case violet::HardwareVulkan: + case HardwareVulkan: if (!loadVulkanDriver()) { throw GpuFail("No instance of the Vulkan driver was found"); } break; - case violet::SoftwareSuperSlow: - case violet::HardwareOpenGL: + case SoftwareSlow: + case HardwareOpenGL: break; } } diff --git a/app/src/main/cpp/cosmic/gpu/render_driver.h b/app/src/main/cpp/cosmic/gpu/render_driver.h index 029de1b..dac467d 100644 --- a/app/src/main/cpp/cosmic/gpu/render_driver.h +++ b/app/src/main/cpp/cosmic/gpu/render_driver.h @@ -1,6 +1,6 @@ #pragma once #include -#include +#include namespace cosmic::gpu { using LinkableObject = void*; class RenderDriver { @@ -13,7 +13,7 @@ namespace cosmic::gpu { LinkableObject driver{}; PFN_vkGetInstanceProcAddr vulkanInstanceAddr{}; - void pickUserRender(const violet::RenderApi api, bool reload = false); + void pickUserRender(const RenderApi api, bool reload = false); bool loadVulkanDriver(); }; } diff --git a/app/src/main/cpp/cosmic/gpu/violet/renders.h b/app/src/main/cpp/cosmic/gpu/renders.h similarity index 78% rename from app/src/main/cpp/cosmic/gpu/violet/renders.h rename to app/src/main/cpp/cosmic/gpu/renders.h index b7567e9..e3e3423 100644 --- a/app/src/main/cpp/cosmic/gpu/violet/renders.h +++ b/app/src/main/cpp/cosmic/gpu/renders.h @@ -1,9 +1,8 @@ #pragma once #include #include - -#include -namespace cosmic::gpu::violet { +#include +namespace cosmic::gpu { enum RenderApi : u8 { SoftwareSlow, HardwareVulkan, @@ -17,5 +16,6 @@ namespace cosmic::gpu::violet { struct VkRender { VkRender() {} std::optional surface; + std::unique_ptr allocator; }; } \ No newline at end of file diff --git a/app/src/main/cpp/cosmic/gpu/violet/functions.h b/app/src/main/cpp/cosmic/gpu/violet/functions.h deleted file mode 100644 index 03ce980..0000000 --- a/app/src/main/cpp/cosmic/gpu/violet/functions.h +++ /dev/null @@ -1,14 +0,0 @@ -#pragma once - -#include -#include -#include -namespace cosmic::gpu::violet { - class VioletLayer; - class VioletFunctionsRef { - public: - std::function, jobject)> setSurface; - std::function)> prepareGraphicsApi; - std::function)> displayApiVersion; - }; -} \ No newline at end of file diff --git a/app/src/main/cpp/cosmic/gpu/vulcano/vram_allocator.cpp b/app/src/main/cpp/cosmic/gpu/vulcano/vram_allocator.cpp new file mode 100644 index 0000000..0349e25 --- /dev/null +++ b/app/src/main/cpp/cosmic/gpu/vulcano/vram_allocator.cpp @@ -0,0 +1,12 @@ +#include + +namespace cosmic::gpu::vulcano { + VramManager::VramManager(raw_reference gpu) : graphics(gpu) { + VmaAllocatorCreateInfo allocatorInfo{}; + vmaCreateAllocator(&allocatorInfo, &vma); + } + VramManager::~VramManager() { + if (vma != VK_NULL_HANDLE) + vmaDestroyAllocator(vma); + } +} diff --git a/app/src/main/cpp/cosmic/gpu/vulcano/vram_allocator.h b/app/src/main/cpp/cosmic/gpu/vulcano/vram_allocator.h new file mode 100644 index 0000000..8b66fc0 --- /dev/null +++ b/app/src/main/cpp/cosmic/gpu/vulcano/vram_allocator.h @@ -0,0 +1,15 @@ +#pragma once + +#include +#include +namespace cosmic::gpu::vulcano { + class GraphicsLayer; + class VramManager { + public: + VramManager(raw_reference gpu); + ~VramManager(); + private: + VmaAllocator vma{VK_NULL_HANDLE}; + raw_reference graphics; + }; +} diff --git a/app/src/main/cpp/cosmic/gpu/violet/vulkan_functions.cpp b/app/src/main/cpp/cosmic/gpu/vulcano/vulkan_functions.cpp similarity index 93% rename from app/src/main/cpp/cosmic/gpu/violet/vulkan_functions.cpp rename to app/src/main/cpp/cosmic/gpu/vulcano/vulkan_functions.cpp index b393eb9..49ca631 100644 --- a/app/src/main/cpp/cosmic/gpu/violet/vulkan_functions.cpp +++ b/app/src/main/cpp/cosmic/gpu/vulcano/vulkan_functions.cpp @@ -1,7 +1,7 @@ #include -#include +#include -namespace cosmic::gpu::violet { +namespace cosmic::gpu::vulcano { vk::raii::Instance createVulkanInstance(const vk::raii::Context& context) { vk::ApplicationInfo application{ .pApplicationName = "Cosmic", @@ -14,7 +14,7 @@ namespace cosmic::gpu::violet { "VK_KHR_android_surface", // Provide a way to connect/refer a VkSurfaceKHR as a ANativeWindows }; for (const auto required : requiredExtensions) { - if (!ranges::any_of(extensions, [&](const auto& available){ + if (!ranges::any_of(extensions, [&](const auto& available) { return std::string_view(available.extensionName) == std::string_view(required); })) { throw GpuFail("Couldn't find a Vulkan extension with name {}", required); diff --git a/app/src/main/cpp/cosmic/tokyo3/tokyo3_arm64_jitter.h b/app/src/main/cpp/cosmic/tokyo/arm64_jitter.h similarity index 58% rename from app/src/main/cpp/cosmic/tokyo3/tokyo3_arm64_jitter.h rename to app/src/main/cpp/cosmic/tokyo/arm64_jitter.h index 0d12182..05f85ea 100644 --- a/app/src/main/cpp/cosmic/tokyo3/tokyo3_arm64_jitter.h +++ b/app/src/main/cpp/cosmic/tokyo/arm64_jitter.h @@ -1,10 +1,10 @@ #pragma once #include -namespace cosmic::eeiv::tokyo3 { - class EEArm64Jitter : public EeExecutor { +namespace cosmic::eeiv::tokyo { + class EeArm64Jitter : public EeExecutor { public: - EEArm64Jitter(EeMipsCore& intCpu) : EeExecutor(intCpu) {} + EeArm64Jitter(EeMipsCore& intCpu) : EeExecutor(intCpu) {} u32 executeCode() override { return 0; }