Upgrade to C++23
This commit is contained in:
2
external/capstone/CMakeLists.txt
vendored
2
external/capstone/CMakeLists.txt
vendored
@@ -30,7 +30,7 @@ string(REGEX MATCH "^[0-9]+\\.[0-9]+\\.[0-9]+" PROJECT_VERSION_BASE ${PROJECT_VE
|
|||||||
# Set the project version without the pre-release identifier
|
# Set the project version without the pre-release identifier
|
||||||
project(capstone VERSION ${PROJECT_VERSION_BASE})
|
project(capstone VERSION ${PROJECT_VERSION_BASE})
|
||||||
|
|
||||||
set(UNIX_COMPILER_OPTIONS -Werror -Wall -Warray-bounds -Wshift-negative-value -Wreturn-type -Wformat -Wmissing-braces -Wunused-function -Warray-bounds -Wunused-variable -Wparentheses -Wint-in-bool-context -Wmisleading-indentation)
|
set(UNIX_COMPILER_OPTIONS -Werror -Warray-bounds -Wshift-negative-value -Wreturn-type -Wformat -Wmissing-braces -Warray-bounds -Wunused-variable -Wparentheses -Wint-in-bool-context -Wmisleading-indentation)
|
||||||
|
|
||||||
# maybe-uninitialized is only supported by newer versions of GCC.
|
# maybe-uninitialized is only supported by newer versions of GCC.
|
||||||
# Unfortunately, it is pretty unreliable and reports wrong results.
|
# Unfortunately, it is pretty unreliable and reports wrong results.
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ if(APPLE)
|
|||||||
enable_language(OBJC)
|
enable_language(OBJC)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
set(CMAKE_CXX_STANDARD 20)
|
set(CMAKE_CXX_STANDARD 23)
|
||||||
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
||||||
|
|
||||||
include_directories(
|
include_directories(
|
||||||
|
|||||||
@@ -8,6 +8,8 @@ EmuThread::EmuThread(const std::shared_ptr<n64::Core> &core, double &fps, Render
|
|||||||
void EmuThread::start() noexcept {
|
void EmuThread::start() noexcept {
|
||||||
thread = std::thread([this]() {
|
thread = std::thread([this]() {
|
||||||
isRunning = true;
|
isRunning = true;
|
||||||
|
core->parallel.Init(renderWidget.wsiPlatform, renderWidget.windowInfo,
|
||||||
|
core->cpu->GetMem().GetRDRAMPtr());
|
||||||
|
|
||||||
auto lastSample = std::chrono::high_resolution_clock::now();
|
auto lastSample = std::chrono::high_resolution_clock::now();
|
||||||
auto avgFps = 16.667;
|
auto avgFps = 16.667;
|
||||||
|
|||||||
@@ -15,115 +15,7 @@ static void check_vk_result(VkResult err)
|
|||||||
abort();
|
abort();
|
||||||
}
|
}
|
||||||
|
|
||||||
void KaizenGui::InitImGui() {
|
|
||||||
IMGUI_CHECKVERSION();
|
|
||||||
ImGui::CreateContext();
|
|
||||||
ImGuiIO& io = ImGui::GetIO();
|
|
||||||
(void)io;
|
|
||||||
|
|
||||||
// Setup Dear ImGui style
|
|
||||||
ImGui::StyleColorsDark();
|
|
||||||
|
|
||||||
ParallelRDP& prdp = core->parallel;
|
|
||||||
Vulkan::WSI& wsi = *prdp.wsi.get();
|
|
||||||
volkInitialize();
|
|
||||||
volkLoadInstance(wsi.get_context().get_instance());
|
|
||||||
ImGui_ImplVulkan_LoadFunctions(VK_API_VERSION_1_3, [](const char* function_name, void* userdata) {
|
|
||||||
auto wsi = (Vulkan::WSI*)userdata;
|
|
||||||
return vkGetInstanceProcAddr(wsi->get_context().get_instance(), function_name);
|
|
||||||
}, &wsi);
|
|
||||||
|
|
||||||
ImGui_ImplVulkan_InitInfo init_info = {};
|
|
||||||
// Create Descriptor Pool
|
|
||||||
{
|
|
||||||
VkDescriptorPoolSize pool_sizes[] =
|
|
||||||
{
|
|
||||||
{ VK_DESCRIPTOR_TYPE_SAMPLER, 1000 },
|
|
||||||
{ VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1000 },
|
|
||||||
{ VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, 1000 },
|
|
||||||
{ VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, 1000 },
|
|
||||||
{ VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER, 1000 },
|
|
||||||
{ VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, 1000 },
|
|
||||||
{ VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1000 },
|
|
||||||
{ VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1000 },
|
|
||||||
{ VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, 1000 },
|
|
||||||
{ VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC, 1000 },
|
|
||||||
{ VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 1000 }
|
|
||||||
};
|
|
||||||
VkDescriptorPoolCreateInfo pool_info = {};
|
|
||||||
pool_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
|
|
||||||
pool_info.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
|
|
||||||
pool_info.maxSets = 1000 * IM_ARRAYSIZE(pool_sizes);
|
|
||||||
pool_info.poolSizeCount = (uint32_t)IM_ARRAYSIZE(pool_sizes);
|
|
||||||
pool_info.pPoolSizes = pool_sizes;
|
|
||||||
auto err = vkCreateDescriptorPool(wsi.get_context().get_device(), &pool_info, nullptr, &init_info.DescriptorPool);
|
|
||||||
check_vk_result(err);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Create the Render Pass
|
|
||||||
VkRenderPass renderPass;
|
|
||||||
{
|
|
||||||
VkAttachmentDescription attachment = {};
|
|
||||||
attachment.format = wsi.get_device().get_swapchain_view().get_format();
|
|
||||||
attachment.samples = VK_SAMPLE_COUNT_1_BIT;
|
|
||||||
attachment.loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
|
|
||||||
attachment.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
|
|
||||||
attachment.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
|
|
||||||
attachment.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
|
|
||||||
attachment.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
|
|
||||||
attachment.finalLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR;
|
|
||||||
VkAttachmentReference color_attachment = {};
|
|
||||||
color_attachment.attachment = 0;
|
|
||||||
color_attachment.layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
|
|
||||||
VkSubpassDescription subpass = {};
|
|
||||||
subpass.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS;
|
|
||||||
subpass.colorAttachmentCount = 1;
|
|
||||||
subpass.pColorAttachments = &color_attachment;
|
|
||||||
VkSubpassDependency dependency = {};
|
|
||||||
dependency.srcSubpass = VK_SUBPASS_EXTERNAL;
|
|
||||||
dependency.dstSubpass = 0;
|
|
||||||
dependency.srcStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
|
|
||||||
dependency.dstStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
|
|
||||||
dependency.srcAccessMask = 0;
|
|
||||||
dependency.dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
|
|
||||||
VkRenderPassCreateInfo info = {};
|
|
||||||
info.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
|
|
||||||
info.attachmentCount = 1;
|
|
||||||
info.pAttachments = &attachment;
|
|
||||||
info.subpassCount = 1;
|
|
||||||
info.pSubpasses = &subpass;
|
|
||||||
info.dependencyCount = 1;
|
|
||||||
info.pDependencies = &dependency;
|
|
||||||
auto err = vkCreateRenderPass(wsi.get_context().get_device(), &info, nullptr, &renderPass);
|
|
||||||
check_vk_result(err);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Setup Platform/Renderer backends
|
|
||||||
ImGui_ImplSDL3_InitForVulkan(window.getHandle());
|
|
||||||
init_info.Instance = wsi.get_context().get_instance();
|
|
||||||
init_info.PhysicalDevice = wsi.get_context().get_gpu();
|
|
||||||
init_info.Device = wsi.get_context().get_device();
|
|
||||||
init_info.QueueFamily = wsi.get_context().get_queue_info().family_indices[Vulkan::QUEUE_INDEX_GRAPHICS];
|
|
||||||
init_info.Queue = wsi.get_context().get_queue_info().queues[Vulkan::QUEUE_INDEX_GRAPHICS];
|
|
||||||
init_info.PipelineCache = nullptr;
|
|
||||||
init_info.Allocator = nullptr;
|
|
||||||
init_info.MinImageCount = 2;
|
|
||||||
init_info.ImageCount = 2;
|
|
||||||
init_info.RenderPass = renderPass;
|
|
||||||
init_info.CheckVkResultFn = check_vk_result;
|
|
||||||
|
|
||||||
ImGui_ImplVulkan_Init(&init_info);
|
|
||||||
|
|
||||||
io.Fonts->AddFontDefault();
|
|
||||||
{
|
|
||||||
ImGui_ImplVulkan_CreateFontsTexture();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
KaizenGui::KaizenGui() noexcept : window("Kaizen", 1280, 720), core(std::make_shared<n64::Core>()), vulkanWidget(core, window.getHandle()), emuThread(core, fpsCounter, vulkanWidget, settingsWindow) {
|
KaizenGui::KaizenGui() noexcept : window("Kaizen", 1280, 720), core(std::make_shared<n64::Core>()), vulkanWidget(core, window.getHandle()), emuThread(core, fpsCounter, vulkanWidget, settingsWindow) {
|
||||||
core->parallel.Init(vulkanWidget.wsiPlatform, vulkanWidget.windowInfo, core->cpu->GetMem().GetRDRAMPtr());
|
|
||||||
InitImGui();
|
|
||||||
|
|
||||||
emuExitFunc = [&]() {
|
emuExitFunc = [&]() {
|
||||||
quit = true;
|
quit = true;
|
||||||
if (emuThread.isRunning) {
|
if (emuThread.isRunning) {
|
||||||
|
|||||||
@@ -2,16 +2,17 @@
|
|||||||
#include <KaizenGui.hpp>
|
#include <KaizenGui.hpp>
|
||||||
#include <RenderWidget.hpp>
|
#include <RenderWidget.hpp>
|
||||||
#include <SDL3/SDL.h>
|
#include <SDL3/SDL.h>
|
||||||
|
#include <InputSettings.hpp>
|
||||||
|
|
||||||
RenderWidget::RenderWidget(const std::shared_ptr<n64::Core> &core, SDL_Window* window) {
|
RenderWidget::RenderWidget(const std::shared_ptr<n64::Core> &core, InputSettings& inputSettings, SDL_Window* window) : inputSettings(inputSettings) {
|
||||||
if (!Vulkan::Context::init_loader(nullptr)) {
|
if (!Vulkan::Context::init_loader(nullptr)) {
|
||||||
Util::panic("Could not initialize Vulkan ICD");
|
Util::panic("Could not initialize Vulkan ICD");
|
||||||
}
|
}
|
||||||
|
|
||||||
wsiPlatform = std::make_shared<ImGuiWSIPlatform>(core, window);
|
wsiPlatform = std::make_shared<SDLWSIPlatform>(core, inputSettings, window);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ImGuiWSIPlatform::poll_input() {
|
void SDLWSIPlatform::poll_input() {
|
||||||
if (!canPollEvents)
|
if (!canPollEvents)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
|||||||
@@ -3,13 +3,15 @@
|
|||||||
#include <SDL3/SDL.h>
|
#include <SDL3/SDL.h>
|
||||||
#include <SDL3/SDL_vulkan.h>
|
#include <SDL3/SDL_vulkan.h>
|
||||||
|
|
||||||
|
struct InputSettings;
|
||||||
|
|
||||||
namespace n64 {
|
namespace n64 {
|
||||||
struct Core;
|
struct Core;
|
||||||
}
|
}
|
||||||
|
|
||||||
class ImGuiParallelRdpWindowInfo final : public ParallelRDP::WindowInfo {
|
class SDLParallelRdpWindowInfo final : public ParallelRDP::WindowInfo {
|
||||||
public:
|
public:
|
||||||
explicit ImGuiParallelRdpWindowInfo(const std::shared_ptr<SDL_Window> window) : window(window) {}
|
explicit SDLParallelRdpWindowInfo(const std::shared_ptr<SDL_Window> window) : window(window) {}
|
||||||
CoordinatePair get_window_size() override {
|
CoordinatePair get_window_size() override {
|
||||||
int w,h;
|
int w,h;
|
||||||
SDL_GetWindowSizeInPixels(window.get(), &w, &h);
|
SDL_GetWindowSizeInPixels(window.get(), &w, &h);
|
||||||
@@ -20,18 +22,18 @@ private:
|
|||||||
std::shared_ptr<SDL_Window> window{};
|
std::shared_ptr<SDL_Window> window{};
|
||||||
};
|
};
|
||||||
|
|
||||||
class ImGuiWSIPlatform final : public Vulkan::WSIPlatform {
|
class SDLWSIPlatform final : public Vulkan::WSIPlatform {
|
||||||
public:
|
public:
|
||||||
explicit ImGuiWSIPlatform(const std::shared_ptr<n64::Core> &core, SDL_Window* window) : window(window), core(core) {}
|
explicit SDLWSIPlatform(const std::shared_ptr<n64::Core> &core, InputSettings& inputSettings, SDL_Window* window) : window(window), inputSettings(inputSettings), core(core) {}
|
||||||
|
|
||||||
std::vector<const char *> get_instance_extensions() override {
|
std::vector<const char *> get_instance_extensions() override {
|
||||||
auto vec = std::vector<const char *>();
|
auto vec = std::vector<const char *>();
|
||||||
u32 extCount;
|
u32 extCount;
|
||||||
const auto &extensions = SDL_Vulkan_GetInstanceExtensions(&extCount);
|
const auto &extensions = SDL_Vulkan_GetInstanceExtensions(&extCount);
|
||||||
vec.reserve(extCount);
|
vec.resize(extCount);
|
||||||
|
|
||||||
for (u32 i = 0; i < extCount; i++) {
|
for (u32 i = 0; i < extCount; i++) {
|
||||||
vec.emplace_back(extensions[i]);
|
vec[i] = extensions[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
return vec;
|
return vec;
|
||||||
@@ -67,14 +69,16 @@ public:
|
|||||||
private:
|
private:
|
||||||
std::shared_ptr<n64::Core> core;
|
std::shared_ptr<n64::Core> core;
|
||||||
SDL_Gamepad *gamepad{};
|
SDL_Gamepad *gamepad{};
|
||||||
|
InputSettings& inputSettings;
|
||||||
bool gamepadConnected = false;
|
bool gamepadConnected = false;
|
||||||
bool canPollEvents = true;
|
bool canPollEvents = true;
|
||||||
};
|
};
|
||||||
|
|
||||||
class RenderWidget final {
|
class RenderWidget final {
|
||||||
public:
|
public:
|
||||||
explicit RenderWidget(const std::shared_ptr<n64::Core> &, SDL_Window*);
|
explicit RenderWidget(const std::shared_ptr<n64::Core> &, InputSettings&, SDL_Window*);
|
||||||
|
|
||||||
std::shared_ptr<ParallelRDP::WindowInfo> windowInfo;
|
std::shared_ptr<ParallelRDP::WindowInfo> windowInfo;
|
||||||
std::shared_ptr<ImGuiWSIPlatform> wsiPlatform;
|
std::shared_ptr<Vulkan::WSIPlatform> wsiPlatform;
|
||||||
|
InputSettings& inputSettings;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,14 +1,8 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
#include <common.hpp>
|
#include <common.hpp>
|
||||||
|
#include <bit>
|
||||||
|
|
||||||
static FORCE_INLINE u16 bswap(const u16 x) { return (x & 0xFF00u) >> 8 | (x & 0x00FFu) << 8; }
|
template <class T>
|
||||||
|
static constexpr T bswap(const T x) {
|
||||||
static FORCE_INLINE u32 bswap(const u32 x) {
|
return std::byteswap<T>(x);
|
||||||
return (x & 0xFF000000u) >> 24u | (x & 0x00FF0000u) >> 8u | (x & 0x0000FF00u) << 8u | (x & 0x000000FFu) << 24u;
|
|
||||||
}
|
|
||||||
|
|
||||||
static FORCE_INLINE u64 bswap(const u64 x) {
|
|
||||||
return (x & 0xFF00000000000000u) >> 56u | (x & 0x00FF000000000000u) >> 40u | (x & 0x0000FF0000000000u) >> 24u |
|
|
||||||
(x & 0x000000FF00000000u) >> 8u | (x & 0x00000000FF000000u) << 8u | (x & 0x0000000000FF0000u) << 24u |
|
|
||||||
(x & 0x000000000000FF00u) << 40u | (x & 0x00000000000000FFu) << 56u;
|
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user