anv/blit2d: Inline meta_emit_blit2d

Reviewed-by: Nanley Chery <nanley.g.chery@intel.com>
This commit is contained in:
Jason Ekstrand
2016-03-30 11:51:50 -07:00
parent b0a6cfb9b4
commit 5187ab05b8

View File

@@ -129,16 +129,40 @@ create_iview(struct anv_cmd_buffer *cmd_buffer,
}, cmd_buffer, img_o, usage); }, cmd_buffer, img_o, usage);
} }
static void void
meta_emit_blit2d(struct anv_cmd_buffer *cmd_buffer, anv_meta_end_blit2d(struct anv_cmd_buffer *cmd_buffer,
struct anv_image_view *src_iview, struct anv_meta_saved_state *save)
uint32_t src_pitch, {
VkOffset3D src_offset, anv_meta_restore(save, cmd_buffer);
struct anv_image_view *dest_iview, }
VkOffset3D dest_offset,
VkExtent3D extent) void
anv_meta_begin_blit2d(struct anv_cmd_buffer *cmd_buffer,
struct anv_meta_saved_state *save)
{
anv_meta_save(save, cmd_buffer,
(1 << VK_DYNAMIC_STATE_VIEWPORT));
}
void
anv_meta_blit2d(struct anv_cmd_buffer *cmd_buffer,
struct anv_meta_blit2d_surf *src,
struct anv_meta_blit2d_surf *dst,
unsigned num_rects,
struct anv_meta_blit2d_rect *rects)
{ {
struct anv_device *device = cmd_buffer->device; struct anv_device *device = cmd_buffer->device;
VkDevice vk_device = anv_device_to_handle(cmd_buffer->device);
VkImageUsageFlags src_usage = VK_IMAGE_USAGE_SAMPLED_BIT;
VkImageUsageFlags dst_usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
for (unsigned r = 0; r < num_rects; ++r) {
VkImage src_img;
VkImage dst_img;
struct anv_image_view src_iview;
struct anv_image_view dst_iview;
create_iview(cmd_buffer, src, &rects[r], src_usage, &src_img, &src_iview);
create_iview(cmd_buffer, dst, &rects[r], dst_usage, &dst_img, &dst_iview);
struct blit_vb_data { struct blit_vb_data {
float pos[2]; float pos[2];
@@ -154,37 +178,37 @@ meta_emit_blit2d(struct anv_cmd_buffer *cmd_buffer,
vb_data[0] = (struct blit_vb_data) { vb_data[0] = (struct blit_vb_data) {
.pos = { .pos = {
dest_offset.x + extent.width, rects[r].dst_x + rects[r].width,
dest_offset.y + extent.height, rects[r].dst_y + rects[r].height,
}, },
.tex_coord = { .tex_coord = {
src_offset.x + extent.width, rects[r].src_x + rects[r].width,
src_offset.y + extent.height, rects[r].src_y + rects[r].height,
src_pitch, src->pitch,
}, },
}; };
vb_data[1] = (struct blit_vb_data) { vb_data[1] = (struct blit_vb_data) {
.pos = { .pos = {
dest_offset.x, rects[r].dst_x,
dest_offset.y + extent.height, rects[r].dst_y + rects[r].height,
}, },
.tex_coord = { .tex_coord = {
src_offset.x, rects[r].src_x,
src_offset.y + extent.height, rects[r].src_y + rects[r].height,
src_pitch, src->pitch,
}, },
}; };
vb_data[2] = (struct blit_vb_data) { vb_data[2] = (struct blit_vb_data) {
.pos = { .pos = {
dest_offset.x, rects[r].dst_x,
dest_offset.y, rects[r].dst_y,
}, },
.tex_coord = { .tex_coord = {
src_offset.x, rects[r].src_x,
src_offset.y, rects[r].src_y,
src_pitch, src->pitch,
}, },
}; };
@@ -208,7 +232,7 @@ meta_emit_blit2d(struct anv_cmd_buffer *cmd_buffer,
}); });
VkDescriptorPool desc_pool; VkDescriptorPool desc_pool;
anv_CreateDescriptorPool(anv_device_to_handle(device), anv_CreateDescriptorPool(vk_device,
&(const VkDescriptorPoolCreateInfo) { &(const VkDescriptorPoolCreateInfo) {
.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO, .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO,
.pNext = NULL, .pNext = NULL,
@@ -224,7 +248,7 @@ meta_emit_blit2d(struct anv_cmd_buffer *cmd_buffer,
}, &cmd_buffer->pool->alloc, &desc_pool); }, &cmd_buffer->pool->alloc, &desc_pool);
VkDescriptorSet set; VkDescriptorSet set;
anv_AllocateDescriptorSets(anv_device_to_handle(device), anv_AllocateDescriptorSets(vk_device,
&(VkDescriptorSetAllocateInfo) { &(VkDescriptorSetAllocateInfo) {
.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO, .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO,
.descriptorPool = desc_pool, .descriptorPool = desc_pool,
@@ -232,7 +256,7 @@ meta_emit_blit2d(struct anv_cmd_buffer *cmd_buffer,
.pSetLayouts = &device->meta_state.blit2d.ds_layout .pSetLayouts = &device->meta_state.blit2d.ds_layout
}, &set); }, &set);
anv_UpdateDescriptorSets(anv_device_to_handle(device), anv_UpdateDescriptorSets(vk_device,
1, /* writeCount */ 1, /* writeCount */
(VkWriteDescriptorSet[]) { (VkWriteDescriptorSet[]) {
{ {
@@ -245,7 +269,7 @@ meta_emit_blit2d(struct anv_cmd_buffer *cmd_buffer,
.pImageInfo = (VkDescriptorImageInfo[]) { .pImageInfo = (VkDescriptorImageInfo[]) {
{ {
.sampler = NULL, .sampler = NULL,
.imageView = anv_image_view_to_handle(src_iview), .imageView = anv_image_view_to_handle(&src_iview),
.imageLayout = VK_IMAGE_LAYOUT_GENERAL, .imageLayout = VK_IMAGE_LAYOUT_GENERAL,
}, },
} }
@@ -253,15 +277,15 @@ meta_emit_blit2d(struct anv_cmd_buffer *cmd_buffer,
}, 0, NULL); }, 0, NULL);
VkFramebuffer fb; VkFramebuffer fb;
anv_CreateFramebuffer(anv_device_to_handle(device), anv_CreateFramebuffer(vk_device,
&(VkFramebufferCreateInfo) { &(VkFramebufferCreateInfo) {
.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, .sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO,
.attachmentCount = 1, .attachmentCount = 1,
.pAttachments = (VkImageView[]) { .pAttachments = (VkImageView[]) {
anv_image_view_to_handle(dest_iview), anv_image_view_to_handle(&dst_iview),
}, },
.width = dest_iview->extent.width, .width = dst_iview.extent.width,
.height = dest_iview->extent.height, .height = dst_iview.extent.height,
.layers = 1 .layers = 1
}, &cmd_buffer->pool->alloc, &fb); }, &cmd_buffer->pool->alloc, &fb);
@@ -271,8 +295,8 @@ meta_emit_blit2d(struct anv_cmd_buffer *cmd_buffer,
.renderPass = device->meta_state.blit2d.render_pass, .renderPass = device->meta_state.blit2d.render_pass,
.framebuffer = fb, .framebuffer = fb,
.renderArea = { .renderArea = {
.offset = { dest_offset.x, dest_offset.y }, .offset = { rects[r].dst_x, rects[r].dst_y, },
.extent = { extent.width, extent.height }, .extent = { rects[r].width, rects[r].height },
}, },
.clearValueCount = 0, .clearValueCount = 0,
.pClearValues = NULL, .pClearValues = NULL,
@@ -289,8 +313,8 @@ meta_emit_blit2d(struct anv_cmd_buffer *cmd_buffer,
&(VkViewport) { &(VkViewport) {
.x = 0.0f, .x = 0.0f,
.y = 0.0f, .y = 0.0f,
.width = dest_iview->extent.width, .width = dst_iview.extent.width,
.height = dest_iview->extent.height, .height = dst_iview.extent.height,
.minDepth = 0.0f, .minDepth = 0.0f,
.maxDepth = 1.0f, .maxDepth = 1.0f,
}); });
@@ -307,53 +331,8 @@ meta_emit_blit2d(struct anv_cmd_buffer *cmd_buffer,
/* At the point where we emit the draw call, all data from the /* At the point where we emit the draw call, all data from the
* descriptor sets, etc. has been used. We are free to delete it. * descriptor sets, etc. has been used. We are free to delete it.
*/ */
anv_DestroyDescriptorPool(anv_device_to_handle(device), anv_DestroyDescriptorPool(vk_device, desc_pool, &cmd_buffer->pool->alloc);
desc_pool, &cmd_buffer->pool->alloc); anv_DestroyFramebuffer(vk_device, fb, &cmd_buffer->pool->alloc);
anv_DestroyFramebuffer(anv_device_to_handle(device), fb,
&cmd_buffer->pool->alloc);
}
void
anv_meta_end_blit2d(struct anv_cmd_buffer *cmd_buffer,
struct anv_meta_saved_state *save)
{
anv_meta_restore(save, cmd_buffer);
}
void
anv_meta_begin_blit2d(struct anv_cmd_buffer *cmd_buffer,
struct anv_meta_saved_state *save)
{
anv_meta_save(save, cmd_buffer,
(1 << VK_DYNAMIC_STATE_VIEWPORT));
}
void
anv_meta_blit2d(struct anv_cmd_buffer *cmd_buffer,
struct anv_meta_blit2d_surf *src,
struct anv_meta_blit2d_surf *dst,
unsigned num_rects,
struct anv_meta_blit2d_rect *rects)
{
VkDevice vk_device = anv_device_to_handle(cmd_buffer->device);
VkImageUsageFlags src_usage = VK_IMAGE_USAGE_SAMPLED_BIT;
VkImageUsageFlags dst_usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
for (unsigned r = 0; r < num_rects; ++r) {
VkImage src_img;
VkImage dst_img;
struct anv_image_view src_iview;
struct anv_image_view dst_iview;
create_iview(cmd_buffer, src, &rects[r], src_usage, &src_img, &src_iview);
create_iview(cmd_buffer, dst, &rects[r], dst_usage, &dst_img, &dst_iview);
/* Perform blit */
meta_emit_blit2d(cmd_buffer,
&src_iview, src->pitch,
(VkOffset3D){rects[r].src_x, rects[r].src_y, 0},
&dst_iview,
(VkOffset3D){rects[r].dst_x, rects[r].dst_y, 0},
(VkExtent3D){rects[r].width, rects[r].height, 1});
anv_DestroyImage(vk_device, src_img, &cmd_buffer->pool->alloc); anv_DestroyImage(vk_device, src_img, &cmd_buffer->pool->alloc);
anv_DestroyImage(vk_device, dst_img, &cmd_buffer->pool->alloc); anv_DestroyImage(vk_device, dst_img, &cmd_buffer->pool->alloc);