diff --git a/engine/CMakeLists.txt b/engine/CMakeLists.txt index 1d992ee..0d2c09b 100644 --- a/engine/CMakeLists.txt +++ b/engine/CMakeLists.txt @@ -27,7 +27,6 @@ set(ENGINE_SRC platform/linux/x11/window_driver.cpp platform/windows/window_driver.cpp platform/window_driver.cpp - render/renderer.cpp render/render_device.cpp render/render_driver.cpp ) diff --git a/engine/include/nova/platform/window_fwd.h b/engine/include/nova/platform/platform_structs.h similarity index 74% rename from engine/include/nova/platform/window_fwd.h rename to engine/include/nova/platform/platform_structs.h index c1aee32..8b856da 100644 --- a/engine/include/nova/platform/window_fwd.h +++ b/engine/include/nova/platform/platform_structs.h @@ -7,10 +7,6 @@ #pragma once namespace Nova { - enum class WindowAPI { WAYLAND, WINDOWS, X11 }; - - class WindowDriver; - struct Window; using WindowID = Window*; } // namespace Nova diff --git a/engine/include/nova/platform/window_driver.h b/engine/include/nova/platform/window_driver.h index 4ee3502..ea5cacb 100644 --- a/engine/include/nova/platform/window_driver.h +++ b/engine/include/nova/platform/window_driver.h @@ -7,13 +7,17 @@ #pragma once #include -#include -#include +#include +#include #include #include namespace Nova { + class RenderDriver; + + enum class WindowAPI { WAYLAND, WINDOWS, X11 }; + class NOVA_API WindowDriver { public: static WindowDriver* create(); diff --git a/engine/include/nova/render/render_fwd.h b/engine/include/nova/render/data_format.h similarity index 82% rename from engine/include/nova/render/render_fwd.h rename to engine/include/nova/render/data_format.h index 2fccdff..23bb8cc 100644 --- a/engine/include/nova/render/render_fwd.h +++ b/engine/include/nova/render/data_format.h @@ -7,15 +7,6 @@ #pragma once namespace Nova { - enum class CullMode { NONE, FRONT, BACK }; - enum class FrontFace { CLOCKWISE, COUNTER_CLOCKWISE }; - enum class InputRate { VERTEX, INSTANCE }; - enum class PipelineType { GRAPHICS, COMPUTE }; - enum class PrimitiveTopology { POINT_LIST, LINE_LIST, LINE_STRIP, TRIANGLE_LIST, TRIANGLE_STRIP }; - enum class QueueType { UNDEFINED, GRAPHICS, COMPUTE, TRANSFER }; - enum class RenderAPI { DX12, VULKAN }; - enum class ShaderStage { VERTEX, FRAGMENT, GEOMETRY, TESS_CONTROL, TESS_EVAL, COMPUTE, MESH, TASK }; - enum class DataFormat { UNDEFINED, R4G4_UNORM_PACK8, @@ -237,31 +228,4 @@ namespace Nova { G16_B16R16_2PLANE_422_UNORM, G16_B16_R16_3PLANE_444_UNORM, }; - - class RenderDriver; - struct RenderDevice; - - struct VertexAttribute; - struct VertexBinding; - struct RenderPassParams; - struct GraphicsPipelineParams; - struct ComputePipelineParams; - - struct CommandBuffer; - struct CommandPool; - struct Pipeline; - struct Queue; - struct RenderPass; - struct Shader; - struct Surface; - struct Swapchain; - - using CommandBufferID = CommandBuffer*; - using CommandPoolID = CommandPool*; - using PipelineID = Pipeline*; - using QueueID = Queue*; - using RenderPassID = RenderPass*; - using ShaderID = Shader*; - using SurfaceID = Surface*; - using SwapchainID = Swapchain*; } // namespace Nova diff --git a/engine/include/nova/render/params/compute_pipeline.h b/engine/include/nova/render/params/compute_pipeline.h new file mode 100644 index 0000000..dff17cc --- /dev/null +++ b/engine/include/nova/render/params/compute_pipeline.h @@ -0,0 +1,13 @@ +/** + * Copyright (c) 2025, Jayden Grubb + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#pragma once + +namespace Nova { + struct ComputePipelineParams { + // TODO + }; +} // namespace Nova diff --git a/engine/include/nova/render/render_params.h b/engine/include/nova/render/params/graphics_pipeline.h similarity index 79% rename from engine/include/nova/render/render_params.h rename to engine/include/nova/render/params/graphics_pipeline.h index 4e63242..b471c45 100644 --- a/engine/include/nova/render/render_params.h +++ b/engine/include/nova/render/params/graphics_pipeline.h @@ -6,12 +6,18 @@ #pragma once -#include +#include +#include #include #include namespace Nova { + enum class CullMode { NONE, FRONT, BACK }; + enum class FrontFace { CLOCKWISE, COUNTER_CLOCKWISE }; + enum class InputRate { VERTEX, INSTANCE }; + enum class PrimitiveTopology { POINT_LIST, LINE_LIST, LINE_STRIP, TRIANGLE_LIST, TRIANGLE_STRIP }; + struct VertexAttribute { u32 binding = 0; u32 location = 0; @@ -25,8 +31,6 @@ namespace Nova { InputRate rate = InputRate::VERTEX; }; - struct RenderPassParams {}; - struct GraphicsPipelineParams { std::vector shaders; std::vector bindings; @@ -54,6 +58,4 @@ namespace Nova { RenderPassID render_pass = nullptr; u32 subpass = 0; }; - - struct ComputePipelineParams {}; } // namespace Nova diff --git a/engine/include/nova/render/params/render_pass.h b/engine/include/nova/render/params/render_pass.h new file mode 100644 index 0000000..8263988 --- /dev/null +++ b/engine/include/nova/render/params/render_pass.h @@ -0,0 +1,13 @@ +/** + * Copyright (c) 2025, Jayden Grubb + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#pragma once + +namespace Nova { + struct RenderPassParams { + // TODO + }; +} // namespace Nova diff --git a/engine/include/nova/render/render_device.h b/engine/include/nova/render/render_device.h index 0e7051f..2509da1 100644 --- a/engine/include/nova/render/render_device.h +++ b/engine/include/nova/render/render_device.h @@ -7,7 +7,7 @@ #pragma once #include -#include +#include #include #include @@ -15,13 +15,15 @@ #include namespace Nova { - struct NOVA_API RenderDevice { - enum class Vendor { UNKNOWN = 0, INTEL = 0x8086, AMD = 0x1002, NVIDIA = 0x10de }; - enum class Type { OTHER = 0, INTEGRATED = 1, DISCRETE = 2, VIRTUAL = 3, CPU = 4 }; + class RenderDriver; + enum class DeviceVendor { UNKNOWN = 0, INTEL = 0x8086, AMD = 0x1002, NVIDIA = 0x10de }; + enum class DeviceType { OTHER = 0, INTEGRATED = 1, DISCRETE = 2, VIRTUAL = 3, CPU = 4 }; + + struct NOVA_API RenderDevice { std::string name; - Vendor vendor; - Type type; + DeviceVendor vendor; + DeviceType type; u32 deviceID; void* handle; diff --git a/engine/include/nova/render/render_driver.h b/engine/include/nova/render/render_driver.h index 6fe0eda..6e69117 100644 --- a/engine/include/nova/render/render_driver.h +++ b/engine/include/nova/render/render_driver.h @@ -7,14 +7,25 @@ #pragma once #include -#include -#include +#include +#include +#include +#include +#include +#include #include #include #include namespace Nova { + class WindowDriver; + + enum class PipelineType { GRAPHICS, COMPUTE }; + enum class QueueType { UNDEFINED, GRAPHICS, COMPUTE, TRANSFER }; + enum class RenderAPI { DX12, VULKAN }; + enum class ShaderStage { VERTEX, FRAGMENT, GEOMETRY, TESS_CONTROL, TESS_EVAL, COMPUTE, MESH, TASK }; + class NOVA_API RenderDriver { public: static RenderDriver* create(RenderAPI api, WindowDriver* window_driver = nullptr); @@ -31,7 +42,7 @@ namespace Nova { virtual void select_device(u32 index) = 0; virtual u32 choose_queue_family(QueueType type, SurfaceID surface) = 0; - + [[nodiscard]] virtual QueueID get_queue(u32 queue_family) = 0; virtual void free_queue(QueueID queue) = 0; diff --git a/engine/include/nova/render/render_structs.h b/engine/include/nova/render/render_structs.h new file mode 100644 index 0000000..760430b --- /dev/null +++ b/engine/include/nova/render/render_structs.h @@ -0,0 +1,27 @@ +/** + * Copyright (c) 2025, Jayden Grubb + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#pragma once + +namespace Nova { + struct CommandBuffer; + struct CommandPool; + struct Pipeline; + struct Queue; + struct RenderPass; + struct Shader; + struct Surface; + struct Swapchain; + + using CommandBufferID = CommandBuffer*; + using CommandPoolID = CommandPool*; + using PipelineID = Pipeline*; + using QueueID = Queue*; + using RenderPassID = RenderPass*; + using ShaderID = Shader*; + using SurfaceID = Surface*; + using SwapchainID = Swapchain*; +} // namespace Nova diff --git a/engine/include/nova/render/renderer.h b/engine/include/nova/render/renderer.h deleted file mode 100644 index 886ccf1..0000000 --- a/engine/include/nova/render/renderer.h +++ /dev/null @@ -1,19 +0,0 @@ -/** - * Copyright (c) 2025, Jayden Grubb - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#pragma once - -#include -#include - -namespace Nova { - class NOVA_API Renderer { - public: - static void init(RenderAPI api); - static void shutdown(); - static RenderDriver* get_driver(); - }; -} // namespace Nova diff --git a/engine/src/drivers/vulkan/render_driver.cpp b/engine/src/drivers/vulkan/render_driver.cpp index fc229f1..9ff2e0c 100644 --- a/engine/src/drivers/vulkan/render_driver.cpp +++ b/engine/src/drivers/vulkan/render_driver.cpp @@ -8,291 +8,292 @@ #include "drivers/vulkan/render_driver.h" +#include "drivers/vulkan/render_structs.h" + #include #include #include -#include #include + #include #include #include #include #include +#include -#define VALIDATION_LAYER "VK_LAYER_KHRONOS_validation" -#define MAX_QUEUES_PER_FAMILY 2U +namespace { + static constexpr u32 MAX_QUEUES_PER_FAMILY = 2; + static constexpr std::string_view VALIDATION_LAYER = "VK_LAYER_KHRONOS_validation"; + + static constexpr VkShaderStageFlagBits VK_SHADER_STAGE_MAP[] = { + VK_SHADER_STAGE_VERTEX_BIT, + VK_SHADER_STAGE_FRAGMENT_BIT, + VK_SHADER_STAGE_GEOMETRY_BIT, + VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, + VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, + VK_SHADER_STAGE_COMPUTE_BIT, + VK_SHADER_STAGE_MESH_BIT_EXT, + VK_SHADER_STAGE_TASK_BIT_EXT + }; + + static constexpr VkPrimitiveTopology VK_PRIMITIVE_TOPOLOGY_MAP[] = { + VK_PRIMITIVE_TOPOLOGY_POINT_LIST, + VK_PRIMITIVE_TOPOLOGY_LINE_LIST, + VK_PRIMITIVE_TOPOLOGY_LINE_STRIP, + VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST, + VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP + }; + + static constexpr VkCullModeFlags VK_CULL_MODE_MAP[] = { + VK_CULL_MODE_NONE, + VK_CULL_MODE_FRONT_BIT, + VK_CULL_MODE_BACK_BIT, + }; + + static constexpr VkFrontFace VK_FRONT_FACE_MAP[] = { + VK_FRONT_FACE_COUNTER_CLOCKWISE, + VK_FRONT_FACE_CLOCKWISE, + }; + + static constexpr VkVertexInputRate VK_VERTEX_INPUT_RATE_MAP[] = { + VK_VERTEX_INPUT_RATE_VERTEX, + VK_VERTEX_INPUT_RATE_INSTANCE, + }; + + static constexpr VkQueueFlagBits VK_QUEUE_FLAGS_MAP[] = { + static_cast(0), + VK_QUEUE_GRAPHICS_BIT, + VK_QUEUE_COMPUTE_BIT, + VK_QUEUE_TRANSFER_BIT, + }; + + static constexpr VkFormat VK_FORMAT_MAP[] = { + VK_FORMAT_UNDEFINED, + VK_FORMAT_R4G4_UNORM_PACK8, + VK_FORMAT_R4G4B4A4_UNORM_PACK16, + VK_FORMAT_B4G4R4A4_UNORM_PACK16, + VK_FORMAT_R5G6B5_UNORM_PACK16, + VK_FORMAT_B5G6R5_UNORM_PACK16, + VK_FORMAT_R5G5B5A1_UNORM_PACK16, + VK_FORMAT_B5G5R5A1_UNORM_PACK16, + VK_FORMAT_A1R5G5B5_UNORM_PACK16, + VK_FORMAT_R8_UNORM, + VK_FORMAT_R8_SNORM, + VK_FORMAT_R8_USCALED, + VK_FORMAT_R8_SSCALED, + VK_FORMAT_R8_UINT, + VK_FORMAT_R8_SINT, + VK_FORMAT_R8_SRGB, + VK_FORMAT_R8G8_UNORM, + VK_FORMAT_R8G8_SNORM, + VK_FORMAT_R8G8_USCALED, + VK_FORMAT_R8G8_SSCALED, + VK_FORMAT_R8G8_UINT, + VK_FORMAT_R8G8_SINT, + VK_FORMAT_R8G8_SRGB, + VK_FORMAT_R8G8B8_UNORM, + VK_FORMAT_R8G8B8_SNORM, + VK_FORMAT_R8G8B8_USCALED, + VK_FORMAT_R8G8B8_SSCALED, + VK_FORMAT_R8G8B8_UINT, + VK_FORMAT_R8G8B8_SINT, + VK_FORMAT_R8G8B8_SRGB, + VK_FORMAT_B8G8R8_UNORM, + VK_FORMAT_B8G8R8_SNORM, + VK_FORMAT_B8G8R8_USCALED, + VK_FORMAT_B8G8R8_SSCALED, + VK_FORMAT_B8G8R8_UINT, + VK_FORMAT_B8G8R8_SINT, + VK_FORMAT_B8G8R8_SRGB, + VK_FORMAT_R8G8B8A8_UNORM, + VK_FORMAT_R8G8B8A8_SNORM, + VK_FORMAT_R8G8B8A8_USCALED, + VK_FORMAT_R8G8B8A8_SSCALED, + VK_FORMAT_R8G8B8A8_UINT, + VK_FORMAT_R8G8B8A8_SINT, + VK_FORMAT_R8G8B8A8_SRGB, + VK_FORMAT_B8G8R8A8_UNORM, + VK_FORMAT_B8G8R8A8_SNORM, + VK_FORMAT_B8G8R8A8_USCALED, + VK_FORMAT_B8G8R8A8_SSCALED, + VK_FORMAT_B8G8R8A8_UINT, + VK_FORMAT_B8G8R8A8_SINT, + VK_FORMAT_B8G8R8A8_SRGB, + VK_FORMAT_A8B8G8R8_UNORM_PACK32, + VK_FORMAT_A8B8G8R8_SNORM_PACK32, + VK_FORMAT_A8B8G8R8_USCALED_PACK32, + VK_FORMAT_A8B8G8R8_SSCALED_PACK32, + VK_FORMAT_A8B8G8R8_UINT_PACK32, + VK_FORMAT_A8B8G8R8_SINT_PACK32, + VK_FORMAT_A8B8G8R8_SRGB_PACK32, + VK_FORMAT_A2R10G10B10_UNORM_PACK32, + VK_FORMAT_A2R10G10B10_SNORM_PACK32, + VK_FORMAT_A2R10G10B10_USCALED_PACK32, + VK_FORMAT_A2R10G10B10_SSCALED_PACK32, + VK_FORMAT_A2R10G10B10_UINT_PACK32, + VK_FORMAT_A2R10G10B10_SINT_PACK32, + VK_FORMAT_A2B10G10R10_UNORM_PACK32, + VK_FORMAT_A2B10G10R10_SNORM_PACK32, + VK_FORMAT_A2B10G10R10_USCALED_PACK32, + VK_FORMAT_A2B10G10R10_SSCALED_PACK32, + VK_FORMAT_A2B10G10R10_UINT_PACK32, + VK_FORMAT_A2B10G10R10_SINT_PACK32, + VK_FORMAT_R16_UNORM, + VK_FORMAT_R16_SNORM, + VK_FORMAT_R16_USCALED, + VK_FORMAT_R16_SSCALED, + VK_FORMAT_R16_UINT, + VK_FORMAT_R16_SINT, + VK_FORMAT_R16_SFLOAT, + VK_FORMAT_R16G16_UNORM, + VK_FORMAT_R16G16_SNORM, + VK_FORMAT_R16G16_USCALED, + VK_FORMAT_R16G16_SSCALED, + VK_FORMAT_R16G16_UINT, + VK_FORMAT_R16G16_SINT, + VK_FORMAT_R16G16_SFLOAT, + VK_FORMAT_R16G16B16_UNORM, + VK_FORMAT_R16G16B16_SNORM, + VK_FORMAT_R16G16B16_USCALED, + VK_FORMAT_R16G16B16_SSCALED, + VK_FORMAT_R16G16B16_UINT, + VK_FORMAT_R16G16B16_SINT, + VK_FORMAT_R16G16B16_SFLOAT, + VK_FORMAT_R16G16B16A16_UNORM, + VK_FORMAT_R16G16B16A16_SNORM, + VK_FORMAT_R16G16B16A16_USCALED, + VK_FORMAT_R16G16B16A16_SSCALED, + VK_FORMAT_R16G16B16A16_UINT, + VK_FORMAT_R16G16B16A16_SINT, + VK_FORMAT_R16G16B16A16_SFLOAT, + VK_FORMAT_R32_UINT, + VK_FORMAT_R32_SINT, + VK_FORMAT_R32_SFLOAT, + VK_FORMAT_R32G32_UINT, + VK_FORMAT_R32G32_SINT, + VK_FORMAT_R32G32_SFLOAT, + VK_FORMAT_R32G32B32_UINT, + VK_FORMAT_R32G32B32_SINT, + VK_FORMAT_R32G32B32_SFLOAT, + VK_FORMAT_R32G32B32A32_UINT, + VK_FORMAT_R32G32B32A32_SINT, + VK_FORMAT_R32G32B32A32_SFLOAT, + VK_FORMAT_R64_UINT, + VK_FORMAT_R64_SINT, + VK_FORMAT_R64_SFLOAT, + VK_FORMAT_R64G64_UINT, + VK_FORMAT_R64G64_SINT, + VK_FORMAT_R64G64_SFLOAT, + VK_FORMAT_R64G64B64_UINT, + VK_FORMAT_R64G64B64_SINT, + VK_FORMAT_R64G64B64_SFLOAT, + VK_FORMAT_R64G64B64A64_UINT, + VK_FORMAT_R64G64B64A64_SINT, + VK_FORMAT_R64G64B64A64_SFLOAT, + VK_FORMAT_B10G11R11_UFLOAT_PACK32, + VK_FORMAT_E5B9G9R9_UFLOAT_PACK32, + VK_FORMAT_D16_UNORM, + VK_FORMAT_X8_D24_UNORM_PACK32, + VK_FORMAT_D32_SFLOAT, + VK_FORMAT_S8_UINT, + VK_FORMAT_D16_UNORM_S8_UINT, + VK_FORMAT_D24_UNORM_S8_UINT, + VK_FORMAT_D32_SFLOAT_S8_UINT, + VK_FORMAT_BC1_RGB_UNORM_BLOCK, + VK_FORMAT_BC1_RGB_SRGB_BLOCK, + VK_FORMAT_BC1_RGBA_UNORM_BLOCK, + VK_FORMAT_BC1_RGBA_SRGB_BLOCK, + VK_FORMAT_BC2_UNORM_BLOCK, + VK_FORMAT_BC2_SRGB_BLOCK, + VK_FORMAT_BC3_UNORM_BLOCK, + VK_FORMAT_BC3_SRGB_BLOCK, + VK_FORMAT_BC4_UNORM_BLOCK, + VK_FORMAT_BC4_SNORM_BLOCK, + VK_FORMAT_BC5_UNORM_BLOCK, + VK_FORMAT_BC5_SNORM_BLOCK, + VK_FORMAT_BC6H_UFLOAT_BLOCK, + VK_FORMAT_BC6H_SFLOAT_BLOCK, + VK_FORMAT_BC7_UNORM_BLOCK, + VK_FORMAT_BC7_SRGB_BLOCK, + VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK, + VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK, + VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK, + VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK, + VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK, + VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK, + VK_FORMAT_EAC_R11_UNORM_BLOCK, + VK_FORMAT_EAC_R11_SNORM_BLOCK, + VK_FORMAT_EAC_R11G11_UNORM_BLOCK, + VK_FORMAT_EAC_R11G11_SNORM_BLOCK, + VK_FORMAT_ASTC_4x4_UNORM_BLOCK, + VK_FORMAT_ASTC_4x4_SRGB_BLOCK, + VK_FORMAT_ASTC_5x4_UNORM_BLOCK, + VK_FORMAT_ASTC_5x4_SRGB_BLOCK, + VK_FORMAT_ASTC_5x5_UNORM_BLOCK, + VK_FORMAT_ASTC_5x5_SRGB_BLOCK, + VK_FORMAT_ASTC_6x5_UNORM_BLOCK, + VK_FORMAT_ASTC_6x5_SRGB_BLOCK, + VK_FORMAT_ASTC_6x6_UNORM_BLOCK, + VK_FORMAT_ASTC_6x6_SRGB_BLOCK, + VK_FORMAT_ASTC_8x5_UNORM_BLOCK, + VK_FORMAT_ASTC_8x5_SRGB_BLOCK, + VK_FORMAT_ASTC_8x6_UNORM_BLOCK, + VK_FORMAT_ASTC_8x6_SRGB_BLOCK, + VK_FORMAT_ASTC_8x8_UNORM_BLOCK, + VK_FORMAT_ASTC_8x8_SRGB_BLOCK, + VK_FORMAT_ASTC_10x5_UNORM_BLOCK, + VK_FORMAT_ASTC_10x5_SRGB_BLOCK, + VK_FORMAT_ASTC_10x6_UNORM_BLOCK, + VK_FORMAT_ASTC_10x6_SRGB_BLOCK, + VK_FORMAT_ASTC_10x8_UNORM_BLOCK, + VK_FORMAT_ASTC_10x8_SRGB_BLOCK, + VK_FORMAT_ASTC_10x10_UNORM_BLOCK, + VK_FORMAT_ASTC_10x10_SRGB_BLOCK, + VK_FORMAT_ASTC_12x10_UNORM_BLOCK, + VK_FORMAT_ASTC_12x10_SRGB_BLOCK, + VK_FORMAT_ASTC_12x12_UNORM_BLOCK, + VK_FORMAT_ASTC_12x12_SRGB_BLOCK, + VK_FORMAT_G8B8G8R8_422_UNORM, + VK_FORMAT_B8G8R8G8_422_UNORM, + VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM, + VK_FORMAT_G8_B8R8_2PLANE_420_UNORM, + VK_FORMAT_G8_B8_R8_3PLANE_422_UNORM, + VK_FORMAT_G8_B8R8_2PLANE_422_UNORM, + VK_FORMAT_G8_B8_R8_3PLANE_444_UNORM, + VK_FORMAT_R10X6_UNORM_PACK16, + VK_FORMAT_R10X6G10X6_UNORM_2PACK16, + VK_FORMAT_R10X6G10X6B10X6A10X6_UNORM_4PACK16, + VK_FORMAT_G10X6B10X6G10X6R10X6_422_UNORM_4PACK16, + VK_FORMAT_B10X6G10X6R10X6G10X6_422_UNORM_4PACK16, + VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_420_UNORM_3PACK16, + VK_FORMAT_G10X6_B10X6R10X6_2PLANE_420_UNORM_3PACK16, + VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_422_UNORM_3PACK16, + VK_FORMAT_G10X6_B10X6R10X6_2PLANE_422_UNORM_3PACK16, + VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_444_UNORM_3PACK16, + VK_FORMAT_R12X4_UNORM_PACK16, + VK_FORMAT_R12X4G12X4_UNORM_2PACK16, + VK_FORMAT_R12X4G12X4B12X4A12X4_UNORM_4PACK16, + VK_FORMAT_G12X4B12X4G12X4R12X4_422_UNORM_4PACK16, + VK_FORMAT_B12X4G12X4R12X4G12X4_422_UNORM_4PACK16, + VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_420_UNORM_3PACK16, + VK_FORMAT_G12X4_B12X4R12X4_2PLANE_420_UNORM_3PACK16, + VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_422_UNORM_3PACK16, + VK_FORMAT_G12X4_B12X4R12X4_2PLANE_422_UNORM_3PACK16, + VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_444_UNORM_3PACK16, + VK_FORMAT_G16B16G16R16_422_UNORM, + VK_FORMAT_B16G16R16G16_422_UNORM, + VK_FORMAT_G16_B16_R16_3PLANE_420_UNORM, + VK_FORMAT_G16_B16R16_2PLANE_420_UNORM, + VK_FORMAT_G16_B16_R16_3PLANE_422_UNORM, + VK_FORMAT_G16_B16R16_2PLANE_422_UNORM, + VK_FORMAT_G16_B16_R16_3PLANE_444_UNORM + }; +} // namespace using namespace Nova; -static constexpr VkShaderStageFlagBits VK_SHADER_STAGE_MAP[] = { - VK_SHADER_STAGE_VERTEX_BIT, - VK_SHADER_STAGE_FRAGMENT_BIT, - VK_SHADER_STAGE_GEOMETRY_BIT, - VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, - VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, - VK_SHADER_STAGE_COMPUTE_BIT, - VK_SHADER_STAGE_MESH_BIT_EXT, - VK_SHADER_STAGE_TASK_BIT_EXT -}; - -static constexpr VkPrimitiveTopology VK_PRIMITIVE_TOPOLOGY_MAP[] = { - VK_PRIMITIVE_TOPOLOGY_POINT_LIST, - VK_PRIMITIVE_TOPOLOGY_LINE_LIST, - VK_PRIMITIVE_TOPOLOGY_LINE_STRIP, - VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST, - VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP -}; - -// clang-format off - -static constexpr VkCullModeFlags VK_CULL_MODE_MAP[] = { - VK_CULL_MODE_NONE, - VK_CULL_MODE_FRONT_BIT, - VK_CULL_MODE_BACK_BIT -}; - -static constexpr VkFrontFace VK_FRONT_FACE_MAP[] = { - VK_FRONT_FACE_COUNTER_CLOCKWISE, - VK_FRONT_FACE_CLOCKWISE -}; - -static constexpr VkVertexInputRate VK_VERTEX_INPUT_RATE_MAP[] = { - VK_VERTEX_INPUT_RATE_VERTEX, - VK_VERTEX_INPUT_RATE_INSTANCE -}; - -static constexpr VkQueueFlagBits VK_QUEUE_FLAGS_MAP[] = { - static_cast(0), - VK_QUEUE_GRAPHICS_BIT, - VK_QUEUE_COMPUTE_BIT, - VK_QUEUE_TRANSFER_BIT -}; - -// clang-format on - -static constexpr VkFormat VK_FORMAT_MAP[] = { - VK_FORMAT_UNDEFINED, - VK_FORMAT_R4G4_UNORM_PACK8, - VK_FORMAT_R4G4B4A4_UNORM_PACK16, - VK_FORMAT_B4G4R4A4_UNORM_PACK16, - VK_FORMAT_R5G6B5_UNORM_PACK16, - VK_FORMAT_B5G6R5_UNORM_PACK16, - VK_FORMAT_R5G5B5A1_UNORM_PACK16, - VK_FORMAT_B5G5R5A1_UNORM_PACK16, - VK_FORMAT_A1R5G5B5_UNORM_PACK16, - VK_FORMAT_R8_UNORM, - VK_FORMAT_R8_SNORM, - VK_FORMAT_R8_USCALED, - VK_FORMAT_R8_SSCALED, - VK_FORMAT_R8_UINT, - VK_FORMAT_R8_SINT, - VK_FORMAT_R8_SRGB, - VK_FORMAT_R8G8_UNORM, - VK_FORMAT_R8G8_SNORM, - VK_FORMAT_R8G8_USCALED, - VK_FORMAT_R8G8_SSCALED, - VK_FORMAT_R8G8_UINT, - VK_FORMAT_R8G8_SINT, - VK_FORMAT_R8G8_SRGB, - VK_FORMAT_R8G8B8_UNORM, - VK_FORMAT_R8G8B8_SNORM, - VK_FORMAT_R8G8B8_USCALED, - VK_FORMAT_R8G8B8_SSCALED, - VK_FORMAT_R8G8B8_UINT, - VK_FORMAT_R8G8B8_SINT, - VK_FORMAT_R8G8B8_SRGB, - VK_FORMAT_B8G8R8_UNORM, - VK_FORMAT_B8G8R8_SNORM, - VK_FORMAT_B8G8R8_USCALED, - VK_FORMAT_B8G8R8_SSCALED, - VK_FORMAT_B8G8R8_UINT, - VK_FORMAT_B8G8R8_SINT, - VK_FORMAT_B8G8R8_SRGB, - VK_FORMAT_R8G8B8A8_UNORM, - VK_FORMAT_R8G8B8A8_SNORM, - VK_FORMAT_R8G8B8A8_USCALED, - VK_FORMAT_R8G8B8A8_SSCALED, - VK_FORMAT_R8G8B8A8_UINT, - VK_FORMAT_R8G8B8A8_SINT, - VK_FORMAT_R8G8B8A8_SRGB, - VK_FORMAT_B8G8R8A8_UNORM, - VK_FORMAT_B8G8R8A8_SNORM, - VK_FORMAT_B8G8R8A8_USCALED, - VK_FORMAT_B8G8R8A8_SSCALED, - VK_FORMAT_B8G8R8A8_UINT, - VK_FORMAT_B8G8R8A8_SINT, - VK_FORMAT_B8G8R8A8_SRGB, - VK_FORMAT_A8B8G8R8_UNORM_PACK32, - VK_FORMAT_A8B8G8R8_SNORM_PACK32, - VK_FORMAT_A8B8G8R8_USCALED_PACK32, - VK_FORMAT_A8B8G8R8_SSCALED_PACK32, - VK_FORMAT_A8B8G8R8_UINT_PACK32, - VK_FORMAT_A8B8G8R8_SINT_PACK32, - VK_FORMAT_A8B8G8R8_SRGB_PACK32, - VK_FORMAT_A2R10G10B10_UNORM_PACK32, - VK_FORMAT_A2R10G10B10_SNORM_PACK32, - VK_FORMAT_A2R10G10B10_USCALED_PACK32, - VK_FORMAT_A2R10G10B10_SSCALED_PACK32, - VK_FORMAT_A2R10G10B10_UINT_PACK32, - VK_FORMAT_A2R10G10B10_SINT_PACK32, - VK_FORMAT_A2B10G10R10_UNORM_PACK32, - VK_FORMAT_A2B10G10R10_SNORM_PACK32, - VK_FORMAT_A2B10G10R10_USCALED_PACK32, - VK_FORMAT_A2B10G10R10_SSCALED_PACK32, - VK_FORMAT_A2B10G10R10_UINT_PACK32, - VK_FORMAT_A2B10G10R10_SINT_PACK32, - VK_FORMAT_R16_UNORM, - VK_FORMAT_R16_SNORM, - VK_FORMAT_R16_USCALED, - VK_FORMAT_R16_SSCALED, - VK_FORMAT_R16_UINT, - VK_FORMAT_R16_SINT, - VK_FORMAT_R16_SFLOAT, - VK_FORMAT_R16G16_UNORM, - VK_FORMAT_R16G16_SNORM, - VK_FORMAT_R16G16_USCALED, - VK_FORMAT_R16G16_SSCALED, - VK_FORMAT_R16G16_UINT, - VK_FORMAT_R16G16_SINT, - VK_FORMAT_R16G16_SFLOAT, - VK_FORMAT_R16G16B16_UNORM, - VK_FORMAT_R16G16B16_SNORM, - VK_FORMAT_R16G16B16_USCALED, - VK_FORMAT_R16G16B16_SSCALED, - VK_FORMAT_R16G16B16_UINT, - VK_FORMAT_R16G16B16_SINT, - VK_FORMAT_R16G16B16_SFLOAT, - VK_FORMAT_R16G16B16A16_UNORM, - VK_FORMAT_R16G16B16A16_SNORM, - VK_FORMAT_R16G16B16A16_USCALED, - VK_FORMAT_R16G16B16A16_SSCALED, - VK_FORMAT_R16G16B16A16_UINT, - VK_FORMAT_R16G16B16A16_SINT, - VK_FORMAT_R16G16B16A16_SFLOAT, - VK_FORMAT_R32_UINT, - VK_FORMAT_R32_SINT, - VK_FORMAT_R32_SFLOAT, - VK_FORMAT_R32G32_UINT, - VK_FORMAT_R32G32_SINT, - VK_FORMAT_R32G32_SFLOAT, - VK_FORMAT_R32G32B32_UINT, - VK_FORMAT_R32G32B32_SINT, - VK_FORMAT_R32G32B32_SFLOAT, - VK_FORMAT_R32G32B32A32_UINT, - VK_FORMAT_R32G32B32A32_SINT, - VK_FORMAT_R32G32B32A32_SFLOAT, - VK_FORMAT_R64_UINT, - VK_FORMAT_R64_SINT, - VK_FORMAT_R64_SFLOAT, - VK_FORMAT_R64G64_UINT, - VK_FORMAT_R64G64_SINT, - VK_FORMAT_R64G64_SFLOAT, - VK_FORMAT_R64G64B64_UINT, - VK_FORMAT_R64G64B64_SINT, - VK_FORMAT_R64G64B64_SFLOAT, - VK_FORMAT_R64G64B64A64_UINT, - VK_FORMAT_R64G64B64A64_SINT, - VK_FORMAT_R64G64B64A64_SFLOAT, - VK_FORMAT_B10G11R11_UFLOAT_PACK32, - VK_FORMAT_E5B9G9R9_UFLOAT_PACK32, - VK_FORMAT_D16_UNORM, - VK_FORMAT_X8_D24_UNORM_PACK32, - VK_FORMAT_D32_SFLOAT, - VK_FORMAT_S8_UINT, - VK_FORMAT_D16_UNORM_S8_UINT, - VK_FORMAT_D24_UNORM_S8_UINT, - VK_FORMAT_D32_SFLOAT_S8_UINT, - VK_FORMAT_BC1_RGB_UNORM_BLOCK, - VK_FORMAT_BC1_RGB_SRGB_BLOCK, - VK_FORMAT_BC1_RGBA_UNORM_BLOCK, - VK_FORMAT_BC1_RGBA_SRGB_BLOCK, - VK_FORMAT_BC2_UNORM_BLOCK, - VK_FORMAT_BC2_SRGB_BLOCK, - VK_FORMAT_BC3_UNORM_BLOCK, - VK_FORMAT_BC3_SRGB_BLOCK, - VK_FORMAT_BC4_UNORM_BLOCK, - VK_FORMAT_BC4_SNORM_BLOCK, - VK_FORMAT_BC5_UNORM_BLOCK, - VK_FORMAT_BC5_SNORM_BLOCK, - VK_FORMAT_BC6H_UFLOAT_BLOCK, - VK_FORMAT_BC6H_SFLOAT_BLOCK, - VK_FORMAT_BC7_UNORM_BLOCK, - VK_FORMAT_BC7_SRGB_BLOCK, - VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK, - VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK, - VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK, - VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK, - VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK, - VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK, - VK_FORMAT_EAC_R11_UNORM_BLOCK, - VK_FORMAT_EAC_R11_SNORM_BLOCK, - VK_FORMAT_EAC_R11G11_UNORM_BLOCK, - VK_FORMAT_EAC_R11G11_SNORM_BLOCK, - VK_FORMAT_ASTC_4x4_UNORM_BLOCK, - VK_FORMAT_ASTC_4x4_SRGB_BLOCK, - VK_FORMAT_ASTC_5x4_UNORM_BLOCK, - VK_FORMAT_ASTC_5x4_SRGB_BLOCK, - VK_FORMAT_ASTC_5x5_UNORM_BLOCK, - VK_FORMAT_ASTC_5x5_SRGB_BLOCK, - VK_FORMAT_ASTC_6x5_UNORM_BLOCK, - VK_FORMAT_ASTC_6x5_SRGB_BLOCK, - VK_FORMAT_ASTC_6x6_UNORM_BLOCK, - VK_FORMAT_ASTC_6x6_SRGB_BLOCK, - VK_FORMAT_ASTC_8x5_UNORM_BLOCK, - VK_FORMAT_ASTC_8x5_SRGB_BLOCK, - VK_FORMAT_ASTC_8x6_UNORM_BLOCK, - VK_FORMAT_ASTC_8x6_SRGB_BLOCK, - VK_FORMAT_ASTC_8x8_UNORM_BLOCK, - VK_FORMAT_ASTC_8x8_SRGB_BLOCK, - VK_FORMAT_ASTC_10x5_UNORM_BLOCK, - VK_FORMAT_ASTC_10x5_SRGB_BLOCK, - VK_FORMAT_ASTC_10x6_UNORM_BLOCK, - VK_FORMAT_ASTC_10x6_SRGB_BLOCK, - VK_FORMAT_ASTC_10x8_UNORM_BLOCK, - VK_FORMAT_ASTC_10x8_SRGB_BLOCK, - VK_FORMAT_ASTC_10x10_UNORM_BLOCK, - VK_FORMAT_ASTC_10x10_SRGB_BLOCK, - VK_FORMAT_ASTC_12x10_UNORM_BLOCK, - VK_FORMAT_ASTC_12x10_SRGB_BLOCK, - VK_FORMAT_ASTC_12x12_UNORM_BLOCK, - VK_FORMAT_ASTC_12x12_SRGB_BLOCK, - VK_FORMAT_G8B8G8R8_422_UNORM, - VK_FORMAT_B8G8R8G8_422_UNORM, - VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM, - VK_FORMAT_G8_B8R8_2PLANE_420_UNORM, - VK_FORMAT_G8_B8_R8_3PLANE_422_UNORM, - VK_FORMAT_G8_B8R8_2PLANE_422_UNORM, - VK_FORMAT_G8_B8_R8_3PLANE_444_UNORM, - VK_FORMAT_R10X6_UNORM_PACK16, - VK_FORMAT_R10X6G10X6_UNORM_2PACK16, - VK_FORMAT_R10X6G10X6B10X6A10X6_UNORM_4PACK16, - VK_FORMAT_G10X6B10X6G10X6R10X6_422_UNORM_4PACK16, - VK_FORMAT_B10X6G10X6R10X6G10X6_422_UNORM_4PACK16, - VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_420_UNORM_3PACK16, - VK_FORMAT_G10X6_B10X6R10X6_2PLANE_420_UNORM_3PACK16, - VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_422_UNORM_3PACK16, - VK_FORMAT_G10X6_B10X6R10X6_2PLANE_422_UNORM_3PACK16, - VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_444_UNORM_3PACK16, - VK_FORMAT_R12X4_UNORM_PACK16, - VK_FORMAT_R12X4G12X4_UNORM_2PACK16, - VK_FORMAT_R12X4G12X4B12X4A12X4_UNORM_4PACK16, - VK_FORMAT_G12X4B12X4G12X4R12X4_422_UNORM_4PACK16, - VK_FORMAT_B12X4G12X4R12X4G12X4_422_UNORM_4PACK16, - VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_420_UNORM_3PACK16, - VK_FORMAT_G12X4_B12X4R12X4_2PLANE_420_UNORM_3PACK16, - VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_422_UNORM_3PACK16, - VK_FORMAT_G12X4_B12X4R12X4_2PLANE_422_UNORM_3PACK16, - VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_444_UNORM_3PACK16, - VK_FORMAT_G16B16G16R16_422_UNORM, - VK_FORMAT_B16G16R16G16_422_UNORM, - VK_FORMAT_G16_B16_R16_3PLANE_420_UNORM, - VK_FORMAT_G16_B16R16_2PLANE_420_UNORM, - VK_FORMAT_G16_B16_R16_3PLANE_422_UNORM, - VK_FORMAT_G16_B16R16_2PLANE_422_UNORM, - VK_FORMAT_G16_B16_R16_3PLANE_444_UNORM -}; - VulkanRenderDriver::VulkanRenderDriver(WindowDriver* p_driver) : m_window_driver(p_driver) { NOVA_AUTO_TRACE(); _check_version(); @@ -1058,7 +1059,7 @@ void VulkanRenderDriver::_check_layers() { for (const auto& layer : available) { if (std::string_view(layer.layerName) == VALIDATION_LAYER) { NOVA_LOG("Using layer: {}", layer.layerName); - m_layers.push_back(VALIDATION_LAYER); + m_layers.push_back(VALIDATION_LAYER.data()); return; } } @@ -1104,12 +1105,13 @@ void VulkanRenderDriver::_init_hardware() { VkPhysicalDeviceProperties properties; vkGetPhysicalDeviceProperties(device, &properties); - m_devices.emplace_back(); - m_devices.back().name = properties.deviceName; - m_devices.back().vendor = static_cast(properties.vendorID); - m_devices.back().type = static_cast(properties.deviceType); - m_devices.back().deviceID = properties.deviceID; - m_devices.back().handle = device; + m_devices.emplace_back({ + .name = properties.deviceName, + .vendor = static_cast(properties.vendorID), + .type = static_cast(properties.deviceType), + .deviceID = properties.deviceID, + .handle = device, + }); NOVA_LOG("Found device: {}", properties.deviceName); } diff --git a/engine/src/drivers/vulkan/render_driver.h b/engine/src/drivers/vulkan/render_driver.h index 25f5330..655025a 100644 --- a/engine/src/drivers/vulkan/render_driver.h +++ b/engine/src/drivers/vulkan/render_driver.h @@ -9,62 +9,13 @@ #ifdef NOVA_VULKAN #include + #include #include #include namespace Nova { - struct CommandBuffer { - VkCommandBuffer handle = VK_NULL_HANDLE; - }; - - struct CommandPool { - VkCommandPool handle = VK_NULL_HANDLE; - std::vector allocated_buffers; - }; - - struct Pipeline { - PipelineType type; - VkPipeline handle = VK_NULL_HANDLE; - VkPipelineLayout layout = VK_NULL_HANDLE; - }; - - struct Queue { - VkQueue handle = VK_NULL_HANDLE; - u32 family_index; - u32 queue_index; - u32 usage_count = 0; - }; - - struct RenderPass { - VkRenderPass handle = VK_NULL_HANDLE; - }; - - struct Shader { - VkShaderModule handle = VK_NULL_HANDLE; - ShaderStage stage = ShaderStage::VERTEX; - std::string name; - }; - - struct Surface { - VkSurfaceKHR handle = VK_NULL_HANDLE; - u32 width = 0; - u32 height = 0; - bool dirty = false; // TODO: Use state enum - }; - - struct Swapchain { - VkSwapchainKHR handle = VK_NULL_HANDLE; - VkFormat format = VK_FORMAT_UNDEFINED; - VkColorSpaceKHR color_space = VK_COLOR_SPACE_SRGB_NONLINEAR_KHR; - std::vector images; - std::vector image_views; - std::vector framebuffers; - SurfaceID surface = nullptr; - RenderPassID render_pass = nullptr; - }; - class VulkanRenderDriver final : public RenderDriver { public: explicit VulkanRenderDriver(WindowDriver* window_driver); @@ -81,7 +32,7 @@ namespace Nova { void select_device(u32 index) override; u32 choose_queue_family(QueueType type, SurfaceID surface) override; - + [[nodiscard]] QueueID get_queue(u32 queue_family) override; void free_queue(QueueID queue) override; diff --git a/engine/src/drivers/vulkan/render_structs.h b/engine/src/drivers/vulkan/render_structs.h new file mode 100644 index 0000000..dc813f7 --- /dev/null +++ b/engine/src/drivers/vulkan/render_structs.h @@ -0,0 +1,70 @@ +/** + * Copyright (c) 2025, Jayden Grubb + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#pragma once + +/// NOTE: This header should only be included in implementation files + +#include +#include +#include + +#include + +#include +#include + +namespace Nova { + struct CommandBuffer { + VkCommandBuffer handle = VK_NULL_HANDLE; + }; + + struct CommandPool { + VkCommandPool handle = VK_NULL_HANDLE; + std::vector allocated_buffers; + }; + + struct Pipeline { + PipelineType type; + VkPipeline handle = VK_NULL_HANDLE; + VkPipelineLayout layout = VK_NULL_HANDLE; + }; + + struct Queue { + VkQueue handle = VK_NULL_HANDLE; + u32 family_index; + u32 queue_index; + u32 usage_count = 0; + }; + + struct RenderPass { + VkRenderPass handle = VK_NULL_HANDLE; + }; + + struct Shader { + VkShaderModule handle = VK_NULL_HANDLE; + ShaderStage stage = ShaderStage::VERTEX; + std::string name; + }; + + struct Surface { + VkSurfaceKHR handle = VK_NULL_HANDLE; + u32 width = 0; + u32 height = 0; + bool dirty = false; // TODO: Use state enum + }; + + struct Swapchain { + VkSwapchainKHR handle = VK_NULL_HANDLE; + VkFormat format = VK_FORMAT_UNDEFINED; + VkColorSpaceKHR color_space = VK_COLOR_SPACE_SRGB_NONLINEAR_KHR; + std::vector images; + std::vector image_views; + std::vector framebuffers; + SurfaceID surface = nullptr; + RenderPassID render_pass = nullptr; + }; +} // namespace Nova diff --git a/engine/src/platform/linux/x11/window_driver.cpp b/engine/src/platform/linux/x11/window_driver.cpp index d20912d..559c27a 100644 --- a/engine/src/platform/linux/x11/window_driver.cpp +++ b/engine/src/platform/linux/x11/window_driver.cpp @@ -8,8 +8,12 @@ #include "platform/linux/x11/window_driver.h" +#include "platform/linux/x11/window_structs.h" +#include "platform/linux/x11/wrapper.h" + #ifdef NOVA_VULKAN #include "drivers/vulkan/render_driver.h" +#include "drivers/vulkan/render_structs.h" #include #include diff --git a/engine/src/platform/linux/x11/window_driver.h b/engine/src/platform/linux/x11/window_driver.h index ec42cd3..65555c5 100644 --- a/engine/src/platform/linux/x11/window_driver.h +++ b/engine/src/platform/linux/x11/window_driver.h @@ -8,24 +8,13 @@ #ifdef NOVA_X11 -#include +#include "platform/linux/x11/wrapper.h" + #include #include -namespace X11 { - using Window = ::Window; - using Display = ::Display; - using Atom = ::Atom; -} // namespace X11 - namespace Nova { - struct Window { - X11::Window handle = 0; - int width = 0; - int height = 0; - }; - class X11WindowDriver final : public WindowDriver { public: X11WindowDriver(); diff --git a/engine/src/platform/linux/x11/window_structs.h b/engine/src/platform/linux/x11/window_structs.h new file mode 100644 index 0000000..1250ce0 --- /dev/null +++ b/engine/src/platform/linux/x11/window_structs.h @@ -0,0 +1,21 @@ +/** + * Copyright (c) 2025, Jayden Grubb + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#pragma once + +/// NOTE: This header should only be included in implementation files + +#include "platform/linux/x11/wrapper.h" + +#include + +namespace Nova { + struct Window { + X11::Window handle = 0; + int width = 0; + int height = 0; + }; +} // namespace Nova diff --git a/engine/src/platform/linux/x11/wrapper.h b/engine/src/platform/linux/x11/wrapper.h new file mode 100644 index 0000000..a13259e --- /dev/null +++ b/engine/src/platform/linux/x11/wrapper.h @@ -0,0 +1,15 @@ +/** + * Copyright (c) 2025, Jayden Grubb + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#pragma once + +#include + +namespace X11 { + using Window = ::Window; + using Display = ::Display; + using Atom = ::Atom; +} // namespace X11 diff --git a/engine/src/render/render_device.cpp b/engine/src/render/render_device.cpp index b061da8..4665641 100644 --- a/engine/src/render/render_device.cpp +++ b/engine/src/render/render_device.cpp @@ -32,16 +32,16 @@ u32 RenderDevice::choose_device(RenderDriver* p_driver, std::span - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#include -#include -#include - -#include - -using namespace Nova; - -static std::unique_ptr s_driver; - -void Renderer::init(const RenderAPI p_api) { - NOVA_AUTO_TRACE(); - NOVA_ASSERT(!s_driver); - - s_driver = std::unique_ptr(RenderDriver::create(p_api, nullptr)); -} - -void Renderer::shutdown() { - NOVA_AUTO_TRACE(); - s_driver.reset(); -} - -RenderDriver* Renderer::get_driver() { - NOVA_ASSERT(s_driver); - return s_driver.get(); -}