From 1cfab28e6ee2f53a665f93169aaed9053820cfbb Mon Sep 17 00:00:00 2001 From: Bas Nieuwenhuizen Date: Fri, 29 Dec 2017 01:25:07 +0100 Subject: radv: Make color meta operations layout aware. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit For fast clear eliminate and decompressions, we always use the most compressed format. For clears, the code already creates a renderpass on demand with the exact same layout as specified. Otherwise we start distinguishing between GENERAL and TRANSFER_DST_OPTIMAL. Reviewed-by: Dave Airlie Tested-by: Dieter Nützel --- src/amd/vulkan/radv_meta_blit.c | 76 ++++++++++++++++++++++------------------- 1 file changed, 41 insertions(+), 35 deletions(-) (limited to 'src/amd/vulkan/radv_meta_blit.c') diff --git a/src/amd/vulkan/radv_meta_blit.c b/src/amd/vulkan/radv_meta_blit.c index 1f5f6ff739d..3ff48498d80 100644 --- a/src/amd/vulkan/radv_meta_blit.c +++ b/src/amd/vulkan/radv_meta_blit.c @@ -325,11 +325,12 @@ meta_emit_blit(struct radv_cmd_buffer *cmd_buffer, switch (src_iview->aspect_mask) { case VK_IMAGE_ASPECT_COLOR_BIT: { unsigned fs_key = radv_format_meta_fs_key(dest_image->vk_format); + unsigned dst_layout = radv_meta_dst_layout_from_layout(dest_image_layout); radv_CmdBeginRenderPass(radv_cmd_buffer_to_handle(cmd_buffer), &(VkRenderPassBeginInfo) { .sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, - .renderPass = device->meta_state.blit.render_pass[fs_key], + .renderPass = device->meta_state.blit.render_pass[fs_key][dst_layout], .framebuffer = fb, .renderArea = { .offset = { dest_box.offset.x, dest_box.offset.y }, @@ -644,9 +645,11 @@ radv_device_finish_meta_blit_state(struct radv_device *device) struct radv_meta_state *state = &device->meta_state; for (unsigned i = 0; i < NUM_META_FS_KEYS; ++i) { - radv_DestroyRenderPass(radv_device_to_handle(device), - state->blit.render_pass[i], - &state->alloc); + for (unsigned j = 0; j < RADV_META_DST_LAYOUT_COUNT; ++j) { + radv_DestroyRenderPass(radv_device_to_handle(device), + state->blit.render_pass[i][j], + &state->alloc); + } radv_DestroyPipeline(radv_device_to_handle(device), state->blit.pipeline_1d_src[i], &state->alloc); @@ -717,38 +720,41 @@ radv_device_init_meta_blit_color(struct radv_device *device, for (unsigned i = 0; i < ARRAY_SIZE(pipeline_formats); ++i) { unsigned key = radv_format_meta_fs_key(pipeline_formats[i]); - result = radv_CreateRenderPass(radv_device_to_handle(device), - &(VkRenderPassCreateInfo) { - .sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, - .attachmentCount = 1, - .pAttachments = &(VkAttachmentDescription) { - .format = pipeline_formats[i], - .loadOp = VK_ATTACHMENT_LOAD_OP_LOAD, - .storeOp = VK_ATTACHMENT_STORE_OP_STORE, - .initialLayout = VK_IMAGE_LAYOUT_GENERAL, - .finalLayout = VK_IMAGE_LAYOUT_GENERAL, - }, - .subpassCount = 1, - .pSubpasses = &(VkSubpassDescription) { - .pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS, - .inputAttachmentCount = 0, - .colorAttachmentCount = 1, - .pColorAttachments = &(VkAttachmentReference) { - .attachment = 0, - .layout = VK_IMAGE_LAYOUT_GENERAL, + for(unsigned j = 0; j < RADV_META_DST_LAYOUT_COUNT; ++j) { + VkImageLayout layout = radv_meta_dst_layout_to_layout(j); + result = radv_CreateRenderPass(radv_device_to_handle(device), + &(VkRenderPassCreateInfo) { + .sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, + .attachmentCount = 1, + .pAttachments = &(VkAttachmentDescription) { + .format = pipeline_formats[i], + .loadOp = VK_ATTACHMENT_LOAD_OP_LOAD, + .storeOp = VK_ATTACHMENT_STORE_OP_STORE, + .initialLayout = layout, + .finalLayout = layout, }, - .pResolveAttachments = NULL, - .pDepthStencilAttachment = &(VkAttachmentReference) { - .attachment = VK_ATTACHMENT_UNUSED, - .layout = VK_IMAGE_LAYOUT_GENERAL, + .subpassCount = 1, + .pSubpasses = &(VkSubpassDescription) { + .pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS, + .inputAttachmentCount = 0, + .colorAttachmentCount = 1, + .pColorAttachments = &(VkAttachmentReference) { + .attachment = 0, + .layout = layout, + }, + .pResolveAttachments = NULL, + .pDepthStencilAttachment = &(VkAttachmentReference) { + .attachment = VK_ATTACHMENT_UNUSED, + .layout = VK_IMAGE_LAYOUT_GENERAL, + }, + .preserveAttachmentCount = 1, + .pPreserveAttachments = (uint32_t[]) { 0 }, }, - .preserveAttachmentCount = 1, - .pPreserveAttachments = (uint32_t[]) { 0 }, - }, - .dependencyCount = 0, - }, &device->meta_state.alloc, &device->meta_state.blit.render_pass[key]); - if (result != VK_SUCCESS) - goto fail; + .dependencyCount = 0, + }, &device->meta_state.alloc, &device->meta_state.blit.render_pass[key][j]); + if (result != VK_SUCCESS) + goto fail; + } VkPipelineVertexInputStateCreateInfo vi_create_info = { .sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO, @@ -823,7 +829,7 @@ radv_device_init_meta_blit_color(struct radv_device *device, }, .flags = 0, .layout = device->meta_state.blit.pipeline_layout, - .renderPass = device->meta_state.blit.render_pass[key], + .renderPass = device->meta_state.blit.render_pass[key][0], .subpass = 0, }; -- cgit v1.2.3