diff options
| author | ladevieq <ladevie.quentin@gmail.com> | 2025-01-23 00:16:41 +0100 |
|---|---|---|
| committer | ladevieq <ladevie.quentin@gmail.com> | 2025-01-23 00:16:57 +0100 |
| commit | 0dd7e34602d0abec6442e4b63c22a8b2e760aad2 (patch) | |
| tree | 99c4c5a4fb04517069b8d95ee92950e83bb3211f | |
| parent | 11ede6055d54480d3b7486c5811a44f6f63e1c61 (diff) | |
Dx12 surface creation
| -rw-r--r-- | api-test/dx12-device.cpp | 28 | ||||
| -rw-r--r-- | api-test/main.cpp | 11 | ||||
| -rw-r--r-- | include/api-test/dx12-device-types.hpp | 26 | ||||
| -rw-r--r-- | include/api-test/dx12-device.hpp | 14 | ||||
| -rw-r--r-- | include/api-test/freelist.hpp | 1 |
5 files changed, 70 insertions, 10 deletions
diff --git a/api-test/dx12-device.cpp b/api-test/dx12-device.cpp index 86340d1..4de63b6 100644 --- a/api-test/dx12-device.cpp +++ b/api-test/dx12-device.cpp @@ -37,17 +37,35 @@ void dx12device::init() { SUCCEEDED(device->CreateCommandQueue(&queue_desc, IID_PPV_ARGS(&queues[2U]))); } -void dx12device::create_surface(const surface_desc& desc) +handle<dx12::device_surface> dx12device::create_surface(const dx12::surface_desc& desc) { + dx12::device_surface surface { + }; DXGI_MODE_DESC mode_desc{ - .Width = desc. + .Width = 0U, + .Height = 0U, + .RefreshRate = { + .Numerator = 1U, + .Denominator = 60U, + }, + .Format = desc.surface_format, + .ScanlineOrdering = DXGI_MODE_SCANLINE_ORDER_UNSPECIFIED, + .Scaling = DXGI_MODE_SCALING_CENTERED, }; DXGI_SAMPLE_DESC sample_desc{ - + .Count = 1U, + .Quality = 0U, }; DXGI_SWAP_CHAIN_DESC swapchain_desc{ .BufferDesc = mode_desc, .SampleDesc = sample_desc, - .BufferUsage = DXGI_USAGE_UNORDERED_ACCESS | DXGI_USAGE_RENDER_TARGET_OUTPUT, + .BufferUsage = desc.usages, + .BufferCount = desc.image_count, + .OutputWindow = desc.window_handle, + .Windowed = TRUE, + .SwapEffect = desc.present_mode, + .Flags = 0U, }; - factory->CreateSwapChain(device, ) + HRESULT hr = factory->CreateSwapChain(device, &swapchain_desc, &surface.swapchain); + + return surfaces.add(surface); } diff --git a/api-test/main.cpp b/api-test/main.cpp index 9fa7ef9..f61fa13 100644 --- a/api-test/main.cpp +++ b/api-test/main.cpp @@ -114,8 +114,9 @@ int main() { #endif device.init(); - auto main_scene = scene(camera(position, target, v_fov, aspect_ratio, aperture, focus_distance), window_width, window_height); + // auto main_scene = scene(camera(position, target, v_fov, aspect_ratio, aperture, focus_distance), window_width, window_height); +#ifdef VK auto surface_handle = device.create_surface({ .window_handle = wnd.handle, .surface_format = { @@ -125,6 +126,14 @@ int main() { .present_mode = VK_PRESENT_MODE_IMMEDIATE_KHR, .usages = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_STORAGE_BIT, }); +#else + auto surface_handle = device.create_surface({ + .window_handle = wnd.handle, + .surface_format = DXGI_FORMAT_R8G8B8A8_UNORM_SRGB, + .present_mode = DXGI_SWAP_EFFECT_FLIP_DISCARD, + .usages = DXGI_USAGE_UNORDERED_ACCESS | DXGI_USAGE_RENDER_TARGET_OUTPUT, + }); +#endif auto& surface = device.get_surface(surface_handle); #ifdef VK diff --git a/include/api-test/dx12-device-types.hpp b/include/api-test/dx12-device-types.hpp new file mode 100644 index 0000000..dee1811 --- /dev/null +++ b/include/api-test/dx12-device-types.hpp @@ -0,0 +1,26 @@ +#include <cstdint> +#include <dxgi.h> + +namespace dx12 { + struct texture_desc { + }; + + struct device_texture { + }; + + struct surface_desc { + HWND window_handle; + DXGI_FORMAT surface_format; + DXGI_SWAP_EFFECT present_mode; + // VkImageUsageFlags usages; + DXGI_USAGE usages; + uint32_t image_count = surface_desc::default_image_count; + + static constexpr uint32_t max_image_count = 3U; + static constexpr uint32_t default_image_count = 3U; + }; + + struct device_surface { + IDXGISwapChain* swapchain; + }; +} diff --git a/include/api-test/dx12-device.hpp b/include/api-test/dx12-device.hpp index 8d8d1c3..5f48f95 100644 --- a/include/api-test/dx12-device.hpp +++ b/include/api-test/dx12-device.hpp @@ -1,5 +1,7 @@ #include <d3d12.h> -#include <dxgi.h> + +#include "freelist.hpp" +#include "dx12-device-types.hpp" class dx12device { public: @@ -9,7 +11,7 @@ class dx12device { return render_device; } - void create_surface(const surface_desc& desc); + handle<dx12::device_surface> create_surface(const dx12::surface_desc& desc); void create_buffer() {}; @@ -25,12 +27,18 @@ class dx12device { void get_texture() {}; + [[nodiscard]] inline dx12::device_surface& get_surface(handle<dx12::device_surface> handle) { + return surfaces[handle]; + } + private: IDXGIFactory* factory; IDXGIAdapter* adapter; ID3D12Device* device; - ID3D12CommandQueue queues[3U]; + ID3D12CommandQueue* queues[3U]; + + freelist<dx12::device_surface> surfaces; static dx12device render_device; }; diff --git a/include/api-test/freelist.hpp b/include/api-test/freelist.hpp index ffefdff..3d0324d 100644 --- a/include/api-test/freelist.hpp +++ b/include/api-test/freelist.hpp @@ -1,5 +1,4 @@ #pragma once -#include <numeric> #include <vector> #include <cassert> |
