diff options
| author | ladevieq <ladevie.quentin@gmail.com> | 2025-01-21 23:22:24 +0100 |
|---|---|---|
| committer | ladevieq <ladevie.quentin@gmail.com> | 2025-01-21 23:22:24 +0100 |
| commit | 11ede6055d54480d3b7486c5811a44f6f63e1c61 (patch) | |
| tree | e7d3df776bdc94b778d8fa24927af40db99bc8ba /api-test | |
| parent | c4a6f4bbaaf86d50d5da103894469a9bc12a1323 (diff) | |
Save dx12 initial work
Diffstat (limited to 'api-test')
| -rw-r--r-- | api-test/CMakeLists.txt | 3 | ||||
| -rw-r--r-- | api-test/dx12-device.cpp | 53 | ||||
| -rw-r--r-- | api-test/main.cpp | 134 | ||||
| -rw-r--r-- | api-test/vk-device.cpp | 2 |
4 files changed, 129 insertions, 63 deletions
diff --git a/api-test/CMakeLists.txt b/api-test/CMakeLists.txt index b41c325..846b0fd 100644 --- a/api-test/CMakeLists.txt +++ b/api-test/CMakeLists.txt @@ -5,6 +5,7 @@ add_executable( command-buffer.cpp vk-bindless.cpp vk-utils.cpp + dx12-device.cpp ${CMAKE_SOURCE_DIR}/src/window.cpp ${CMAKE_SOURCE_DIR}/src/utils.cpp ${CMAKE_SOURCE_DIR}/src/vulkan-loader.cpp @@ -26,4 +27,4 @@ target_include_directories(api-test SYSTEM PUBLIC ${Vulkan_INCLUDE_DIRS}) target_include_directories(api-test SYSTEM PUBLIC ${CMAKE_SOURCE_DIR}/thirdparty) target_include_directories(api-test PUBLIC ${CMAKE_SOURCE_DIR}/include) target_include_directories(api-test PUBLIC ${CMAKE_SOURCE_DIR}/include/api-test) -target_link_libraries(api-test PRIVATE imgui::imgui) +target_link_libraries(api-test PRIVATE imgui::imgui dxgi d3d12) diff --git a/api-test/dx12-device.cpp b/api-test/dx12-device.cpp new file mode 100644 index 0000000..86340d1 --- /dev/null +++ b/api-test/dx12-device.cpp @@ -0,0 +1,53 @@ +#include "dx12-device.hpp" + +#include <cstdint> +#include <cstdio> + +dx12device dx12device::render_device = dx12device(); + +void dx12device::init() { + SUCCEEDED(CreateDXGIFactory(IID_PPV_ARGS(&factory))); + + uint32_t index = 0U; + while (factory->EnumAdapters(index, &adapter) != DXGI_ERROR_NOT_FOUND) { + DXGI_ADAPTER_DESC desc; + SUCCEEDED(adapter->GetDesc(&desc)); + printf("%S\n", desc.Description); + index++; + } + + SUCCEEDED(factory->EnumAdapters(0U, &adapter)); + + SUCCEEDED(D3D12CreateDevice(adapter, D3D_FEATURE_LEVEL_12_0, IID_PPV_ARGS(&device))); + + D3D12_COMMAND_QUEUE_DESC queue_desc{ + .Type = D3D12_COMMAND_LIST_TYPE::D3D12_COMMAND_LIST_TYPE_DIRECT, + .Priority = D3D12_COMMAND_QUEUE_PRIORITY::D3D12_COMMAND_QUEUE_PRIORITY_HIGH, + .Flags = D3D12_COMMAND_QUEUE_FLAGS::D3D12_COMMAND_QUEUE_FLAG_NONE, + .NodeMask = 0U, + }; + SUCCEEDED(device->CreateCommandQueue(&queue_desc, IID_PPV_ARGS(&queues[0U]))); + + queue_desc.Type = D3D12_COMMAND_LIST_TYPE::D3D12_COMMAND_LIST_TYPE_COMPUTE; + queue_desc.Priority = D3D12_COMMAND_QUEUE_PRIORITY::D3D12_COMMAND_QUEUE_PRIORITY_HIGH, + SUCCEEDED(device->CreateCommandQueue(&queue_desc, IID_PPV_ARGS(&queues[1U]))); + + queue_desc.Type = D3D12_COMMAND_LIST_TYPE::D3D12_COMMAND_LIST_TYPE_COPY; + queue_desc.Priority = D3D12_COMMAND_QUEUE_PRIORITY::D3D12_COMMAND_QUEUE_PRIORITY_HIGH, + SUCCEEDED(device->CreateCommandQueue(&queue_desc, IID_PPV_ARGS(&queues[2U]))); +} + +void dx12device::create_surface(const surface_desc& desc) + DXGI_MODE_DESC mode_desc{ + .Width = desc. + }; + DXGI_SAMPLE_DESC sample_desc{ + + }; + DXGI_SWAP_CHAIN_DESC swapchain_desc{ + .BufferDesc = mode_desc, + .SampleDesc = sample_desc, + .BufferUsage = DXGI_USAGE_UNORDERED_ACCESS | DXGI_USAGE_RENDER_TARGET_OUTPUT, + }; + factory->CreateSwapChain(device, ) +} diff --git a/api-test/main.cpp b/api-test/main.cpp index 0761070..9fa7ef9 100644 --- a/api-test/main.cpp +++ b/api-test/main.cpp @@ -1,6 +1,5 @@ #include <cassert> #include <cstdio> -#include <ratio> #include <array> #include <chrono> #include <vk_mem_alloc.h> @@ -12,9 +11,14 @@ #include "handle.hpp" #include "window.hpp" -#include "vk-device.hpp" #include "utils.hpp" +#ifdef VK +#include "vk-device.hpp" +#else +#include "dx12-device.hpp" +#endif + struct device_texture; #ifdef _DEBUG @@ -103,7 +107,11 @@ int main() { const auto aperture = 0.1f; const auto focus_distance = 10.f; +#ifdef VK auto& device = vkdevice::get_render_device(); +#else + auto& device = dx12device::get_render_device(); +#endif device.init(); auto main_scene = scene(camera(position, target, v_fov, aspect_ratio, aperture, focus_distance), window_width, window_height); @@ -119,6 +127,7 @@ int main() { }); auto& surface = device.get_surface(surface_handle); +#ifdef VK constexpr size_t image_size = 1024U; constexpr size_t image_count = 4U; auto staging_buffer_handle = device.create_buffer({ @@ -129,42 +138,43 @@ int main() { }); const auto& staging_buffer = device.get_buffer(staging_buffer_handle); - int width; - int height; - int channels; - uint8_t* data = stbi_load("../models/sponza/466164707995436622.jpg", &width, &height, &channels, 4); - size_t size = static_cast<size_t>(width) * height * 4U; - memcpy(staging_buffer.mapped_ptr, data, size); + // API test code + // int width; + // int height; + // int channels; + // uint8_t* data = stbi_load("../models/sponza/466164707995436622.jpg", &width, &height, &channels, 4); + // size_t size = static_cast<size_t>(width) * height * 4U; + // memcpy(staging_buffer.mapped_ptr, data, size); - auto gpu_texture_handle = device.create_texture({ - .width = static_cast<uint32_t>(width), - .height = static_cast<uint32_t>(height), - .usages = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_STORAGE_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, - .format = VK_FORMAT_R8G8B8A8_UNORM, - .type = VK_IMAGE_TYPE_2D, - }); + // auto gpu_texture_handle = device.create_texture({ + // .width = static_cast<uint32_t>(width), + // .height = static_cast<uint32_t>(height), + // .usages = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_STORAGE_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, + // .format = VK_FORMAT_R8G8B8A8_UNORM, + // .type = VK_IMAGE_TYPE_2D, + // }); - off_t offset = width * height * 4; - data = stbi_load("../models/sponza/715093869573992647.jpg", &width, &height, &channels, 4); - size = static_cast<size_t>(width) * height * 4U; - auto* addr = static_cast<void*>(static_cast<uint8_t*>(staging_buffer.mapped_ptr) + offset); - memcpy(addr, data, size); + // off_t offset = width * height * 4; + // data = stbi_load("../models/sponza/715093869573992647.jpg", &width, &height, &channels, 4); + // size = static_cast<size_t>(width) * height * 4U; + // auto* addr = static_cast<void*>(static_cast<uint8_t*>(staging_buffer.mapped_ptr) + offset); + // memcpy(addr, data, size); - auto second_texture = device.create_texture({ - .width = static_cast<uint32_t>(width), - .height = static_cast<uint32_t>(height), - .usages = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_STORAGE_BIT, - .format = VK_FORMAT_R8G8B8A8_UNORM, - .type = VK_IMAGE_TYPE_2D, - }); + // auto second_texture = device.create_texture({ + // .width = static_cast<uint32_t>(width), + // .height = static_cast<uint32_t>(height), + // .usages = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_STORAGE_BIT, + // .format = VK_FORMAT_R8G8B8A8_UNORM, + // .type = VK_IMAGE_TYPE_2D, + // }); - auto output_texture_handle = device.create_texture({ - .width = static_cast<uint32_t>(width), - .height = static_cast<uint32_t>(height), - .usages = VK_IMAGE_USAGE_STORAGE_BIT, - .format = VK_FORMAT_R8G8B8A8_UNORM, - .type = VK_IMAGE_TYPE_2D, - }); + // auto output_texture_handle = device.create_texture({ + // .width = static_cast<uint32_t>(width), + // .height = static_cast<uint32_t>(height), + // .usages = VK_IMAGE_USAGE_STORAGE_BIT, + // .format = VK_FORMAT_R8G8B8A8_UNORM, + // .type = VK_IMAGE_TYPE_2D, + // }); uint8_t *pixels = nullptr; int atlas_width; @@ -244,41 +254,42 @@ int main() { std::array<graphics_command_buffer, 4U> graphics_command_buffers; device.allocate_command_buffers(graphics_command_buffers.data(), graphics_command_buffers.size(), QueueType::GRAPHICS); - RD_START_CAPTURE; + // API test code + // RD_START_CAPTURE; - graphics_command_buffers[0].start(); + // graphics_command_buffers[0].start(); - graphics_command_buffers[0].barrier(gpu_texture_handle, VK_PIPELINE_STAGE_2_TRANSFER_BIT, VK_ACCESS_2_TRANSFER_WRITE_BIT, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL); - graphics_command_buffers[0].barrier(second_texture, VK_PIPELINE_STAGE_2_TRANSFER_BIT, VK_ACCESS_2_TRANSFER_WRITE_BIT, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL); - graphics_command_buffers[0].barrier(ui_texture_handle, VK_PIPELINE_STAGE_2_TRANSFER_BIT, VK_ACCESS_2_TRANSFER_WRITE_BIT, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL); - graphics_command_buffers[0].copy(staging_buffer_handle, gpu_texture_handle); - graphics_command_buffers[0].copy(staging_buffer_handle, second_texture, static_cast<VkDeviceSize>(offset)); - graphics_command_buffers[0].copy(staging_buffer_handle, ui_texture_handle, static_cast<VkDeviceSize>(ui_offset)); + // graphics_command_buffers[0].barrier(gpu_texture_handle, VK_PIPELINE_STAGE_2_TRANSFER_BIT, VK_ACCESS_2_TRANSFER_WRITE_BIT, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL); + // graphics_command_buffers[0].barrier(second_texture, VK_PIPELINE_STAGE_2_TRANSFER_BIT, VK_ACCESS_2_TRANSFER_WRITE_BIT, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL); + // graphics_command_buffers[0].barrier(ui_texture_handle, VK_PIPELINE_STAGE_2_TRANSFER_BIT, VK_ACCESS_2_TRANSFER_WRITE_BIT, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL); + // graphics_command_buffers[0].copy(staging_buffer_handle, gpu_texture_handle); + // graphics_command_buffers[0].copy(staging_buffer_handle, second_texture, static_cast<VkDeviceSize>(offset)); + // graphics_command_buffers[0].copy(staging_buffer_handle, ui_texture_handle, static_cast<VkDeviceSize>(ui_offset)); - graphics_command_buffers[0].barrier(gpu_texture_handle, VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT, VK_ACCESS_2_SHADER_WRITE_BIT, VK_IMAGE_LAYOUT_READ_ONLY_OPTIMAL); - graphics_command_buffers[0].barrier(second_texture, VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT, VK_ACCESS_2_SHADER_READ_BIT, VK_IMAGE_LAYOUT_READ_ONLY_OPTIMAL); + // graphics_command_buffers[0].barrier(gpu_texture_handle, VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT, VK_ACCESS_2_SHADER_WRITE_BIT, VK_IMAGE_LAYOUT_READ_ONLY_OPTIMAL); + // graphics_command_buffers[0].barrier(second_texture, VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT, VK_ACCESS_2_SHADER_READ_BIT, VK_IMAGE_LAYOUT_READ_ONLY_OPTIMAL); - { - graphics_command_buffers[0].dispatch({ - .pipeline = compute, - .group_size = { .vec = { image_size, image_size, 1U }}, - .local_group_size = { .vec = { 8U, 8U, 1U }}, - .params = { - device.get_texture(second_texture).get_storage_index(), // Input 1 - device.get_texture(gpu_texture_handle).get_storage_index(), // Input 2 - device.get_texture(output_texture_handle).get_storage_index(), // Output - }, - }); - } + // { + // graphics_command_buffers[0].dispatch({ + // .pipeline = compute, + // .group_size = { .vec = { image_size, image_size, 1U }}, + // .local_group_size = { .vec = { 8U, 8U, 1U }}, + // .params = { + // device.get_texture(second_texture).get_storage_index(), // Input 1 + // device.get_texture(gpu_texture_handle).get_storage_index(), // Input 2 + // device.get_texture(output_texture_handle).get_storage_index(), // Output + // }, + // }); + // } - graphics_command_buffers[0].barrier(gpu_texture_handle, VK_PIPELINE_STAGE_2_COLOR_ATTACHMENT_OUTPUT_BIT, VK_ACCESS_2_COLOR_ATTACHMENT_WRITE_BIT, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL); + // graphics_command_buffers[0].barrier(gpu_texture_handle, VK_PIPELINE_STAGE_2_COLOR_ATTACHMENT_OUTPUT_BIT, VK_ACCESS_2_COLOR_ATTACHMENT_WRITE_BIT, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL); - graphics_command_buffers[0].stop(); + // graphics_command_buffers[0].stop(); - device.submit(graphics_command_buffers.data(), 1); - device.wait(); + // device.submit(graphics_command_buffers.data(), 1); + // device.wait(); - RD_END_CAPTURE; + // RD_END_CAPTURE; std::array<handle<device_texture>, 1U> color_attachment {}; constexpr uint32_t virtual_frames_count = 2U; @@ -455,6 +466,7 @@ int main() { device.destroy_buffer(index_buffer_handle); ImGui::DestroyContext(); +#endif // VK return 0; } diff --git a/api-test/vk-device.cpp b/api-test/vk-device.cpp index e1d671f..029d3ac 100644 --- a/api-test/vk-device.cpp +++ b/api-test/vk-device.cpp @@ -17,7 +17,7 @@ void vkdevice::init() { VK_QUEUE_COMPUTE_BIT | VK_QUEUE_TRANSFER_BIT, }; - queues[1U] = { + queues[1U] = { .usages = VK_QUEUE_COMPUTE_BIT, }; queues[2U] = { |
