vkd3d: Implement swap chain blits using dynamic rendering.
Signed-off-by: Philip Rebohle <philip.rebohle@tu-dortmund.de>
This commit is contained in:
parent
024ef02f9b
commit
3783eaf4f7
|
@ -591,89 +591,14 @@ void vkd3d_copy_image_ops_cleanup(struct vkd3d_copy_image_ops *meta_copy_image_o
|
||||||
vkd3d_free(meta_copy_image_ops->pipelines);
|
vkd3d_free(meta_copy_image_ops->pipelines);
|
||||||
}
|
}
|
||||||
|
|
||||||
static VkResult vkd3d_meta_create_swapchain_render_pass(struct d3d12_device *device,
|
|
||||||
const struct vkd3d_swapchain_pipeline_key *key, VkRenderPass *render_pass)
|
|
||||||
{
|
|
||||||
const struct vkd3d_vk_device_procs *vk_procs = &device->vk_procs;
|
|
||||||
VkRenderPassCreateInfo2KHR render_pass_info;
|
|
||||||
VkAttachmentDescription2KHR attachment_desc;
|
|
||||||
VkAttachmentReference2KHR attachment_ref;
|
|
||||||
VkSubpassDescription2KHR subpass_desc;
|
|
||||||
VkSubpassDependency2KHR subpass_dep;
|
|
||||||
|
|
||||||
attachment_desc.sType = VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_2_KHR;
|
|
||||||
attachment_desc.pNext = NULL;
|
|
||||||
attachment_desc.loadOp = key->load_op;
|
|
||||||
attachment_desc.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
|
|
||||||
attachment_desc.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
|
|
||||||
attachment_desc.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
|
|
||||||
attachment_desc.format = key->format;
|
|
||||||
attachment_desc.samples = VK_SAMPLE_COUNT_1_BIT;
|
|
||||||
attachment_desc.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
|
|
||||||
attachment_desc.finalLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR;
|
|
||||||
attachment_desc.flags = 0;
|
|
||||||
|
|
||||||
attachment_ref.sType = VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_2_KHR;
|
|
||||||
attachment_ref.pNext = NULL;
|
|
||||||
attachment_ref.attachment = 0;
|
|
||||||
attachment_ref.layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
|
|
||||||
attachment_ref.aspectMask = 0; /* input attachment aspect mask */
|
|
||||||
|
|
||||||
subpass_desc.sType = VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_2_KHR;
|
|
||||||
subpass_desc.pNext = NULL;
|
|
||||||
subpass_desc.flags = 0;
|
|
||||||
subpass_desc.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS;
|
|
||||||
subpass_desc.viewMask = 0;
|
|
||||||
subpass_desc.inputAttachmentCount = 0;
|
|
||||||
subpass_desc.pInputAttachments = NULL;
|
|
||||||
subpass_desc.colorAttachmentCount = 1;
|
|
||||||
subpass_desc.pColorAttachments = &attachment_ref;
|
|
||||||
subpass_desc.pResolveAttachments = NULL;
|
|
||||||
subpass_desc.pDepthStencilAttachment = NULL;
|
|
||||||
subpass_desc.preserveAttachmentCount = 0;
|
|
||||||
subpass_desc.pPreserveAttachments = NULL;
|
|
||||||
|
|
||||||
subpass_dep.sType = VK_STRUCTURE_TYPE_SUBPASS_DEPENDENCY_2_KHR;
|
|
||||||
subpass_dep.pNext = NULL;
|
|
||||||
subpass_dep.srcSubpass = VK_SUBPASS_EXTERNAL;
|
|
||||||
subpass_dep.dstSubpass = 0;
|
|
||||||
subpass_dep.srcStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
|
|
||||||
subpass_dep.dstStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
|
|
||||||
subpass_dep.srcAccessMask = 0;
|
|
||||||
subpass_dep.dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
|
|
||||||
subpass_dep.dependencyFlags = 0;
|
|
||||||
subpass_dep.viewOffset = 0;
|
|
||||||
|
|
||||||
render_pass_info.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO_2_KHR;
|
|
||||||
render_pass_info.pNext = NULL;
|
|
||||||
render_pass_info.flags = 0;
|
|
||||||
render_pass_info.attachmentCount = 1;
|
|
||||||
render_pass_info.pAttachments = &attachment_desc;
|
|
||||||
render_pass_info.subpassCount = 1;
|
|
||||||
render_pass_info.pSubpasses = &subpass_desc;
|
|
||||||
render_pass_info.dependencyCount = 1;
|
|
||||||
render_pass_info.pDependencies = &subpass_dep;
|
|
||||||
render_pass_info.correlatedViewMaskCount = 0;
|
|
||||||
render_pass_info.pCorrelatedViewMasks = NULL;
|
|
||||||
|
|
||||||
return VK_CALL(vkCreateRenderPass2KHR(device->vk_device, &render_pass_info, NULL, render_pass));
|
|
||||||
}
|
|
||||||
|
|
||||||
static HRESULT vkd3d_meta_create_swapchain_pipeline(struct vkd3d_meta_ops *meta_ops,
|
static HRESULT vkd3d_meta_create_swapchain_pipeline(struct vkd3d_meta_ops *meta_ops,
|
||||||
const struct vkd3d_swapchain_pipeline_key *key, struct vkd3d_swapchain_pipeline *pipeline)
|
const struct vkd3d_swapchain_pipeline_key *key, struct vkd3d_swapchain_pipeline *pipeline)
|
||||||
{
|
{
|
||||||
const struct vkd3d_vk_device_procs *vk_procs = &meta_ops->device->vk_procs;
|
|
||||||
struct vkd3d_swapchain_ops *meta_swapchain_ops = &meta_ops->swapchain;
|
struct vkd3d_swapchain_ops *meta_swapchain_ops = &meta_ops->swapchain;
|
||||||
VkPipelineColorBlendAttachmentState blend_att;
|
VkPipelineColorBlendAttachmentState blend_att;
|
||||||
VkPipelineColorBlendStateCreateInfo cb_state;
|
VkPipelineColorBlendStateCreateInfo cb_state;
|
||||||
VkResult vr;
|
VkResult vr;
|
||||||
|
|
||||||
if ((vr = vkd3d_meta_create_swapchain_render_pass(meta_ops->device, key, &pipeline->vk_render_pass)))
|
|
||||||
{
|
|
||||||
ERR("Failed to create render pass, vr %d.\n", vr);
|
|
||||||
return hresult_from_vk_result(vr);
|
|
||||||
}
|
|
||||||
|
|
||||||
memset(&cb_state, 0, sizeof(cb_state));
|
memset(&cb_state, 0, sizeof(cb_state));
|
||||||
memset(&blend_att, 0, sizeof(blend_att));
|
memset(&blend_att, 0, sizeof(blend_att));
|
||||||
cb_state.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
|
cb_state.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
|
||||||
|
@ -690,10 +615,7 @@ static HRESULT vkd3d_meta_create_swapchain_pipeline(struct vkd3d_meta_ops *meta_
|
||||||
meta_swapchain_ops->vk_vs_module, meta_swapchain_ops->vk_fs_module, 1,
|
meta_swapchain_ops->vk_vs_module, meta_swapchain_ops->vk_fs_module, 1,
|
||||||
NULL, &cb_state,
|
NULL, &cb_state,
|
||||||
NULL, &pipeline->vk_pipeline)) < 0)
|
NULL, &pipeline->vk_pipeline)) < 0)
|
||||||
{
|
|
||||||
VK_CALL(vkDestroyRenderPass(meta_ops->device->vk_device, pipeline->vk_render_pass, NULL));
|
|
||||||
return hresult_from_vk_result(vr);
|
return hresult_from_vk_result(vr);
|
||||||
}
|
|
||||||
|
|
||||||
pipeline->key = *key;
|
pipeline->key = *key;
|
||||||
return S_OK;
|
return S_OK;
|
||||||
|
@ -1023,7 +945,6 @@ void vkd3d_swapchain_ops_cleanup(struct vkd3d_swapchain_ops *meta_swapchain_ops,
|
||||||
{
|
{
|
||||||
struct vkd3d_swapchain_pipeline *pipeline = &meta_swapchain_ops->pipelines[i];
|
struct vkd3d_swapchain_pipeline *pipeline = &meta_swapchain_ops->pipelines[i];
|
||||||
|
|
||||||
VK_CALL(vkDestroyRenderPass(device->vk_device, pipeline->vk_render_pass, NULL));
|
|
||||||
VK_CALL(vkDestroyPipeline(device->vk_device, pipeline->vk_pipeline, NULL));
|
VK_CALL(vkDestroyPipeline(device->vk_device, pipeline->vk_pipeline, NULL));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1064,7 +985,6 @@ HRESULT vkd3d_meta_get_swapchain_pipeline(struct vkd3d_meta_ops *meta_ops,
|
||||||
|
|
||||||
if (!memcmp(key, &pipeline->key, sizeof(*key)))
|
if (!memcmp(key, &pipeline->key, sizeof(*key)))
|
||||||
{
|
{
|
||||||
info->vk_render_pass = pipeline->vk_render_pass;
|
|
||||||
info->vk_pipeline = pipeline->vk_pipeline;
|
info->vk_pipeline = pipeline->vk_pipeline;
|
||||||
pthread_mutex_unlock(&meta_swapchain_ops->mutex);
|
pthread_mutex_unlock(&meta_swapchain_ops->mutex);
|
||||||
return S_OK;
|
return S_OK;
|
||||||
|
@ -1086,7 +1006,6 @@ HRESULT vkd3d_meta_get_swapchain_pipeline(struct vkd3d_meta_ops *meta_ops,
|
||||||
return hr;
|
return hr;
|
||||||
}
|
}
|
||||||
|
|
||||||
info->vk_render_pass = pipeline->vk_render_pass;
|
|
||||||
info->vk_pipeline = pipeline->vk_pipeline;
|
info->vk_pipeline = pipeline->vk_pipeline;
|
||||||
|
|
||||||
pthread_mutex_unlock(&meta_swapchain_ops->mutex);
|
pthread_mutex_unlock(&meta_swapchain_ops->mutex);
|
||||||
|
|
|
@ -180,7 +180,6 @@ struct d3d12_swapchain
|
||||||
VkImage vk_images[DXGI_MAX_SWAP_CHAIN_BUFFERS];
|
VkImage vk_images[DXGI_MAX_SWAP_CHAIN_BUFFERS];
|
||||||
VkImage vk_swapchain_images[DXGI_MAX_SWAP_CHAIN_BUFFERS];
|
VkImage vk_swapchain_images[DXGI_MAX_SWAP_CHAIN_BUFFERS];
|
||||||
VkImageView vk_swapchain_image_views[DXGI_MAX_SWAP_CHAIN_BUFFERS];
|
VkImageView vk_swapchain_image_views[DXGI_MAX_SWAP_CHAIN_BUFFERS];
|
||||||
VkFramebuffer vk_framebuffers[DXGI_MAX_SWAP_CHAIN_BUFFERS];
|
|
||||||
VkCommandBuffer vk_cmd_buffers[DXGI_MAX_SWAP_CHAIN_BUFFERS];
|
VkCommandBuffer vk_cmd_buffers[DXGI_MAX_SWAP_CHAIN_BUFFERS];
|
||||||
bool vk_acquire_semaphores_signaled[DXGI_MAX_SWAP_CHAIN_BUFFERS];
|
bool vk_acquire_semaphores_signaled[DXGI_MAX_SWAP_CHAIN_BUFFERS];
|
||||||
VkSemaphore vk_acquire_semaphores[DXGI_MAX_SWAP_CHAIN_BUFFERS];
|
VkSemaphore vk_acquire_semaphores[DXGI_MAX_SWAP_CHAIN_BUFFERS];
|
||||||
|
@ -817,8 +816,6 @@ static HRESULT d3d12_swapchain_get_user_graphics_pipeline(struct d3d12_swapchain
|
||||||
HRESULT hr;
|
HRESULT hr;
|
||||||
|
|
||||||
key.bind_point = VK_PIPELINE_BIND_POINT_GRAPHICS;
|
key.bind_point = VK_PIPELINE_BIND_POINT_GRAPHICS;
|
||||||
key.load_op = swapchain->desc.Scaling == DXGI_SCALING_NONE ?
|
|
||||||
VK_ATTACHMENT_LOAD_OP_CLEAR : VK_ATTACHMENT_LOAD_OP_DONT_CARE;
|
|
||||||
key.filter = swapchain->desc.Scaling == DXGI_SCALING_NONE ? VK_FILTER_NEAREST : VK_FILTER_LINEAR;
|
key.filter = swapchain->desc.Scaling == DXGI_SCALING_NONE ? VK_FILTER_NEAREST : VK_FILTER_LINEAR;
|
||||||
key.format = format;
|
key.format = format;
|
||||||
|
|
||||||
|
@ -987,16 +984,13 @@ static VkResult d3d12_swapchain_record_swapchain_blit(struct d3d12_swapchain *sw
|
||||||
VkCommandBuffer vk_cmd_buffer, unsigned int dst_index, unsigned int src_index)
|
VkCommandBuffer vk_cmd_buffer, unsigned int dst_index, unsigned int src_index)
|
||||||
{
|
{
|
||||||
const struct vkd3d_vk_device_procs *vk_procs = d3d12_swapchain_procs(swapchain);
|
const struct vkd3d_vk_device_procs *vk_procs = d3d12_swapchain_procs(swapchain);
|
||||||
VkSubpassBeginInfoKHR subpass_begin_info;
|
VkRenderingAttachmentInfoKHR attachment_info;
|
||||||
VkSubpassEndInfoKHR subpass_end_info;
|
|
||||||
VkCommandBufferBeginInfo begin_info;
|
VkCommandBufferBeginInfo begin_info;
|
||||||
VkRenderPassBeginInfo rp_info;
|
VkImageMemoryBarrier image_barrier;
|
||||||
VkClearValue clear_value;
|
VkRenderingInfoKHR rendering_info;
|
||||||
VkViewport viewport;
|
VkViewport viewport;
|
||||||
VkResult vr;
|
VkResult vr;
|
||||||
|
|
||||||
memset(&clear_value, 0, sizeof(clear_value));
|
|
||||||
|
|
||||||
begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
|
begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
|
||||||
begin_info.pNext = NULL;
|
begin_info.pNext = NULL;
|
||||||
begin_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
|
begin_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
|
||||||
|
@ -1008,39 +1002,28 @@ static VkResult d3d12_swapchain_record_swapchain_blit(struct d3d12_swapchain *sw
|
||||||
return vr;
|
return vr;
|
||||||
}
|
}
|
||||||
|
|
||||||
rp_info.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
|
memset(&attachment_info, 0, sizeof(attachment_info));
|
||||||
rp_info.pNext = NULL;
|
attachment_info.sType = VK_STRUCTURE_TYPE_RENDERING_ATTACHMENT_INFO_KHR;
|
||||||
rp_info.renderPass = swapchain->pipeline.vk_render_pass;
|
attachment_info.imageView = swapchain->vk_swapchain_image_views[dst_index];
|
||||||
rp_info.framebuffer = swapchain->vk_framebuffers[dst_index];
|
attachment_info.imageLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
|
||||||
|
attachment_info.loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
|
||||||
rp_info.renderArea.offset.x = 0;
|
attachment_info.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
|
||||||
rp_info.renderArea.offset.y = 0;
|
|
||||||
rp_info.renderArea.extent.width = swapchain->vk_swapchain_width;
|
|
||||||
rp_info.renderArea.extent.height = swapchain->vk_swapchain_height;
|
|
||||||
|
|
||||||
subpass_begin_info.sType = VK_STRUCTURE_TYPE_SUBPASS_BEGIN_INFO_KHR;
|
|
||||||
subpass_begin_info.pNext = NULL;
|
|
||||||
subpass_begin_info.contents = VK_SUBPASS_CONTENTS_INLINE;
|
|
||||||
|
|
||||||
subpass_end_info.sType = VK_STRUCTURE_TYPE_SUBPASS_END_INFO_KHR;
|
|
||||||
subpass_end_info.pNext = NULL;
|
|
||||||
|
|
||||||
if (swapchain->desc.Scaling == DXGI_SCALING_NONE)
|
if (swapchain->desc.Scaling == DXGI_SCALING_NONE)
|
||||||
{
|
attachment_info.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
|
||||||
rp_info.clearValueCount = 1;
|
|
||||||
rp_info.pClearValues = &clear_value;
|
memset(&rendering_info, 0, sizeof(rendering_info));
|
||||||
}
|
rendering_info.sType = VK_STRUCTURE_TYPE_RENDERING_INFO_KHR;
|
||||||
else
|
rendering_info.renderArea.extent.width = swapchain->vk_swapchain_width;
|
||||||
{
|
rendering_info.renderArea.extent.height = swapchain->vk_swapchain_height;
|
||||||
rp_info.clearValueCount = 0;
|
rendering_info.layerCount = 1;
|
||||||
rp_info.pClearValues = NULL;
|
rendering_info.colorAttachmentCount = 1;
|
||||||
}
|
rendering_info.pColorAttachments = &attachment_info;
|
||||||
|
|
||||||
viewport.x = viewport.y = 0.0f;
|
viewport.x = viewport.y = 0.0f;
|
||||||
viewport.minDepth = 0.0f;
|
viewport.minDepth = 0.0f;
|
||||||
viewport.maxDepth = 1.0f;
|
viewport.maxDepth = 1.0f;
|
||||||
|
|
||||||
VK_CALL(vkCmdBeginRenderPass2KHR(vk_cmd_buffer, &rp_info, &subpass_begin_info));
|
|
||||||
if (swapchain->desc.Scaling == DXGI_SCALING_NONE)
|
if (swapchain->desc.Scaling == DXGI_SCALING_NONE)
|
||||||
{
|
{
|
||||||
viewport.width = (float)swapchain->desc.Width;
|
viewport.width = (float)swapchain->desc.Width;
|
||||||
|
@ -1052,15 +1035,48 @@ static VkResult d3d12_swapchain_record_swapchain_blit(struct d3d12_swapchain *sw
|
||||||
viewport.height = swapchain->vk_swapchain_height;
|
viewport.height = swapchain->vk_swapchain_height;
|
||||||
}
|
}
|
||||||
|
|
||||||
VK_CALL(vkCmdSetViewport(vk_cmd_buffer, 0, 1, &viewport));
|
image_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
|
||||||
VK_CALL(vkCmdSetScissor(vk_cmd_buffer, 0, 1, &rp_info.renderArea));
|
image_barrier.pNext = NULL;
|
||||||
|
image_barrier.srcAccessMask = 0;
|
||||||
|
image_barrier.dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
|
||||||
|
image_barrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
|
||||||
|
image_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
|
||||||
|
image_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
|
||||||
|
image_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
|
||||||
|
image_barrier.image = swapchain->vk_swapchain_images[dst_index];
|
||||||
|
image_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
|
||||||
|
image_barrier.subresourceRange.baseMipLevel = 0;
|
||||||
|
image_barrier.subresourceRange.levelCount = 1;
|
||||||
|
image_barrier.subresourceRange.baseArrayLayer = 0;
|
||||||
|
image_barrier.subresourceRange.layerCount = 1;
|
||||||
|
|
||||||
|
if (attachment_info.loadOp != VK_ATTACHMENT_LOAD_OP_DONT_CARE)
|
||||||
|
image_barrier.dstAccessMask |= VK_ACCESS_COLOR_ATTACHMENT_READ_BIT;
|
||||||
|
|
||||||
|
VK_CALL(vkCmdPipelineBarrier(vk_cmd_buffer,
|
||||||
|
VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
|
||||||
|
VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
|
||||||
|
0, 0, NULL, 0, NULL, 1, &image_barrier));
|
||||||
|
|
||||||
|
VK_CALL(vkCmdBeginRenderingKHR(vk_cmd_buffer, &rendering_info));
|
||||||
|
VK_CALL(vkCmdSetViewport(vk_cmd_buffer, 0, 1, &viewport));
|
||||||
|
VK_CALL(vkCmdSetScissor(vk_cmd_buffer, 0, 1, &rendering_info.renderArea));
|
||||||
VK_CALL(vkCmdBindPipeline(vk_cmd_buffer, VK_PIPELINE_BIND_POINT_GRAPHICS, swapchain->pipeline.vk_pipeline));
|
VK_CALL(vkCmdBindPipeline(vk_cmd_buffer, VK_PIPELINE_BIND_POINT_GRAPHICS, swapchain->pipeline.vk_pipeline));
|
||||||
VK_CALL(vkCmdBindDescriptorSets(vk_cmd_buffer, VK_PIPELINE_BIND_POINT_GRAPHICS,
|
VK_CALL(vkCmdBindDescriptorSets(vk_cmd_buffer, VK_PIPELINE_BIND_POINT_GRAPHICS,
|
||||||
swapchain->pipeline.vk_pipeline_layout, 0, 1, &swapchain->descriptors.sets[src_index],
|
swapchain->pipeline.vk_pipeline_layout, 0, 1, &swapchain->descriptors.sets[src_index],
|
||||||
0, NULL));
|
0, NULL));
|
||||||
VK_CALL(vkCmdDraw(vk_cmd_buffer, 3, 1, 0, 0));
|
VK_CALL(vkCmdDraw(vk_cmd_buffer, 3, 1, 0, 0));
|
||||||
VK_CALL(vkCmdEndRenderPass2KHR(vk_cmd_buffer, &subpass_end_info));
|
VK_CALL(vkCmdEndRenderingKHR(vk_cmd_buffer));
|
||||||
|
|
||||||
|
image_barrier.srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
|
||||||
|
image_barrier.dstAccessMask = 0;
|
||||||
|
image_barrier.oldLayout = image_barrier.newLayout;
|
||||||
|
image_barrier.newLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR;
|
||||||
|
|
||||||
|
VK_CALL(vkCmdPipelineBarrier(vk_cmd_buffer,
|
||||||
|
VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
|
||||||
|
VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT,
|
||||||
|
0, 0, NULL, 0, NULL, 1, &image_barrier));
|
||||||
|
|
||||||
if ((vr = VK_CALL(vkEndCommandBuffer(vk_cmd_buffer))) < 0)
|
if ((vr = VK_CALL(vkEndCommandBuffer(vk_cmd_buffer))) < 0)
|
||||||
WARN("Failed to end command buffer, vr %d.\n", vr);
|
WARN("Failed to end command buffer, vr %d.\n", vr);
|
||||||
|
@ -1068,7 +1084,7 @@ static VkResult d3d12_swapchain_record_swapchain_blit(struct d3d12_swapchain *sw
|
||||||
return vr;
|
return vr;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void d3d12_swapchain_destroy_framebuffers(struct d3d12_swapchain *swapchain)
|
static void d3d12_swapchain_destroy_views(struct d3d12_swapchain *swapchain)
|
||||||
{
|
{
|
||||||
const struct vkd3d_vk_device_procs *vk_procs = d3d12_swapchain_procs(swapchain);
|
const struct vkd3d_vk_device_procs *vk_procs = d3d12_swapchain_procs(swapchain);
|
||||||
VkDevice vk_device = d3d12_swapchain_device(swapchain)->vk_device;
|
VkDevice vk_device = d3d12_swapchain_device(swapchain)->vk_device;
|
||||||
|
@ -1077,30 +1093,18 @@ static void d3d12_swapchain_destroy_framebuffers(struct d3d12_swapchain *swapcha
|
||||||
for (i = 0; i < swapchain->buffer_count; i++)
|
for (i = 0; i < swapchain->buffer_count; i++)
|
||||||
{
|
{
|
||||||
VK_CALL(vkDestroyImageView(vk_device, swapchain->vk_swapchain_image_views[i], NULL));
|
VK_CALL(vkDestroyImageView(vk_device, swapchain->vk_swapchain_image_views[i], NULL));
|
||||||
VK_CALL(vkDestroyFramebuffer(vk_device, swapchain->vk_framebuffers[i], NULL));
|
|
||||||
swapchain->vk_swapchain_image_views[i] = VK_NULL_HANDLE;
|
swapchain->vk_swapchain_image_views[i] = VK_NULL_HANDLE;
|
||||||
swapchain->vk_framebuffers[i] = VK_NULL_HANDLE;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static HRESULT d3d12_swapchain_create_framebuffers(struct d3d12_swapchain *swapchain, VkFormat format)
|
static HRESULT d3d12_swapchain_create_views(struct d3d12_swapchain *swapchain, VkFormat format)
|
||||||
{
|
{
|
||||||
const struct vkd3d_vk_device_procs *vk_procs = d3d12_swapchain_procs(swapchain);
|
const struct vkd3d_vk_device_procs *vk_procs = d3d12_swapchain_procs(swapchain);
|
||||||
VkDevice vk_device = d3d12_swapchain_device(swapchain)->vk_device;
|
VkDevice vk_device = d3d12_swapchain_device(swapchain)->vk_device;
|
||||||
VkImageViewCreateInfo image_view_info;
|
VkImageViewCreateInfo image_view_info;
|
||||||
VkFramebufferCreateInfo fb_info;
|
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
VkResult vr;
|
VkResult vr;
|
||||||
|
|
||||||
fb_info.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
|
|
||||||
fb_info.pNext = NULL;
|
|
||||||
fb_info.flags = 0;
|
|
||||||
fb_info.renderPass = swapchain->pipeline.vk_render_pass;
|
|
||||||
fb_info.width = swapchain->vk_swapchain_width;
|
|
||||||
fb_info.height = swapchain->vk_swapchain_height;
|
|
||||||
fb_info.layers = 1;
|
|
||||||
fb_info.attachmentCount = 1;
|
|
||||||
|
|
||||||
image_view_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
|
image_view_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
|
||||||
image_view_info.pNext = NULL;
|
image_view_info.pNext = NULL;
|
||||||
image_view_info.flags = 0;
|
image_view_info.flags = 0;
|
||||||
|
@ -1121,9 +1125,6 @@ static HRESULT d3d12_swapchain_create_framebuffers(struct d3d12_swapchain *swapc
|
||||||
image_view_info.image = swapchain->vk_swapchain_images[i];
|
image_view_info.image = swapchain->vk_swapchain_images[i];
|
||||||
if ((vr = VK_CALL(vkCreateImageView(vk_device, &image_view_info, NULL, &swapchain->vk_swapchain_image_views[i]))))
|
if ((vr = VK_CALL(vkCreateImageView(vk_device, &image_view_info, NULL, &swapchain->vk_swapchain_image_views[i]))))
|
||||||
return hresult_from_vk_result(vr);
|
return hresult_from_vk_result(vr);
|
||||||
fb_info.pAttachments = &swapchain->vk_swapchain_image_views[i];
|
|
||||||
if ((vr = VK_CALL(vkCreateFramebuffer(vk_device, &fb_info, NULL, &swapchain->vk_framebuffers[i]))))
|
|
||||||
return hresult_from_vk_result(vr);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return S_OK;
|
return S_OK;
|
||||||
|
@ -1225,7 +1226,7 @@ static HRESULT d3d12_swapchain_create_buffers(struct d3d12_swapchain *swapchain,
|
||||||
VkResult vr;
|
VkResult vr;
|
||||||
HRESULT hr;
|
HRESULT hr;
|
||||||
|
|
||||||
d3d12_swapchain_destroy_framebuffers(swapchain);
|
d3d12_swapchain_destroy_views(swapchain);
|
||||||
|
|
||||||
if ((vr = VK_CALL(vkGetSwapchainImagesKHR(vk_device, vk_swapchain, &image_count, NULL))) < 0)
|
if ((vr = VK_CALL(vkGetSwapchainImagesKHR(vk_device, vk_swapchain, &image_count, NULL))) < 0)
|
||||||
{
|
{
|
||||||
|
@ -1255,7 +1256,7 @@ static HRESULT d3d12_swapchain_create_buffers(struct d3d12_swapchain *swapchain,
|
||||||
|
|
||||||
if (queue_desc.Type == D3D12_COMMAND_LIST_TYPE_DIRECT)
|
if (queue_desc.Type == D3D12_COMMAND_LIST_TYPE_DIRECT)
|
||||||
{
|
{
|
||||||
if (FAILED(hr = d3d12_swapchain_create_framebuffers(swapchain, vk_swapchain_format)))
|
if (FAILED(hr = d3d12_swapchain_create_views(swapchain, vk_swapchain_format)))
|
||||||
return hr;
|
return hr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1575,7 +1576,7 @@ static HRESULT d3d12_swapchain_create_vulkan_swapchain(struct d3d12_swapchain *s
|
||||||
return hr;
|
return hr;
|
||||||
|
|
||||||
d3d12_swapchain_destroy_buffers(swapchain, FALSE);
|
d3d12_swapchain_destroy_buffers(swapchain, FALSE);
|
||||||
d3d12_swapchain_destroy_framebuffers(swapchain);
|
d3d12_swapchain_destroy_views(swapchain);
|
||||||
swapchain->buffer_count = 0;
|
swapchain->buffer_count = 0;
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
@ -1637,7 +1638,7 @@ static void d3d12_swapchain_destroy(struct d3d12_swapchain *swapchain)
|
||||||
const struct vkd3d_vk_device_procs *vk_procs = d3d12_swapchain_procs(swapchain);
|
const struct vkd3d_vk_device_procs *vk_procs = d3d12_swapchain_procs(swapchain);
|
||||||
|
|
||||||
d3d12_swapchain_destroy_buffers(swapchain, TRUE);
|
d3d12_swapchain_destroy_buffers(swapchain, TRUE);
|
||||||
d3d12_swapchain_destroy_framebuffers(swapchain);
|
d3d12_swapchain_destroy_views(swapchain);
|
||||||
|
|
||||||
if (swapchain->frame_latency_event)
|
if (swapchain->frame_latency_event)
|
||||||
CloseHandle(swapchain->frame_latency_event);
|
CloseHandle(swapchain->frame_latency_event);
|
||||||
|
|
|
@ -2600,7 +2600,6 @@ void vkd3d_copy_image_ops_cleanup(struct vkd3d_copy_image_ops *meta_copy_image_o
|
||||||
struct vkd3d_swapchain_pipeline_key
|
struct vkd3d_swapchain_pipeline_key
|
||||||
{
|
{
|
||||||
VkPipelineBindPoint bind_point;
|
VkPipelineBindPoint bind_point;
|
||||||
VkAttachmentLoadOp load_op;
|
|
||||||
VkFormat format;
|
VkFormat format;
|
||||||
VkFilter filter;
|
VkFilter filter;
|
||||||
};
|
};
|
||||||
|
@ -2609,13 +2608,11 @@ struct vkd3d_swapchain_info
|
||||||
{
|
{
|
||||||
VkDescriptorSetLayout vk_set_layout;
|
VkDescriptorSetLayout vk_set_layout;
|
||||||
VkPipelineLayout vk_pipeline_layout;
|
VkPipelineLayout vk_pipeline_layout;
|
||||||
VkRenderPass vk_render_pass;
|
|
||||||
VkPipeline vk_pipeline;
|
VkPipeline vk_pipeline;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct vkd3d_swapchain_pipeline
|
struct vkd3d_swapchain_pipeline
|
||||||
{
|
{
|
||||||
VkRenderPass vk_render_pass;
|
|
||||||
VkPipeline vk_pipeline;
|
VkPipeline vk_pipeline;
|
||||||
struct vkd3d_swapchain_pipeline_key key;
|
struct vkd3d_swapchain_pipeline_key key;
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in New Issue