aboutsummaryrefslogtreecommitdiffstats
path: root/api-test/vk-device.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'api-test/vk-device.cpp')
-rw-r--r--api-test/vk-device.cpp653
1 files changed, 378 insertions, 275 deletions
diff --git a/api-test/vk-device.cpp b/api-test/vk-device.cpp
index 6967e41..296d76c 100644
--- a/api-test/vk-device.cpp
+++ b/api-test/vk-device.cpp
@@ -6,26 +6,26 @@
#define VMA_IMPLEMENTATION
#include <vk_mem_alloc.h>
+#include "vk-utils.hpp"
#include "vulkan-loader.hpp"
#include "window.hpp"
-#include "vk-utils.hpp"
vkdevice* vkdevice::render_device = nullptr;
vkdevice::vkdevice(const window& window)
: queues{
- {
- .usages = VK_QUEUE_GRAPHICS_BIT |
- VK_QUEUE_COMPUTE_BIT |
- VK_QUEUE_TRANSFER_BIT,
- },
- {
- .usages = VK_QUEUE_COMPUTE_BIT,
- },
- {
- .usages = VK_QUEUE_TRANSFER_BIT,
- },
- } {
+ {
+ .usages = VK_QUEUE_GRAPHICS_BIT |
+ VK_QUEUE_COMPUTE_BIT |
+ VK_QUEUE_TRANSFER_BIT,
+ },
+ {
+ .usages = VK_QUEUE_COMPUTE_BIT,
+ },
+ {
+ .usages = VK_QUEUE_TRANSFER_BIT,
+ },
+ } {
load_vulkan();
create_instance();
@@ -96,23 +96,22 @@ vkdevice::~vkdevice() {
}
handle<device_texture> vkdevice::create_texture(const texture_desc& desc) {
- device_texture device_texture {
+ device_texture device_texture{
.desc = desc,
};
assert(desc.mips <= texture_desc::max_mips);
- VkImageCreateInfo create_info {
- .sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,
- .pNext = nullptr,
- .flags = 0U,
- .imageType = desc.type,
- .format = desc.format,
- .extent = {
- .width = desc.width,
- .height = desc.height,
- .depth = desc.depth
- },
+ VkImageCreateInfo create_info{
+ .sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,
+ .pNext = nullptr,
+ .flags = 0U,
+ .imageType = desc.type,
+ .format = desc.format,
+ .extent = {
+ .width = desc.width,
+ .height = desc.height,
+ .depth = desc.depth },
.mipLevels = desc.mips,
.arrayLayers = 1,
.samples = VK_SAMPLE_COUNT_1_BIT,
@@ -124,14 +123,14 @@ handle<device_texture> vkdevice::create_texture(const texture_desc& desc) {
.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED,
};
- VmaAllocationCreateInfo alloc_create_info {
- .flags = 0U,
- .usage = VMA_MEMORY_USAGE_GPU_ONLY,
- .requiredFlags = VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
- .preferredFlags = 0U,
- .memoryTypeBits = 0U,
- .pool = nullptr,
- .pUserData = nullptr,
+ VmaAllocationCreateInfo alloc_create_info{
+ .flags = 0U,
+ .usage = VMA_MEMORY_USAGE_GPU_ONLY,
+ .requiredFlags = VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
+ .preferredFlags = 0U,
+ .memoryTypeBits = 0U,
+ .pool = nullptr,
+ .pUserData = nullptr,
};
VKCHECK(vmaCreateImage(gpu_allocator, &create_info, &alloc_create_info, &device_texture.vk_image, &device_texture.alloc, nullptr));
@@ -139,27 +138,28 @@ handle<device_texture> vkdevice::create_texture(const texture_desc& desc) {
create_views(device_texture);
// TODO: Handle mips views
- std::vector<VkDescriptorImageInfo> images_info;
- images_info.push_back({
- .sampler = nullptr,
- .imageView = device_texture.whole_view,
- .imageLayout = VK_IMAGE_LAYOUT_GENERAL,
- });
+ VkDescriptorImageInfo images_info[]{
+ {
+ nullptr,
+ device_texture.whole_view,
+ VK_IMAGE_LAYOUT_GENERAL,
+ },
+ };
std::vector<VkWriteDescriptorSet> write_descriptor_sets;
if ((desc.usages & VK_IMAGE_USAGE_STORAGE_BIT) != 0) {
device_texture.storage_index = storage_indices.add(&device_texture);
write_descriptor_sets.push_back({
- .sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET,
- .pNext = nullptr,
- .dstSet = bindless.sets[BindlessSetType::GLOBAL],
- .dstBinding = 2U,
- .dstArrayElement = device_texture.storage_index,
- .descriptorCount = static_cast<uint32_t>(images_info.size()),
- .descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
- .pImageInfo = images_info.data(),
- .pBufferInfo = nullptr,
+ .sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET,
+ .pNext = nullptr,
+ .dstSet = bindless.sets[BindlessSetType::GLOBAL],
+ .dstBinding = 2U,
+ .dstArrayElement = device_texture.storage_index,
+ .descriptorCount = sizeof(images_info) / sizeof(VkDescriptorImageInfo),
+ .descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
+ .pImageInfo = images_info,
+ .pBufferInfo = nullptr,
.pTexelBufferView = nullptr,
});
}
@@ -167,15 +167,15 @@ handle<device_texture> vkdevice::create_texture(const texture_desc& desc) {
device_texture.sampled_index = sampled_indices.add(&device_texture);
write_descriptor_sets.push_back({
- .sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET,
- .pNext = nullptr,
- .dstSet = bindless.sets[BindlessSetType::GLOBAL],
- .dstBinding = 1U,
- .dstArrayElement = device_texture.sampled_index,
- .descriptorCount = static_cast<uint32_t>(images_info.size()),
- .descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE,
- .pImageInfo = images_info.data(),
- .pBufferInfo = nullptr,
+ .sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET,
+ .pNext = nullptr,
+ .dstSet = bindless.sets[BindlessSetType::GLOBAL],
+ .dstBinding = 1U,
+ .dstArrayElement = device_texture.sampled_index,
+ .descriptorCount = sizeof(images_info) / sizeof(VkDescriptorImageInfo),
+ .descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE,
+ .pImageInfo = images_info,
+ .pBufferInfo = nullptr,
.pTexelBufferView = nullptr,
});
}
@@ -186,11 +186,11 @@ handle<device_texture> vkdevice::create_texture(const texture_desc& desc) {
}
handle<device_buffer> vkdevice::create_buffer(const buffer_desc& desc) {
- device_buffer device_buffer {
+ device_buffer device_buffer{
.desc = desc,
};
- VkBufferCreateInfo create_info {
+ VkBufferCreateInfo create_info{
.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO,
.pNext = nullptr,
.flags = 0U,
@@ -201,11 +201,10 @@ handle<device_buffer> vkdevice::create_buffer(const buffer_desc& desc) {
.pQueueFamilyIndices = nullptr,
};
- VmaAllocatorCreateFlags alloc_create_flags =
- desc.memory_usage != VMA_MEMORY_USAGE_GPU_ONLY ?
- VMA_ALLOCATION_CREATE_MAPPED_BIT : 0U;
+ VmaAllocatorCreateFlags alloc_create_flags =
+ desc.memory_usage != VMA_MEMORY_USAGE_GPU_ONLY ? VMA_ALLOCATION_CREATE_MAPPED_BIT : 0U;
- VmaAllocationCreateInfo alloc_create_info {
+ VmaAllocationCreateInfo alloc_create_info{
.flags = alloc_create_flags,
.usage = static_cast<VmaMemoryUsage>(desc.memory_usage),
.requiredFlags = desc.memory_properties,
@@ -215,53 +214,62 @@ handle<device_buffer> vkdevice::create_buffer(const buffer_desc& desc) {
.pUserData = nullptr,
};
- VmaAllocationInfo alloc_info {};
+ VmaAllocationInfo alloc_info{};
VKCHECK(vmaCreateBuffer(gpu_allocator, &create_info, &alloc_create_info, &device_buffer.vk_buffer, &device_buffer.alloc, &alloc_info));
+ if ((desc.usages & VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT) != 0U) {
+ VkBufferDeviceAddressInfo address_info {
+ .sType = VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_INFO,
+ .pNext = nullptr,
+ .buffer = device_buffer.vk_buffer,
+ };
+ device_buffer.device_address = vkGetBufferDeviceAddress(device, &address_info);
+ }
+
device_buffer.mapped_ptr = alloc_info.pMappedData;
return { buffers.add(device_buffer) };
}
handle<device_pipeline> vkdevice::create_pipeline(const pipeline_desc& desc) {
- device_pipeline device_pipeline {
- .desc = desc,
+ device_pipeline device_pipeline{
+ .desc = desc,
.bindless = &bindless,
};
if (!desc.cs_code.empty()) {
VkShaderModule shader_module;
{
- const auto& code = desc.cs_code;
- VkShaderModuleCreateInfo create_info {
- .sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO,
- .pNext = nullptr,
- .flags = 0U,
+ const auto& code = desc.cs_code;
+ VkShaderModuleCreateInfo create_info{
+ .sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO,
+ .pNext = nullptr,
+ .flags = 0U,
.codeSize = code.size(),
- .pCode = (uint32_t*)code.data(),
+ .pCode = (uint32_t*)code.data(),
};
VKCHECK(vkCreateShaderModule(device, &create_info, nullptr, &shader_module));
}
- VkPipelineShaderStageCreateInfo stage_create_info {
- .sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
- .pNext = nullptr,
- .flags = 0U,
- .stage = VK_SHADER_STAGE_COMPUTE_BIT,
- .module = shader_module,
- .pName = "main",
+ VkPipelineShaderStageCreateInfo stage_create_info{
+ .sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
+ .pNext = nullptr,
+ .flags = 0U,
+ .stage = VK_SHADER_STAGE_COMPUTE_BIT,
+ .module = shader_module,
+ .pName = "main",
.pSpecializationInfo = nullptr,
};
- VkComputePipelineCreateInfo create_info {
- .sType = VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
- .pNext = nullptr,
- .flags = 0U,
- .stage = stage_create_info,
- .layout = bindless.layout,
+ VkComputePipelineCreateInfo create_info{
+ .sType = VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
+ .pNext = nullptr,
+ .flags = 0U,
+ .stage = stage_create_info,
+ .layout = bindless.layout,
.basePipelineHandle = nullptr,
- .basePipelineIndex = 0,
+ .basePipelineIndex = 0,
};
device_pipeline.bind_point = VK_PIPELINE_BIND_POINT_COMPUTE;
@@ -269,158 +277,157 @@ handle<device_pipeline> vkdevice::create_pipeline(const pipeline_desc& desc) {
vkDestroyShaderModule(device, shader_module, nullptr);
} else {
- VkPipelineShaderStageCreateInfo shader_stages_create_info[2U] {
+ VkPipelineShaderStageCreateInfo shader_stages_create_info[2U]{
{
- .sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
- .pNext = nullptr,
- .flags = 0U,
- .stage = VK_SHADER_STAGE_VERTEX_BIT,
- .pName = "main",
+ .sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
+ .pNext = nullptr,
+ .flags = 0U,
+ .stage = VK_SHADER_STAGE_VERTEX_BIT,
+ .pName = "main",
.pSpecializationInfo = nullptr,
},
{
- .sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
- .pNext = nullptr,
- .flags = 0U,
- .stage = VK_SHADER_STAGE_FRAGMENT_BIT,
- .pName = "main",
+ .sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
+ .pNext = nullptr,
+ .flags = 0U,
+ .stage = VK_SHADER_STAGE_FRAGMENT_BIT,
+ .pName = "main",
.pSpecializationInfo = nullptr,
},
};
{
- const auto& code = desc.vs_code;
- VkShaderModuleCreateInfo module_create_info {
- .sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO,
- .pNext = nullptr,
- .flags = 0U,
+ const auto& code = desc.vs_code;
+ VkShaderModuleCreateInfo module_create_info{
+ .sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO,
+ .pNext = nullptr,
+ .flags = 0U,
.codeSize = code.size(),
- .pCode = (uint32_t*)code.data(),
+ .pCode = (uint32_t*)code.data(),
};
VKCHECK(vkCreateShaderModule(device, &module_create_info, nullptr, &shader_stages_create_info[0U].module));
-
}
{
- const auto& code = desc.fs_code;
- VkShaderModuleCreateInfo module_create_info {
- .sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO,
- .pNext = nullptr,
- .flags = 0U,
+ const auto& code = desc.fs_code;
+ VkShaderModuleCreateInfo module_create_info{
+ .sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO,
+ .pNext = nullptr,
+ .flags = 0U,
.codeSize = code.size(),
- .pCode = (uint32_t*)code.data(),
+ .pCode = (uint32_t*)code.data(),
};
VKCHECK(vkCreateShaderModule(device, &module_create_info, nullptr, &shader_stages_create_info[1U].module));
}
- VkPipelineVertexInputStateCreateInfo vertex_input_state_create_info {
+ VkPipelineVertexInputStateCreateInfo vertex_input_state_create_info{
.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO,
};
- VkPipelineInputAssemblyStateCreateInfo input_assembly_create_info {
- .sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,
- .pNext = nullptr,
- .flags = 0U,
- .topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST,
+ VkPipelineInputAssemblyStateCreateInfo input_assembly_create_info{
+ .sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,
+ .pNext = nullptr,
+ .flags = 0U,
+ .topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST,
.primitiveRestartEnable = VK_FALSE,
};
- VkPipelineViewportStateCreateInfo viewport_state_create_info {
- .sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO,
- .pNext = nullptr,
- .flags = 0U,
+ VkPipelineViewportStateCreateInfo viewport_state_create_info{
+ .sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO,
+ .pNext = nullptr,
+ .flags = 0U,
.viewportCount = 1U,
- .pViewports = nullptr,
- .scissorCount = 1U,
- .pScissors = nullptr,
+ .pViewports = nullptr,
+ .scissorCount = 1U,
+ .pScissors = nullptr,
};
- VkPipelineRasterizationStateCreateInfo rasterization_state_create_info {
- .sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO,
- .pNext = nullptr,
- .flags = 0U,
- .depthClampEnable = VK_FALSE,
+ VkPipelineRasterizationStateCreateInfo rasterization_state_create_info{
+ .sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO,
+ .pNext = nullptr,
+ .flags = 0U,
+ .depthClampEnable = VK_FALSE,
.rasterizerDiscardEnable = VK_FALSE,
- .polygonMode = VK_POLYGON_MODE_FILL,
- .cullMode = VK_CULL_MODE_NONE,
- .frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE,
- .depthBiasEnable = VK_FALSE,
- .lineWidth = 1.f,
+ .polygonMode = VK_POLYGON_MODE_FILL,
+ .cullMode = VK_CULL_MODE_NONE,
+ .frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE,
+ .depthBiasEnable = VK_FALSE,
+ .lineWidth = 1.f,
};
- VkPipelineMultisampleStateCreateInfo multisample_state_create_info {
- .sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO,
- .pNext = nullptr,
- .flags = 0,
+ VkPipelineMultisampleStateCreateInfo multisample_state_create_info{
+ .sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO,
+ .pNext = nullptr,
+ .flags = 0,
.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT,
- .sampleShadingEnable = VK_FALSE,
- .minSampleShading = 1.f,
+ .sampleShadingEnable = VK_FALSE,
+ .minSampleShading = 1.f,
};
- VkPipelineColorBlendAttachmentState color_attachment_state {
- .blendEnable = VK_TRUE,
+ VkPipelineColorBlendAttachmentState color_attachment_state{
+ .blendEnable = VK_TRUE,
.srcColorBlendFactor = VK_BLEND_FACTOR_SRC_ALPHA,
.dstColorBlendFactor = VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA,
- .colorBlendOp = VK_BLEND_OP_ADD,
+ .colorBlendOp = VK_BLEND_OP_ADD,
.srcAlphaBlendFactor = VK_BLEND_FACTOR_ONE,
.dstAlphaBlendFactor = VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA,
- .alphaBlendOp = VK_BLEND_OP_ADD,
- .colorWriteMask = VK_COLOR_COMPONENT_R_BIT | VK_COLOR_COMPONENT_G_BIT | VK_COLOR_COMPONENT_B_BIT | VK_COLOR_COMPONENT_A_BIT,
+ .alphaBlendOp = VK_BLEND_OP_ADD,
+ .colorWriteMask = VK_COLOR_COMPONENT_R_BIT | VK_COLOR_COMPONENT_G_BIT | VK_COLOR_COMPONENT_B_BIT | VK_COLOR_COMPONENT_A_BIT,
};
- VkPipelineColorBlendStateCreateInfo color_blend_state_create_info {
- .sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO,
- .pNext = nullptr,
- .flags = 0,
- .logicOpEnable = VK_FALSE,
+ VkPipelineColorBlendStateCreateInfo color_blend_state_create_info{
+ .sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO,
+ .pNext = nullptr,
+ .flags = 0,
+ .logicOpEnable = VK_FALSE,
.attachmentCount = 1,
- .pAttachments = &color_attachment_state,
+ .pAttachments = &color_attachment_state,
};
- VkDynamicState dynamic_states[] {
+ VkDynamicState dynamic_states[]{
VK_DYNAMIC_STATE_VIEWPORT,
VK_DYNAMIC_STATE_SCISSOR,
};
- VkPipelineDynamicStateCreateInfo dynamic_state_create_info {
- .sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO,
- .pNext = nullptr,
- .flags = 0U,
+ VkPipelineDynamicStateCreateInfo dynamic_state_create_info{
+ .sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO,
+ .pNext = nullptr,
+ .flags = 0U,
.dynamicStateCount = sizeof(dynamic_states) / sizeof(VkDynamicState),
- .pDynamicStates = dynamic_states,
+ .pDynamicStates = dynamic_states,
};
- VkPipelineRenderingCreateInfo pipeline_rendering_create_info {
- .sType = VK_STRUCTURE_TYPE_PIPELINE_RENDERING_CREATE_INFO,
- .pNext = nullptr,
- .viewMask = 0U,
- .colorAttachmentCount = static_cast<uint32_t>(desc.color_attachments_format.size()),
+ VkPipelineRenderingCreateInfo pipeline_rendering_create_info{
+ .sType = VK_STRUCTURE_TYPE_PIPELINE_RENDERING_CREATE_INFO,
+ .pNext = nullptr,
+ .viewMask = 0U,
+ .colorAttachmentCount = static_cast<uint32_t>(desc.color_attachments_format.size()),
.pColorAttachmentFormats = desc.color_attachments_format.data(),
- .depthAttachmentFormat = VK_FORMAT_UNDEFINED,
+ .depthAttachmentFormat = VK_FORMAT_UNDEFINED,
.stencilAttachmentFormat = VK_FORMAT_UNDEFINED,
};
- VkGraphicsPipelineCreateInfo create_info {
- .sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO,
- .pNext = &pipeline_rendering_create_info,
- .flags = 0U,
- .stageCount = sizeof(shader_stages_create_info) / sizeof(VkPipelineShaderStageCreateInfo),
- .pStages = shader_stages_create_info,
- .pVertexInputState = &vertex_input_state_create_info,
+ VkGraphicsPipelineCreateInfo create_info{
+ .sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO,
+ .pNext = &pipeline_rendering_create_info,
+ .flags = 0U,
+ .stageCount = sizeof(shader_stages_create_info) / sizeof(VkPipelineShaderStageCreateInfo),
+ .pStages = shader_stages_create_info,
+ .pVertexInputState = &vertex_input_state_create_info,
.pInputAssemblyState = &input_assembly_create_info,
- .pTessellationState = nullptr,
- .pViewportState = &viewport_state_create_info,
+ .pTessellationState = nullptr,
+ .pViewportState = &viewport_state_create_info,
.pRasterizationState = &rasterization_state_create_info,
- .pMultisampleState = &multisample_state_create_info,
- .pDepthStencilState = nullptr,
- .pColorBlendState = &color_blend_state_create_info,
- .pDynamicState = &dynamic_state_create_info,
- .layout = bindless.layout,
- .renderPass = nullptr,
- .subpass = 0U,
- .basePipelineHandle = nullptr,
- .basePipelineIndex = 0,
+ .pMultisampleState = &multisample_state_create_info,
+ .pDepthStencilState = nullptr,
+ .pColorBlendState = &color_blend_state_create_info,
+ .pDynamicState = &dynamic_state_create_info,
+ .layout = bindless.layout,
+ .renderPass = nullptr,
+ .subpass = 0U,
+ .basePipelineHandle = nullptr,
+ .basePipelineIndex = 0,
};
device_pipeline.bind_point = VK_PIPELINE_BIND_POINT_GRAPHICS;
@@ -430,6 +437,28 @@ handle<device_pipeline> vkdevice::create_pipeline(const pipeline_desc& desc) {
return { pipelines.add(device_pipeline) };
}
+vksemaphore vkdevice::create_semaphore() {
+ vksemaphore semaphore{
+ .value = 0,
+ };
+ VkSemaphoreTypeCreateInfo semaphore_type_create_info{
+ .sType = VK_STRUCTURE_TYPE_SEMAPHORE_TYPE_CREATE_INFO,
+ .pNext = nullptr,
+ .semaphoreType = VK_SEMAPHORE_TYPE_TIMELINE,
+ .initialValue = 0U,
+ };
+
+ VkSemaphoreCreateInfo create_info{
+ .sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO,
+ .pNext = &semaphore_type_create_info,
+ .flags = 0U,
+ };
+
+ VKCHECK(vkCreateSemaphore(device, &create_info, nullptr, &semaphore.vk_semaphore));
+
+ return semaphore;
+}
+
void vkdevice::destroy_texture(const device_texture& texture) {
destroy_texture({ .id = textures.find(texture) });
}
@@ -467,17 +496,31 @@ void vkdevice::destroy_pipeline(handle<device_pipeline> handle) {
vkDestroyPipeline(device, pipeline.vk_pipeline, nullptr);
}
-void vkdevice::submit(command_buffer* buffers, size_t count) {
- assert((max_submitable_command_buffers - count) >= 0);
+void vkdevice::wait(vksemaphore& semaphore) {
+ VkSemaphoreWaitInfo wait_info {
+ .sType = VK_STRUCTURE_TYPE_SEMAPHORE_WAIT_INFO,
+ .pNext = nullptr,
+ .flags = 0U,
+ .semaphoreCount = 1U,
+ .pSemaphores = &semaphore.vk_semaphore,
+ .pValues = &semaphore.value,
+ };
+ VKCHECK(vkWaitSemaphores(device, &wait_info, -1));
+}
+
+void vkdevice::submit(std::span<command_buffer> buffers, vksemaphore* wait, vksemaphore* signal) {
+#define USE_SUBMIT2
+ assert((max_submitable_command_buffers - buffers.size()) >= 0);
const auto queue_type = buffers[0].queue_type;
+#ifndef USE_SUBMIT2
VkCommandBuffer to_submit[max_submitable_command_buffers];
- for (auto index { 0U }; index < count; index++) {
+ for (auto index{ 0U }; index < count; index++) {
assert(queue_type == buffers[index].queue_type);
to_submit[index] = buffers[index].vk_command_buffer;
}
- VkSubmitInfo submit_info {
+ VkSubmitInfo submit_info{
.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO,
.pNext = nullptr,
.waitSemaphoreCount = 0U,
@@ -490,25 +533,85 @@ void vkdevice::submit(command_buffer* buffers, size_t count) {
};
VKCHECK(vkQueueSubmit(queues[static_cast<uint32_t>(queue_type)].vk_queue, 1, &submit_info, nullptr));
+#else
+ VkCommandBufferSubmitInfo command_buffers_info[buffers.size()];
+
+ for (auto index{ 0U }; index < buffers.size(); index++) {
+ assert(queue_type == buffers[index].queue_type);
+
+ auto& command_buffer_info = command_buffers_info[index];
+ command_buffer_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_SUBMIT_INFO;
+ command_buffer_info.pNext = nullptr;
+ command_buffer_info.commandBuffer = buffers[index].vk_command_buffer;
+ command_buffer_info.deviceMask = 0U;
+ }
+
+ VkSemaphoreSubmitInfo wait_semaphore_info{
+ .sType = VK_STRUCTURE_TYPE_SEMAPHORE_SUBMIT_INFO,
+ .pNext = nullptr,
+ .stageMask = VK_PIPELINE_STAGE_2_BOTTOM_OF_PIPE_BIT,
+ .deviceIndex = 0U,
+ };
+
+ VkSemaphoreSubmitInfo signal_semaphore_info{
+ .sType = VK_STRUCTURE_TYPE_SEMAPHORE_SUBMIT_INFO,
+ .pNext = nullptr,
+ .stageMask = VK_PIPELINE_STAGE_2_NONE,
+ .deviceIndex = 0U,
+ };
+
+ VkSubmitInfo2 submit_info{
+ .sType = VK_STRUCTURE_TYPE_SUBMIT_INFO_2,
+ .pNext = nullptr,
+ .flags = 0U,
+ .commandBufferInfoCount = static_cast<uint32_t>(buffers.size()),
+ .pCommandBufferInfos = command_buffers_info,
+ };
+
+ if (wait != nullptr) {
+ wait_semaphore_info.semaphore = wait->vk_semaphore;
+ wait_semaphore_info.value = wait->value;
+ submit_info.waitSemaphoreInfoCount = 1U;
+ submit_info.pWaitSemaphoreInfos = &wait_semaphore_info;
+ }
+
+ if (signal != nullptr) {
+ signal_semaphore_info.semaphore = signal->vk_semaphore;
+ signal_semaphore_info.value = ++signal->value;
+
+ submit_info.signalSemaphoreInfoCount = 1U;
+ submit_info.pSignalSemaphoreInfos = &signal_semaphore_info;
+ }
+
+ VKCHECK(vkQueueSubmit2(queues[static_cast<uint32_t>(queue_type)].vk_queue, 1, &submit_info, nullptr));
+#endif
}
-void vkdevice::present() {
- VkPresentInfoKHR present_info {
+void vkdevice::present(vksurface& surface, const vksemaphore& semaphore) {
+ VkResult result;
+ VkPresentInfoKHR present_info{
.sType = VK_STRUCTURE_TYPE_PRESENT_INFO_KHR,
.pNext = nullptr,
+ .waitSemaphoreCount = 1U,
+ .pWaitSemaphores = &semaphore.vk_semaphore,
+ .swapchainCount = 1U,
+ .pSwapchains = &surface.vk_swapchain,
+ .pImageIndices = &surface.image_index,
+ .pResults = &result,
};
- // VKCHECK(vkQueuePresentKHR(queues[static_cast<uint32_t>(QueueType::GRAPHICS)].vk_queue, &present_info));
-}
+ VKCHECK(vkQueuePresentKHR(queues[static_cast<uint32_t>(QueueType::GRAPHICS)].vk_queue, &present_info));
+ VKCHECK(result);
+}
// private
void vkdevice::allocate_command_buffers(command_buffer* buffers, size_t count, QueueType type) {
assert((max_allocable_command_buffers - count) >= 0);
- const auto& queue = queues[static_cast<uint32_t>(type)];
- VkCommandBuffer command_buffers[max_allocable_command_buffers];
+ const auto& queue = queues[static_cast<uint32_t>(type)];
+ VkCommandBuffer command_buffers[max_allocable_command_buffers];
- VkCommandBufferAllocateInfo allocate_info {
+ VkCommandBufferAllocateInfo allocate_info{
.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO,
.pNext = nullptr,
.commandPool = queue.command_pool,
@@ -518,28 +621,28 @@ void vkdevice::allocate_command_buffers(command_buffer* buffers, size_t count, Q
VKCHECK(vkAllocateCommandBuffers(device, &allocate_info, command_buffers));
- for (auto index { 0U }; index < count; index++) {
+ for (auto index{ 0U }; index < count; index++) {
buffers[index].vk_command_buffer = command_buffers[index];
- buffers[index].queue_type = type;
+ buffers[index].queue_type = type;
}
}
void vkdevice::create_views(device_texture& texture) {
- VkImageAspectFlags aspect_mask = ((texture.desc.usages & VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT) != 0U)
- ? VK_IMAGE_ASPECT_DEPTH_BIT
- : VK_IMAGE_ASPECT_COLOR_BIT;
- VkImageViewCreateInfo create_info {
- .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
- .pNext = nullptr,
- .flags = 0U,
- .image = texture.vk_image,
- .viewType = VK_IMAGE_VIEW_TYPE_2D,
- .format = texture.desc.format,
- .components = {
- .r = VK_COMPONENT_SWIZZLE_R,
- .g = VK_COMPONENT_SWIZZLE_G,
- .b = VK_COMPONENT_SWIZZLE_B,
- .a = VK_COMPONENT_SWIZZLE_A,
+ VkImageAspectFlags aspect_mask = ((texture.desc.usages & VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT) != 0U)
+ ? VK_IMAGE_ASPECT_DEPTH_BIT
+ : VK_IMAGE_ASPECT_COLOR_BIT;
+ VkImageViewCreateInfo create_info{
+ .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
+ .pNext = nullptr,
+ .flags = 0U,
+ .image = texture.vk_image,
+ .viewType = VK_IMAGE_VIEW_TYPE_2D,
+ .format = texture.desc.format,
+ .components = {
+ .r = VK_COMPONENT_SWIZZLE_R,
+ .g = VK_COMPONENT_SWIZZLE_G,
+ .b = VK_COMPONENT_SWIZZLE_B,
+ .a = VK_COMPONENT_SWIZZLE_A,
},
.subresourceRange = {
.aspectMask = aspect_mask,
@@ -562,12 +665,12 @@ void vkdevice::create_views(device_texture& texture) {
// Presentation stuff
void vkdevice::create_surface(const window& window) {
- VkWin32SurfaceCreateInfoKHR create_info {
- .sType = VK_STRUCTURE_TYPE_WIN32_SURFACE_CREATE_INFO_KHR,
- .pNext = nullptr,
- .flags = 0U,
- .hinstance = GetModuleHandle(nullptr),
- .hwnd = window.handle,
+ VkWin32SurfaceCreateInfoKHR create_info{
+ .sType = VK_STRUCTURE_TYPE_WIN32_SURFACE_CREATE_INFO_KHR,
+ .pNext = nullptr,
+ .flags = 0U,
+ .hinstance = GetModuleHandle(nullptr),
+ .hwnd = window.handle,
};
VKCHECK(vkCreateWin32SurfaceKHR(instance, &create_info, nullptr, &surface));
@@ -575,7 +678,7 @@ void vkdevice::create_surface(const window& window) {
void vkdevice::create_swapchain() {
VkBool32 supported = VK_FALSE;
- auto& queue = queues[static_cast<uint32_t>(QueueType::GRAPHICS)];
+ auto& queue = queues[static_cast<uint32_t>(QueueType::GRAPHICS)];
VKCHECK(vkGetPhysicalDeviceSurfaceSupportKHR(physical_device, queue.index, surface, &supported));
assert(supported);
@@ -611,43 +714,43 @@ void vkdevice::create_swapchain() {
VKCHECK(vkGetPhysicalDeviceSurfacePresentModesKHR(physical_device, surface, &supported_present_modes_count, supported_present_modes.data()));
- auto min_image_count = (surface_capabilities.minImageCount <= virtual_frames_count) ? virtual_frames_count : surface_capabilities.minImageCount;
+ auto min_image_count = (surface_capabilities.minImageCount <= virtual_frames_count) ? virtual_frames_count : surface_capabilities.minImageCount;
- VkSwapchainCreateInfoKHR create_info = {
- .sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR,
- .pNext = nullptr,
- .flags = 0U,
- .surface = surface,
- .minImageCount = min_image_count,
- .imageFormat = supported_formats[0].format,
- .imageColorSpace = supported_formats[0].colorSpace,
- .imageExtent = extent,
- .imageArrayLayers = 1U,
- .imageUsage = VK_IMAGE_USAGE_TRANSFER_DST_BIT,
- .imageSharingMode = VK_SHARING_MODE_EXCLUSIVE,
- .queueFamilyIndexCount = 0U,
- .pQueueFamilyIndices = nullptr,
- .preTransform = VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR,
- .compositeAlpha = VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR,
- .presentMode = supported_present_modes[0],
- .clipped = VK_TRUE,
- .oldSwapchain = nullptr,
+ VkSwapchainCreateInfoKHR create_info = {
+ .sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR,
+ .pNext = nullptr,
+ .flags = 0U,
+ .surface = surface,
+ .minImageCount = min_image_count,
+ .imageFormat = supported_formats[0].format,
+ .imageColorSpace = supported_formats[0].colorSpace,
+ .imageExtent = extent,
+ .imageArrayLayers = 1U,
+ .imageUsage = VK_IMAGE_USAGE_TRANSFER_DST_BIT,
+ .imageSharingMode = VK_SHARING_MODE_EXCLUSIVE,
+ .queueFamilyIndexCount = 0U,
+ .pQueueFamilyIndices = nullptr,
+ .preTransform = VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR,
+ .compositeAlpha = VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR,
+ .presentMode = supported_present_modes[0],
+ .clipped = VK_TRUE,
+ .oldSwapchain = nullptr,
};
VKCHECK(vkCreateSwapchainKHR(device, &create_info, nullptr, &swapchain));
}
void vkdevice::create_virtual_frames() {
- for (auto index { 0U }; index < virtual_frames_count; index++) {
+ for (auto index{ 0U }; index < virtual_frames_count; index++) {
{
- VkSemaphoreTypeCreateInfo semaphore_type_create_info {
- .sType = VK_STRUCTURE_TYPE_SEMAPHORE_TYPE_CREATE_INFO,
- .pNext = nullptr,
- .semaphoreType = VK_SEMAPHORE_TYPE_TIMELINE,
- .initialValue = 0U,
+ VkSemaphoreTypeCreateInfo semaphore_type_create_info{
+ .sType = VK_STRUCTURE_TYPE_SEMAPHORE_TYPE_CREATE_INFO,
+ .pNext = nullptr,
+ .semaphoreType = VK_SEMAPHORE_TYPE_TIMELINE,
+ .initialValue = 0U,
};
- VkSemaphoreCreateInfo create_info {
+ VkSemaphoreCreateInfo create_info{
.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO,
.pNext = &semaphore_type_create_info,
.flags = 0U,
@@ -661,7 +764,7 @@ void vkdevice::create_virtual_frames() {
// ----------------- vkadapter -----------------
void vkdevice::create_instance() {
- VkApplicationInfo app_info {
+ VkApplicationInfo app_info{
.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO,
.pApplicationName = "path-tracer",
.applicationVersion = VK_MAKE_VERSION(1, 0, 0),
@@ -670,17 +773,17 @@ void vkdevice::create_instance() {
.apiVersion = VK_API_VERSION_1_3,
};
- constexpr const char* instance_layers[] {
+ constexpr const char* instance_layers[]{
"VK_LAYER_KHRONOS_validation",
};
- constexpr const char* instance_extensions[] {
+ constexpr const char* instance_extensions[]{
VK_EXT_DEBUG_UTILS_EXTENSION_NAME,
"VK_KHR_surface",
"VK_KHR_win32_surface"
};
- VkInstanceCreateInfo create_info {
+ VkInstanceCreateInfo create_info{
.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO,
.pNext = nullptr,
.flags = 0U,
@@ -703,28 +806,28 @@ void vkdevice::create_device() {
VkDeviceQueueCreateInfo queue_create_infos[static_cast<uint32_t>(QueueType::MAX)];
for (auto& queue_create_info : queue_create_infos) {
- queue_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
- queue_create_info.pNext = nullptr;
- queue_create_info.flags = 0U;
- queue_create_info.queueCount = 1;
- queue_create_info.pQueuePriorities = &queue_priority;
+ queue_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
+ queue_create_info.pNext = nullptr;
+ queue_create_info.flags = 0U;
+ queue_create_info.queueCount = 1;
+ queue_create_info.pQueuePriorities = &queue_priority;
}
auto queue_properties_count = 0U;
vkGetPhysicalDeviceQueueFamilyProperties(physical_device, &queue_properties_count, nullptr);
- std::vector<VkQueueFamilyProperties> queue_properties { queue_properties_count };
+ std::vector<VkQueueFamilyProperties> queue_properties{ queue_properties_count };
vkGetPhysicalDeviceQueueFamilyProperties(physical_device, &queue_properties_count, queue_properties.data());
for (auto index{ 0U }; index < static_cast<uint32_t>(QueueType::MAX); index++) {
- auto& queue = queues[index];
+ auto& queue = queues[index];
- for (auto properties_index { 0U }; properties_index < queue_properties_count; properties_index++) {
+ for (auto properties_index{ 0U }; properties_index < queue_properties_count; properties_index++) {
auto& queue_property = queue_properties[properties_index];
if ((queue_property.queueFlags & queue.usages) == queue.usages) {
queue_create_infos[index].queueFamilyIndex = queue.index = properties_index;
- queue_property.queueFlags = 0U;
+ queue_property.queueFlags = 0U;
}
}
}
@@ -734,7 +837,7 @@ void vkdevice::create_device() {
// VK_EXT_DESCRIPTOR_BUFFER_EXTENSION_NAME
};
- VkPhysicalDeviceVulkan12Features physical_device_12_features {
+ VkPhysicalDeviceVulkan12Features physical_device_12_features{
.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES,
.pNext = nullptr,
.shaderSampledImageArrayNonUniformIndexing = VK_TRUE,
@@ -746,14 +849,14 @@ void vkdevice::create_device() {
.bufferDeviceAddress = VK_TRUE,
};
- VkPhysicalDeviceVulkan13Features physical_device_13_features {
+ VkPhysicalDeviceVulkan13Features physical_device_13_features{
.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_FEATURES,
.pNext = &physical_device_12_features,
.synchronization2 = VK_TRUE,
.dynamicRendering = VK_TRUE,
};
- VkDeviceCreateInfo create_info {
+ VkDeviceCreateInfo create_info{
.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO,
.pNext = &physical_device_13_features,
.flags = 0U,
@@ -778,22 +881,22 @@ void vkdevice::create_device() {
}
void vkdevice::create_memory_allocator() {
- VmaAllocatorCreateInfo create_info {
- .flags = VMA_ALLOCATOR_CREATE_BUFFER_DEVICE_ADDRESS_BIT,
- .physicalDevice = physical_device,
- .device = device,
- .instance = instance,
- .vulkanApiVersion = VK_API_VERSION_1_2,
+ VmaAllocatorCreateInfo create_info{
+ .flags = VMA_ALLOCATOR_CREATE_BUFFER_DEVICE_ADDRESS_BIT,
+ .physicalDevice = physical_device,
+ .device = device,
+ .instance = instance,
+ .vulkanApiVersion = VK_API_VERSION_1_2,
};
VKCHECK(vmaCreateAllocator(&create_info, &gpu_allocator));
}
void vkdevice::create_command_pools() {
- VkCommandPoolCreateInfo create_info {
+ VkCommandPoolCreateInfo create_info{
.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO,
.pNext = nullptr,
- .flags = 0U,
+ .flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT,
};
for (auto& queue : queues) {
@@ -809,7 +912,7 @@ void vkdevice::pick_physical_device() {
assert(physical_devices_count > 0);
- std::vector<VkPhysicalDevice> physical_devices { physical_devices_count };
+ std::vector<VkPhysicalDevice> physical_devices{ physical_devices_count };
vkEnumeratePhysicalDevices(instance, &physical_devices_count, physical_devices.data());
for (auto& physical_dev : physical_devices) {
@@ -825,11 +928,11 @@ void vkdevice::pick_physical_device() {
bool vkdevice::device_support_features(VkPhysicalDevice physical_dev) {
// Vulkan 1.2 physical device features support
{
- VkPhysicalDeviceVulkan12Features vulkan_12_features {
+ VkPhysicalDeviceVulkan12Features vulkan_12_features{
.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES,
};
- VkPhysicalDeviceFeatures2 physical_device_features {
+ VkPhysicalDeviceFeatures2 physical_device_features{
.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2,
.pNext = &vulkan_12_features,
};
@@ -851,11 +954,11 @@ bool vkdevice::device_support_features(VkPhysicalDevice physical_dev) {
// Vulkan 1.3 physical device features support
{
- VkPhysicalDeviceVulkan13Features vulkan_13_features {
+ VkPhysicalDeviceVulkan13Features vulkan_13_features{
.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_FEATURES,
};
- VkPhysicalDeviceFeatures2 physical_device_features {
+ VkPhysicalDeviceFeatures2 physical_device_features{
.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2,
.pNext = &vulkan_13_features,
};
@@ -872,15 +975,15 @@ bool vkdevice::device_support_features(VkPhysicalDevice physical_dev) {
}
void vkdevice::create_debug_layer_callback() {
- VkDebugUtilsMessengerCreateInfoEXT create_info {
+ VkDebugUtilsMessengerCreateInfoEXT create_info{
.sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT,
.pNext = nullptr,
.flags = 0U,
.messageSeverity = VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT |
VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT,
- .messageType = VK_DEBUG_UTILS_MESSAGE_TYPE_GENERAL_BIT_EXT |
- VK_DEBUG_UTILS_MESSAGE_TYPE_PERFORMANCE_BIT_EXT |
- VK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT,
+ .messageType = VK_DEBUG_UTILS_MESSAGE_TYPE_GENERAL_BIT_EXT |
+ VK_DEBUG_UTILS_MESSAGE_TYPE_PERFORMANCE_BIT_EXT |
+ VK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT,
.pfnUserCallback = debug_callback,
.pUserData = nullptr,
};