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
|
static void
|
||||||
emit_resolve(struct anv_cmd_buffer *cmd_buffer,
|
emit_resolve(struct anv_cmd_buffer *cmd_buffer,
|
||||||
struct anv_image_view *src_iview,
|
struct anv_image_view *src_iview,
|
||||||
uint32_t src_level,
|
|
||||||
const VkOffset2D *src_offset,
|
const VkOffset2D *src_offset,
|
||||||
struct anv_image_view *dest_iview,
|
struct anv_image_view *dest_iview,
|
||||||
uint32_t dest_level,
|
|
||||||
const VkOffset2D *dest_offset,
|
const VkOffset2D *dest_offset,
|
||||||
const VkExtent2D *resolve_extent)
|
const VkExtent2D *resolve_extent)
|
||||||
{
|
{
|
||||||
struct anv_device *device = cmd_buffer->device;
|
struct anv_device *device = cmd_buffer->device;
|
||||||
VkDevice device_h = anv_device_to_handle(device);
|
VkDevice device_h = anv_device_to_handle(device);
|
||||||
VkCommandBuffer cmd_buffer_h = anv_cmd_buffer_to_handle(cmd_buffer);
|
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 *src_image = src_iview->image;
|
||||||
const struct anv_image *dest_image = dest_iview->image;
|
|
||||||
VkDescriptorPool dummy_desc_pool_h = (VkDescriptorPool) 1;
|
VkDescriptorPool dummy_desc_pool_h = (VkDescriptorPool) 1;
|
||||||
uint32_t samples_log2 = ffs(src_image->samples) - 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] = {
|
const struct vertex_attrs vertex_data[3] = {
|
||||||
{
|
{
|
||||||
.vue_header = {0},
|
.vue_header = {0},
|
||||||
|
@ -581,35 +574,6 @@ emit_resolve(struct anv_cmd_buffer *cmd_buffer,
|
||||||
/*copyCount*/ 0,
|
/*copyCount*/ 0,
|
||||||
/*copies */ NULL);
|
/*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,
|
ANV_CALL(CmdSetViewport)(cmd_buffer_h,
|
||||||
/*firstViewport*/ 0,
|
/*firstViewport*/ 0,
|
||||||
/*viewportCount*/ 1,
|
/*viewportCount*/ 1,
|
||||||
|
@ -617,8 +581,8 @@ emit_resolve(struct anv_cmd_buffer *cmd_buffer,
|
||||||
{
|
{
|
||||||
.x = 0,
|
.x = 0,
|
||||||
.y = 0,
|
.y = 0,
|
||||||
.width = dest_iview_extent.width,
|
.width = fb->width,
|
||||||
.height = dest_iview_extent.height,
|
.height = fb->height,
|
||||||
.minDepth = 0.0,
|
.minDepth = 0.0,
|
||||||
.maxDepth = 1.0,
|
.maxDepth = 1.0,
|
||||||
},
|
},
|
||||||
|
@ -630,7 +594,7 @@ emit_resolve(struct anv_cmd_buffer *cmd_buffer,
|
||||||
(VkRect2D[]) {
|
(VkRect2D[]) {
|
||||||
{
|
{
|
||||||
.offset = { 0, 0 },
|
.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);
|
/*copies */ NULL);
|
||||||
|
|
||||||
ANV_CALL(CmdDraw)(cmd_buffer_h, 3, 1, 0, 0);
|
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
|
/* All objects below are consumed by the draw call. We may safely destroy
|
||||||
* them.
|
* them.
|
||||||
|
@ -662,8 +625,6 @@ emit_resolve(struct anv_cmd_buffer *cmd_buffer,
|
||||||
anv_descriptor_set_destroy(device, desc_set);
|
anv_descriptor_set_destroy(device, desc_set);
|
||||||
anv_DestroySampler(device_h, sampler_h,
|
anv_DestroySampler(device_h, sampler_h,
|
||||||
&cmd_buffer->pool->alloc);
|
&cmd_buffer->pool->alloc);
|
||||||
anv_DestroyFramebuffer(device_h, fb_h,
|
|
||||||
&cmd_buffer->pool->alloc);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void anv_CmdResolveImage(
|
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_cmd_buffer, cmd_buffer, cmd_buffer_h);
|
||||||
ANV_FROM_HANDLE(anv_image, src_image, src_image_h);
|
ANV_FROM_HANDLE(anv_image, src_image, src_image_h);
|
||||||
ANV_FROM_HANDLE(anv_image, dest_image, dest_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;
|
struct anv_meta_saved_state state;
|
||||||
|
VkDevice device_h = anv_device_to_handle(device);
|
||||||
|
|
||||||
anv_meta_save(&state, cmd_buffer, 0);
|
anv_meta_save(&state, cmd_buffer, 0);
|
||||||
|
|
||||||
|
@ -757,15 +720,50 @@ void anv_CmdResolveImage(
|
||||||
},
|
},
|
||||||
cmd_buffer, 0);
|
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,
|
emit_resolve(cmd_buffer,
|
||||||
&src_iview,
|
&src_iview,
|
||||||
region->srcSubresource.mipLevel,
|
|
||||||
&(VkOffset2D) {
|
&(VkOffset2D) {
|
||||||
.x = region->srcOffset.x,
|
.x = region->srcOffset.x,
|
||||||
.y = region->srcOffset.y,
|
.y = region->srcOffset.y,
|
||||||
},
|
},
|
||||||
&dest_iview,
|
&dest_iview,
|
||||||
region->dstSubresource.mipLevel,
|
|
||||||
&(VkOffset2D) {
|
&(VkOffset2D) {
|
||||||
.x = region->dstOffset.x,
|
.x = region->dstOffset.x,
|
||||||
.y = region->dstOffset.y,
|
.y = region->dstOffset.y,
|
||||||
|
@ -774,6 +772,11 @@ void anv_CmdResolveImage(
|
||||||
.width = region->extent.width,
|
.width = region->extent.width,
|
||||||
.height = region->extent.height,
|
.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