Path: blob/21.2-virgl/src/amd/vulkan/radv_meta_blit.c
7204 views
/*1* Copyright © 2015 Intel Corporation2*3* Permission is hereby granted, free of charge, to any person obtaining a4* copy of this software and associated documentation files (the "Software"),5* to deal in the Software without restriction, including without limitation6* the rights to use, copy, modify, merge, publish, distribute, sublicense,7* and/or sell copies of the Software, and to permit persons to whom the8* Software is furnished to do so, subject to the following conditions:9*10* The above copyright notice and this permission notice (including the next11* paragraph) shall be included in all copies or substantial portions of the12* Software.13*14* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR15* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,16* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL17* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER18* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING19* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS20* IN THE SOFTWARE.21*/2223#include "nir/nir_builder.h"24#include "radv_meta.h"2526struct blit_region {27VkOffset3D src_offset;28VkExtent3D src_extent;29VkOffset3D dest_offset;30VkExtent3D dest_extent;31};3233static VkResult build_pipeline(struct radv_device *device, VkImageAspectFlagBits aspect,34enum glsl_sampler_dim tex_dim, unsigned fs_key,35VkPipeline *pipeline);3637static nir_shader *38build_nir_vertex_shader(void)39{40const struct glsl_type *vec4 = glsl_vec4_type();41nir_builder b = nir_builder_init_simple_shader(MESA_SHADER_VERTEX, NULL, "meta_blit_vs");4243nir_variable *pos_out = nir_variable_create(b.shader, nir_var_shader_out, vec4, "gl_Position");44pos_out->data.location = VARYING_SLOT_POS;4546nir_variable *tex_pos_out = nir_variable_create(b.shader, nir_var_shader_out, vec4, "v_tex_pos");47tex_pos_out->data.location = VARYING_SLOT_VAR0;48tex_pos_out->data.interpolation = INTERP_MODE_SMOOTH;4950nir_ssa_def *outvec = radv_meta_gen_rect_vertices(&b);5152nir_store_var(&b, pos_out, outvec, 0xf);5354nir_ssa_def *src_box = nir_load_push_constant(&b, 4, 32, nir_imm_int(&b, 0), .range = 16);55nir_ssa_def *src0_z =56nir_load_push_constant(&b, 1, 32, nir_imm_int(&b, 0), .base = 16, .range = 4);5758nir_ssa_def *vertex_id = nir_load_vertex_id_zero_base(&b);5960/* vertex 0 - src0_x, src0_y, src0_z */61/* vertex 1 - src0_x, src1_y, src0_z*/62/* vertex 2 - src1_x, src0_y, src0_z */63/* so channel 0 is vertex_id != 2 ? src_x : src_x + w64channel 1 is vertex id != 1 ? src_y : src_y + w */6566nir_ssa_def *c0cmp = nir_ine(&b, vertex_id, nir_imm_int(&b, 2));67nir_ssa_def *c1cmp = nir_ine(&b, vertex_id, nir_imm_int(&b, 1));6869nir_ssa_def *comp[4];70comp[0] = nir_bcsel(&b, c0cmp, nir_channel(&b, src_box, 0), nir_channel(&b, src_box, 2));7172comp[1] = nir_bcsel(&b, c1cmp, nir_channel(&b, src_box, 1), nir_channel(&b, src_box, 3));73comp[2] = src0_z;74comp[3] = nir_imm_float(&b, 1.0);75nir_ssa_def *out_tex_vec = nir_vec(&b, comp, 4);76nir_store_var(&b, tex_pos_out, out_tex_vec, 0xf);77return b.shader;78}7980static nir_shader *81build_nir_copy_fragment_shader(enum glsl_sampler_dim tex_dim)82{83const struct glsl_type *vec4 = glsl_vec4_type();84nir_builder b =85nir_builder_init_simple_shader(MESA_SHADER_FRAGMENT, NULL, "meta_blit_fs.%d", tex_dim);8687nir_variable *tex_pos_in = nir_variable_create(b.shader, nir_var_shader_in, vec4, "v_tex_pos");88tex_pos_in->data.location = VARYING_SLOT_VAR0;8990/* Swizzle the array index which comes in as Z coordinate into the right91* position.92*/93unsigned swz[] = {0, (tex_dim == GLSL_SAMPLER_DIM_1D ? 2 : 1), 2};94nir_ssa_def *const tex_pos =95nir_swizzle(&b, nir_load_var(&b, tex_pos_in), swz, (tex_dim == GLSL_SAMPLER_DIM_1D ? 2 : 3));9697const struct glsl_type *sampler_type =98glsl_sampler_type(tex_dim, false, tex_dim != GLSL_SAMPLER_DIM_3D, glsl_get_base_type(vec4));99nir_variable *sampler = nir_variable_create(b.shader, nir_var_uniform, sampler_type, "s_tex");100sampler->data.descriptor_set = 0;101sampler->data.binding = 0;102103nir_ssa_def *tex_deref = &nir_build_deref_var(&b, sampler)->dest.ssa;104105nir_tex_instr *tex = nir_tex_instr_create(b.shader, 3);106tex->sampler_dim = tex_dim;107tex->op = nir_texop_tex;108tex->src[0].src_type = nir_tex_src_coord;109tex->src[0].src = nir_src_for_ssa(tex_pos);110tex->src[1].src_type = nir_tex_src_texture_deref;111tex->src[1].src = nir_src_for_ssa(tex_deref);112tex->src[2].src_type = nir_tex_src_sampler_deref;113tex->src[2].src = nir_src_for_ssa(tex_deref);114tex->dest_type = nir_type_float32; /* TODO */115tex->is_array = glsl_sampler_type_is_array(sampler_type);116tex->coord_components = tex_pos->num_components;117118nir_ssa_dest_init(&tex->instr, &tex->dest, 4, 32, "tex");119nir_builder_instr_insert(&b, &tex->instr);120121nir_variable *color_out = nir_variable_create(b.shader, nir_var_shader_out, vec4, "f_color");122color_out->data.location = FRAG_RESULT_DATA0;123nir_store_var(&b, color_out, &tex->dest.ssa, 0xf);124125return b.shader;126}127128static nir_shader *129build_nir_copy_fragment_shader_depth(enum glsl_sampler_dim tex_dim)130{131const struct glsl_type *vec4 = glsl_vec4_type();132nir_builder b =133nir_builder_init_simple_shader(MESA_SHADER_FRAGMENT, NULL, "meta_blit_depth_fs.%d", tex_dim);134135nir_variable *tex_pos_in = nir_variable_create(b.shader, nir_var_shader_in, vec4, "v_tex_pos");136tex_pos_in->data.location = VARYING_SLOT_VAR0;137138/* Swizzle the array index which comes in as Z coordinate into the right139* position.140*/141unsigned swz[] = {0, (tex_dim == GLSL_SAMPLER_DIM_1D ? 2 : 1), 2};142nir_ssa_def *const tex_pos =143nir_swizzle(&b, nir_load_var(&b, tex_pos_in), swz, (tex_dim == GLSL_SAMPLER_DIM_1D ? 2 : 3));144145const struct glsl_type *sampler_type =146glsl_sampler_type(tex_dim, false, tex_dim != GLSL_SAMPLER_DIM_3D, glsl_get_base_type(vec4));147nir_variable *sampler = nir_variable_create(b.shader, nir_var_uniform, sampler_type, "s_tex");148sampler->data.descriptor_set = 0;149sampler->data.binding = 0;150151nir_ssa_def *tex_deref = &nir_build_deref_var(&b, sampler)->dest.ssa;152153nir_tex_instr *tex = nir_tex_instr_create(b.shader, 3);154tex->sampler_dim = tex_dim;155tex->op = nir_texop_tex;156tex->src[0].src_type = nir_tex_src_coord;157tex->src[0].src = nir_src_for_ssa(tex_pos);158tex->src[1].src_type = nir_tex_src_texture_deref;159tex->src[1].src = nir_src_for_ssa(tex_deref);160tex->src[2].src_type = nir_tex_src_sampler_deref;161tex->src[2].src = nir_src_for_ssa(tex_deref);162tex->dest_type = nir_type_float32; /* TODO */163tex->is_array = glsl_sampler_type_is_array(sampler_type);164tex->coord_components = tex_pos->num_components;165166nir_ssa_dest_init(&tex->instr, &tex->dest, 4, 32, "tex");167nir_builder_instr_insert(&b, &tex->instr);168169nir_variable *color_out = nir_variable_create(b.shader, nir_var_shader_out, vec4, "f_color");170color_out->data.location = FRAG_RESULT_DEPTH;171nir_store_var(&b, color_out, &tex->dest.ssa, 0x1);172173return b.shader;174}175176static nir_shader *177build_nir_copy_fragment_shader_stencil(enum glsl_sampler_dim tex_dim)178{179const struct glsl_type *vec4 = glsl_vec4_type();180nir_builder b = nir_builder_init_simple_shader(MESA_SHADER_FRAGMENT, NULL,181"meta_blit_stencil_fs.%d", tex_dim);182183nir_variable *tex_pos_in = nir_variable_create(b.shader, nir_var_shader_in, vec4, "v_tex_pos");184tex_pos_in->data.location = VARYING_SLOT_VAR0;185186/* Swizzle the array index which comes in as Z coordinate into the right187* position.188*/189unsigned swz[] = {0, (tex_dim == GLSL_SAMPLER_DIM_1D ? 2 : 1), 2};190nir_ssa_def *const tex_pos =191nir_swizzle(&b, nir_load_var(&b, tex_pos_in), swz, (tex_dim == GLSL_SAMPLER_DIM_1D ? 2 : 3));192193const struct glsl_type *sampler_type =194glsl_sampler_type(tex_dim, false, tex_dim != GLSL_SAMPLER_DIM_3D, glsl_get_base_type(vec4));195nir_variable *sampler = nir_variable_create(b.shader, nir_var_uniform, sampler_type, "s_tex");196sampler->data.descriptor_set = 0;197sampler->data.binding = 0;198199nir_ssa_def *tex_deref = &nir_build_deref_var(&b, sampler)->dest.ssa;200201nir_tex_instr *tex = nir_tex_instr_create(b.shader, 3);202tex->sampler_dim = tex_dim;203tex->op = nir_texop_tex;204tex->src[0].src_type = nir_tex_src_coord;205tex->src[0].src = nir_src_for_ssa(tex_pos);206tex->src[1].src_type = nir_tex_src_texture_deref;207tex->src[1].src = nir_src_for_ssa(tex_deref);208tex->src[2].src_type = nir_tex_src_sampler_deref;209tex->src[2].src = nir_src_for_ssa(tex_deref);210tex->dest_type = nir_type_float32; /* TODO */211tex->is_array = glsl_sampler_type_is_array(sampler_type);212tex->coord_components = tex_pos->num_components;213214nir_ssa_dest_init(&tex->instr, &tex->dest, 4, 32, "tex");215nir_builder_instr_insert(&b, &tex->instr);216217nir_variable *color_out = nir_variable_create(b.shader, nir_var_shader_out, vec4, "f_color");218color_out->data.location = FRAG_RESULT_STENCIL;219nir_store_var(&b, color_out, &tex->dest.ssa, 0x1);220221return b.shader;222}223224static enum glsl_sampler_dim225translate_sampler_dim(VkImageType type)226{227switch (type) {228case VK_IMAGE_TYPE_1D:229return GLSL_SAMPLER_DIM_1D;230case VK_IMAGE_TYPE_2D:231return GLSL_SAMPLER_DIM_2D;232case VK_IMAGE_TYPE_3D:233return GLSL_SAMPLER_DIM_3D;234default:235unreachable("Unhandled image type");236}237}238239static void240meta_emit_blit(struct radv_cmd_buffer *cmd_buffer, struct radv_image *src_image,241struct radv_image_view *src_iview, VkImageLayout src_image_layout,242float src_offset_0[3], float src_offset_1[3], struct radv_image *dest_image,243struct radv_image_view *dest_iview, VkImageLayout dest_image_layout,244VkOffset2D dest_offset_0, VkOffset2D dest_offset_1, VkRect2D dest_box,245VkSampler sampler)246{247struct radv_device *device = cmd_buffer->device;248uint32_t src_width = radv_minify(src_iview->image->info.width, src_iview->base_mip);249uint32_t src_height = radv_minify(src_iview->image->info.height, src_iview->base_mip);250uint32_t src_depth = radv_minify(src_iview->image->info.depth, src_iview->base_mip);251uint32_t dst_width = radv_minify(dest_iview->image->info.width, dest_iview->base_mip);252uint32_t dst_height = radv_minify(dest_iview->image->info.height, dest_iview->base_mip);253254assert(src_image->info.samples == dest_image->info.samples);255256float vertex_push_constants[5] = {257src_offset_0[0] / (float)src_width, src_offset_0[1] / (float)src_height,258src_offset_1[0] / (float)src_width, src_offset_1[1] / (float)src_height,259src_offset_0[2] / (float)src_depth,260};261262radv_CmdPushConstants(radv_cmd_buffer_to_handle(cmd_buffer),263device->meta_state.blit.pipeline_layout, VK_SHADER_STAGE_VERTEX_BIT, 0, 20,264vertex_push_constants);265266VkFramebuffer fb;267radv_CreateFramebuffer(radv_device_to_handle(device),268&(VkFramebufferCreateInfo){269.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO,270.attachmentCount = 1,271.pAttachments =272(VkImageView[]){273radv_image_view_to_handle(dest_iview),274},275.width = dst_width,276.height = dst_height,277.layers = 1,278},279&cmd_buffer->pool->alloc, &fb);280VkPipeline *pipeline = NULL;281unsigned fs_key = 0;282switch (src_iview->aspect_mask) {283case VK_IMAGE_ASPECT_COLOR_BIT: {284unsigned dst_layout = radv_meta_dst_layout_from_layout(dest_image_layout);285fs_key = radv_format_meta_fs_key(device, dest_image->vk_format);286287radv_cmd_buffer_begin_render_pass(288cmd_buffer,289&(VkRenderPassBeginInfo){290.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,291.renderPass = device->meta_state.blit.render_pass[fs_key][dst_layout],292.framebuffer = fb,293.renderArea =294{295.offset = {dest_box.offset.x, dest_box.offset.y},296.extent = {dest_box.extent.width, dest_box.extent.height},297},298.clearValueCount = 0,299.pClearValues = NULL,300},301NULL);302switch (src_image->type) {303case VK_IMAGE_TYPE_1D:304pipeline = &device->meta_state.blit.pipeline_1d_src[fs_key];305break;306case VK_IMAGE_TYPE_2D:307pipeline = &device->meta_state.blit.pipeline_2d_src[fs_key];308break;309case VK_IMAGE_TYPE_3D:310pipeline = &device->meta_state.blit.pipeline_3d_src[fs_key];311break;312default:313unreachable("bad VkImageType");314}315break;316}317case VK_IMAGE_ASPECT_DEPTH_BIT: {318enum radv_blit_ds_layout ds_layout = radv_meta_blit_ds_to_type(dest_image_layout);319radv_cmd_buffer_begin_render_pass(320cmd_buffer,321&(VkRenderPassBeginInfo){322.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,323.renderPass = device->meta_state.blit.depth_only_rp[ds_layout],324.framebuffer = fb,325.renderArea =326{327.offset = {dest_box.offset.x, dest_box.offset.y},328.extent = {dest_box.extent.width, dest_box.extent.height},329},330.clearValueCount = 0,331.pClearValues = NULL,332},333NULL);334switch (src_image->type) {335case VK_IMAGE_TYPE_1D:336pipeline = &device->meta_state.blit.depth_only_1d_pipeline;337break;338case VK_IMAGE_TYPE_2D:339pipeline = &device->meta_state.blit.depth_only_2d_pipeline;340break;341case VK_IMAGE_TYPE_3D:342pipeline = &device->meta_state.blit.depth_only_3d_pipeline;343break;344default:345unreachable("bad VkImageType");346}347break;348}349case VK_IMAGE_ASPECT_STENCIL_BIT: {350enum radv_blit_ds_layout ds_layout = radv_meta_blit_ds_to_type(dest_image_layout);351radv_cmd_buffer_begin_render_pass(352cmd_buffer,353&(VkRenderPassBeginInfo){354.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,355.renderPass = device->meta_state.blit.stencil_only_rp[ds_layout],356.framebuffer = fb,357.renderArea =358{359.offset = {dest_box.offset.x, dest_box.offset.y},360.extent = {dest_box.extent.width, dest_box.extent.height},361},362.clearValueCount = 0,363.pClearValues = NULL,364},365NULL);366switch (src_image->type) {367case VK_IMAGE_TYPE_1D:368pipeline = &device->meta_state.blit.stencil_only_1d_pipeline;369break;370case VK_IMAGE_TYPE_2D:371pipeline = &device->meta_state.blit.stencil_only_2d_pipeline;372break;373case VK_IMAGE_TYPE_3D:374pipeline = &device->meta_state.blit.stencil_only_3d_pipeline;375break;376default:377unreachable("bad VkImageType");378}379break;380}381default:382unreachable("bad VkImageType");383}384385radv_cmd_buffer_set_subpass(cmd_buffer, &cmd_buffer->state.pass->subpasses[0]);386387if (!*pipeline) {388VkResult ret = build_pipeline(device, src_iview->aspect_mask,389translate_sampler_dim(src_image->type), fs_key, pipeline);390if (ret != VK_SUCCESS) {391cmd_buffer->record_result = ret;392goto fail_pipeline;393}394}395396radv_CmdBindPipeline(radv_cmd_buffer_to_handle(cmd_buffer), VK_PIPELINE_BIND_POINT_GRAPHICS,397*pipeline);398399radv_meta_push_descriptor_set(400cmd_buffer, VK_PIPELINE_BIND_POINT_GRAPHICS, device->meta_state.blit.pipeline_layout,4010, /* set */4021, /* descriptorWriteCount */403(VkWriteDescriptorSet[]){{.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET,404.dstBinding = 0,405.dstArrayElement = 0,406.descriptorCount = 1,407.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,408.pImageInfo = (VkDescriptorImageInfo[]){409{410.sampler = sampler,411.imageView = radv_image_view_to_handle(src_iview),412.imageLayout = VK_IMAGE_LAYOUT_GENERAL,413},414}}});415416radv_CmdSetViewport(radv_cmd_buffer_to_handle(cmd_buffer), 0, 1,417&(VkViewport){.x = dest_offset_0.x,418.y = dest_offset_0.y,419.width = dest_offset_1.x - dest_offset_0.x,420.height = dest_offset_1.y - dest_offset_0.y,421.minDepth = 0.0f,422.maxDepth = 1.0f});423424radv_CmdSetScissor(radv_cmd_buffer_to_handle(cmd_buffer), 0, 1,425&(VkRect2D){426.offset = (VkOffset2D){MIN2(dest_offset_0.x, dest_offset_1.x),427MIN2(dest_offset_0.y, dest_offset_1.y)},428.extent = (VkExtent2D){abs(dest_offset_1.x - dest_offset_0.x),429abs(dest_offset_1.y - dest_offset_0.y)},430});431432radv_CmdDraw(radv_cmd_buffer_to_handle(cmd_buffer), 3, 1, 0, 0);433434fail_pipeline:435radv_cmd_buffer_end_render_pass(cmd_buffer);436437/* At the point where we emit the draw call, all data from the438* descriptor sets, etc. has been used. We are free to delete it.439*/440/* TODO: above comment is not valid for at least descriptor sets/pools,441* as we may not free them till after execution finishes. Check others. */442443radv_DestroyFramebuffer(radv_device_to_handle(device), fb, &cmd_buffer->pool->alloc);444}445446static bool447flip_coords(unsigned *src0, unsigned *src1, unsigned *dst0, unsigned *dst1)448{449bool flip = false;450if (*src0 > *src1) {451unsigned tmp = *src0;452*src0 = *src1;453*src1 = tmp;454flip = !flip;455}456457if (*dst0 > *dst1) {458unsigned tmp = *dst0;459*dst0 = *dst1;460*dst1 = tmp;461flip = !flip;462}463return flip;464}465466static void467blit_image(struct radv_cmd_buffer *cmd_buffer, struct radv_image *src_image,468VkImageLayout src_image_layout, struct radv_image *dst_image,469VkImageLayout dst_image_layout, const VkImageBlit2KHR *region, VkFilter filter)470{471const VkImageSubresourceLayers *src_res = ®ion->srcSubresource;472const VkImageSubresourceLayers *dst_res = ®ion->dstSubresource;473struct radv_device *device = cmd_buffer->device;474struct radv_meta_saved_state saved_state;475bool old_predicating;476VkSampler sampler;477478/* From the Vulkan 1.0 spec:479*480* vkCmdBlitImage must not be used for multisampled source or481* destination images. Use vkCmdResolveImage for this purpose.482*/483assert(src_image->info.samples == 1);484assert(dst_image->info.samples == 1);485486radv_CreateSampler(radv_device_to_handle(device),487&(VkSamplerCreateInfo){488.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO,489.magFilter = filter,490.minFilter = filter,491.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE,492.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE,493.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE,494},495&cmd_buffer->pool->alloc, &sampler);496497radv_meta_save(498&saved_state, cmd_buffer,499RADV_META_SAVE_GRAPHICS_PIPELINE | RADV_META_SAVE_CONSTANTS | RADV_META_SAVE_DESCRIPTORS);500501/* VK_EXT_conditional_rendering says that blit commands should not be502* affected by conditional rendering.503*/504old_predicating = cmd_buffer->state.predicating;505cmd_buffer->state.predicating = false;506507unsigned dst_start, dst_end;508if (dst_image->type == VK_IMAGE_TYPE_3D) {509assert(dst_res->baseArrayLayer == 0);510dst_start = region->dstOffsets[0].z;511dst_end = region->dstOffsets[1].z;512} else {513dst_start = dst_res->baseArrayLayer;514dst_end = dst_start + dst_res->layerCount;515}516517unsigned src_start, src_end;518if (src_image->type == VK_IMAGE_TYPE_3D) {519assert(src_res->baseArrayLayer == 0);520src_start = region->srcOffsets[0].z;521src_end = region->srcOffsets[1].z;522} else {523src_start = src_res->baseArrayLayer;524src_end = src_start + src_res->layerCount;525}526527bool flip_z = flip_coords(&src_start, &src_end, &dst_start, &dst_end);528float src_z_step = (float)(src_end - src_start) / (float)(dst_end - dst_start);529530/* There is no interpolation to the pixel center during531* rendering, so add the 0.5 offset ourselves here. */532float depth_center_offset = 0;533if (src_image->type == VK_IMAGE_TYPE_3D)534depth_center_offset = 0.5 / (dst_end - dst_start) * (src_end - src_start);535536if (flip_z) {537src_start = src_end;538src_z_step *= -1;539depth_center_offset *= -1;540}541542unsigned src_x0 = region->srcOffsets[0].x;543unsigned src_x1 = region->srcOffsets[1].x;544unsigned dst_x0 = region->dstOffsets[0].x;545unsigned dst_x1 = region->dstOffsets[1].x;546547unsigned src_y0 = region->srcOffsets[0].y;548unsigned src_y1 = region->srcOffsets[1].y;549unsigned dst_y0 = region->dstOffsets[0].y;550unsigned dst_y1 = region->dstOffsets[1].y;551552VkRect2D dst_box;553dst_box.offset.x = MIN2(dst_x0, dst_x1);554dst_box.offset.y = MIN2(dst_y0, dst_y1);555dst_box.extent.width = dst_x1 - dst_x0;556dst_box.extent.height = dst_y1 - dst_y0;557558const unsigned num_layers = dst_end - dst_start;559for (unsigned i = 0; i < num_layers; i++) {560struct radv_image_view dst_iview, src_iview;561562const VkOffset2D dst_offset_0 = {563.x = dst_x0,564.y = dst_y0,565};566const VkOffset2D dst_offset_1 = {567.x = dst_x1,568.y = dst_y1,569};570571float src_offset_0[3] = {572src_x0,573src_y0,574src_start + i * src_z_step + depth_center_offset,575};576float src_offset_1[3] = {577src_x1,578src_y1,579src_start + i * src_z_step + depth_center_offset,580};581const uint32_t dst_array_slice = dst_start + i;582583/* 3D images have just 1 layer */584const uint32_t src_array_slice = src_image->type == VK_IMAGE_TYPE_3D ? 0 : src_start + i;585586radv_image_view_init(&dst_iview, cmd_buffer->device,587&(VkImageViewCreateInfo){588.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,589.image = radv_image_to_handle(dst_image),590.viewType = radv_meta_get_view_type(dst_image),591.format = dst_image->vk_format,592.subresourceRange = {.aspectMask = dst_res->aspectMask,593.baseMipLevel = dst_res->mipLevel,594.levelCount = 1,595.baseArrayLayer = dst_array_slice,596.layerCount = 1},597},598NULL);599radv_image_view_init(&src_iview, cmd_buffer->device,600&(VkImageViewCreateInfo){601.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,602.image = radv_image_to_handle(src_image),603.viewType = radv_meta_get_view_type(src_image),604.format = src_image->vk_format,605.subresourceRange = {.aspectMask = src_res->aspectMask,606.baseMipLevel = src_res->mipLevel,607.levelCount = 1,608.baseArrayLayer = src_array_slice,609.layerCount = 1},610},611NULL);612meta_emit_blit(cmd_buffer, src_image, &src_iview, src_image_layout, src_offset_0,613src_offset_1, dst_image, &dst_iview, dst_image_layout, dst_offset_0,614dst_offset_1, dst_box, sampler);615}616617/* Restore conditional rendering. */618cmd_buffer->state.predicating = old_predicating;619620radv_meta_restore(&saved_state, cmd_buffer);621622radv_DestroySampler(radv_device_to_handle(device), sampler, &cmd_buffer->pool->alloc);623}624625void626radv_CmdBlitImage2KHR(VkCommandBuffer commandBuffer, const VkBlitImageInfo2KHR *pBlitImageInfo)627{628RADV_FROM_HANDLE(radv_cmd_buffer, cmd_buffer, commandBuffer);629RADV_FROM_HANDLE(radv_image, src_image, pBlitImageInfo->srcImage);630RADV_FROM_HANDLE(radv_image, dst_image, pBlitImageInfo->dstImage);631632for (unsigned r = 0; r < pBlitImageInfo->regionCount; r++) {633blit_image(cmd_buffer, src_image, pBlitImageInfo->srcImageLayout, dst_image,634pBlitImageInfo->dstImageLayout, &pBlitImageInfo->pRegions[r],635pBlitImageInfo->filter);636}637}638639void640radv_device_finish_meta_blit_state(struct radv_device *device)641{642struct radv_meta_state *state = &device->meta_state;643644for (unsigned i = 0; i < NUM_META_FS_KEYS; ++i) {645for (unsigned j = 0; j < RADV_META_DST_LAYOUT_COUNT; ++j) {646radv_DestroyRenderPass(radv_device_to_handle(device), state->blit.render_pass[i][j],647&state->alloc);648}649radv_DestroyPipeline(radv_device_to_handle(device), state->blit.pipeline_1d_src[i],650&state->alloc);651radv_DestroyPipeline(radv_device_to_handle(device), state->blit.pipeline_2d_src[i],652&state->alloc);653radv_DestroyPipeline(radv_device_to_handle(device), state->blit.pipeline_3d_src[i],654&state->alloc);655}656657for (enum radv_blit_ds_layout i = RADV_BLIT_DS_LAYOUT_TILE_ENABLE; i < RADV_BLIT_DS_LAYOUT_COUNT;658i++) {659radv_DestroyRenderPass(radv_device_to_handle(device), state->blit.depth_only_rp[i],660&state->alloc);661radv_DestroyRenderPass(radv_device_to_handle(device), state->blit.stencil_only_rp[i],662&state->alloc);663}664665radv_DestroyPipeline(radv_device_to_handle(device), state->blit.depth_only_1d_pipeline,666&state->alloc);667radv_DestroyPipeline(radv_device_to_handle(device), state->blit.depth_only_2d_pipeline,668&state->alloc);669radv_DestroyPipeline(radv_device_to_handle(device), state->blit.depth_only_3d_pipeline,670&state->alloc);671672radv_DestroyPipeline(radv_device_to_handle(device), state->blit.stencil_only_1d_pipeline,673&state->alloc);674radv_DestroyPipeline(radv_device_to_handle(device), state->blit.stencil_only_2d_pipeline,675&state->alloc);676radv_DestroyPipeline(radv_device_to_handle(device), state->blit.stencil_only_3d_pipeline,677&state->alloc);678679radv_DestroyPipelineLayout(radv_device_to_handle(device), state->blit.pipeline_layout,680&state->alloc);681radv_DestroyDescriptorSetLayout(radv_device_to_handle(device), state->blit.ds_layout,682&state->alloc);683}684685static VkResult686build_pipeline(struct radv_device *device, VkImageAspectFlagBits aspect,687enum glsl_sampler_dim tex_dim, unsigned fs_key, VkPipeline *pipeline)688{689VkResult result = VK_SUCCESS;690691mtx_lock(&device->meta_state.mtx);692693if (*pipeline) {694mtx_unlock(&device->meta_state.mtx);695return VK_SUCCESS;696}697698nir_shader *fs;699nir_shader *vs = build_nir_vertex_shader();700VkRenderPass rp;701702switch (aspect) {703case VK_IMAGE_ASPECT_COLOR_BIT:704fs = build_nir_copy_fragment_shader(tex_dim);705rp = device->meta_state.blit.render_pass[fs_key][0];706break;707case VK_IMAGE_ASPECT_DEPTH_BIT:708fs = build_nir_copy_fragment_shader_depth(tex_dim);709rp = device->meta_state.blit.depth_only_rp[0];710break;711case VK_IMAGE_ASPECT_STENCIL_BIT:712fs = build_nir_copy_fragment_shader_stencil(tex_dim);713rp = device->meta_state.blit.stencil_only_rp[0];714break;715default:716unreachable("Unhandled aspect");717}718VkPipelineVertexInputStateCreateInfo vi_create_info = {719.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO,720.vertexBindingDescriptionCount = 0,721.vertexAttributeDescriptionCount = 0,722};723724VkPipelineShaderStageCreateInfo pipeline_shader_stages[] = {725{.sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,726.stage = VK_SHADER_STAGE_VERTEX_BIT,727.module = vk_shader_module_handle_from_nir(vs),728.pName = "main",729.pSpecializationInfo = NULL},730{.sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,731.stage = VK_SHADER_STAGE_FRAGMENT_BIT,732.module = vk_shader_module_handle_from_nir(fs),733.pName = "main",734.pSpecializationInfo = NULL},735};736737VkGraphicsPipelineCreateInfo vk_pipeline_info = {738.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO,739.stageCount = ARRAY_SIZE(pipeline_shader_stages),740.pStages = pipeline_shader_stages,741.pVertexInputState = &vi_create_info,742.pInputAssemblyState =743&(VkPipelineInputAssemblyStateCreateInfo){744.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,745.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP,746.primitiveRestartEnable = false,747},748.pViewportState =749&(VkPipelineViewportStateCreateInfo){750.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO,751.viewportCount = 1,752.scissorCount = 1,753},754.pRasterizationState =755&(VkPipelineRasterizationStateCreateInfo){756.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO,757.rasterizerDiscardEnable = false,758.polygonMode = VK_POLYGON_MODE_FILL,759.cullMode = VK_CULL_MODE_NONE,760.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE},761.pMultisampleState =762&(VkPipelineMultisampleStateCreateInfo){763.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO,764.rasterizationSamples = 1,765.sampleShadingEnable = false,766.pSampleMask = (VkSampleMask[]){UINT32_MAX},767},768.pDynamicState =769&(VkPipelineDynamicStateCreateInfo){770.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO,771.dynamicStateCount = 4,772.pDynamicStates =773(VkDynamicState[]){774VK_DYNAMIC_STATE_VIEWPORT,775VK_DYNAMIC_STATE_SCISSOR,776VK_DYNAMIC_STATE_LINE_WIDTH,777VK_DYNAMIC_STATE_BLEND_CONSTANTS,778},779},780.flags = 0,781.layout = device->meta_state.blit.pipeline_layout,782.renderPass = rp,783.subpass = 0,784};785786VkPipelineColorBlendStateCreateInfo color_blend_info = {787.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO,788.attachmentCount = 1,789.pAttachments = (VkPipelineColorBlendAttachmentState[]){790{.colorWriteMask = VK_COLOR_COMPONENT_A_BIT | VK_COLOR_COMPONENT_R_BIT |791VK_COLOR_COMPONENT_G_BIT | VK_COLOR_COMPONENT_B_BIT},792}};793794VkPipelineDepthStencilStateCreateInfo depth_info = {795.sType = VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO,796.depthTestEnable = true,797.depthWriteEnable = true,798.depthCompareOp = VK_COMPARE_OP_ALWAYS,799};800801VkPipelineDepthStencilStateCreateInfo stencil_info = {802.sType = VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO,803.depthTestEnable = false,804.depthWriteEnable = false,805.stencilTestEnable = true,806.front = {.failOp = VK_STENCIL_OP_REPLACE,807.passOp = VK_STENCIL_OP_REPLACE,808.depthFailOp = VK_STENCIL_OP_REPLACE,809.compareOp = VK_COMPARE_OP_ALWAYS,810.compareMask = 0xff,811.writeMask = 0xff,812.reference = 0},813.back = {.failOp = VK_STENCIL_OP_REPLACE,814.passOp = VK_STENCIL_OP_REPLACE,815.depthFailOp = VK_STENCIL_OP_REPLACE,816.compareOp = VK_COMPARE_OP_ALWAYS,817.compareMask = 0xff,818.writeMask = 0xff,819.reference = 0},820.depthCompareOp = VK_COMPARE_OP_ALWAYS,821};822823switch (aspect) {824case VK_IMAGE_ASPECT_COLOR_BIT:825vk_pipeline_info.pColorBlendState = &color_blend_info;826break;827case VK_IMAGE_ASPECT_DEPTH_BIT:828vk_pipeline_info.pDepthStencilState = &depth_info;829break;830case VK_IMAGE_ASPECT_STENCIL_BIT:831vk_pipeline_info.pDepthStencilState = &stencil_info;832break;833default:834unreachable("Unhandled aspect");835}836837const struct radv_graphics_pipeline_create_info radv_pipeline_info = {.use_rectlist = true};838839result = radv_graphics_pipeline_create(840radv_device_to_handle(device), radv_pipeline_cache_to_handle(&device->meta_state.cache),841&vk_pipeline_info, &radv_pipeline_info, &device->meta_state.alloc, pipeline);842ralloc_free(vs);843ralloc_free(fs);844mtx_unlock(&device->meta_state.mtx);845return result;846}847848static VkResult849radv_device_init_meta_blit_color(struct radv_device *device, bool on_demand)850{851VkResult result;852853for (unsigned i = 0; i < NUM_META_FS_KEYS; ++i) {854unsigned key = radv_format_meta_fs_key(device, radv_fs_key_format_exemplars[i]);855for (unsigned j = 0; j < RADV_META_DST_LAYOUT_COUNT; ++j) {856VkImageLayout layout = radv_meta_dst_layout_to_layout(j);857result = radv_CreateRenderPass2(858radv_device_to_handle(device),859&(VkRenderPassCreateInfo2){860.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO_2,861.attachmentCount = 1,862.pAttachments =863&(VkAttachmentDescription2){864.sType = VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_2,865.format = radv_fs_key_format_exemplars[i],866.loadOp = VK_ATTACHMENT_LOAD_OP_LOAD,867.storeOp = VK_ATTACHMENT_STORE_OP_STORE,868.initialLayout = layout,869.finalLayout = layout,870},871.subpassCount = 1,872.pSubpasses =873&(VkSubpassDescription2){874.sType = VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_2,875.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS,876.inputAttachmentCount = 0,877.colorAttachmentCount = 1,878.pColorAttachments =879&(VkAttachmentReference2){880.sType = VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_2,881.attachment = 0,882.layout = layout,883},884.pResolveAttachments = NULL,885.pDepthStencilAttachment =886&(VkAttachmentReference2){887.sType = VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_2,888.attachment = VK_ATTACHMENT_UNUSED,889.layout = VK_IMAGE_LAYOUT_GENERAL,890},891.preserveAttachmentCount = 0,892.pPreserveAttachments = NULL,893},894.dependencyCount = 2,895.pDependencies =896(VkSubpassDependency2[]){{.sType = VK_STRUCTURE_TYPE_SUBPASS_DEPENDENCY_2,897.srcSubpass = VK_SUBPASS_EXTERNAL,898.dstSubpass = 0,899.srcStageMask = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,900.dstStageMask = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT,901.srcAccessMask = 0,902.dstAccessMask = 0,903.dependencyFlags = 0},904{.sType = VK_STRUCTURE_TYPE_SUBPASS_DEPENDENCY_2,905.srcSubpass = 0,906.dstSubpass = VK_SUBPASS_EXTERNAL,907.srcStageMask = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,908.dstStageMask = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT,909.srcAccessMask = 0,910.dstAccessMask = 0,911.dependencyFlags = 0}},912},913&device->meta_state.alloc, &device->meta_state.blit.render_pass[key][j]);914if (result != VK_SUCCESS)915goto fail;916}917918if (on_demand)919continue;920921result = build_pipeline(device, VK_IMAGE_ASPECT_COLOR_BIT, GLSL_SAMPLER_DIM_1D, key,922&device->meta_state.blit.pipeline_1d_src[key]);923if (result != VK_SUCCESS)924goto fail;925926result = build_pipeline(device, VK_IMAGE_ASPECT_COLOR_BIT, GLSL_SAMPLER_DIM_2D, key,927&device->meta_state.blit.pipeline_2d_src[key]);928if (result != VK_SUCCESS)929goto fail;930931result = build_pipeline(device, VK_IMAGE_ASPECT_COLOR_BIT, GLSL_SAMPLER_DIM_3D, key,932&device->meta_state.blit.pipeline_3d_src[key]);933if (result != VK_SUCCESS)934goto fail;935}936937result = VK_SUCCESS;938fail:939return result;940}941942static VkResult943radv_device_init_meta_blit_depth(struct radv_device *device, bool on_demand)944{945VkResult result;946947for (enum radv_blit_ds_layout ds_layout = RADV_BLIT_DS_LAYOUT_TILE_ENABLE;948ds_layout < RADV_BLIT_DS_LAYOUT_COUNT; ds_layout++) {949VkImageLayout layout = radv_meta_blit_ds_to_layout(ds_layout);950result = radv_CreateRenderPass2(951radv_device_to_handle(device),952&(VkRenderPassCreateInfo2){953.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO_2,954.attachmentCount = 1,955.pAttachments =956&(VkAttachmentDescription2){957.sType = VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_2,958.format = VK_FORMAT_D32_SFLOAT,959.loadOp = VK_ATTACHMENT_LOAD_OP_LOAD,960.storeOp = VK_ATTACHMENT_STORE_OP_STORE,961.initialLayout = layout,962.finalLayout = layout,963},964.subpassCount = 1,965.pSubpasses =966&(VkSubpassDescription2){967.sType = VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_2,968.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS,969.inputAttachmentCount = 0,970.colorAttachmentCount = 0,971.pColorAttachments = NULL,972.pResolveAttachments = NULL,973.pDepthStencilAttachment =974&(VkAttachmentReference2){975.sType = VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_2,976.attachment = 0,977.layout = layout,978},979.preserveAttachmentCount = 0,980.pPreserveAttachments = NULL,981},982.dependencyCount = 2,983.pDependencies =984(VkSubpassDependency2[]){{.sType = VK_STRUCTURE_TYPE_SUBPASS_DEPENDENCY_2,985.srcSubpass = VK_SUBPASS_EXTERNAL,986.dstSubpass = 0,987.srcStageMask = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,988.dstStageMask = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT,989.srcAccessMask = 0,990.dstAccessMask = 0,991.dependencyFlags = 0},992{.sType = VK_STRUCTURE_TYPE_SUBPASS_DEPENDENCY_2,993.srcSubpass = 0,994.dstSubpass = VK_SUBPASS_EXTERNAL,995.srcStageMask = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,996.dstStageMask = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT,997.srcAccessMask = 0,998.dstAccessMask = 0,999.dependencyFlags = 0}},1000},1001&device->meta_state.alloc, &device->meta_state.blit.depth_only_rp[ds_layout]);1002if (result != VK_SUCCESS)1003goto fail;1004}10051006if (on_demand)1007return VK_SUCCESS;10081009result = build_pipeline(device, VK_IMAGE_ASPECT_DEPTH_BIT, GLSL_SAMPLER_DIM_1D, 0,1010&device->meta_state.blit.depth_only_1d_pipeline);1011if (result != VK_SUCCESS)1012goto fail;10131014result = build_pipeline(device, VK_IMAGE_ASPECT_DEPTH_BIT, GLSL_SAMPLER_DIM_2D, 0,1015&device->meta_state.blit.depth_only_2d_pipeline);1016if (result != VK_SUCCESS)1017goto fail;10181019result = build_pipeline(device, VK_IMAGE_ASPECT_DEPTH_BIT, GLSL_SAMPLER_DIM_3D, 0,1020&device->meta_state.blit.depth_only_3d_pipeline);1021if (result != VK_SUCCESS)1022goto fail;10231024fail:1025return result;1026}10271028static VkResult1029radv_device_init_meta_blit_stencil(struct radv_device *device, bool on_demand)1030{1031VkResult result;10321033for (enum radv_blit_ds_layout ds_layout = RADV_BLIT_DS_LAYOUT_TILE_ENABLE;1034ds_layout < RADV_BLIT_DS_LAYOUT_COUNT; ds_layout++) {1035VkImageLayout layout = radv_meta_blit_ds_to_layout(ds_layout);1036result = radv_CreateRenderPass2(1037radv_device_to_handle(device),1038&(VkRenderPassCreateInfo2){1039.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO_2,1040.attachmentCount = 1,1041.pAttachments =1042&(VkAttachmentDescription2){1043.sType = VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_2,1044.format = VK_FORMAT_S8_UINT,1045.loadOp = VK_ATTACHMENT_LOAD_OP_LOAD,1046.storeOp = VK_ATTACHMENT_STORE_OP_STORE,1047.initialLayout = layout,1048.finalLayout = layout,1049},1050.subpassCount = 1,1051.pSubpasses =1052&(VkSubpassDescription2){1053.sType = VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_2,1054.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS,1055.inputAttachmentCount = 0,1056.colorAttachmentCount = 0,1057.pColorAttachments = NULL,1058.pResolveAttachments = NULL,1059.pDepthStencilAttachment =1060&(VkAttachmentReference2){1061.sType = VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_2,1062.attachment = 0,1063.layout = layout,1064},1065.preserveAttachmentCount = 0,1066.pPreserveAttachments = NULL,1067},1068.dependencyCount = 2,1069.pDependencies =1070(VkSubpassDependency2[]){{.sType = VK_STRUCTURE_TYPE_SUBPASS_DEPENDENCY_2,1071.srcSubpass = VK_SUBPASS_EXTERNAL,1072.dstSubpass = 0,1073.srcStageMask = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,1074.dstStageMask = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT,1075.srcAccessMask = 0,1076.dstAccessMask = 0,1077.dependencyFlags = 0},1078{.sType = VK_STRUCTURE_TYPE_SUBPASS_DEPENDENCY_2,1079.srcSubpass = 0,1080.dstSubpass = VK_SUBPASS_EXTERNAL,1081.srcStageMask = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,1082.dstStageMask = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT,1083.srcAccessMask = 0,1084.dstAccessMask = 0,1085.dependencyFlags = 0}},10861087},1088&device->meta_state.alloc, &device->meta_state.blit.stencil_only_rp[ds_layout]);1089}1090if (result != VK_SUCCESS)1091goto fail;10921093if (on_demand)1094return VK_SUCCESS;10951096result = build_pipeline(device, VK_IMAGE_ASPECT_STENCIL_BIT, GLSL_SAMPLER_DIM_1D, 0,1097&device->meta_state.blit.stencil_only_1d_pipeline);1098if (result != VK_SUCCESS)1099goto fail;11001101result = build_pipeline(device, VK_IMAGE_ASPECT_STENCIL_BIT, GLSL_SAMPLER_DIM_2D, 0,1102&device->meta_state.blit.stencil_only_2d_pipeline);1103if (result != VK_SUCCESS)1104goto fail;11051106result = build_pipeline(device, VK_IMAGE_ASPECT_STENCIL_BIT, GLSL_SAMPLER_DIM_3D, 0,1107&device->meta_state.blit.stencil_only_3d_pipeline);1108if (result != VK_SUCCESS)1109goto fail;11101111fail:1112return result;1113}11141115VkResult1116radv_device_init_meta_blit_state(struct radv_device *device, bool on_demand)1117{1118VkResult result;11191120VkDescriptorSetLayoutCreateInfo ds_layout_info = {1121.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO,1122.flags = VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR,1123.bindingCount = 1,1124.pBindings = (VkDescriptorSetLayoutBinding[]){1125{.binding = 0,1126.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,1127.descriptorCount = 1,1128.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT,1129.pImmutableSamplers = NULL},1130}};1131result =1132radv_CreateDescriptorSetLayout(radv_device_to_handle(device), &ds_layout_info,1133&device->meta_state.alloc, &device->meta_state.blit.ds_layout);1134if (result != VK_SUCCESS)1135goto fail;11361137const VkPushConstantRange push_constant_range = {VK_SHADER_STAGE_VERTEX_BIT, 0, 20};11381139result = radv_CreatePipelineLayout(radv_device_to_handle(device),1140&(VkPipelineLayoutCreateInfo){1141.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO,1142.setLayoutCount = 1,1143.pSetLayouts = &device->meta_state.blit.ds_layout,1144.pushConstantRangeCount = 1,1145.pPushConstantRanges = &push_constant_range,1146},1147&device->meta_state.alloc,1148&device->meta_state.blit.pipeline_layout);1149if (result != VK_SUCCESS)1150goto fail;11511152result = radv_device_init_meta_blit_color(device, on_demand);1153if (result != VK_SUCCESS)1154goto fail;11551156result = radv_device_init_meta_blit_depth(device, on_demand);1157if (result != VK_SUCCESS)1158goto fail;11591160result = radv_device_init_meta_blit_stencil(device, on_demand);11611162fail:1163if (result != VK_SUCCESS)1164radv_device_finish_meta_blit_state(device);1165return result;1166}116711681169