diff options
| author | ladevieq <ladevie.quentin@gmail.com> | 2025-01-18 23:48:11 +0100 |
|---|---|---|
| committer | ladevieq <ladevie.quentin@gmail.com> | 2025-01-18 23:48:11 +0100 |
| commit | c4a6f4bbaaf86d50d5da103894469a9bc12a1323 (patch) | |
| tree | e8823d49b1e17f09b4193e53cf3bd311968bf9d0 /api-test/vk-bindless.cpp | |
| parent | 7c4abd18f453011c7ad45929f7d0df76d3b3a25a (diff) | |
Working api prototype
Diffstat (limited to 'api-test/vk-bindless.cpp')
| -rw-r--r-- | api-test/vk-bindless.cpp | 201 |
1 files changed, 140 insertions, 61 deletions
diff --git a/api-test/vk-bindless.cpp b/api-test/vk-bindless.cpp index 66fd59c..d3d6415 100644 --- a/api-test/vk-bindless.cpp +++ b/api-test/vk-bindless.cpp @@ -1,12 +1,18 @@ #include "vk-bindless.hpp" #include <vk_mem_alloc.h> +#include <vulkan/vulkan_core.h> #include "vk-device.hpp" #include "vk-utils.hpp" #include "vulkan-loader.hpp" -const device_buffer& bindless_model::get_uniform_buffer() const { +device_buffer& bindless_model::get_globals_uniform_buffer() const { + auto& render_device = vkdevice::get_render_device(); + return render_device.get_buffer(globals_uniform_buffer_handle); +} + +device_buffer& bindless_model::get_draws_uniform_buffer() const { auto& render_device = vkdevice::get_render_device(); return render_device.get_buffer(draws_uniform_buffer_handle); } @@ -21,67 +27,96 @@ bindless_model bindless_model::create_bindless_model() { bindless.create_descriptor_pool(device); bindless.allocate_sets(device); - VkWriteDescriptorSet writes_descriptor_set[2U]; + // VkWriteDescriptorSet writes_descriptor_set[BindlessSetType::MAX]; - { - bindless.instances_uniform_buffer_handle = render_device.create_buffer({ - .size = instances_uniform_buffer_size, + // { + bindless.globals_uniform_buffer_handle = render_device.create_buffer({ + .size = globals_uniform_buffer_size, .usages = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, .memory_properties = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT, .memory_usage = VMA_MEMORY_USAGE_CPU_TO_GPU, }); - const auto& buffer = render_device.get_buffer(bindless.instances_uniform_buffer_handle); - VkDescriptorBufferInfo buffer_info { - .buffer = buffer.vk_buffer, - .offset = 0U, - .range = VK_WHOLE_SIZE, - }; + // const auto& buffer = render_device.get_buffer(bindless.globals_uniform_buffer_handle); + // VkDescriptorBufferInfo buffer_info { + // .buffer = buffer.vk_buffer, + // .offset = 0U, + // .range = VK_WHOLE_SIZE, + // }; - writes_descriptor_set[0U] = { - .sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET, - .pNext = nullptr, - .dstSet = bindless.sets[BindlessSetType::INSTANCES_UNIFORMS], - .dstBinding = 0U, - .dstArrayElement = 0U, - .descriptorCount = 1U, - .descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, - .pImageInfo = nullptr, - .pBufferInfo = &buffer_info, - .pTexelBufferView = nullptr, - }; - } + // writes_descriptor_set[BindlessSetType::GLOBAL] = { + // .sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET, + // .pNext = nullptr, + // .dstSet = bindless.sets[BindlessSetType::GLOBAL], + // .dstBinding = 3U, + // .dstArrayElement = 0U, + // .descriptorCount = 1U, + // .descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, + // .pImageInfo = nullptr, + // .pBufferInfo = &buffer_info, + // .pTexelBufferView = nullptr, + // }; + // } - { + // { + // bindless.instances_uniform_buffer_handle = render_device.create_buffer({ + // .size = instances_uniform_buffer_size, + // .usages = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, + // .memory_properties = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT, + // .memory_usage = VMA_MEMORY_USAGE_CPU_TO_GPU, + // }); + + // const auto& buffer = render_device.get_buffer(bindless.instances_uniform_buffer_handle); + // VkDescriptorBufferInfo buffer_info { + // .buffer = buffer.vk_buffer, + // .offset = 0U, + // .range = VK_WHOLE_SIZE, + // }; + + // writes_descriptor_set[BindlessSetType::INSTANCES_UNIFORMS] = { + // .sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET, + // .pNext = nullptr, + // .dstSet = bindless.sets[BindlessSetType::INSTANCES_UNIFORMS], + // .dstBinding = 0U, + // .dstArrayElement = 0U, + // .descriptorCount = 1U, + // .descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, + // .pImageInfo = nullptr, + // .pBufferInfo = &buffer_info, + // .pTexelBufferView = nullptr, + // }; + // } + + // { bindless.draws_uniform_buffer_handle = render_device.create_buffer({ .size = draws_uniform_buffer_size, - .usages = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, + .usages = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT | VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT, .memory_properties = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT, .memory_usage = VMA_MEMORY_USAGE_CPU_TO_GPU, }); - const auto& buffer = render_device.get_buffer(bindless.draws_uniform_buffer_handle); - VkDescriptorBufferInfo buffer_info { - .buffer = buffer.vk_buffer, - .offset = 0U, - .range = VK_WHOLE_SIZE, - }; + // const auto& buffer = render_device.get_buffer(bindless.draws_uniform_buffer_handle); + // VkDescriptorBufferInfo buffer_info { + // .buffer = buffer.vk_buffer, + // .offset = 0U, + // .range = draws_uniform_buffer_size, + // }; - writes_descriptor_set[1U] = { - .sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET, - .pNext = nullptr, - .dstSet = bindless.sets[BindlessSetType::DRAWS_UNIFORMS], - .dstBinding = 0U, - .dstArrayElement = 0U, - .descriptorCount = 1U, - .descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, - .pImageInfo = nullptr, - .pBufferInfo = &buffer_info, - .pTexelBufferView = nullptr, - }; - } + // writes_descriptor_set[BindlessSetType::DRAWS_UNIFORMS] = { + // .sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET, + // .pNext = nullptr, + // .dstSet = bindless.sets[BindlessSetType::DRAWS_UNIFORMS], + // .dstBinding = 0U, + // .dstArrayElement = 0U, + // .descriptorCount = 1U, + // .descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, + // .pImageInfo = nullptr, + // .pBufferInfo = &buffer_info, + // .pTexelBufferView = nullptr, + // }; + // } - vkUpdateDescriptorSets(device, sizeof(writes_descriptor_set) / sizeof(VkWriteDescriptorSet), writes_descriptor_set, 0U, nullptr); + // vkUpdateDescriptorSets(device, sizeof(writes_descriptor_set) / sizeof(VkWriteDescriptorSet), writes_descriptor_set, 0U, nullptr); #else VkBufferCreateInfo create_info{ .sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO, @@ -126,11 +161,12 @@ void bindless_model::destroy_bindless_model(bindless_model& bindless) { vkDestroyDescriptorSetLayout(device, bindless.sets_layout[index], nullptr); } - vkDestroyPipelineLayout(device, bindless.layout, nullptr); + vkDestroyPipelineLayout(device, bindless.graphics_layout, nullptr); + vkDestroyPipelineLayout(device, bindless.compute_layout, nullptr); bindless.destroy_immutable_samplers(device); - render_device.destroy_buffer(bindless.instances_uniform_buffer_handle); + // render_device.destroy_buffer(bindless.instances_uniform_buffer_handle); render_device.destroy_buffer(bindless.draws_uniform_buffer_handle); } @@ -139,6 +175,7 @@ void bindless_model::create_layout(VkDevice device) { // Binding 0 Storage images // Binding 1 Sampled images // Binding 2 Samplers + // Binding 3 Dynamic Uniform Buffer { VkDescriptorSetLayoutBinding set_layout_bindings[]{ { @@ -162,12 +199,21 @@ void bindless_model::create_layout(VkDevice device) { .stageFlags = VK_SHADER_STAGE_COMPUTE_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, .pImmutableSamplers = nullptr, }, + // { + // .binding = 3U, + // .descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, + // .descriptorCount = 1U, + // .stageFlags = VK_SHADER_STAGE_COMPUTE_BIT | VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, + // .pImmutableSamplers = nullptr, + // }, }; VkDescriptorBindingFlags flags[]{ VK_DESCRIPTOR_BINDING_PARTIALLY_BOUND_BIT | VK_DESCRIPTOR_BINDING_UPDATE_UNUSED_WHILE_PENDING_BIT, VK_DESCRIPTOR_BINDING_PARTIALLY_BOUND_BIT | VK_DESCRIPTOR_BINDING_UPDATE_UNUSED_WHILE_PENDING_BIT, VK_DESCRIPTOR_BINDING_PARTIALLY_BOUND_BIT | VK_DESCRIPTOR_BINDING_UPDATE_UNUSED_WHILE_PENDING_BIT, + // VK_DESCRIPTOR_BINDING_PARTIALLY_BOUND_BIT | VK_DESCRIPTOR_BINDING_UPDATE_UNUSED_WHILE_PENDING_BIT, + // 0U, }; VkDescriptorSetLayoutBindingFlagsCreateInfo layout_binding_flags{ @@ -195,7 +241,7 @@ void bindless_model::create_layout(VkDevice device) { { .binding = 0U, .descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, - .descriptorCount = 1, + .descriptorCount = 1U, .stageFlags = VK_SHADER_STAGE_COMPUTE_BIT | VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, .pImmutableSamplers = nullptr, }, @@ -236,17 +282,50 @@ void bindless_model::create_layout(VkDevice device) { VKCHECK(vkCreateDescriptorSetLayout(device, &create_info, nullptr, &sets_layout[BindlessSetType::DRAWS_UNIFORMS])); } - VkPipelineLayoutCreateInfo create_info{ - .sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, - .pNext = nullptr, - .flags = 0U, - .setLayoutCount = sizeof(sets_layout) / sizeof(VkDescriptorSetLayout), - .pSetLayouts = sets_layout, - .pushConstantRangeCount = 0U, - .pPushConstantRanges = nullptr, - }; + { + VkPushConstantRange push_constants[] { + { + .stageFlags = VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, + .offset = 0U, + .size = max_push_constants_slots_size * (max_push_constants_slots), + }, + }; + + VkPipelineLayoutCreateInfo create_info{ + .sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, + .pNext = nullptr, + .flags = 0U, + .setLayoutCount = sizeof(sets_layout) / sizeof(VkDescriptorSetLayout), + .pSetLayouts = sets_layout, + .pushConstantRangeCount = sizeof(push_constants) / sizeof(push_constants[0]), + .pPushConstantRanges = push_constants, + }; - VKCHECK(vkCreatePipelineLayout(device, &create_info, nullptr, &layout)); + VKCHECK(vkCreatePipelineLayout(device, &create_info, nullptr, &graphics_layout)); + } + + { + VkPushConstantRange push_constants[] { + { + .stageFlags = VK_SHADER_STAGE_COMPUTE_BIT, + .offset = 0U, + .size = max_push_constants_slots_size * max_push_constants_slots, + }, + }; + + + VkPipelineLayoutCreateInfo create_info{ + .sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, + .pNext = nullptr, + .flags = 0U, + .setLayoutCount = sizeof(sets_layout) / sizeof(VkDescriptorSetLayout), + .pSetLayouts = sets_layout, + .pushConstantRangeCount = sizeof(push_constants) / sizeof(push_constants[0]), + .pPushConstantRanges = push_constants, + }; + + VKCHECK(vkCreatePipelineLayout(device, &create_info, nullptr, &compute_layout)); + } } #ifndef USE_VK_DESCRIPTOR_BUFFER @@ -266,7 +345,7 @@ void bindless_model::create_descriptor_pool(VkDevice device) { }, { .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, - .descriptorCount = set_descriptors_count, + .descriptorCount = 8U, }, }; @@ -307,7 +386,7 @@ void bindless_model::create_immutable_samplers(VkDevice device) { .mipLodBias = 0.f, .anisotropyEnable = VK_FALSE, .compareEnable = VK_FALSE, - .compareOp = VK_COMPARE_OP_ALWAYS, + .compareOp = VK_COMPARE_OP_NEVER, .minLod = 0.f, .maxLod = 0.f, .borderColor = VK_BORDER_COLOR_FLOAT_TRANSPARENT_BLACK, |
