aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorladevieq <ladevie.quentin@gmail.com>2025-01-23 00:16:41 +0100
committerladevieq <ladevie.quentin@gmail.com>2025-01-23 00:16:57 +0100
commit0dd7e34602d0abec6442e4b63c22a8b2e760aad2 (patch)
tree99c4c5a4fb04517069b8d95ee92950e83bb3211f
parent11ede6055d54480d3b7486c5811a44f6f63e1c61 (diff)
Dx12 surface creation
-rw-r--r--api-test/dx12-device.cpp28
-rw-r--r--api-test/main.cpp11
-rw-r--r--include/api-test/dx12-device-types.hpp26
-rw-r--r--include/api-test/dx12-device.hpp14
-rw-r--r--include/api-test/freelist.hpp1
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>