Upgrade to C++23

This commit is contained in:
SimoZ64
2025-05-20 17:47:52 +02:00
parent be711bf5b3
commit 8fa341bf72
7 changed files with 26 additions and 133 deletions

View File

@@ -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
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.
# Unfortunately, it is pretty unreliable and reports wrong results.

View File

@@ -11,7 +11,7 @@ if(APPLE)
enable_language(OBJC)
endif()
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD 23)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
include_directories(

View File

@@ -8,6 +8,8 @@ EmuThread::EmuThread(const std::shared_ptr<n64::Core> &core, double &fps, Render
void EmuThread::start() noexcept {
thread = std::thread([this]() {
isRunning = true;
core->parallel.Init(renderWidget.wsiPlatform, renderWidget.windowInfo,
core->cpu->GetMem().GetRDRAMPtr());
auto lastSample = std::chrono::high_resolution_clock::now();
auto avgFps = 16.667;

View File

@@ -15,115 +15,7 @@ static void check_vk_result(VkResult err)
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) {
core->parallel.Init(vulkanWidget.wsiPlatform, vulkanWidget.windowInfo, core->cpu->GetMem().GetRDRAMPtr());
InitImGui();
emuExitFunc = [&]() {
quit = true;
if (emuThread.isRunning) {

View File

@@ -2,16 +2,17 @@
#include <KaizenGui.hpp>
#include <RenderWidget.hpp>
#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)) {
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)
return;

View File

@@ -3,13 +3,15 @@
#include <SDL3/SDL.h>
#include <SDL3/SDL_vulkan.h>
struct InputSettings;
namespace n64 {
struct Core;
}
class ImGuiParallelRdpWindowInfo final : public ParallelRDP::WindowInfo {
class SDLParallelRdpWindowInfo final : public ParallelRDP::WindowInfo {
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 {
int w,h;
SDL_GetWindowSizeInPixels(window.get(), &w, &h);
@@ -20,18 +22,18 @@ private:
std::shared_ptr<SDL_Window> window{};
};
class ImGuiWSIPlatform final : public Vulkan::WSIPlatform {
class SDLWSIPlatform final : public Vulkan::WSIPlatform {
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 {
auto vec = std::vector<const char *>();
u32 extCount;
const auto &extensions = SDL_Vulkan_GetInstanceExtensions(&extCount);
vec.reserve(extCount);
vec.resize(extCount);
for (u32 i = 0; i < extCount; i++) {
vec.emplace_back(extensions[i]);
vec[i] = extensions[i];
}
return vec;
@@ -67,14 +69,16 @@ public:
private:
std::shared_ptr<n64::Core> core;
SDL_Gamepad *gamepad{};
InputSettings& inputSettings;
bool gamepadConnected = false;
bool canPollEvents = true;
};
class RenderWidget final {
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<ImGuiWSIPlatform> wsiPlatform;
std::shared_ptr<Vulkan::WSIPlatform> wsiPlatform;
InputSettings& inputSettings;
};

View File

@@ -1,14 +1,8 @@
#pragma once
#include <common.hpp>
#include <bit>
static FORCE_INLINE u16 bswap(const u16 x) { return (x & 0xFF00u) >> 8 | (x & 0x00FFu) << 8; }
static FORCE_INLINE u32 bswap(const u32 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;
template <class T>
static constexpr T bswap(const T x) {
return std::byteswap<T>(x);
}