anv/blit2d: Customize meta blit structs and functions for blit2d API

* Add fields in meta struct
* Add support in meta init/teardown
* Switch to custom meta_emit_blit2d()

Signed-off-by: Nanley Chery <nanley.g.chery@intel.com>
Reviewed-by: Jason Ekstrand <jason.ekstrand@intel.com>
This commit is contained in:
Nanley Chery
2016-03-09 11:31:49 -08:00
parent 2d8c632117
commit 997a873f0c
3 changed files with 41 additions and 90 deletions

View File

@@ -150,8 +150,14 @@ anv_device_init_meta(struct anv_device *device)
if (result != VK_SUCCESS) if (result != VK_SUCCESS)
goto fail_blit; goto fail_blit;
result = anv_device_init_meta_blit2d_state(device);
if (result != VK_SUCCESS)
goto fail_blit2d;
return VK_SUCCESS; return VK_SUCCESS;
fail_blit2d:
anv_device_finish_meta_blit_state(device);
fail_blit: fail_blit:
anv_device_finish_meta_resolve_state(device); anv_device_finish_meta_resolve_state(device);
fail_resolve: fail_resolve:
@@ -166,4 +172,5 @@ anv_device_finish_meta(struct anv_device *device)
anv_device_finish_meta_resolve_state(device); anv_device_finish_meta_resolve_state(device);
anv_device_finish_meta_clear_state(device); anv_device_finish_meta_clear_state(device);
anv_device_finish_meta_blit_state(device); anv_device_finish_meta_blit_state(device);
anv_device_finish_meta_blit2d_state(device);
} }

View File

@@ -56,15 +56,12 @@ vk_format_for_size(int bs)
static void static void
meta_emit_blit2d(struct anv_cmd_buffer *cmd_buffer, meta_emit_blit2d(struct anv_cmd_buffer *cmd_buffer,
struct anv_image *src_image,
struct anv_image_view *src_iview, struct anv_image_view *src_iview,
VkOffset3D src_offset, VkOffset3D src_offset,
VkExtent3D src_extent, VkExtent3D src_extent,
struct anv_image *dest_image,
struct anv_image_view *dest_iview, struct anv_image_view *dest_iview,
VkOffset3D dest_offset, VkOffset3D dest_offset,
VkExtent3D dest_extent, VkExtent3D dest_extent)
VkFilter blit_filter)
{ {
struct anv_device *device = cmd_buffer->device; struct anv_device *device = cmd_buffer->device;
@@ -73,8 +70,6 @@ meta_emit_blit2d(struct anv_cmd_buffer *cmd_buffer,
float tex_coord[3]; float tex_coord[3];
} *vb_data; } *vb_data;
assert(src_image->samples == dest_image->samples);
unsigned vb_size = sizeof(struct anv_vue_header) + 3 * sizeof(*vb_data); unsigned vb_size = sizeof(struct anv_vue_header) + 3 * sizeof(*vb_data);
struct anv_state vb_state = struct anv_state vb_state =
@@ -144,8 +139,8 @@ meta_emit_blit2d(struct anv_cmd_buffer *cmd_buffer,
ANV_CALL(CreateSampler)(anv_device_to_handle(device), ANV_CALL(CreateSampler)(anv_device_to_handle(device),
&(VkSamplerCreateInfo) { &(VkSamplerCreateInfo) {
.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO, .sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO,
.magFilter = blit_filter, .magFilter = VK_FILTER_NEAREST,
.minFilter = blit_filter, .minFilter = VK_FILTER_NEAREST,
}, &cmd_buffer->pool->alloc, &sampler); }, &cmd_buffer->pool->alloc, &sampler);
VkDescriptorPool desc_pool; VkDescriptorPool desc_pool;
@@ -170,7 +165,7 @@ meta_emit_blit2d(struct anv_cmd_buffer *cmd_buffer,
.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO, .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO,
.descriptorPool = desc_pool, .descriptorPool = desc_pool,
.descriptorSetCount = 1, .descriptorSetCount = 1,
.pSetLayouts = &device->meta_state.blit.ds_layout .pSetLayouts = &device->meta_state.blit2d.ds_layout
}, &set); }, &set);
anv_UpdateDescriptorSets(anv_device_to_handle(device), anv_UpdateDescriptorSets(anv_device_to_handle(device),
@@ -209,7 +204,7 @@ meta_emit_blit2d(struct anv_cmd_buffer *cmd_buffer,
ANV_CALL(CmdBeginRenderPass)(anv_cmd_buffer_to_handle(cmd_buffer), ANV_CALL(CmdBeginRenderPass)(anv_cmd_buffer_to_handle(cmd_buffer),
&(VkRenderPassBeginInfo) { &(VkRenderPassBeginInfo) {
.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, .sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,
.renderPass = device->meta_state.blit.render_pass, .renderPass = device->meta_state.blit2d.render_pass,
.framebuffer = fb, .framebuffer = fb,
.renderArea = { .renderArea = {
.offset = { dest_offset.x, dest_offset.y }, .offset = { dest_offset.x, dest_offset.y },
@@ -219,21 +214,7 @@ meta_emit_blit2d(struct anv_cmd_buffer *cmd_buffer,
.pClearValues = NULL, .pClearValues = NULL,
}, VK_SUBPASS_CONTENTS_INLINE); }, VK_SUBPASS_CONTENTS_INLINE);
VkPipeline pipeline; VkPipeline pipeline = device->meta_state.blit2d.pipeline_2d_src;
switch (src_image->type) {
case VK_IMAGE_TYPE_1D:
pipeline = device->meta_state.blit.pipeline_1d_src;
break;
case VK_IMAGE_TYPE_2D:
pipeline = device->meta_state.blit.pipeline_2d_src;
break;
case VK_IMAGE_TYPE_3D:
pipeline = device->meta_state.blit.pipeline_3d_src;
break;
default:
unreachable(!"bad VkImageType");
}
if (cmd_buffer->state.pipeline != anv_pipeline_from_handle(pipeline)) { if (cmd_buffer->state.pipeline != anv_pipeline_from_handle(pipeline)) {
anv_CmdBindPipeline(anv_cmd_buffer_to_handle(cmd_buffer), anv_CmdBindPipeline(anv_cmd_buffer_to_handle(cmd_buffer),
@@ -252,7 +233,7 @@ meta_emit_blit2d(struct anv_cmd_buffer *cmd_buffer,
anv_CmdBindDescriptorSets(anv_cmd_buffer_to_handle(cmd_buffer), anv_CmdBindDescriptorSets(anv_cmd_buffer_to_handle(cmd_buffer),
VK_PIPELINE_BIND_POINT_GRAPHICS, VK_PIPELINE_BIND_POINT_GRAPHICS,
device->meta_state.blit.pipeline_layout, 0, 1, device->meta_state.blit2d.pipeline_layout, 0, 1,
&set, 0, NULL); &set, 0, NULL);
ANV_CALL(CmdDraw)(anv_cmd_buffer_to_handle(cmd_buffer), 3, 1, 0, 0); ANV_CALL(CmdDraw)(anv_cmd_buffer_to_handle(cmd_buffer), 3, 1, 0, 0);
@@ -410,16 +391,13 @@ anv_meta_blit2d(struct anv_cmd_buffer *cmd_buffer,
&iview_info, cmd_buffer, img_o, dst_usage); &iview_info, cmd_buffer, img_o, dst_usage);
/* Perform blit */ /* Perform blit */
anv_meta_emit_blit(cmd_buffer, meta_emit_blit2d(cmd_buffer,
anv_image_from_handle(src_image),
&src_iview, &src_iview,
src_offset_el, src_offset_el,
(VkExtent3D){rects[r].width, rects[r].height, 1}, (VkExtent3D){rects[r].width, rects[r].height, 1},
anv_image_from_handle(dst_image),
&dst_iview, &dst_iview,
dst_offset_el, dst_offset_el,
(VkExtent3D){rects[r].width, rects[r].height, 1}, (VkExtent3D){rects[r].width, rects[r].height, 1});
VK_FILTER_NEAREST);
anv_DestroyImage(vk_device, src_image, &cmd_buffer->pool->alloc); anv_DestroyImage(vk_device, src_image, &cmd_buffer->pool->alloc);
anv_DestroyImage(vk_device, dst_image, &cmd_buffer->pool->alloc); anv_DestroyImage(vk_device, dst_image, &cmd_buffer->pool->alloc);
@@ -511,22 +489,16 @@ void
anv_device_finish_meta_blit2d_state(struct anv_device *device) anv_device_finish_meta_blit2d_state(struct anv_device *device)
{ {
anv_DestroyRenderPass(anv_device_to_handle(device), anv_DestroyRenderPass(anv_device_to_handle(device),
device->meta_state.blit.render_pass, device->meta_state.blit2d.render_pass,
&device->meta_state.alloc); &device->meta_state.alloc);
anv_DestroyPipeline(anv_device_to_handle(device), anv_DestroyPipeline(anv_device_to_handle(device),
device->meta_state.blit.pipeline_1d_src, device->meta_state.blit2d.pipeline_2d_src,
&device->meta_state.alloc);
anv_DestroyPipeline(anv_device_to_handle(device),
device->meta_state.blit.pipeline_2d_src,
&device->meta_state.alloc);
anv_DestroyPipeline(anv_device_to_handle(device),
device->meta_state.blit.pipeline_3d_src,
&device->meta_state.alloc); &device->meta_state.alloc);
anv_DestroyPipelineLayout(anv_device_to_handle(device), anv_DestroyPipelineLayout(anv_device_to_handle(device),
device->meta_state.blit.pipeline_layout, device->meta_state.blit2d.pipeline_layout,
&device->meta_state.alloc); &device->meta_state.alloc);
anv_DestroyDescriptorSetLayout(anv_device_to_handle(device), anv_DestroyDescriptorSetLayout(anv_device_to_handle(device),
device->meta_state.blit.ds_layout, device->meta_state.blit2d.ds_layout,
&device->meta_state.alloc); &device->meta_state.alloc);
} }
@@ -564,7 +536,7 @@ anv_device_init_meta_blit2d_state(struct anv_device *device)
.pPreserveAttachments = (uint32_t[]) { 0 }, .pPreserveAttachments = (uint32_t[]) { 0 },
}, },
.dependencyCount = 0, .dependencyCount = 0,
}, &device->meta_state.alloc, &device->meta_state.blit.render_pass); }, &device->meta_state.alloc, &device->meta_state.blit2d.render_pass);
if (result != VK_SUCCESS) if (result != VK_SUCCESS)
goto fail; goto fail;
@@ -577,18 +549,10 @@ anv_device_init_meta_blit2d_state(struct anv_device *device)
.nir = build_nir_vertex_shader(), .nir = build_nir_vertex_shader(),
}; };
struct anv_shader_module fs_1d = {
.nir = build_nir_copy_fragment_shader(GLSL_SAMPLER_DIM_1D),
};
struct anv_shader_module fs_2d = { struct anv_shader_module fs_2d = {
.nir = build_nir_copy_fragment_shader(GLSL_SAMPLER_DIM_2D), .nir = build_nir_copy_fragment_shader(GLSL_SAMPLER_DIM_2D),
}; };
struct anv_shader_module fs_3d = {
.nir = build_nir_copy_fragment_shader(GLSL_SAMPLER_DIM_3D),
};
VkPipelineVertexInputStateCreateInfo vi_create_info = { VkPipelineVertexInputStateCreateInfo vi_create_info = {
.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO, .sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO,
.vertexBindingDescriptionCount = 2, .vertexBindingDescriptionCount = 2,
@@ -646,7 +610,7 @@ anv_device_init_meta_blit2d_state(struct anv_device *device)
result = anv_CreateDescriptorSetLayout(anv_device_to_handle(device), result = anv_CreateDescriptorSetLayout(anv_device_to_handle(device),
&ds_layout_info, &ds_layout_info,
&device->meta_state.alloc, &device->meta_state.alloc,
&device->meta_state.blit.ds_layout); &device->meta_state.blit2d.ds_layout);
if (result != VK_SUCCESS) if (result != VK_SUCCESS)
goto fail_render_pass; goto fail_render_pass;
@@ -654,9 +618,9 @@ anv_device_init_meta_blit2d_state(struct anv_device *device)
&(VkPipelineLayoutCreateInfo) { &(VkPipelineLayoutCreateInfo) {
.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, .sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO,
.setLayoutCount = 1, .setLayoutCount = 1,
.pSetLayouts = &device->meta_state.blit.ds_layout, .pSetLayouts = &device->meta_state.blit2d.ds_layout,
}, },
&device->meta_state.alloc, &device->meta_state.blit.pipeline_layout); &device->meta_state.alloc, &device->meta_state.blit2d.pipeline_layout);
if (result != VK_SUCCESS) if (result != VK_SUCCESS)
goto fail_descriptor_set_layout; goto fail_descriptor_set_layout;
@@ -731,8 +695,8 @@ anv_device_init_meta_blit2d_state(struct anv_device *device)
}, },
}, },
.flags = 0, .flags = 0,
.layout = device->meta_state.blit.pipeline_layout, .layout = device->meta_state.blit2d.pipeline_layout,
.renderPass = device->meta_state.blit.render_pass, .renderPass = device->meta_state.blit2d.render_pass,
.subpass = 0, .subpass = 0,
}; };
@@ -745,64 +709,34 @@ anv_device_init_meta_blit2d_state(struct anv_device *device)
.use_rectlist = true .use_rectlist = true
}; };
pipeline_shader_stages[1].module = anv_shader_module_to_handle(&fs_1d);
result = anv_graphics_pipeline_create(anv_device_to_handle(device),
VK_NULL_HANDLE,
&vk_pipeline_info, &anv_pipeline_info,
&device->meta_state.alloc, &device->meta_state.blit.pipeline_1d_src);
if (result != VK_SUCCESS)
goto fail_pipeline_layout;
pipeline_shader_stages[1].module = anv_shader_module_to_handle(&fs_2d); pipeline_shader_stages[1].module = anv_shader_module_to_handle(&fs_2d);
result = anv_graphics_pipeline_create(anv_device_to_handle(device), result = anv_graphics_pipeline_create(anv_device_to_handle(device),
VK_NULL_HANDLE, VK_NULL_HANDLE,
&vk_pipeline_info, &anv_pipeline_info, &vk_pipeline_info, &anv_pipeline_info,
&device->meta_state.alloc, &device->meta_state.blit.pipeline_2d_src); &device->meta_state.alloc, &device->meta_state.blit2d.pipeline_2d_src);
if (result != VK_SUCCESS) if (result != VK_SUCCESS)
goto fail_pipeline_1d; goto fail_pipeline_layout;
pipeline_shader_stages[1].module = anv_shader_module_to_handle(&fs_3d);
result = anv_graphics_pipeline_create(anv_device_to_handle(device),
VK_NULL_HANDLE,
&vk_pipeline_info, &anv_pipeline_info,
&device->meta_state.alloc, &device->meta_state.blit.pipeline_3d_src);
if (result != VK_SUCCESS)
goto fail_pipeline_2d;
ralloc_free(vs.nir); ralloc_free(vs.nir);
ralloc_free(fs_1d.nir);
ralloc_free(fs_2d.nir); ralloc_free(fs_2d.nir);
ralloc_free(fs_3d.nir);
return VK_SUCCESS; return VK_SUCCESS;
fail_pipeline_2d:
anv_DestroyPipeline(anv_device_to_handle(device),
device->meta_state.blit.pipeline_2d_src,
&device->meta_state.alloc);
fail_pipeline_1d:
anv_DestroyPipeline(anv_device_to_handle(device),
device->meta_state.blit.pipeline_1d_src,
&device->meta_state.alloc);
fail_pipeline_layout: fail_pipeline_layout:
anv_DestroyPipelineLayout(anv_device_to_handle(device), anv_DestroyPipelineLayout(anv_device_to_handle(device),
device->meta_state.blit.pipeline_layout, device->meta_state.blit2d.pipeline_layout,
&device->meta_state.alloc); &device->meta_state.alloc);
fail_descriptor_set_layout: fail_descriptor_set_layout:
anv_DestroyDescriptorSetLayout(anv_device_to_handle(device), anv_DestroyDescriptorSetLayout(anv_device_to_handle(device),
device->meta_state.blit.ds_layout, device->meta_state.blit2d.ds_layout,
&device->meta_state.alloc); &device->meta_state.alloc);
fail_render_pass: fail_render_pass:
anv_DestroyRenderPass(anv_device_to_handle(device), anv_DestroyRenderPass(anv_device_to_handle(device),
device->meta_state.blit.render_pass, device->meta_state.blit2d.render_pass,
&device->meta_state.alloc); &device->meta_state.alloc);
ralloc_free(vs.nir); ralloc_free(vs.nir);
ralloc_free(fs_1d.nir);
ralloc_free(fs_2d.nir); ralloc_free(fs_2d.nir);
ralloc_free(fs_3d.nir);
fail: fail:
return result; return result;
} }

View File

@@ -607,6 +607,16 @@ struct anv_meta_state {
VkDescriptorSetLayout ds_layout; VkDescriptorSetLayout ds_layout;
} blit; } blit;
struct {
VkRenderPass render_pass;
/** Pipeline that copies from a 2D image. */
VkPipeline pipeline_2d_src;
VkPipelineLayout pipeline_layout;
VkDescriptorSetLayout ds_layout;
} blit2d;
struct { struct {
/** Pipeline [i] resolves an image with 2^(i+1) samples. */ /** Pipeline [i] resolves an image with 2^(i+1) samples. */
VkPipeline pipelines[MAX_SAMPLES_LOG2]; VkPipeline pipelines[MAX_SAMPLES_LOG2];