Path: blob/21.2-virgl/src/amd/vulkan/radv_meta_blit2d.c
7233 views
/*1* Copyright © 2016 Red Hat2*3* based on anv driver:4* Copyright © 2016 Intel Corporation5*6* Permission is hereby granted, free of charge, to any person obtaining a7* copy of this software and associated documentation files (the "Software"),8* to deal in the Software without restriction, including without limitation9* the rights to use, copy, modify, merge, publish, distribute, sublicense,10* and/or sell copies of the Software, and to permit persons to whom the11* Software is furnished to do so, subject to the following conditions:12*13* The above copyright notice and this permission notice (including the next14* paragraph) shall be included in all copies or substantial portions of the15* Software.16*17* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR18* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,19* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL20* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER21* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING22* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS23* IN THE SOFTWARE.24*/2526#include "nir/nir_builder.h"27#include "radv_meta.h"28#include "vk_format.h"2930enum blit2d_src_type {31BLIT2D_SRC_TYPE_IMAGE,32BLIT2D_SRC_TYPE_IMAGE_3D,33BLIT2D_SRC_TYPE_BUFFER,34BLIT2D_NUM_SRC_TYPES,35};3637static VkResult blit2d_init_color_pipeline(struct radv_device *device,38enum blit2d_src_type src_type, VkFormat format,39uint32_t log2_samples);4041static VkResult blit2d_init_depth_only_pipeline(struct radv_device *device,42enum blit2d_src_type src_type,43uint32_t log2_samples);4445static VkResult blit2d_init_stencil_only_pipeline(struct radv_device *device,46enum blit2d_src_type src_type,47uint32_t log2_samples);4849static void50create_iview(struct radv_cmd_buffer *cmd_buffer, struct radv_meta_blit2d_surf *surf,51struct radv_image_view *iview, VkFormat depth_format, VkImageAspectFlagBits aspects)52{53VkFormat format;54VkImageViewType view_type = cmd_buffer->device->physical_device->rad_info.chip_class < GFX955? VK_IMAGE_VIEW_TYPE_2D56: radv_meta_get_view_type(surf->image);5758if (depth_format)59format = depth_format;60else61format = surf->format;6263radv_image_view_init(iview, cmd_buffer->device,64&(VkImageViewCreateInfo){65.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,66.image = radv_image_to_handle(surf->image),67.viewType = view_type,68.format = format,69.subresourceRange = {.aspectMask = aspects,70.baseMipLevel = surf->level,71.levelCount = 1,72.baseArrayLayer = surf->layer,73.layerCount = 1},74},75NULL);76}7778static void79create_bview(struct radv_cmd_buffer *cmd_buffer, struct radv_meta_blit2d_buffer *src,80struct radv_buffer_view *bview, VkFormat depth_format)81{82VkFormat format;8384if (depth_format)85format = depth_format;86else87format = src->format;88radv_buffer_view_init(bview, cmd_buffer->device,89&(VkBufferViewCreateInfo){90.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO,91.flags = 0,92.buffer = radv_buffer_to_handle(src->buffer),93.format = format,94.offset = src->offset,95.range = VK_WHOLE_SIZE,96});97}9899struct blit2d_src_temps {100struct radv_image_view iview;101struct radv_buffer_view bview;102};103104static void105blit2d_bind_src(struct radv_cmd_buffer *cmd_buffer, struct radv_meta_blit2d_surf *src_img,106struct radv_meta_blit2d_buffer *src_buf, struct blit2d_src_temps *tmp,107enum blit2d_src_type src_type, VkFormat depth_format, VkImageAspectFlagBits aspects,108uint32_t log2_samples)109{110struct radv_device *device = cmd_buffer->device;111112if (src_type == BLIT2D_SRC_TYPE_BUFFER) {113create_bview(cmd_buffer, src_buf, &tmp->bview, depth_format);114115radv_meta_push_descriptor_set(116cmd_buffer, VK_PIPELINE_BIND_POINT_GRAPHICS,117device->meta_state.blit2d[log2_samples].p_layouts[src_type], 0, /* set */1181, /* descriptorWriteCount */119(VkWriteDescriptorSet[]){120{.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET,121.dstBinding = 0,122.dstArrayElement = 0,123.descriptorCount = 1,124.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER,125.pTexelBufferView = (VkBufferView[]){radv_buffer_view_to_handle(&tmp->bview)}}});126127radv_CmdPushConstants(radv_cmd_buffer_to_handle(cmd_buffer),128device->meta_state.blit2d[log2_samples].p_layouts[src_type],129VK_SHADER_STAGE_FRAGMENT_BIT, 16, 4, &src_buf->pitch);130} else {131create_iview(cmd_buffer, src_img, &tmp->iview, depth_format, aspects);132133if (src_type == BLIT2D_SRC_TYPE_IMAGE_3D)134radv_CmdPushConstants(radv_cmd_buffer_to_handle(cmd_buffer),135device->meta_state.blit2d[log2_samples].p_layouts[src_type],136VK_SHADER_STAGE_FRAGMENT_BIT, 16, 4, &src_img->layer);137138radv_meta_push_descriptor_set(139cmd_buffer, VK_PIPELINE_BIND_POINT_GRAPHICS,140device->meta_state.blit2d[log2_samples].p_layouts[src_type], 0, /* set */1411, /* descriptorWriteCount */142(VkWriteDescriptorSet[]){{.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET,143.dstBinding = 0,144.dstArrayElement = 0,145.descriptorCount = 1,146.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE,147.pImageInfo = (VkDescriptorImageInfo[]){148{149.sampler = VK_NULL_HANDLE,150.imageView = radv_image_view_to_handle(&tmp->iview),151.imageLayout = VK_IMAGE_LAYOUT_GENERAL,152},153}}});154}155}156157struct blit2d_dst_temps {158VkImage image;159struct radv_image_view iview;160VkFramebuffer fb;161};162163static void164blit2d_bind_dst(struct radv_cmd_buffer *cmd_buffer, struct radv_meta_blit2d_surf *dst,165uint32_t width, uint32_t height, VkFormat depth_format,166struct blit2d_dst_temps *tmp, VkImageAspectFlagBits aspects)167{168create_iview(cmd_buffer, dst, &tmp->iview, depth_format, aspects);169170radv_CreateFramebuffer(171radv_device_to_handle(cmd_buffer->device),172&(VkFramebufferCreateInfo){.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO,173.attachmentCount = 1,174.pAttachments =175(VkImageView[]){176radv_image_view_to_handle(&tmp->iview),177},178.width = width,179.height = height,180.layers = 1},181&cmd_buffer->pool->alloc, &tmp->fb);182}183184static void185bind_pipeline(struct radv_cmd_buffer *cmd_buffer, enum blit2d_src_type src_type, unsigned fs_key,186uint32_t log2_samples)187{188VkPipeline pipeline =189cmd_buffer->device->meta_state.blit2d[log2_samples].pipelines[src_type][fs_key];190191radv_CmdBindPipeline(radv_cmd_buffer_to_handle(cmd_buffer), VK_PIPELINE_BIND_POINT_GRAPHICS,192pipeline);193}194195static void196bind_depth_pipeline(struct radv_cmd_buffer *cmd_buffer, enum blit2d_src_type src_type,197uint32_t log2_samples)198{199VkPipeline pipeline =200cmd_buffer->device->meta_state.blit2d[log2_samples].depth_only_pipeline[src_type];201202radv_CmdBindPipeline(radv_cmd_buffer_to_handle(cmd_buffer), VK_PIPELINE_BIND_POINT_GRAPHICS,203pipeline);204}205206static void207bind_stencil_pipeline(struct radv_cmd_buffer *cmd_buffer, enum blit2d_src_type src_type,208uint32_t log2_samples)209{210VkPipeline pipeline =211cmd_buffer->device->meta_state.blit2d[log2_samples].stencil_only_pipeline[src_type];212213radv_CmdBindPipeline(radv_cmd_buffer_to_handle(cmd_buffer), VK_PIPELINE_BIND_POINT_GRAPHICS,214pipeline);215}216217static void218radv_meta_blit2d_normal_dst(struct radv_cmd_buffer *cmd_buffer,219struct radv_meta_blit2d_surf *src_img,220struct radv_meta_blit2d_buffer *src_buf,221struct radv_meta_blit2d_surf *dst, unsigned num_rects,222struct radv_meta_blit2d_rect *rects, enum blit2d_src_type src_type,223uint32_t log2_samples)224{225struct radv_device *device = cmd_buffer->device;226227for (unsigned r = 0; r < num_rects; ++r) {228u_foreach_bit(i, dst->aspect_mask)229{230unsigned aspect_mask = 1u << i;231unsigned src_aspect_mask = aspect_mask;232VkFormat depth_format = 0;233if (aspect_mask == VK_IMAGE_ASPECT_STENCIL_BIT)234depth_format = vk_format_stencil_only(dst->image->vk_format);235else if (aspect_mask == VK_IMAGE_ASPECT_DEPTH_BIT)236depth_format = vk_format_depth_only(dst->image->vk_format);237else if (src_img)238src_aspect_mask = src_img->aspect_mask;239240struct blit2d_src_temps src_temps;241blit2d_bind_src(cmd_buffer, src_img, src_buf, &src_temps, src_type, depth_format,242src_aspect_mask, log2_samples);243244struct blit2d_dst_temps dst_temps;245blit2d_bind_dst(cmd_buffer, dst, rects[r].dst_x + rects[r].width,246rects[r].dst_y + rects[r].height, depth_format, &dst_temps, aspect_mask);247248float vertex_push_constants[4] = {249rects[r].src_x,250rects[r].src_y,251rects[r].src_x + rects[r].width,252rects[r].src_y + rects[r].height,253};254255radv_CmdPushConstants(radv_cmd_buffer_to_handle(cmd_buffer),256device->meta_state.blit2d[log2_samples].p_layouts[src_type],257VK_SHADER_STAGE_VERTEX_BIT, 0, 16, vertex_push_constants);258259if (aspect_mask == VK_IMAGE_ASPECT_COLOR_BIT ||260aspect_mask == VK_IMAGE_ASPECT_PLANE_0_BIT ||261aspect_mask == VK_IMAGE_ASPECT_PLANE_1_BIT ||262aspect_mask == VK_IMAGE_ASPECT_PLANE_2_BIT) {263unsigned fs_key = radv_format_meta_fs_key(device, dst_temps.iview.vk_format);264unsigned dst_layout = radv_meta_dst_layout_from_layout(dst->current_layout);265266if (device->meta_state.blit2d[log2_samples].pipelines[src_type][fs_key] ==267VK_NULL_HANDLE) {268VkResult ret = blit2d_init_color_pipeline(269device, src_type, radv_fs_key_format_exemplars[fs_key], log2_samples);270if (ret != VK_SUCCESS) {271cmd_buffer->record_result = ret;272goto fail_pipeline;273}274}275276radv_cmd_buffer_begin_render_pass(277cmd_buffer,278&(VkRenderPassBeginInfo){279.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,280.renderPass = device->meta_state.blit2d_render_passes[fs_key][dst_layout],281.framebuffer = dst_temps.fb,282.renderArea =283{284.offset =285{286rects[r].dst_x,287rects[r].dst_y,288},289.extent = {rects[r].width, rects[r].height},290},291.clearValueCount = 0,292.pClearValues = NULL,293},294&(struct radv_extra_render_pass_begin_info){.disable_dcc =295dst->disable_compression});296297radv_cmd_buffer_set_subpass(cmd_buffer, &cmd_buffer->state.pass->subpasses[0]);298299bind_pipeline(cmd_buffer, src_type, fs_key, log2_samples);300} else if (aspect_mask == VK_IMAGE_ASPECT_DEPTH_BIT) {301enum radv_blit_ds_layout ds_layout = radv_meta_blit_ds_to_type(dst->current_layout);302303if (device->meta_state.blit2d[log2_samples].depth_only_pipeline[src_type] ==304VK_NULL_HANDLE) {305VkResult ret = blit2d_init_depth_only_pipeline(device, src_type, log2_samples);306if (ret != VK_SUCCESS) {307cmd_buffer->record_result = ret;308goto fail_pipeline;309}310}311312radv_cmd_buffer_begin_render_pass(313cmd_buffer,314&(VkRenderPassBeginInfo){315.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,316.renderPass = device->meta_state.blit2d_depth_only_rp[ds_layout],317.framebuffer = dst_temps.fb,318.renderArea =319{320.offset =321{322rects[r].dst_x,323rects[r].dst_y,324},325.extent = {rects[r].width, rects[r].height},326},327.clearValueCount = 0,328.pClearValues = NULL,329},330NULL);331332radv_cmd_buffer_set_subpass(cmd_buffer, &cmd_buffer->state.pass->subpasses[0]);333334bind_depth_pipeline(cmd_buffer, src_type, log2_samples);335336} else if (aspect_mask == VK_IMAGE_ASPECT_STENCIL_BIT) {337enum radv_blit_ds_layout ds_layout = radv_meta_blit_ds_to_type(dst->current_layout);338339if (device->meta_state.blit2d[log2_samples].stencil_only_pipeline[src_type] ==340VK_NULL_HANDLE) {341VkResult ret = blit2d_init_stencil_only_pipeline(device, src_type, log2_samples);342if (ret != VK_SUCCESS) {343cmd_buffer->record_result = ret;344goto fail_pipeline;345}346}347348radv_cmd_buffer_begin_render_pass(349cmd_buffer,350&(VkRenderPassBeginInfo){351.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,352.renderPass = device->meta_state.blit2d_stencil_only_rp[ds_layout],353.framebuffer = dst_temps.fb,354.renderArea =355{356.offset =357{358rects[r].dst_x,359rects[r].dst_y,360},361.extent = {rects[r].width, rects[r].height},362},363.clearValueCount = 0,364.pClearValues = NULL,365},366NULL);367368radv_cmd_buffer_set_subpass(cmd_buffer, &cmd_buffer->state.pass->subpasses[0]);369370bind_stencil_pipeline(cmd_buffer, src_type, log2_samples);371} else372unreachable("Processing blit2d with multiple aspects.");373374radv_CmdSetViewport(radv_cmd_buffer_to_handle(cmd_buffer), 0, 1,375&(VkViewport){.x = rects[r].dst_x,376.y = rects[r].dst_y,377.width = rects[r].width,378.height = rects[r].height,379.minDepth = 0.0f,380.maxDepth = 1.0f});381382radv_CmdSetScissor(radv_cmd_buffer_to_handle(cmd_buffer), 0, 1,383&(VkRect2D){384.offset = (VkOffset2D){rects[r].dst_x, rects[r].dst_y},385.extent = (VkExtent2D){rects[r].width, rects[r].height},386});387388radv_CmdDraw(radv_cmd_buffer_to_handle(cmd_buffer), 3, 1, 0, 0);389radv_cmd_buffer_end_render_pass(cmd_buffer);390391fail_pipeline:392/* At the point where we emit the draw call, all data from the393* descriptor sets, etc. has been used. We are free to delete it.394*/395radv_DestroyFramebuffer(radv_device_to_handle(device), dst_temps.fb,396&cmd_buffer->pool->alloc);397}398}399}400401void402radv_meta_blit2d(struct radv_cmd_buffer *cmd_buffer, struct radv_meta_blit2d_surf *src_img,403struct radv_meta_blit2d_buffer *src_buf, struct radv_meta_blit2d_surf *dst,404unsigned num_rects, struct radv_meta_blit2d_rect *rects)405{406bool use_3d = cmd_buffer->device->physical_device->rad_info.chip_class >= GFX9 &&407(src_img && src_img->image->type == VK_IMAGE_TYPE_3D);408enum blit2d_src_type src_type = src_buf ? BLIT2D_SRC_TYPE_BUFFER409: use_3d ? BLIT2D_SRC_TYPE_IMAGE_3D410: BLIT2D_SRC_TYPE_IMAGE;411radv_meta_blit2d_normal_dst(cmd_buffer, src_img, src_buf, dst, num_rects, rects, src_type,412src_img ? util_logbase2(src_img->image->info.samples) : 0);413}414415static nir_shader *416build_nir_vertex_shader(void)417{418const struct glsl_type *vec4 = glsl_vec4_type();419const struct glsl_type *vec2 = glsl_vector_type(GLSL_TYPE_FLOAT, 2);420nir_builder b = nir_builder_init_simple_shader(MESA_SHADER_VERTEX, NULL, "meta_blit2d_vs");421422nir_variable *pos_out = nir_variable_create(b.shader, nir_var_shader_out, vec4, "gl_Position");423pos_out->data.location = VARYING_SLOT_POS;424425nir_variable *tex_pos_out = nir_variable_create(b.shader, nir_var_shader_out, vec2, "v_tex_pos");426tex_pos_out->data.location = VARYING_SLOT_VAR0;427tex_pos_out->data.interpolation = INTERP_MODE_SMOOTH;428429nir_ssa_def *outvec = radv_meta_gen_rect_vertices(&b);430nir_store_var(&b, pos_out, outvec, 0xf);431432nir_ssa_def *src_box = nir_load_push_constant(&b, 4, 32, nir_imm_int(&b, 0), .range = 16);433nir_ssa_def *vertex_id = nir_load_vertex_id_zero_base(&b);434435/* vertex 0 - src_x, src_y */436/* vertex 1 - src_x, src_y+h */437/* vertex 2 - src_x+w, src_y */438/* so channel 0 is vertex_id != 2 ? src_x : src_x + w439channel 1 is vertex id != 1 ? src_y : src_y + w */440441nir_ssa_def *c0cmp = nir_ine(&b, vertex_id, nir_imm_int(&b, 2));442nir_ssa_def *c1cmp = nir_ine(&b, vertex_id, nir_imm_int(&b, 1));443444nir_ssa_def *comp[2];445comp[0] = nir_bcsel(&b, c0cmp, nir_channel(&b, src_box, 0), nir_channel(&b, src_box, 2));446447comp[1] = nir_bcsel(&b, c1cmp, nir_channel(&b, src_box, 1), nir_channel(&b, src_box, 3));448nir_ssa_def *out_tex_vec = nir_vec(&b, comp, 2);449nir_store_var(&b, tex_pos_out, out_tex_vec, 0x3);450return b.shader;451}452453typedef nir_ssa_def *(*texel_fetch_build_func)(struct nir_builder *, struct radv_device *,454nir_ssa_def *, bool, bool);455456static nir_ssa_def *457build_nir_texel_fetch(struct nir_builder *b, struct radv_device *device, nir_ssa_def *tex_pos,458bool is_3d, bool is_multisampled)459{460enum glsl_sampler_dim dim = is_3d ? GLSL_SAMPLER_DIM_3D461: is_multisampled ? GLSL_SAMPLER_DIM_MS462: GLSL_SAMPLER_DIM_2D;463const struct glsl_type *sampler_type = glsl_sampler_type(dim, false, false, GLSL_TYPE_UINT);464nir_variable *sampler = nir_variable_create(b->shader, nir_var_uniform, sampler_type, "s_tex");465sampler->data.descriptor_set = 0;466sampler->data.binding = 0;467468nir_ssa_def *tex_pos_3d = NULL;469nir_ssa_def *sample_idx = NULL;470if (is_3d) {471nir_ssa_def *layer =472nir_load_push_constant(b, 1, 32, nir_imm_int(b, 0), .base = 16, .range = 4);473474nir_ssa_def *chans[3];475chans[0] = nir_channel(b, tex_pos, 0);476chans[1] = nir_channel(b, tex_pos, 1);477chans[2] = layer;478tex_pos_3d = nir_vec(b, chans, 3);479}480if (is_multisampled) {481sample_idx = nir_load_sample_id(b);482}483484nir_ssa_def *tex_deref = &nir_build_deref_var(b, sampler)->dest.ssa;485486nir_tex_instr *tex = nir_tex_instr_create(b->shader, is_multisampled ? 4 : 3);487tex->sampler_dim = dim;488tex->op = is_multisampled ? nir_texop_txf_ms : nir_texop_txf;489tex->src[0].src_type = nir_tex_src_coord;490tex->src[0].src = nir_src_for_ssa(is_3d ? tex_pos_3d : tex_pos);491tex->src[1].src_type = is_multisampled ? nir_tex_src_ms_index : nir_tex_src_lod;492tex->src[1].src = nir_src_for_ssa(is_multisampled ? sample_idx : nir_imm_int(b, 0));493tex->src[2].src_type = nir_tex_src_texture_deref;494tex->src[2].src = nir_src_for_ssa(tex_deref);495if (is_multisampled) {496tex->src[3].src_type = nir_tex_src_lod;497tex->src[3].src = nir_src_for_ssa(nir_imm_int(b, 0));498}499tex->dest_type = nir_type_uint32;500tex->is_array = false;501tex->coord_components = is_3d ? 3 : 2;502503nir_ssa_dest_init(&tex->instr, &tex->dest, 4, 32, "tex");504nir_builder_instr_insert(b, &tex->instr);505506return &tex->dest.ssa;507}508509static nir_ssa_def *510build_nir_buffer_fetch(struct nir_builder *b, struct radv_device *device, nir_ssa_def *tex_pos,511bool is_3d, bool is_multisampled)512{513const struct glsl_type *sampler_type =514glsl_sampler_type(GLSL_SAMPLER_DIM_BUF, false, false, GLSL_TYPE_UINT);515nir_variable *sampler = nir_variable_create(b->shader, nir_var_uniform, sampler_type, "s_tex");516sampler->data.descriptor_set = 0;517sampler->data.binding = 0;518519nir_ssa_def *width = nir_load_push_constant(b, 1, 32, nir_imm_int(b, 0), .base = 16, .range = 4);520521nir_ssa_def *pos_x = nir_channel(b, tex_pos, 0);522nir_ssa_def *pos_y = nir_channel(b, tex_pos, 1);523pos_y = nir_imul(b, pos_y, width);524pos_x = nir_iadd(b, pos_x, pos_y);525526nir_ssa_def *tex_deref = &nir_build_deref_var(b, sampler)->dest.ssa;527528nir_tex_instr *tex = nir_tex_instr_create(b->shader, 2);529tex->sampler_dim = GLSL_SAMPLER_DIM_BUF;530tex->op = nir_texop_txf;531tex->src[0].src_type = nir_tex_src_coord;532tex->src[0].src = nir_src_for_ssa(pos_x);533tex->src[1].src_type = nir_tex_src_texture_deref;534tex->src[1].src = nir_src_for_ssa(tex_deref);535tex->dest_type = nir_type_uint32;536tex->is_array = false;537tex->coord_components = 1;538539nir_ssa_dest_init(&tex->instr, &tex->dest, 4, 32, "tex");540nir_builder_instr_insert(b, &tex->instr);541542return &tex->dest.ssa;543}544545static const VkPipelineVertexInputStateCreateInfo normal_vi_create_info = {546.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO,547.vertexBindingDescriptionCount = 0,548.vertexAttributeDescriptionCount = 0,549};550551static nir_shader *552build_nir_copy_fragment_shader(struct radv_device *device, texel_fetch_build_func txf_func,553const char *name, bool is_3d, bool is_multisampled)554{555const struct glsl_type *vec4 = glsl_vec4_type();556const struct glsl_type *vec2 = glsl_vector_type(GLSL_TYPE_FLOAT, 2);557nir_builder b = nir_builder_init_simple_shader(MESA_SHADER_FRAGMENT, NULL, "%s", name);558559nir_variable *tex_pos_in = nir_variable_create(b.shader, nir_var_shader_in, vec2, "v_tex_pos");560tex_pos_in->data.location = VARYING_SLOT_VAR0;561562nir_variable *color_out = nir_variable_create(b.shader, nir_var_shader_out, vec4, "f_color");563color_out->data.location = FRAG_RESULT_DATA0;564565nir_ssa_def *pos_int = nir_f2i32(&b, nir_load_var(&b, tex_pos_in));566nir_ssa_def *tex_pos = nir_channels(&b, pos_int, 0x3);567568nir_ssa_def *color = txf_func(&b, device, tex_pos, is_3d, is_multisampled);569nir_store_var(&b, color_out, color, 0xf);570571return b.shader;572}573574static nir_shader *575build_nir_copy_fragment_shader_depth(struct radv_device *device, texel_fetch_build_func txf_func,576const char *name, bool is_3d, bool is_multisampled)577{578const struct glsl_type *vec4 = glsl_vec4_type();579const struct glsl_type *vec2 = glsl_vector_type(GLSL_TYPE_FLOAT, 2);580nir_builder b = nir_builder_init_simple_shader(MESA_SHADER_FRAGMENT, NULL, "%s", name);581582nir_variable *tex_pos_in = nir_variable_create(b.shader, nir_var_shader_in, vec2, "v_tex_pos");583tex_pos_in->data.location = VARYING_SLOT_VAR0;584585nir_variable *color_out = nir_variable_create(b.shader, nir_var_shader_out, vec4, "f_color");586color_out->data.location = FRAG_RESULT_DEPTH;587588nir_ssa_def *pos_int = nir_f2i32(&b, nir_load_var(&b, tex_pos_in));589nir_ssa_def *tex_pos = nir_channels(&b, pos_int, 0x3);590591nir_ssa_def *color = txf_func(&b, device, tex_pos, is_3d, is_multisampled);592nir_store_var(&b, color_out, color, 0x1);593594return b.shader;595}596597static nir_shader *598build_nir_copy_fragment_shader_stencil(struct radv_device *device, texel_fetch_build_func txf_func,599const char *name, bool is_3d, bool is_multisampled)600{601const struct glsl_type *vec4 = glsl_vec4_type();602const struct glsl_type *vec2 = glsl_vector_type(GLSL_TYPE_FLOAT, 2);603nir_builder b = nir_builder_init_simple_shader(MESA_SHADER_FRAGMENT, NULL, "%s", name);604605nir_variable *tex_pos_in = nir_variable_create(b.shader, nir_var_shader_in, vec2, "v_tex_pos");606tex_pos_in->data.location = VARYING_SLOT_VAR0;607608nir_variable *color_out = nir_variable_create(b.shader, nir_var_shader_out, vec4, "f_color");609color_out->data.location = FRAG_RESULT_STENCIL;610611nir_ssa_def *pos_int = nir_f2i32(&b, nir_load_var(&b, tex_pos_in));612nir_ssa_def *tex_pos = nir_channels(&b, pos_int, 0x3);613614nir_ssa_def *color = txf_func(&b, device, tex_pos, is_3d, is_multisampled);615nir_store_var(&b, color_out, color, 0x1);616617return b.shader;618}619620void621radv_device_finish_meta_blit2d_state(struct radv_device *device)622{623struct radv_meta_state *state = &device->meta_state;624625for (unsigned j = 0; j < NUM_META_FS_KEYS; ++j) {626for (unsigned k = 0; k < RADV_META_DST_LAYOUT_COUNT; ++k) {627radv_DestroyRenderPass(radv_device_to_handle(device), state->blit2d_render_passes[j][k],628&state->alloc);629}630}631632for (enum radv_blit_ds_layout j = RADV_BLIT_DS_LAYOUT_TILE_ENABLE; j < RADV_BLIT_DS_LAYOUT_COUNT;633j++) {634radv_DestroyRenderPass(radv_device_to_handle(device), state->blit2d_depth_only_rp[j],635&state->alloc);636radv_DestroyRenderPass(radv_device_to_handle(device), state->blit2d_stencil_only_rp[j],637&state->alloc);638}639640for (unsigned log2_samples = 0; log2_samples < MAX_SAMPLES_LOG2; ++log2_samples) {641for (unsigned src = 0; src < BLIT2D_NUM_SRC_TYPES; src++) {642radv_DestroyPipelineLayout(radv_device_to_handle(device),643state->blit2d[log2_samples].p_layouts[src], &state->alloc);644radv_DestroyDescriptorSetLayout(radv_device_to_handle(device),645state->blit2d[log2_samples].ds_layouts[src],646&state->alloc);647648for (unsigned j = 0; j < NUM_META_FS_KEYS; ++j) {649radv_DestroyPipeline(radv_device_to_handle(device),650state->blit2d[log2_samples].pipelines[src][j], &state->alloc);651}652653radv_DestroyPipeline(radv_device_to_handle(device),654state->blit2d[log2_samples].depth_only_pipeline[src], &state->alloc);655radv_DestroyPipeline(radv_device_to_handle(device),656state->blit2d[log2_samples].stencil_only_pipeline[src],657&state->alloc);658}659}660}661662static VkResult663blit2d_init_color_pipeline(struct radv_device *device, enum blit2d_src_type src_type,664VkFormat format, uint32_t log2_samples)665{666VkResult result;667unsigned fs_key = radv_format_meta_fs_key(device, format);668const char *name;669670mtx_lock(&device->meta_state.mtx);671if (device->meta_state.blit2d[log2_samples].pipelines[src_type][fs_key]) {672mtx_unlock(&device->meta_state.mtx);673return VK_SUCCESS;674}675676texel_fetch_build_func src_func;677switch (src_type) {678case BLIT2D_SRC_TYPE_IMAGE:679src_func = build_nir_texel_fetch;680name = "meta_blit2d_image_fs";681break;682case BLIT2D_SRC_TYPE_IMAGE_3D:683src_func = build_nir_texel_fetch;684name = "meta_blit3d_image_fs";685break;686case BLIT2D_SRC_TYPE_BUFFER:687src_func = build_nir_buffer_fetch;688name = "meta_blit2d_buffer_fs";689break;690default:691unreachable("unknown blit src type\n");692break;693}694695const VkPipelineVertexInputStateCreateInfo *vi_create_info;696nir_shader *fs = build_nir_copy_fragment_shader(697device, src_func, name, src_type == BLIT2D_SRC_TYPE_IMAGE_3D, log2_samples > 0);698nir_shader *vs = build_nir_vertex_shader();699700vi_create_info = &normal_vi_create_info;701702VkPipelineShaderStageCreateInfo pipeline_shader_stages[] = {703{.sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,704.stage = VK_SHADER_STAGE_VERTEX_BIT,705.module = vk_shader_module_handle_from_nir(vs),706.pName = "main",707.pSpecializationInfo = NULL},708{.sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,709.stage = VK_SHADER_STAGE_FRAGMENT_BIT,710.module = vk_shader_module_handle_from_nir(fs),711.pName = "main",712.pSpecializationInfo = NULL},713};714715for (unsigned dst_layout = 0; dst_layout < RADV_META_DST_LAYOUT_COUNT; ++dst_layout) {716if (!device->meta_state.blit2d_render_passes[fs_key][dst_layout]) {717VkImageLayout layout = radv_meta_dst_layout_to_layout(dst_layout);718719result = radv_CreateRenderPass2(720radv_device_to_handle(device),721&(VkRenderPassCreateInfo2){722.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO_2,723.attachmentCount = 1,724.pAttachments =725&(VkAttachmentDescription2){726.sType = VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_2,727.format = format,728.loadOp = VK_ATTACHMENT_LOAD_OP_LOAD,729.storeOp = VK_ATTACHMENT_STORE_OP_STORE,730.initialLayout = layout,731.finalLayout = layout,732},733.subpassCount = 1,734.pSubpasses =735&(VkSubpassDescription2){736.sType = VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_2,737.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS,738.inputAttachmentCount = 0,739.colorAttachmentCount = 1,740.pColorAttachments =741&(VkAttachmentReference2){742.sType = VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_2,743.attachment = 0,744.layout = layout,745},746.pResolveAttachments = NULL,747.pDepthStencilAttachment =748&(VkAttachmentReference2){749.sType = VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_2,750.attachment = VK_ATTACHMENT_UNUSED,751.layout = layout,752},753.preserveAttachmentCount = 0,754.pPreserveAttachments = NULL,755},756.dependencyCount = 2,757.pDependencies =758(VkSubpassDependency2[]){{.sType = VK_STRUCTURE_TYPE_SUBPASS_DEPENDENCY_2,759.srcSubpass = VK_SUBPASS_EXTERNAL,760.dstSubpass = 0,761.srcStageMask = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,762.dstStageMask = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT,763.srcAccessMask = 0,764.dstAccessMask = 0,765.dependencyFlags = 0},766{.sType = VK_STRUCTURE_TYPE_SUBPASS_DEPENDENCY_2,767.srcSubpass = 0,768.dstSubpass = VK_SUBPASS_EXTERNAL,769.srcStageMask = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,770.dstStageMask = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT,771.srcAccessMask = 0,772.dstAccessMask = 0,773.dependencyFlags = 0}},774},775&device->meta_state.alloc,776&device->meta_state.blit2d_render_passes[fs_key][dst_layout]);777}778}779780const VkGraphicsPipelineCreateInfo vk_pipeline_info = {781.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO,782.stageCount = ARRAY_SIZE(pipeline_shader_stages),783.pStages = pipeline_shader_stages,784.pVertexInputState = vi_create_info,785.pInputAssemblyState =786&(VkPipelineInputAssemblyStateCreateInfo){787.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,788.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP,789.primitiveRestartEnable = false,790},791.pViewportState =792&(VkPipelineViewportStateCreateInfo){793.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO,794.viewportCount = 1,795.scissorCount = 1,796},797.pRasterizationState =798&(VkPipelineRasterizationStateCreateInfo){799.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO,800.rasterizerDiscardEnable = false,801.polygonMode = VK_POLYGON_MODE_FILL,802.cullMode = VK_CULL_MODE_NONE,803.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE},804.pMultisampleState =805&(VkPipelineMultisampleStateCreateInfo){806.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO,807.rasterizationSamples = 1 << log2_samples,808.sampleShadingEnable = log2_samples > 1,809.minSampleShading = 1.0,810.pSampleMask = (VkSampleMask[]){UINT32_MAX},811},812.pColorBlendState =813&(VkPipelineColorBlendStateCreateInfo){814.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO,815.attachmentCount = 1,816.pAttachments =817(VkPipelineColorBlendAttachmentState[]){818{.colorWriteMask = VK_COLOR_COMPONENT_A_BIT | VK_COLOR_COMPONENT_R_BIT |819VK_COLOR_COMPONENT_G_BIT | VK_COLOR_COMPONENT_B_BIT},820}},821.pDynamicState =822&(VkPipelineDynamicStateCreateInfo){823.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO,824.dynamicStateCount = 9,825.pDynamicStates =826(VkDynamicState[]){827VK_DYNAMIC_STATE_VIEWPORT,828VK_DYNAMIC_STATE_SCISSOR,829VK_DYNAMIC_STATE_LINE_WIDTH,830VK_DYNAMIC_STATE_DEPTH_BIAS,831VK_DYNAMIC_STATE_BLEND_CONSTANTS,832VK_DYNAMIC_STATE_DEPTH_BOUNDS,833VK_DYNAMIC_STATE_STENCIL_COMPARE_MASK,834VK_DYNAMIC_STATE_STENCIL_WRITE_MASK,835VK_DYNAMIC_STATE_STENCIL_REFERENCE,836},837},838.flags = 0,839.layout = device->meta_state.blit2d[log2_samples].p_layouts[src_type],840.renderPass = device->meta_state.blit2d_render_passes[fs_key][0],841.subpass = 0,842};843844const struct radv_graphics_pipeline_create_info radv_pipeline_info = {.use_rectlist = true};845846result = radv_graphics_pipeline_create(847radv_device_to_handle(device), radv_pipeline_cache_to_handle(&device->meta_state.cache),848&vk_pipeline_info, &radv_pipeline_info, &device->meta_state.alloc,849&device->meta_state.blit2d[log2_samples].pipelines[src_type][fs_key]);850851ralloc_free(vs);852ralloc_free(fs);853854mtx_unlock(&device->meta_state.mtx);855return result;856}857858static VkResult859blit2d_init_depth_only_pipeline(struct radv_device *device, enum blit2d_src_type src_type,860uint32_t log2_samples)861{862VkResult result;863const char *name;864865mtx_lock(&device->meta_state.mtx);866if (device->meta_state.blit2d[log2_samples].depth_only_pipeline[src_type]) {867mtx_unlock(&device->meta_state.mtx);868return VK_SUCCESS;869}870871texel_fetch_build_func src_func;872switch (src_type) {873case BLIT2D_SRC_TYPE_IMAGE:874src_func = build_nir_texel_fetch;875name = "meta_blit2d_depth_image_fs";876break;877case BLIT2D_SRC_TYPE_IMAGE_3D:878src_func = build_nir_texel_fetch;879name = "meta_blit3d_depth_image_fs";880break;881case BLIT2D_SRC_TYPE_BUFFER:882src_func = build_nir_buffer_fetch;883name = "meta_blit2d_depth_buffer_fs";884break;885default:886unreachable("unknown blit src type\n");887break;888}889890const VkPipelineVertexInputStateCreateInfo *vi_create_info;891nir_shader *fs = build_nir_copy_fragment_shader_depth(892device, src_func, name, src_type == BLIT2D_SRC_TYPE_IMAGE_3D, log2_samples > 0);893nir_shader *vs = build_nir_vertex_shader();894895vi_create_info = &normal_vi_create_info;896897VkPipelineShaderStageCreateInfo pipeline_shader_stages[] = {898{.sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,899.stage = VK_SHADER_STAGE_VERTEX_BIT,900.module = vk_shader_module_handle_from_nir(vs),901.pName = "main",902.pSpecializationInfo = NULL},903{.sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,904.stage = VK_SHADER_STAGE_FRAGMENT_BIT,905.module = vk_shader_module_handle_from_nir(fs),906.pName = "main",907.pSpecializationInfo = NULL},908};909910for (enum radv_blit_ds_layout ds_layout = RADV_BLIT_DS_LAYOUT_TILE_ENABLE;911ds_layout < RADV_BLIT_DS_LAYOUT_COUNT; ds_layout++) {912if (!device->meta_state.blit2d_depth_only_rp[ds_layout]) {913VkImageLayout layout = radv_meta_blit_ds_to_layout(ds_layout);914result = radv_CreateRenderPass2(915radv_device_to_handle(device),916&(VkRenderPassCreateInfo2){917.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO_2,918.attachmentCount = 1,919.pAttachments =920&(VkAttachmentDescription2){921.sType = VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_2,922.format = VK_FORMAT_D32_SFLOAT,923.loadOp = VK_ATTACHMENT_LOAD_OP_LOAD,924.storeOp = VK_ATTACHMENT_STORE_OP_STORE,925.initialLayout = layout,926.finalLayout = layout,927},928.subpassCount = 1,929.pSubpasses =930&(VkSubpassDescription2){931.sType = VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_2,932.inputAttachmentCount = 0,933.colorAttachmentCount = 0,934.pColorAttachments = NULL,935.pResolveAttachments = NULL,936.pDepthStencilAttachment =937&(VkAttachmentReference2){938.sType = VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_2,939.attachment = 0,940.layout = layout,941},942.preserveAttachmentCount = 0,943.pPreserveAttachments = NULL,944},945.dependencyCount = 2,946.pDependencies =947(VkSubpassDependency2[]){{.sType = VK_STRUCTURE_TYPE_SUBPASS_DEPENDENCY_2,948.srcSubpass = VK_SUBPASS_EXTERNAL,949.dstSubpass = 0,950.srcStageMask = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,951.dstStageMask = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT,952.srcAccessMask = 0,953.dstAccessMask = 0,954.dependencyFlags = 0},955{.sType = VK_STRUCTURE_TYPE_SUBPASS_DEPENDENCY_2,956.srcSubpass = 0,957.dstSubpass = VK_SUBPASS_EXTERNAL,958.srcStageMask = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,959.dstStageMask = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT,960.srcAccessMask = 0,961.dstAccessMask = 0,962.dependencyFlags = 0}},963},964&device->meta_state.alloc, &device->meta_state.blit2d_depth_only_rp[ds_layout]);965}966}967968const VkGraphicsPipelineCreateInfo vk_pipeline_info = {969.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO,970.stageCount = ARRAY_SIZE(pipeline_shader_stages),971.pStages = pipeline_shader_stages,972.pVertexInputState = vi_create_info,973.pInputAssemblyState =974&(VkPipelineInputAssemblyStateCreateInfo){975.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,976.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP,977.primitiveRestartEnable = false,978},979.pViewportState =980&(VkPipelineViewportStateCreateInfo){981.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO,982.viewportCount = 1,983.scissorCount = 1,984},985.pRasterizationState =986&(VkPipelineRasterizationStateCreateInfo){987.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO,988.rasterizerDiscardEnable = false,989.polygonMode = VK_POLYGON_MODE_FILL,990.cullMode = VK_CULL_MODE_NONE,991.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE},992.pMultisampleState =993&(VkPipelineMultisampleStateCreateInfo){994.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO,995.rasterizationSamples = 1 << log2_samples,996.sampleShadingEnable = false,997.pSampleMask = (VkSampleMask[]){UINT32_MAX},998},999.pColorBlendState =1000&(VkPipelineColorBlendStateCreateInfo){1001.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO,1002.attachmentCount = 0,1003.pAttachments = NULL,1004},1005.pDepthStencilState =1006&(VkPipelineDepthStencilStateCreateInfo){1007.sType = VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO,1008.depthTestEnable = true,1009.depthWriteEnable = true,1010.depthCompareOp = VK_COMPARE_OP_ALWAYS,1011},1012.pDynamicState =1013&(VkPipelineDynamicStateCreateInfo){1014.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO,1015.dynamicStateCount = 9,1016.pDynamicStates =1017(VkDynamicState[]){1018VK_DYNAMIC_STATE_VIEWPORT,1019VK_DYNAMIC_STATE_SCISSOR,1020VK_DYNAMIC_STATE_LINE_WIDTH,1021VK_DYNAMIC_STATE_DEPTH_BIAS,1022VK_DYNAMIC_STATE_BLEND_CONSTANTS,1023VK_DYNAMIC_STATE_DEPTH_BOUNDS,1024VK_DYNAMIC_STATE_STENCIL_COMPARE_MASK,1025VK_DYNAMIC_STATE_STENCIL_WRITE_MASK,1026VK_DYNAMIC_STATE_STENCIL_REFERENCE,1027},1028},1029.flags = 0,1030.layout = device->meta_state.blit2d[log2_samples].p_layouts[src_type],1031.renderPass = device->meta_state.blit2d_depth_only_rp[0],1032.subpass = 0,1033};10341035const struct radv_graphics_pipeline_create_info radv_pipeline_info = {.use_rectlist = true};10361037result = radv_graphics_pipeline_create(1038radv_device_to_handle(device), radv_pipeline_cache_to_handle(&device->meta_state.cache),1039&vk_pipeline_info, &radv_pipeline_info, &device->meta_state.alloc,1040&device->meta_state.blit2d[log2_samples].depth_only_pipeline[src_type]);10411042ralloc_free(vs);1043ralloc_free(fs);10441045mtx_unlock(&device->meta_state.mtx);1046return result;1047}10481049static VkResult1050blit2d_init_stencil_only_pipeline(struct radv_device *device, enum blit2d_src_type src_type,1051uint32_t log2_samples)1052{1053VkResult result;1054const char *name;10551056mtx_lock(&device->meta_state.mtx);1057if (device->meta_state.blit2d[log2_samples].stencil_only_pipeline[src_type]) {1058mtx_unlock(&device->meta_state.mtx);1059return VK_SUCCESS;1060}10611062texel_fetch_build_func src_func;1063switch (src_type) {1064case BLIT2D_SRC_TYPE_IMAGE:1065src_func = build_nir_texel_fetch;1066name = "meta_blit2d_stencil_image_fs";1067break;1068case BLIT2D_SRC_TYPE_IMAGE_3D:1069src_func = build_nir_texel_fetch;1070name = "meta_blit3d_stencil_image_fs";1071break;1072case BLIT2D_SRC_TYPE_BUFFER:1073src_func = build_nir_buffer_fetch;1074name = "meta_blit2d_stencil_buffer_fs";1075break;1076default:1077unreachable("unknown blit src type\n");1078break;1079}10801081const VkPipelineVertexInputStateCreateInfo *vi_create_info;1082nir_shader *fs = build_nir_copy_fragment_shader_stencil(1083device, src_func, name, src_type == BLIT2D_SRC_TYPE_IMAGE_3D, log2_samples > 0);1084nir_shader *vs = build_nir_vertex_shader();10851086vi_create_info = &normal_vi_create_info;10871088VkPipelineShaderStageCreateInfo pipeline_shader_stages[] = {1089{.sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,1090.stage = VK_SHADER_STAGE_VERTEX_BIT,1091.module = vk_shader_module_handle_from_nir(vs),1092.pName = "main",1093.pSpecializationInfo = NULL},1094{.sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,1095.stage = VK_SHADER_STAGE_FRAGMENT_BIT,1096.module = vk_shader_module_handle_from_nir(fs),1097.pName = "main",1098.pSpecializationInfo = NULL},1099};11001101for (enum radv_blit_ds_layout ds_layout = RADV_BLIT_DS_LAYOUT_TILE_ENABLE;1102ds_layout < RADV_BLIT_DS_LAYOUT_COUNT; ds_layout++) {1103if (!device->meta_state.blit2d_stencil_only_rp[ds_layout]) {1104VkImageLayout layout = radv_meta_blit_ds_to_layout(ds_layout);1105result = radv_CreateRenderPass2(1106radv_device_to_handle(device),1107&(VkRenderPassCreateInfo2){1108.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO_2,1109.attachmentCount = 1,1110.pAttachments =1111&(VkAttachmentDescription2){1112.sType = VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_2,1113.format = VK_FORMAT_S8_UINT,1114.loadOp = VK_ATTACHMENT_LOAD_OP_LOAD,1115.storeOp = VK_ATTACHMENT_STORE_OP_STORE,1116.initialLayout = layout,1117.finalLayout = layout,1118},1119.subpassCount = 1,1120.pSubpasses =1121&(VkSubpassDescription2){1122.sType = VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_2,1123.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS,1124.inputAttachmentCount = 0,1125.colorAttachmentCount = 0,1126.pColorAttachments = NULL,1127.pResolveAttachments = NULL,1128.pDepthStencilAttachment =1129&(VkAttachmentReference2){1130.sType = VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_2,1131.attachment = 0,1132.layout = layout,1133},1134.preserveAttachmentCount = 0,1135.pPreserveAttachments = NULL,1136},1137.dependencyCount = 2,1138.pDependencies =1139(VkSubpassDependency2[]){{.sType = VK_STRUCTURE_TYPE_SUBPASS_DEPENDENCY_2,1140.srcSubpass = VK_SUBPASS_EXTERNAL,1141.dstSubpass = 0,1142.srcStageMask = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,1143.dstStageMask = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT,1144.srcAccessMask = 0,1145.dstAccessMask = 0,1146.dependencyFlags = 0},1147{.sType = VK_STRUCTURE_TYPE_SUBPASS_DEPENDENCY_2,1148.srcSubpass = 0,1149.dstSubpass = VK_SUBPASS_EXTERNAL,1150.srcStageMask = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,1151.dstStageMask = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT,1152.srcAccessMask = 0,1153.dstAccessMask = 0,1154.dependencyFlags = 0}},1155},1156&device->meta_state.alloc, &device->meta_state.blit2d_stencil_only_rp[ds_layout]);1157}1158}11591160const VkGraphicsPipelineCreateInfo vk_pipeline_info = {1161.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO,1162.stageCount = ARRAY_SIZE(pipeline_shader_stages),1163.pStages = pipeline_shader_stages,1164.pVertexInputState = vi_create_info,1165.pInputAssemblyState =1166&(VkPipelineInputAssemblyStateCreateInfo){1167.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,1168.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP,1169.primitiveRestartEnable = false,1170},1171.pViewportState =1172&(VkPipelineViewportStateCreateInfo){1173.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO,1174.viewportCount = 1,1175.scissorCount = 1,1176},1177.pRasterizationState =1178&(VkPipelineRasterizationStateCreateInfo){1179.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO,1180.rasterizerDiscardEnable = false,1181.polygonMode = VK_POLYGON_MODE_FILL,1182.cullMode = VK_CULL_MODE_NONE,1183.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE},1184.pMultisampleState =1185&(VkPipelineMultisampleStateCreateInfo){1186.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO,1187.rasterizationSamples = 1 << log2_samples,1188.sampleShadingEnable = false,1189.pSampleMask = (VkSampleMask[]){UINT32_MAX},1190},1191.pColorBlendState =1192&(VkPipelineColorBlendStateCreateInfo){1193.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO,1194.attachmentCount = 0,1195.pAttachments = NULL,1196},1197.pDepthStencilState =1198&(VkPipelineDepthStencilStateCreateInfo){1199.sType = VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO,1200.depthTestEnable = false,1201.depthWriteEnable = false,1202.stencilTestEnable = true,1203.front = {.failOp = VK_STENCIL_OP_REPLACE,1204.passOp = VK_STENCIL_OP_REPLACE,1205.depthFailOp = VK_STENCIL_OP_REPLACE,1206.compareOp = VK_COMPARE_OP_ALWAYS,1207.compareMask = 0xff,1208.writeMask = 0xff,1209.reference = 0},1210.back = {.failOp = VK_STENCIL_OP_REPLACE,1211.passOp = VK_STENCIL_OP_REPLACE,1212.depthFailOp = VK_STENCIL_OP_REPLACE,1213.compareOp = VK_COMPARE_OP_ALWAYS,1214.compareMask = 0xff,1215.writeMask = 0xff,1216.reference = 0},1217.depthCompareOp = VK_COMPARE_OP_ALWAYS,1218},1219.pDynamicState =1220&(VkPipelineDynamicStateCreateInfo){1221.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO,1222.dynamicStateCount = 6,1223.pDynamicStates =1224(VkDynamicState[]){1225VK_DYNAMIC_STATE_VIEWPORT,1226VK_DYNAMIC_STATE_SCISSOR,1227VK_DYNAMIC_STATE_LINE_WIDTH,1228VK_DYNAMIC_STATE_DEPTH_BIAS,1229VK_DYNAMIC_STATE_BLEND_CONSTANTS,1230VK_DYNAMIC_STATE_DEPTH_BOUNDS,1231},1232},1233.flags = 0,1234.layout = device->meta_state.blit2d[log2_samples].p_layouts[src_type],1235.renderPass = device->meta_state.blit2d_stencil_only_rp[0],1236.subpass = 0,1237};12381239const struct radv_graphics_pipeline_create_info radv_pipeline_info = {.use_rectlist = true};12401241result = radv_graphics_pipeline_create(1242radv_device_to_handle(device), radv_pipeline_cache_to_handle(&device->meta_state.cache),1243&vk_pipeline_info, &radv_pipeline_info, &device->meta_state.alloc,1244&device->meta_state.blit2d[log2_samples].stencil_only_pipeline[src_type]);12451246ralloc_free(vs);1247ralloc_free(fs);12481249mtx_unlock(&device->meta_state.mtx);1250return result;1251}12521253static VkResult1254meta_blit2d_create_pipe_layout(struct radv_device *device, int idx, uint32_t log2_samples)1255{1256VkResult result;1257VkDescriptorType desc_type = (idx == BLIT2D_SRC_TYPE_BUFFER)1258? VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER1259: VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;1260const VkPushConstantRange push_constant_ranges[] = {1261{VK_SHADER_STAGE_VERTEX_BIT, 0, 16},1262{VK_SHADER_STAGE_FRAGMENT_BIT, 16, 4},1263};1264int num_push_constant_range = (idx != BLIT2D_SRC_TYPE_IMAGE || log2_samples > 0) ? 2 : 1;12651266result = radv_CreateDescriptorSetLayout(1267radv_device_to_handle(device),1268&(VkDescriptorSetLayoutCreateInfo){1269.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO,1270.flags = VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR,1271.bindingCount = 1,1272.pBindings =1273(VkDescriptorSetLayoutBinding[]){1274{.binding = 0,1275.descriptorType = desc_type,1276.descriptorCount = 1,1277.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT,1278.pImmutableSamplers = NULL},1279}},1280&device->meta_state.alloc, &device->meta_state.blit2d[log2_samples].ds_layouts[idx]);1281if (result != VK_SUCCESS)1282goto fail;12831284result = radv_CreatePipelineLayout(1285radv_device_to_handle(device),1286&(VkPipelineLayoutCreateInfo){1287.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO,1288.setLayoutCount = 1,1289.pSetLayouts = &device->meta_state.blit2d[log2_samples].ds_layouts[idx],1290.pushConstantRangeCount = num_push_constant_range,1291.pPushConstantRanges = push_constant_ranges,1292},1293&device->meta_state.alloc, &device->meta_state.blit2d[log2_samples].p_layouts[idx]);1294if (result != VK_SUCCESS)1295goto fail;1296return VK_SUCCESS;1297fail:1298return result;1299}13001301VkResult1302radv_device_init_meta_blit2d_state(struct radv_device *device, bool on_demand)1303{1304VkResult result;1305bool create_3d = device->physical_device->rad_info.chip_class >= GFX9;13061307for (unsigned log2_samples = 0; log2_samples < MAX_SAMPLES_LOG2; log2_samples++) {1308for (unsigned src = 0; src < BLIT2D_NUM_SRC_TYPES; src++) {1309if (src == BLIT2D_SRC_TYPE_IMAGE_3D && !create_3d)1310continue;13111312/* Don't need to handle copies between buffers and multisample images. */1313if (src == BLIT2D_SRC_TYPE_BUFFER && log2_samples > 0)1314continue;13151316result = meta_blit2d_create_pipe_layout(device, src, log2_samples);1317if (result != VK_SUCCESS)1318goto fail;13191320if (on_demand)1321continue;13221323for (unsigned j = 0; j < NUM_META_FS_KEYS; ++j) {1324result = blit2d_init_color_pipeline(device, src, radv_fs_key_format_exemplars[j],1325log2_samples);1326if (result != VK_SUCCESS)1327goto fail;1328}13291330result = blit2d_init_depth_only_pipeline(device, src, log2_samples);1331if (result != VK_SUCCESS)1332goto fail;13331334result = blit2d_init_stencil_only_pipeline(device, src, log2_samples);1335if (result != VK_SUCCESS)1336goto fail;1337}1338}13391340return VK_SUCCESS;13411342fail:1343radv_device_finish_meta_blit2d_state(device);1344return result;1345}134613471348