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:
@@ -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);
|
||||||
}
|
}
|
||||||
|
@@ -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;
|
||||||
}
|
}
|
||||||
|
@@ -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];
|
||||||
|
Reference in New Issue
Block a user