anv/meta_resolve: Begin pass outside emit_resolve()
This refactor is preparation for handling subpass resolve attachments.
This commit is contained in:
parent
2bab3cd681
commit
8487569fa7
|
@ -450,26 +450,19 @@ cleanup:
|
|||
static void
|
||||
emit_resolve(struct anv_cmd_buffer *cmd_buffer,
|
||||
struct anv_image_view *src_iview,
|
||||
uint32_t src_level,
|
||||
const VkOffset2D *src_offset,
|
||||
struct anv_image_view *dest_iview,
|
||||
uint32_t dest_level,
|
||||
const VkOffset2D *dest_offset,
|
||||
const VkExtent2D *resolve_extent)
|
||||
{
|
||||
struct anv_device *device = cmd_buffer->device;
|
||||
VkDevice device_h = anv_device_to_handle(device);
|
||||
VkCommandBuffer cmd_buffer_h = anv_cmd_buffer_to_handle(cmd_buffer);
|
||||
const struct anv_framebuffer *fb = cmd_buffer->state.framebuffer;
|
||||
const struct anv_image *src_image = src_iview->image;
|
||||
const struct anv_image *dest_image = dest_iview->image;
|
||||
VkDescriptorPool dummy_desc_pool_h = (VkDescriptorPool) 1;
|
||||
uint32_t samples_log2 = ffs(src_image->samples) - 1;
|
||||
|
||||
const VkExtent2D dest_iview_extent = {
|
||||
anv_minify(dest_image->extent.width, dest_level),
|
||||
anv_minify(dest_image->extent.height, dest_level),
|
||||
};
|
||||
|
||||
const struct vertex_attrs vertex_data[3] = {
|
||||
{
|
||||
.vue_header = {0},
|
||||
|
@ -581,35 +574,6 @@ emit_resolve(struct anv_cmd_buffer *cmd_buffer,
|
|||
/*copyCount*/ 0,
|
||||
/*copies */ NULL);
|
||||
|
||||
VkFramebuffer fb_h;
|
||||
anv_CreateFramebuffer(device_h,
|
||||
&(VkFramebufferCreateInfo) {
|
||||
.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO,
|
||||
.attachmentCount = 1,
|
||||
.pAttachments = (VkImageView[]) {
|
||||
anv_image_view_to_handle(dest_iview),
|
||||
},
|
||||
.width = dest_iview_extent.width,
|
||||
.height = dest_iview_extent.height,
|
||||
.layers = 1
|
||||
},
|
||||
&cmd_buffer->pool->alloc,
|
||||
&fb_h);
|
||||
|
||||
ANV_CALL(CmdBeginRenderPass)(cmd_buffer_h,
|
||||
&(VkRenderPassBeginInfo) {
|
||||
.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,
|
||||
.renderPass = device->meta_state.resolve.pass,
|
||||
.framebuffer = fb_h,
|
||||
.renderArea = {
|
||||
.offset = { dest_offset->x, dest_offset->y },
|
||||
.extent = { resolve_extent->width, resolve_extent->height },
|
||||
},
|
||||
.clearValueCount = 0,
|
||||
.pClearValues = NULL,
|
||||
},
|
||||
VK_SUBPASS_CONTENTS_INLINE);
|
||||
|
||||
ANV_CALL(CmdSetViewport)(cmd_buffer_h,
|
||||
/*firstViewport*/ 0,
|
||||
/*viewportCount*/ 1,
|
||||
|
@ -617,8 +581,8 @@ emit_resolve(struct anv_cmd_buffer *cmd_buffer,
|
|||
{
|
||||
.x = 0,
|
||||
.y = 0,
|
||||
.width = dest_iview_extent.width,
|
||||
.height = dest_iview_extent.height,
|
||||
.width = fb->width,
|
||||
.height = fb->height,
|
||||
.minDepth = 0.0,
|
||||
.maxDepth = 1.0,
|
||||
},
|
||||
|
@ -630,7 +594,7 @@ emit_resolve(struct anv_cmd_buffer *cmd_buffer,
|
|||
(VkRect2D[]) {
|
||||
{
|
||||
.offset = { 0, 0 },
|
||||
.extent = dest_iview_extent,
|
||||
.extent = (VkExtent2D) { fb->width, fb->height },
|
||||
},
|
||||
});
|
||||
|
||||
|
@ -654,7 +618,6 @@ emit_resolve(struct anv_cmd_buffer *cmd_buffer,
|
|||
/*copies */ NULL);
|
||||
|
||||
ANV_CALL(CmdDraw)(cmd_buffer_h, 3, 1, 0, 0);
|
||||
ANV_CALL(CmdEndRenderPass)(cmd_buffer_h);
|
||||
|
||||
/* All objects below are consumed by the draw call. We may safely destroy
|
||||
* them.
|
||||
|
@ -662,8 +625,6 @@ emit_resolve(struct anv_cmd_buffer *cmd_buffer,
|
|||
anv_descriptor_set_destroy(device, desc_set);
|
||||
anv_DestroySampler(device_h, sampler_h,
|
||||
&cmd_buffer->pool->alloc);
|
||||
anv_DestroyFramebuffer(device_h, fb_h,
|
||||
&cmd_buffer->pool->alloc);
|
||||
}
|
||||
|
||||
void anv_CmdResolveImage(
|
||||
|
@ -678,7 +639,9 @@ void anv_CmdResolveImage(
|
|||
ANV_FROM_HANDLE(anv_cmd_buffer, cmd_buffer, cmd_buffer_h);
|
||||
ANV_FROM_HANDLE(anv_image, src_image, src_image_h);
|
||||
ANV_FROM_HANDLE(anv_image, dest_image, dest_image_h);
|
||||
struct anv_device *device = cmd_buffer->device;
|
||||
struct anv_meta_saved_state state;
|
||||
VkDevice device_h = anv_device_to_handle(device);
|
||||
|
||||
anv_meta_save(&state, cmd_buffer, 0);
|
||||
|
||||
|
@ -757,15 +720,50 @@ void anv_CmdResolveImage(
|
|||
},
|
||||
cmd_buffer, 0);
|
||||
|
||||
VkFramebuffer fb_h;
|
||||
anv_CreateFramebuffer(device_h,
|
||||
&(VkFramebufferCreateInfo) {
|
||||
.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO,
|
||||
.attachmentCount = 1,
|
||||
.pAttachments = (VkImageView[]) {
|
||||
anv_image_view_to_handle(&dest_iview),
|
||||
},
|
||||
.width = anv_minify(dest_image->extent.width,
|
||||
region->dstSubresource.mipLevel),
|
||||
.height = anv_minify(dest_image->extent.height,
|
||||
region->dstSubresource.mipLevel),
|
||||
.layers = 1
|
||||
},
|
||||
&cmd_buffer->pool->alloc,
|
||||
&fb_h);
|
||||
|
||||
ANV_CALL(CmdBeginRenderPass)(cmd_buffer_h,
|
||||
&(VkRenderPassBeginInfo) {
|
||||
.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,
|
||||
.renderPass = device->meta_state.resolve.pass,
|
||||
.framebuffer = fb_h,
|
||||
.renderArea = {
|
||||
.offset = {
|
||||
region->dstOffset.x,
|
||||
region->dstOffset.y,
|
||||
},
|
||||
.extent = {
|
||||
region->extent.width,
|
||||
region->extent.height,
|
||||
}
|
||||
},
|
||||
.clearValueCount = 0,
|
||||
.pClearValues = NULL,
|
||||
},
|
||||
VK_SUBPASS_CONTENTS_INLINE);
|
||||
|
||||
emit_resolve(cmd_buffer,
|
||||
&src_iview,
|
||||
region->srcSubresource.mipLevel,
|
||||
&(VkOffset2D) {
|
||||
.x = region->srcOffset.x,
|
||||
.y = region->srcOffset.y,
|
||||
},
|
||||
&dest_iview,
|
||||
region->dstSubresource.mipLevel,
|
||||
&(VkOffset2D) {
|
||||
.x = region->dstOffset.x,
|
||||
.y = region->dstOffset.y,
|
||||
|
@ -774,6 +772,11 @@ void anv_CmdResolveImage(
|
|||
.width = region->extent.width,
|
||||
.height = region->extent.height,
|
||||
});
|
||||
|
||||
ANV_CALL(CmdEndRenderPass)(cmd_buffer_h);
|
||||
|
||||
anv_DestroyFramebuffer(device_h, fb_h,
|
||||
&cmd_buffer->pool->alloc);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue