use dynamic rendering instead of render passes
This commit is contained in:
parent
c9aca769b2
commit
2f8929d5fb
147
vulkan/vulkan.d
147
vulkan/vulkan.d
@ -831,22 +831,41 @@ BeginRendering()
|
|||||||
{ color: { float32: g_vk.depth_clear } },
|
{ color: { float32: g_vk.depth_clear } },
|
||||||
];
|
];
|
||||||
|
|
||||||
VkRenderPassBeginInfo pass_info = {
|
VkRenderingAttachmentInfo[2] attach_descriptions = [
|
||||||
sType: VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,
|
{
|
||||||
renderPass: g_vk.render_pass,
|
sType: VK_STRUCTURE_TYPE_RENDERING_ATTACHMENT_INFO,
|
||||||
framebuffer: g_vk.framebuffer,
|
imageView: g_vk.draw_image.image.view,
|
||||||
renderArea: {
|
imageLayout: VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
|
||||||
offset: { x: 0, y: 0 },
|
loadOp: VK_ATTACHMENT_LOAD_OP_CLEAR,
|
||||||
extent: {
|
storeOp: VK_ATTACHMENT_STORE_OP_STORE,
|
||||||
width: g_vk.swapchain_extent.width,
|
clearValue: { color: { float32: g_vk.color_clear } },
|
||||||
height: g_vk.swapchain_extent.height,
|
},
|
||||||
},
|
{
|
||||||
},
|
sType: VK_STRUCTURE_TYPE_RENDERING_ATTACHMENT_INFO,
|
||||||
clearValueCount: cast(u32)clear_color.length,
|
imageView: g_vk.depth_image.image.view,
|
||||||
pClearValues: clear_color.ptr,
|
imageLayout: VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
|
||||||
};
|
loadOp: VK_ATTACHMENT_LOAD_OP_CLEAR,
|
||||||
|
storeOp: VK_ATTACHMENT_STORE_OP_STORE,
|
||||||
|
clearValue: { color: { float32: g_vk.depth_clear } },
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
vkCmdBeginRenderPass(g_vk.cmd, &pass_info, VK_SUBPASS_CONTENTS_INLINE);
|
VkRenderingInfo render_info = {
|
||||||
|
sType: VK_STRUCTURE_TYPE_RENDERING_INFO,
|
||||||
|
layerCount: 1,
|
||||||
|
colorAttachmentCount: 1,
|
||||||
|
pColorAttachments: &attach_descriptions[0],
|
||||||
|
pDepthAttachment: &attach_descriptions[1],
|
||||||
|
renderArea: {
|
||||||
|
offset: { x: 0, y: 0 },
|
||||||
|
extent: {
|
||||||
|
width: g_vk.swapchain_extent.width,
|
||||||
|
height: g_vk.swapchain_extent.height,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
vkCmdBeginRendering(g_vk.cmd, &render_info);
|
||||||
}
|
}
|
||||||
|
|
||||||
u32[2]
|
u32[2]
|
||||||
@ -883,7 +902,7 @@ CopyToPresentImage(Descriptor* descriptor, UVec2 extent)
|
|||||||
void
|
void
|
||||||
FinishRendering()
|
FinishRendering()
|
||||||
{
|
{
|
||||||
vkCmdEndRenderPass(g_vk.cmd);
|
vkCmdEndRendering(g_vk.cmd);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@ -2901,9 +2920,9 @@ Init(VulkanBuildInfo build_info, u64 permanent_mem, u64 frame_mem)
|
|||||||
version(Windows)
|
version(Windows)
|
||||||
{
|
{
|
||||||
VkWin32SurfaceCreateInfoKHR surface_info = {
|
VkWin32SurfaceCreateInfoKHR surface_info = {
|
||||||
sType: VK_STRUCTURE_TYPE_WIN32_SURFACE_CREATE_INFO_KHR,
|
sType: VK_STRUCTURE_TYPE_WIN32_SURFACE_CREATE_INFO_KHR,
|
||||||
hinstance: g_vk.platform_handles.instance,
|
hinstance: g_vk.platform_handles.instance,
|
||||||
hwnd: g_vk.platform_handles.handle,
|
hwnd: g_vk.platform_handles.handle,
|
||||||
};
|
};
|
||||||
|
|
||||||
VkResult result = vkCreateWin32SurfaceKHR(g_vk.instance, &surface_info, null, &g_vk.surface);
|
VkResult result = vkCreateWin32SurfaceKHR(g_vk.instance, &surface_info, null, &g_vk.surface);
|
||||||
@ -3078,8 +3097,8 @@ Init(VulkanBuildInfo build_info, u64 permanent_mem, u64 frame_mem)
|
|||||||
}
|
}
|
||||||
|
|
||||||
discrete_candidate = cast(bool)discrete;
|
discrete_candidate = cast(bool)discrete;
|
||||||
candidate = current;
|
candidate = current;
|
||||||
physical_device = dev;
|
physical_device = dev;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(physical_device)
|
if(physical_device)
|
||||||
@ -3088,50 +3107,56 @@ Init(VulkanBuildInfo build_info, u64 permanent_mem, u64 frame_mem)
|
|||||||
f32 priority = 1.0f;
|
f32 priority = 1.0f;
|
||||||
count = 1;
|
count = 1;
|
||||||
|
|
||||||
queue_info[0].sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
|
queue_info[0].sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
|
||||||
queue_info[0].queueFamilyIndex = candidate.gfx_index;
|
queue_info[0].queueFamilyIndex = candidate.gfx_index;
|
||||||
queue_info[0].queueCount = 1;
|
queue_info[0].queueCount = 1;
|
||||||
queue_info[0].pQueuePriorities = &priority;
|
queue_info[0].pQueuePriorities = &priority;
|
||||||
queue_info[0].flags = 0;
|
queue_info[0].flags = 0;
|
||||||
|
|
||||||
if(!candidate.single_queue)
|
if(!candidate.single_queue)
|
||||||
{
|
{
|
||||||
queue_info[1].sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
|
queue_info[1].sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
|
||||||
queue_info[1].queueFamilyIndex = candidate.tfer_index;
|
queue_info[1].queueFamilyIndex = candidate.tfer_index;
|
||||||
queue_info[1].queueCount = 1;
|
queue_info[1].queueCount = 1;
|
||||||
queue_info[1].pQueuePriorities = &priority;
|
queue_info[1].pQueuePriorities = &priority;
|
||||||
queue_info[1].flags = 0;
|
queue_info[1].flags = 0;
|
||||||
|
|
||||||
count += 1;
|
count += 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
VkPhysicalDeviceDynamicRenderingFeaturesKHR dynamic_rendering = {
|
||||||
|
sType: VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DYNAMIC_RENDERING_FEATURES,
|
||||||
|
pNext: null,
|
||||||
|
dynamicRendering: VK_TRUE,
|
||||||
|
};
|
||||||
|
|
||||||
VkPhysicalDeviceExtendedDynamicStateFeaturesEXT extended_dynamic_state = {
|
VkPhysicalDeviceExtendedDynamicStateFeaturesEXT extended_dynamic_state = {
|
||||||
sType: VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_FEATURES_EXT,
|
sType: VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_FEATURES_EXT,
|
||||||
pNext: null,
|
pNext: &dynamic_rendering,
|
||||||
extendedDynamicState: VK_TRUE,
|
extendedDynamicState: VK_TRUE,
|
||||||
};
|
};
|
||||||
|
|
||||||
VkPhysicalDeviceSynchronization2Features synchronization2 = {
|
VkPhysicalDeviceSynchronization2Features synchronization2 = {
|
||||||
sType: VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SYNCHRONIZATION_2_FEATURES,
|
sType: VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SYNCHRONIZATION_2_FEATURES,
|
||||||
pNext: &extended_dynamic_state,
|
pNext: &extended_dynamic_state,
|
||||||
synchronization2: VK_TRUE,
|
synchronization2: VK_TRUE,
|
||||||
};
|
};
|
||||||
|
|
||||||
VkPhysicalDeviceVulkan12Features features_12 = {
|
VkPhysicalDeviceVulkan12Features features_12 = {
|
||||||
sType: VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES,
|
sType: VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES,
|
||||||
pNext: &synchronization2,
|
pNext: &synchronization2,
|
||||||
descriptorIndexing: VK_TRUE,
|
descriptorIndexing: VK_TRUE,
|
||||||
bufferDeviceAddress: VK_TRUE,
|
bufferDeviceAddress: VK_TRUE,
|
||||||
descriptorBindingUniformBufferUpdateAfterBind: VK_TRUE,
|
descriptorBindingUniformBufferUpdateAfterBind: VK_TRUE,
|
||||||
descriptorBindingSampledImageUpdateAfterBind: VK_TRUE,
|
descriptorBindingSampledImageUpdateAfterBind: VK_TRUE,
|
||||||
descriptorBindingStorageImageUpdateAfterBind: VK_TRUE,
|
descriptorBindingStorageImageUpdateAfterBind: VK_TRUE,
|
||||||
descriptorBindingStorageBufferUpdateAfterBind: VK_TRUE,
|
descriptorBindingStorageBufferUpdateAfterBind: VK_TRUE,
|
||||||
descriptorBindingStorageTexelBufferUpdateAfterBind: VK_TRUE,
|
descriptorBindingStorageTexelBufferUpdateAfterBind: VK_TRUE,
|
||||||
descriptorBindingPartiallyBound: VK_TRUE,
|
descriptorBindingPartiallyBound: VK_TRUE,
|
||||||
shaderSampledImageArrayNonUniformIndexing: VK_TRUE,
|
shaderSampledImageArrayNonUniformIndexing: VK_TRUE,
|
||||||
shaderUniformBufferArrayNonUniformIndexing: VK_TRUE,
|
shaderUniformBufferArrayNonUniformIndexing: VK_TRUE,
|
||||||
runtimeDescriptorArray: VK_TRUE,
|
runtimeDescriptorArray: VK_TRUE,
|
||||||
storageBuffer8BitAccess: VK_TRUE,
|
storageBuffer8BitAccess: VK_TRUE,
|
||||||
};
|
};
|
||||||
|
|
||||||
VkPhysicalDeviceVulkan11Features features_11 = {
|
VkPhysicalDeviceVulkan11Features features_11 = {
|
||||||
@ -3144,22 +3169,22 @@ Init(VulkanBuildInfo build_info, u64 permanent_mem, u64 frame_mem)
|
|||||||
pNext: &features_11,
|
pNext: &features_11,
|
||||||
features: {
|
features: {
|
||||||
shaderUniformBufferArrayDynamicIndexing: VK_TRUE,
|
shaderUniformBufferArrayDynamicIndexing: VK_TRUE,
|
||||||
shaderSampledImageArrayDynamicIndexing: VK_TRUE,
|
shaderSampledImageArrayDynamicIndexing: VK_TRUE,
|
||||||
shaderStorageBufferArrayDynamicIndexing: VK_TRUE,
|
shaderStorageBufferArrayDynamicIndexing: VK_TRUE,
|
||||||
shaderStorageImageArrayDynamicIndexing: VK_TRUE,
|
shaderStorageImageArrayDynamicIndexing: VK_TRUE,
|
||||||
samplerAnisotropy: VK_TRUE,
|
samplerAnisotropy: VK_TRUE,
|
||||||
fragmentStoresAndAtomics: VK_TRUE,
|
fragmentStoresAndAtomics: VK_TRUE,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
VkDeviceCreateInfo device_info = {
|
VkDeviceCreateInfo device_info = {
|
||||||
sType: VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO,
|
sType: VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO,
|
||||||
pNext: &features,
|
pNext: &features,
|
||||||
ppEnabledExtensionNames: VK_DEVICE_EXTENSIONS.ptr,
|
ppEnabledExtensionNames: VK_DEVICE_EXTENSIONS.ptr,
|
||||||
enabledExtensionCount: cast(u32)VK_DEVICE_EXTENSIONS.length,
|
enabledExtensionCount: cast(u32)VK_DEVICE_EXTENSIONS.length,
|
||||||
queueCreateInfoCount: count,
|
queueCreateInfoCount: count,
|
||||||
pQueueCreateInfos: queue_info.ptr,
|
pQueueCreateInfos: queue_info.ptr,
|
||||||
pEnabledFeatures: null,
|
pEnabledFeatures: null,
|
||||||
};
|
};
|
||||||
|
|
||||||
VkResult result = vkCreateDevice(physical_device, &device_info, null, &g_vk.device);
|
VkResult result = vkCreateDevice(physical_device, &device_info, null, &g_vk.device);
|
||||||
@ -3205,16 +3230,16 @@ Init(VulkanBuildInfo build_info, u64 permanent_mem, u64 frame_mem)
|
|||||||
{
|
{
|
||||||
VmaVulkanFunctions vk_functions = {
|
VmaVulkanFunctions vk_functions = {
|
||||||
vkGetInstanceProcAddr: vkGetInstanceProcAddr,
|
vkGetInstanceProcAddr: vkGetInstanceProcAddr,
|
||||||
vkGetDeviceProcAddr: vkGetDeviceProcAddr,
|
vkGetDeviceProcAddr: vkGetDeviceProcAddr,
|
||||||
};
|
};
|
||||||
|
|
||||||
VmaAllocatorCreateInfo info = {
|
VmaAllocatorCreateInfo info = {
|
||||||
flags: VMA_ALLOCATOR_CREATE_BUFFER_DEVICE_ADDRESS_BIT,
|
flags: VMA_ALLOCATOR_CREATE_BUFFER_DEVICE_ADDRESS_BIT,
|
||||||
vulkanApiVersion: VK_MAKE_API_VERSION(0, 1, 2, 0),
|
vulkanApiVersion: VK_MAKE_API_VERSION(0, 1, 2, 0),
|
||||||
pVulkanFunctions: &vk_functions,
|
pVulkanFunctions: &vk_functions,
|
||||||
physicalDevice: g_vk.physical_device,
|
physicalDevice: g_vk.physical_device,
|
||||||
device: g_vk.device,
|
device: g_vk.device,
|
||||||
instance: g_vk.instance,
|
instance: g_vk.instance,
|
||||||
};
|
};
|
||||||
|
|
||||||
VkResult result = vmaCreateAllocator(&info, &g_vk.vma);
|
VkResult result = vmaCreateAllocator(&info, &g_vk.vma);
|
||||||
@ -3243,12 +3268,12 @@ Init(VulkanBuildInfo build_info, u64 permanent_mem, u64 frame_mem)
|
|||||||
};
|
};
|
||||||
|
|
||||||
VkCommandBufferAllocateInfo cmd_info = {
|
VkCommandBufferAllocateInfo cmd_info = {
|
||||||
sType: VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO,
|
sType: VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO,
|
||||||
commandBufferCount: 1,
|
commandBufferCount: 1,
|
||||||
level: VK_COMMAND_BUFFER_LEVEL_PRIMARY,
|
level: VK_COMMAND_BUFFER_LEVEL_PRIMARY,
|
||||||
};
|
};
|
||||||
|
|
||||||
u32 sem_count = cast(u32)g_vk.present_images.length;
|
u32 sem_count = cast(u32)g_vk.present_images.length;
|
||||||
g_vk.submit_sems = Alloc!(VkSemaphore)(arena, sem_count);
|
g_vk.submit_sems = Alloc!(VkSemaphore)(arena, sem_count);
|
||||||
|
|
||||||
VkResult result;
|
VkResult result;
|
||||||
|
|||||||
@ -125,11 +125,15 @@ PFN_vkCmdSetStencilOpEXT vkCmdSetStencilOpEXT;
|
|||||||
PFN_vkCmdSetStencilReference vkCmdSetStencilReference;
|
PFN_vkCmdSetStencilReference vkCmdSetStencilReference;
|
||||||
PFN_vkCmdSetStencilCompareMask vkCmdSetStencilCompareMask;
|
PFN_vkCmdSetStencilCompareMask vkCmdSetStencilCompareMask;
|
||||||
PFN_vkCmdSetStencilWriteMask vkCmdSetStencilWriteMask;
|
PFN_vkCmdSetStencilWriteMask vkCmdSetStencilWriteMask;
|
||||||
|
PFN_vkCmdBeginRenderingKHR vkCmdBeginRenderingKHR;
|
||||||
|
PFN_vkCmdEndRenderingKHR vkCmdEndRenderingKHR;
|
||||||
|
|
||||||
alias vkQueueSubmit2 = vkQueueSubmit2KHR;
|
alias vkQueueSubmit2 = vkQueueSubmit2KHR;
|
||||||
alias vkCmdPipelineBarrier2 = vkCmdPipelineBarrier2KHR;
|
alias vkCmdPipelineBarrier2 = vkCmdPipelineBarrier2KHR;
|
||||||
alias vkCmdSetStencilTestEnable = vkCmdSetStencilTestEnableEXT;
|
alias vkCmdSetStencilTestEnable = vkCmdSetStencilTestEnableEXT;
|
||||||
alias vkCmdSetStencilOp = vkCmdSetStencilOpEXT;
|
alias vkCmdSetStencilOp = vkCmdSetStencilOpEXT;
|
||||||
|
alias vkCmdBeginRendering = vkCmdBeginRenderingKHR;
|
||||||
|
alias vkCmdEndRendering = vkCmdEndRenderingKHR;
|
||||||
|
|
||||||
static string
|
static string
|
||||||
LoadDeviceFunc(alias fn)()
|
LoadDeviceFunc(alias fn)()
|
||||||
@ -228,6 +232,8 @@ LoadDeviceFunctions()
|
|||||||
mixin(LoadDeviceFunc!(vkCmdSetStencilReference));
|
mixin(LoadDeviceFunc!(vkCmdSetStencilReference));
|
||||||
mixin(LoadDeviceFunc!(vkCmdSetStencilCompareMask));
|
mixin(LoadDeviceFunc!(vkCmdSetStencilCompareMask));
|
||||||
mixin(LoadDeviceFunc!(vkCmdSetStencilWriteMask));
|
mixin(LoadDeviceFunc!(vkCmdSetStencilWriteMask));
|
||||||
|
mixin(LoadDeviceFunc!(vkCmdBeginRenderingKHR));
|
||||||
|
mixin(LoadDeviceFunc!(vkCmdEndRenderingKHR));
|
||||||
|
|
||||||
version(AMD_GPU) version(VULKAN_DEBUG)
|
version(AMD_GPU) version(VULKAN_DEBUG)
|
||||||
{
|
{
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user