Home | History | Annotate | Download | only in vulkan
      1 /*
      2  * Copyright  2016 Red Hat
      3  *
      4  * based on anv driver:
      5  * Copyright  2016 Intel Corporation
      6  *
      7  * Permission is hereby granted, free of charge, to any person obtaining a
      8  * copy of this software and associated documentation files (the "Software"),
      9  * to deal in the Software without restriction, including without limitation
     10  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
     11  * and/or sell copies of the Software, and to permit persons to whom the
     12  * Software is furnished to do so, subject to the following conditions:
     13  *
     14  * The above copyright notice and this permission notice (including the next
     15  * paragraph) shall be included in all copies or substantial portions of the
     16  * Software.
     17  *
     18  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     19  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     20  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
     21  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
     22  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
     23  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
     24  * IN THE SOFTWARE.
     25  */
     26 
     27 #include "radv_meta.h"
     28 #include "nir/nir_builder.h"
     29 #include "vk_format.h"
     30 
     31 enum blit2d_dst_type {
     32 	/* We can bind this destination as a "normal" render target and render
     33 	 * to it just like you would anywhere else.
     34 	 */
     35 	BLIT2D_DST_TYPE_NORMAL,
     36 
     37 	/* The destination has a 3-channel RGB format.  Since we can't render to
     38 	 * non-power-of-two textures, we have to bind it as a red texture and
     39 	 * select the correct component for the given red pixel in the shader.
     40 	 */
     41 	BLIT2D_DST_TYPE_RGB,
     42 
     43 	BLIT2D_NUM_DST_TYPES,
     44 };
     45 
     46 
     47 enum blit2d_src_type {
     48 	BLIT2D_SRC_TYPE_IMAGE,
     49 	BLIT2D_SRC_TYPE_BUFFER,
     50 	BLIT2D_NUM_SRC_TYPES,
     51 };
     52 
     53 static void
     54 create_iview(struct radv_cmd_buffer *cmd_buffer,
     55              struct radv_meta_blit2d_surf *surf,
     56              VkImageUsageFlags usage,
     57              struct radv_image_view *iview, VkFormat depth_format)
     58 {
     59 	VkFormat format;
     60 
     61 	if (depth_format)
     62 		format = depth_format;
     63 	else
     64 		format = surf->format;
     65 
     66 	radv_image_view_init(iview, cmd_buffer->device,
     67 			     &(VkImageViewCreateInfo) {
     68 				     .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
     69 					     .image = radv_image_to_handle(surf->image),
     70 					     .viewType = VK_IMAGE_VIEW_TYPE_2D,
     71 					     .format = format,
     72 					     .subresourceRange = {
     73 					     .aspectMask = surf->aspect_mask,
     74 					     .baseMipLevel = surf->level,
     75 					     .levelCount = 1,
     76 					     .baseArrayLayer = surf->layer,
     77 					     .layerCount = 1
     78 				     },
     79 					     }, cmd_buffer, usage);
     80 }
     81 
     82 static void
     83 create_bview(struct radv_cmd_buffer *cmd_buffer,
     84 	     struct radv_meta_blit2d_buffer *src,
     85 	     struct radv_buffer_view *bview, VkFormat depth_format)
     86 {
     87 	VkFormat format;
     88 
     89 	if (depth_format)
     90 		format = depth_format;
     91 	else
     92 		format = src->format;
     93 	radv_buffer_view_init(bview, cmd_buffer->device,
     94 			      &(VkBufferViewCreateInfo) {
     95 				      .sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO,
     96 				      .flags = 0,
     97 				      .buffer = radv_buffer_to_handle(src->buffer),
     98 				      .format = format,
     99 				      .offset = src->offset,
    100 				      .range = VK_WHOLE_SIZE,
    101 			      }, cmd_buffer);
    102 
    103 }
    104 
    105 struct blit2d_src_temps {
    106 	struct radv_image_view iview;
    107 
    108 	VkDescriptorSet set;
    109 	struct radv_buffer_view bview;
    110 };
    111 
    112 static void
    113 blit2d_bind_src(struct radv_cmd_buffer *cmd_buffer,
    114                 struct radv_meta_blit2d_surf *src_img,
    115                 struct radv_meta_blit2d_buffer *src_buf,
    116                 struct blit2d_src_temps *tmp,
    117                 enum blit2d_src_type src_type, VkFormat depth_format)
    118 {
    119 	struct radv_device *device = cmd_buffer->device;
    120 	VkDevice vk_device = radv_device_to_handle(cmd_buffer->device);
    121 
    122 	if (src_type == BLIT2D_SRC_TYPE_BUFFER) {
    123 		create_bview(cmd_buffer, src_buf, &tmp->bview, depth_format);
    124 
    125 		radv_temp_descriptor_set_create(cmd_buffer->device, cmd_buffer,
    126 					        device->meta_state.blit2d.ds_layouts[src_type],
    127 					        &tmp->set);
    128 
    129 		radv_UpdateDescriptorSets(vk_device,
    130 					  1, /* writeCount */
    131 					  (VkWriteDescriptorSet[]) {
    132 						  {
    133 							  .sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET,
    134 							  .dstSet = tmp->set,
    135 							  .dstBinding = 0,
    136 							  .dstArrayElement = 0,
    137 							  .descriptorCount = 1,
    138 							  .descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER,
    139 							  .pTexelBufferView = (VkBufferView[])  { radv_buffer_view_to_handle(&tmp->bview) }
    140 						  }
    141 					  }, 0, NULL);
    142 
    143 		radv_CmdPushConstants(radv_cmd_buffer_to_handle(cmd_buffer),
    144 				      device->meta_state.blit2d.p_layouts[src_type],
    145 				      VK_SHADER_STAGE_FRAGMENT_BIT, 0, 4,
    146 				      &src_buf->pitch);
    147 	} else {
    148 		create_iview(cmd_buffer, src_img, VK_IMAGE_USAGE_SAMPLED_BIT, &tmp->iview,
    149 			     depth_format);
    150 
    151 		radv_temp_descriptor_set_create(cmd_buffer->device, cmd_buffer,
    152 					        device->meta_state.blit2d.ds_layouts[src_type],
    153 					        &tmp->set);
    154 
    155 		radv_UpdateDescriptorSets(vk_device,
    156 					  1, /* writeCount */
    157 					  (VkWriteDescriptorSet[]) {
    158 						  {
    159 							  .sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET,
    160 								  .dstSet = tmp->set,
    161 								  .dstBinding = 0,
    162 								  .dstArrayElement = 0,
    163 								  .descriptorCount = 1,
    164 								  .descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE,
    165 								  .pImageInfo = (VkDescriptorImageInfo[]) {
    166 								  {
    167 									  .sampler = VK_NULL_HANDLE,
    168 									  .imageView = radv_image_view_to_handle(&tmp->iview),
    169 									  .imageLayout = VK_IMAGE_LAYOUT_GENERAL,
    170 								  },
    171 							  }
    172 						  }
    173 					  }, 0, NULL);
    174 
    175 	}
    176 
    177 	radv_CmdBindDescriptorSets(radv_cmd_buffer_to_handle(cmd_buffer),
    178 				   VK_PIPELINE_BIND_POINT_GRAPHICS,
    179 				   device->meta_state.blit2d.p_layouts[src_type], 0, 1,
    180 				   &tmp->set, 0, NULL);
    181 }
    182 
    183 static void
    184 blit2d_unbind_src(struct radv_cmd_buffer *cmd_buffer,
    185                   struct blit2d_src_temps *tmp,
    186                   enum blit2d_src_type src_type)
    187 {
    188 	radv_temp_descriptor_set_destroy(cmd_buffer->device, tmp->set);
    189 }
    190 
    191 struct blit2d_dst_temps {
    192 	VkImage image;
    193 	struct radv_image_view iview;
    194 	VkFramebuffer fb;
    195 };
    196 
    197 static void
    198 blit2d_bind_dst(struct radv_cmd_buffer *cmd_buffer,
    199                 struct radv_meta_blit2d_surf *dst,
    200                 uint32_t width,
    201                 uint32_t height,
    202 		VkFormat depth_format,
    203                 struct blit2d_dst_temps *tmp)
    204 {
    205 	VkImageUsageFlagBits bits;
    206 
    207 	if (dst->aspect_mask == VK_IMAGE_ASPECT_COLOR_BIT)
    208 		bits = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
    209 	else
    210 		bits = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
    211 
    212 	create_iview(cmd_buffer, dst, bits,
    213 		     &tmp->iview, depth_format);
    214 
    215 	radv_CreateFramebuffer(radv_device_to_handle(cmd_buffer->device),
    216 			       &(VkFramebufferCreateInfo) {
    217 				       .sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO,
    218 					       .attachmentCount = 1,
    219 					       .pAttachments = (VkImageView[]) {
    220 					       radv_image_view_to_handle(&tmp->iview),
    221 				       },
    222 				       .width = width,
    223 				       .height = height,
    224 				       .layers = 1
    225 				}, &cmd_buffer->pool->alloc, &tmp->fb);
    226 }
    227 
    228 static void
    229 blit2d_unbind_dst(struct radv_cmd_buffer *cmd_buffer,
    230                   struct blit2d_dst_temps *tmp)
    231 {
    232 	VkDevice vk_device = radv_device_to_handle(cmd_buffer->device);
    233 	radv_DestroyFramebuffer(vk_device, tmp->fb, &cmd_buffer->pool->alloc);
    234 }
    235 
    236 static void
    237 bind_pipeline(struct radv_cmd_buffer *cmd_buffer,
    238               enum blit2d_src_type src_type, unsigned fs_key)
    239 {
    240 	VkPipeline pipeline =
    241 		cmd_buffer->device->meta_state.blit2d.pipelines[src_type][fs_key];
    242 
    243 	if (cmd_buffer->state.pipeline != radv_pipeline_from_handle(pipeline)) {
    244 		radv_CmdBindPipeline(radv_cmd_buffer_to_handle(cmd_buffer),
    245 				     VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
    246 	}
    247 }
    248 
    249 static void
    250 bind_depth_pipeline(struct radv_cmd_buffer *cmd_buffer,
    251 		    enum blit2d_src_type src_type)
    252 {
    253 	VkPipeline pipeline =
    254 		cmd_buffer->device->meta_state.blit2d.depth_only_pipeline[src_type];
    255 
    256 	if (cmd_buffer->state.pipeline != radv_pipeline_from_handle(pipeline)) {
    257 		radv_CmdBindPipeline(radv_cmd_buffer_to_handle(cmd_buffer),
    258 				     VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
    259 	}
    260 }
    261 
    262 static void
    263 bind_stencil_pipeline(struct radv_cmd_buffer *cmd_buffer,
    264 		      enum blit2d_src_type src_type)
    265 {
    266 	VkPipeline pipeline =
    267 		cmd_buffer->device->meta_state.blit2d.stencil_only_pipeline[src_type];
    268 
    269 	if (cmd_buffer->state.pipeline != radv_pipeline_from_handle(pipeline)) {
    270 		radv_CmdBindPipeline(radv_cmd_buffer_to_handle(cmd_buffer),
    271 				     VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
    272 	}
    273 }
    274 
    275 static void
    276 radv_meta_blit2d_normal_dst(struct radv_cmd_buffer *cmd_buffer,
    277 			    struct radv_meta_blit2d_surf *src_img,
    278 			    struct radv_meta_blit2d_buffer *src_buf,
    279 			    struct radv_meta_blit2d_surf *dst,
    280 			    unsigned num_rects,
    281 			    struct radv_meta_blit2d_rect *rects, enum blit2d_src_type src_type)
    282 {
    283 	struct radv_device *device = cmd_buffer->device;
    284 
    285 	for (unsigned r = 0; r < num_rects; ++r) {
    286 		VkFormat depth_format = 0;
    287 		if (dst->aspect_mask == VK_IMAGE_ASPECT_STENCIL_BIT)
    288 			depth_format = vk_format_stencil_only(dst->image->vk_format);
    289 		else if (dst->aspect_mask == VK_IMAGE_ASPECT_DEPTH_BIT)
    290 			depth_format = vk_format_depth_only(dst->image->vk_format);
    291 		struct blit2d_src_temps src_temps;
    292 		blit2d_bind_src(cmd_buffer, src_img, src_buf, &src_temps, src_type, depth_format);
    293 
    294 		uint32_t offset = 0;
    295 		struct blit2d_dst_temps dst_temps;
    296 		blit2d_bind_dst(cmd_buffer, dst, rects[r].dst_x + rects[r].width,
    297 				rects[r].dst_y + rects[r].height, depth_format, &dst_temps);
    298 
    299 		struct blit_vb_data {
    300 			float pos[2];
    301 			float tex_coord[2];
    302 		} vb_data[3];
    303 
    304 		unsigned vb_size = 3 * sizeof(*vb_data);
    305 
    306 		vb_data[0] = (struct blit_vb_data) {
    307 			.pos = {
    308 				rects[r].dst_x,
    309 				rects[r].dst_y,
    310 			},
    311 			.tex_coord = {
    312 				rects[r].src_x,
    313 				rects[r].src_y,
    314 			},
    315 		};
    316 
    317 		vb_data[1] = (struct blit_vb_data) {
    318 			.pos = {
    319 				rects[r].dst_x,
    320 				rects[r].dst_y + rects[r].height,
    321 			},
    322 			.tex_coord = {
    323 				rects[r].src_x,
    324 				rects[r].src_y + rects[r].height,
    325 			},
    326 		};
    327 
    328 		vb_data[2] = (struct blit_vb_data) {
    329 			.pos = {
    330 				rects[r].dst_x + rects[r].width,
    331 				rects[r].dst_y,
    332 			},
    333 			.tex_coord = {
    334 				rects[r].src_x + rects[r].width,
    335 				rects[r].src_y,
    336 			},
    337 		};
    338 
    339 
    340 		radv_cmd_buffer_upload_data(cmd_buffer, vb_size, 16, vb_data, &offset);
    341 
    342 		struct radv_buffer vertex_buffer = {
    343 			.device = device,
    344 			.size = vb_size,
    345 			.bo = cmd_buffer->upload.upload_bo,
    346 			.offset = offset,
    347 		};
    348 
    349 		radv_CmdBindVertexBuffers(radv_cmd_buffer_to_handle(cmd_buffer), 0, 1,
    350 					  (VkBuffer[]) {
    351 						  radv_buffer_to_handle(&vertex_buffer),
    352 							  },
    353 					  (VkDeviceSize[]) {
    354 						  0,
    355 							  });
    356 
    357 
    358 		if (dst->aspect_mask == VK_IMAGE_ASPECT_COLOR_BIT) {
    359 			unsigned fs_key = radv_format_meta_fs_key(dst_temps.iview.vk_format);
    360 
    361 			radv_CmdBeginRenderPass(radv_cmd_buffer_to_handle(cmd_buffer),
    362 						      &(VkRenderPassBeginInfo) {
    363 							      .sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,
    364 								      .renderPass = device->meta_state.blit2d.render_passes[fs_key],
    365 								      .framebuffer = dst_temps.fb,
    366 								      .renderArea = {
    367 								      .offset = { rects[r].dst_x, rects[r].dst_y, },
    368 								      .extent = { rects[r].width, rects[r].height },
    369 							      },
    370 								      .clearValueCount = 0,
    371 									       .pClearValues = NULL,
    372 									       }, VK_SUBPASS_CONTENTS_INLINE);
    373 
    374 
    375 			bind_pipeline(cmd_buffer, src_type, fs_key);
    376 		} else if (dst->aspect_mask == VK_IMAGE_ASPECT_DEPTH_BIT) {
    377 			radv_CmdBeginRenderPass(radv_cmd_buffer_to_handle(cmd_buffer),
    378 						      &(VkRenderPassBeginInfo) {
    379 							      .sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,
    380 								      .renderPass = device->meta_state.blit2d.depth_only_rp,
    381 								      .framebuffer = dst_temps.fb,
    382 								      .renderArea = {
    383 								      .offset = { rects[r].dst_x, rects[r].dst_y, },
    384 								      .extent = { rects[r].width, rects[r].height },
    385 							      },
    386 								      .clearValueCount = 0,
    387 									       .pClearValues = NULL,
    388 									       }, VK_SUBPASS_CONTENTS_INLINE);
    389 
    390 
    391 			bind_depth_pipeline(cmd_buffer, src_type);
    392 
    393 		} else if (dst->aspect_mask == VK_IMAGE_ASPECT_STENCIL_BIT) {
    394 			radv_CmdBeginRenderPass(radv_cmd_buffer_to_handle(cmd_buffer),
    395 						      &(VkRenderPassBeginInfo) {
    396 							      .sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,
    397 								      .renderPass = device->meta_state.blit2d.stencil_only_rp,
    398 								      .framebuffer = dst_temps.fb,
    399 								      .renderArea = {
    400 								      .offset = { rects[r].dst_x, rects[r].dst_y, },
    401 								      .extent = { rects[r].width, rects[r].height },
    402 							      },
    403 								      .clearValueCount = 0,
    404 									       .pClearValues = NULL,
    405 									       }, VK_SUBPASS_CONTENTS_INLINE);
    406 
    407 
    408 			bind_stencil_pipeline(cmd_buffer, src_type);
    409 		}
    410 
    411 		radv_CmdDraw(radv_cmd_buffer_to_handle(cmd_buffer), 3, 1, 0, 0);
    412 		radv_CmdEndRenderPass(radv_cmd_buffer_to_handle(cmd_buffer));
    413 
    414 		/* At the point where we emit the draw call, all data from the
    415 		 * descriptor sets, etc. has been used.  We are free to delete it.
    416 		 */
    417 		blit2d_unbind_src(cmd_buffer, &src_temps, src_type);
    418 		blit2d_unbind_dst(cmd_buffer, &dst_temps);
    419 	}
    420 }
    421 
    422 void
    423 radv_meta_blit2d(struct radv_cmd_buffer *cmd_buffer,
    424 		 struct radv_meta_blit2d_surf *src_img,
    425 		 struct radv_meta_blit2d_buffer *src_buf,
    426 		 struct radv_meta_blit2d_surf *dst,
    427 		 unsigned num_rects,
    428 		 struct radv_meta_blit2d_rect *rects)
    429 {
    430 	enum blit2d_src_type src_type = src_buf ? BLIT2D_SRC_TYPE_BUFFER :
    431 						  BLIT2D_SRC_TYPE_IMAGE;
    432 	radv_meta_blit2d_normal_dst(cmd_buffer, src_img, src_buf, dst,
    433 				    num_rects, rects, src_type);
    434 }
    435 
    436 static nir_shader *
    437 build_nir_vertex_shader(void)
    438 {
    439 	const struct glsl_type *vec4 = glsl_vec4_type();
    440 	const struct glsl_type *vec2 = glsl_vector_type(GLSL_TYPE_FLOAT, 2);
    441 	nir_builder b;
    442 
    443 	nir_builder_init_simple_shader(&b, NULL, MESA_SHADER_VERTEX, NULL);
    444 	b.shader->info->name = ralloc_strdup(b.shader, "meta_blit_vs");
    445 
    446 	nir_variable *pos_in = nir_variable_create(b.shader, nir_var_shader_in,
    447 						   vec4, "a_pos");
    448 	pos_in->data.location = VERT_ATTRIB_GENERIC0;
    449 	nir_variable *pos_out = nir_variable_create(b.shader, nir_var_shader_out,
    450 						    vec4, "gl_Position");
    451 	pos_out->data.location = VARYING_SLOT_POS;
    452 	nir_copy_var(&b, pos_out, pos_in);
    453 
    454 	nir_variable *tex_pos_in = nir_variable_create(b.shader, nir_var_shader_in,
    455 						       vec2, "a_tex_pos");
    456 	tex_pos_in->data.location = VERT_ATTRIB_GENERIC1;
    457 	nir_variable *tex_pos_out = nir_variable_create(b.shader, nir_var_shader_out,
    458 							vec2, "v_tex_pos");
    459 	tex_pos_out->data.location = VARYING_SLOT_VAR0;
    460 	tex_pos_out->data.interpolation = INTERP_MODE_SMOOTH;
    461 	nir_copy_var(&b, tex_pos_out, tex_pos_in);
    462 
    463 	return b.shader;
    464 }
    465 
    466 typedef nir_ssa_def* (*texel_fetch_build_func)(struct nir_builder *,
    467                                                struct radv_device *,
    468                                                nir_ssa_def *);
    469 
    470 static nir_ssa_def *
    471 build_nir_texel_fetch(struct nir_builder *b, struct radv_device *device,
    472                       nir_ssa_def *tex_pos)
    473 {
    474 	const struct glsl_type *sampler_type =
    475 		glsl_sampler_type(GLSL_SAMPLER_DIM_2D, false, false, GLSL_TYPE_UINT);
    476 	nir_variable *sampler = nir_variable_create(b->shader, nir_var_uniform,
    477 						    sampler_type, "s_tex");
    478 	sampler->data.descriptor_set = 0;
    479 	sampler->data.binding = 0;
    480 
    481 	nir_tex_instr *tex = nir_tex_instr_create(b->shader, 2);
    482 	tex->sampler_dim = GLSL_SAMPLER_DIM_2D;
    483 	tex->op = nir_texop_txf;
    484 	tex->src[0].src_type = nir_tex_src_coord;
    485 	tex->src[0].src = nir_src_for_ssa(tex_pos);
    486 	tex->src[1].src_type = nir_tex_src_lod;
    487 	tex->src[1].src = nir_src_for_ssa(nir_imm_int(b, 0));
    488 	tex->dest_type = nir_type_uint;
    489 	tex->is_array = false;
    490 	tex->coord_components = 2;
    491 	tex->texture = nir_deref_var_create(tex, sampler);
    492 	tex->sampler = NULL;
    493 
    494 	nir_ssa_dest_init(&tex->instr, &tex->dest, 4, 32, "tex");
    495 	nir_builder_instr_insert(b, &tex->instr);
    496 
    497 	return &tex->dest.ssa;
    498 }
    499 
    500 
    501 static nir_ssa_def *
    502 build_nir_buffer_fetch(struct nir_builder *b, struct radv_device *device,
    503                       nir_ssa_def *tex_pos)
    504 {
    505 	const struct glsl_type *sampler_type =
    506 		glsl_sampler_type(GLSL_SAMPLER_DIM_BUF, false, false, GLSL_TYPE_UINT);
    507 	nir_variable *sampler = nir_variable_create(b->shader, nir_var_uniform,
    508 						    sampler_type, "s_tex");
    509 	sampler->data.descriptor_set = 0;
    510 	sampler->data.binding = 0;
    511 
    512 	nir_intrinsic_instr *width = nir_intrinsic_instr_create(b->shader, nir_intrinsic_load_push_constant);
    513 	width->src[0] = nir_src_for_ssa(nir_imm_int(b, 0));
    514 	width->num_components = 1;
    515 	nir_ssa_dest_init(&width->instr, &width->dest, 1, 32, "width");
    516 	nir_builder_instr_insert(b, &width->instr);
    517 
    518 	nir_ssa_def *pos_x = nir_channel(b, tex_pos, 0);
    519 	nir_ssa_def *pos_y = nir_channel(b, tex_pos, 1);
    520 	pos_y = nir_imul(b, pos_y, &width->dest.ssa);
    521 	pos_x = nir_iadd(b, pos_x, pos_y);
    522 	//pos_x = nir_iadd(b, pos_x, nir_imm_int(b, 100000));
    523 
    524 	nir_tex_instr *tex = nir_tex_instr_create(b->shader, 1);
    525 	tex->sampler_dim = GLSL_SAMPLER_DIM_BUF;
    526 	tex->op = nir_texop_txf;
    527 	tex->src[0].src_type = nir_tex_src_coord;
    528 	tex->src[0].src = nir_src_for_ssa(pos_x);
    529 	tex->dest_type = nir_type_uint;
    530 	tex->is_array = false;
    531 	tex->coord_components = 1;
    532 	tex->texture = nir_deref_var_create(tex, sampler);
    533 	tex->sampler = NULL;
    534 
    535 	nir_ssa_dest_init(&tex->instr, &tex->dest, 4, 32, "tex");
    536 	nir_builder_instr_insert(b, &tex->instr);
    537 
    538 	return &tex->dest.ssa;
    539 }
    540 
    541 static const VkPipelineVertexInputStateCreateInfo normal_vi_create_info = {
    542 	.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO,
    543 	.vertexBindingDescriptionCount = 1,
    544 	.pVertexBindingDescriptions = (VkVertexInputBindingDescription[]) {
    545 		{
    546 			.binding = 0,
    547 			.stride = 4 * sizeof(float),
    548 			.inputRate = VK_VERTEX_INPUT_RATE_VERTEX
    549 		},
    550 	},
    551 	.vertexAttributeDescriptionCount = 2,
    552 	.pVertexAttributeDescriptions = (VkVertexInputAttributeDescription[]) {
    553 		{
    554 			/* Position */
    555 			.location = 0,
    556 			.binding = 0,
    557 			.format = VK_FORMAT_R32G32_SFLOAT,
    558 			.offset = 0
    559 		},
    560 		{
    561 			/* Texture Coordinate */
    562 			.location = 1,
    563 			.binding = 0,
    564 			.format = VK_FORMAT_R32G32_SFLOAT,
    565 			.offset = 8
    566 		},
    567 	},
    568 };
    569 
    570 static nir_shader *
    571 build_nir_copy_fragment_shader(struct radv_device *device,
    572                                texel_fetch_build_func txf_func, const char* name)
    573 {
    574 	const struct glsl_type *vec4 = glsl_vec4_type();
    575 	const struct glsl_type *vec2 = glsl_vector_type(GLSL_TYPE_FLOAT, 2);
    576 	nir_builder b;
    577 
    578 	nir_builder_init_simple_shader(&b, NULL, MESA_SHADER_FRAGMENT, NULL);
    579 	b.shader->info->name = ralloc_strdup(b.shader, name);
    580 
    581 	nir_variable *tex_pos_in = nir_variable_create(b.shader, nir_var_shader_in,
    582 						       vec2, "v_tex_pos");
    583 	tex_pos_in->data.location = VARYING_SLOT_VAR0;
    584 
    585 	nir_variable *color_out = nir_variable_create(b.shader, nir_var_shader_out,
    586 						      vec4, "f_color");
    587 	color_out->data.location = FRAG_RESULT_DATA0;
    588 
    589 	nir_ssa_def *pos_int = nir_f2i(&b, nir_load_var(&b, tex_pos_in));
    590 	unsigned swiz[4] = { 0, 1 };
    591 	nir_ssa_def *tex_pos = nir_swizzle(&b, pos_int, swiz, 2, false);
    592 
    593 	nir_ssa_def *color = txf_func(&b, device, tex_pos);
    594 	nir_store_var(&b, color_out, color, 0xf);
    595 
    596 	return b.shader;
    597 }
    598 
    599 static nir_shader *
    600 build_nir_copy_fragment_shader_depth(struct radv_device *device,
    601 				     texel_fetch_build_func txf_func, const char* name)
    602 {
    603 	const struct glsl_type *vec4 = glsl_vec4_type();
    604 	const struct glsl_type *vec2 = glsl_vector_type(GLSL_TYPE_FLOAT, 2);
    605 	nir_builder b;
    606 
    607 	nir_builder_init_simple_shader(&b, NULL, MESA_SHADER_FRAGMENT, NULL);
    608 	b.shader->info->name = ralloc_strdup(b.shader, name);
    609 
    610 	nir_variable *tex_pos_in = nir_variable_create(b.shader, nir_var_shader_in,
    611 						       vec2, "v_tex_pos");
    612 	tex_pos_in->data.location = VARYING_SLOT_VAR0;
    613 
    614 	nir_variable *color_out = nir_variable_create(b.shader, nir_var_shader_out,
    615 						      vec4, "f_color");
    616 	color_out->data.location = FRAG_RESULT_DEPTH;
    617 
    618 	nir_ssa_def *pos_int = nir_f2i(&b, nir_load_var(&b, tex_pos_in));
    619 	unsigned swiz[4] = { 0, 1 };
    620 	nir_ssa_def *tex_pos = nir_swizzle(&b, pos_int, swiz, 2, false);
    621 
    622 	nir_ssa_def *color = txf_func(&b, device, tex_pos);
    623 	nir_store_var(&b, color_out, color, 0x1);
    624 
    625 	return b.shader;
    626 }
    627 
    628 static nir_shader *
    629 build_nir_copy_fragment_shader_stencil(struct radv_device *device,
    630 				       texel_fetch_build_func txf_func, const char* name)
    631 {
    632 	const struct glsl_type *vec4 = glsl_vec4_type();
    633 	const struct glsl_type *vec2 = glsl_vector_type(GLSL_TYPE_FLOAT, 2);
    634 	nir_builder b;
    635 
    636 	nir_builder_init_simple_shader(&b, NULL, MESA_SHADER_FRAGMENT, NULL);
    637 	b.shader->info->name = ralloc_strdup(b.shader, name);
    638 
    639 	nir_variable *tex_pos_in = nir_variable_create(b.shader, nir_var_shader_in,
    640 						       vec2, "v_tex_pos");
    641 	tex_pos_in->data.location = VARYING_SLOT_VAR0;
    642 
    643 	nir_variable *color_out = nir_variable_create(b.shader, nir_var_shader_out,
    644 						      vec4, "f_color");
    645 	color_out->data.location = FRAG_RESULT_STENCIL;
    646 
    647 	nir_ssa_def *pos_int = nir_f2i(&b, nir_load_var(&b, tex_pos_in));
    648 	unsigned swiz[4] = { 0, 1 };
    649 	nir_ssa_def *tex_pos = nir_swizzle(&b, pos_int, swiz, 2, false);
    650 
    651 	nir_ssa_def *color = txf_func(&b, device, tex_pos);
    652 	nir_store_var(&b, color_out, color, 0x1);
    653 
    654 	return b.shader;
    655 }
    656 
    657 void
    658 radv_device_finish_meta_blit2d_state(struct radv_device *device)
    659 {
    660 	for(unsigned j = 0; j < NUM_META_FS_KEYS; ++j) {
    661 		if (device->meta_state.blit2d.render_passes[j]) {
    662 			radv_DestroyRenderPass(radv_device_to_handle(device),
    663 					       device->meta_state.blit2d.render_passes[j],
    664 					       &device->meta_state.alloc);
    665 		}
    666 	}
    667 
    668 	radv_DestroyRenderPass(radv_device_to_handle(device),
    669 			       device->meta_state.blit2d.depth_only_rp,
    670 			       &device->meta_state.alloc);
    671 	radv_DestroyRenderPass(radv_device_to_handle(device),
    672 			       device->meta_state.blit2d.stencil_only_rp,
    673 			       &device->meta_state.alloc);
    674 
    675 	for (unsigned src = 0; src < BLIT2D_NUM_SRC_TYPES; src++) {
    676 		if (device->meta_state.blit2d.p_layouts[src]) {
    677 			radv_DestroyPipelineLayout(radv_device_to_handle(device),
    678 						device->meta_state.blit2d.p_layouts[src],
    679 						&device->meta_state.alloc);
    680 		}
    681 
    682 		if (device->meta_state.blit2d.ds_layouts[src]) {
    683 			radv_DestroyDescriptorSetLayout(radv_device_to_handle(device),
    684 							device->meta_state.blit2d.ds_layouts[src],
    685 							&device->meta_state.alloc);
    686 		}
    687 
    688 		for (unsigned j = 0; j < NUM_META_FS_KEYS; ++j) {
    689 			if (device->meta_state.blit2d.pipelines[src][j]) {
    690 				radv_DestroyPipeline(radv_device_to_handle(device),
    691 						     device->meta_state.blit2d.pipelines[src][j],
    692 						     &device->meta_state.alloc);
    693 			}
    694 		}
    695 
    696 		radv_DestroyPipeline(radv_device_to_handle(device),
    697 				     device->meta_state.blit2d.depth_only_pipeline[src],
    698 				     &device->meta_state.alloc);
    699 		radv_DestroyPipeline(radv_device_to_handle(device),
    700 				     device->meta_state.blit2d.stencil_only_pipeline[src],
    701 				     &device->meta_state.alloc);
    702 	}
    703 }
    704 
    705 static VkResult
    706 blit2d_init_color_pipeline(struct radv_device *device,
    707 			   enum blit2d_src_type src_type,
    708 			   VkFormat format)
    709 {
    710 	VkResult result;
    711 	unsigned fs_key = radv_format_meta_fs_key(format);
    712 	const char *name;
    713 
    714 	texel_fetch_build_func src_func;
    715 	switch(src_type) {
    716 	case BLIT2D_SRC_TYPE_IMAGE:
    717 		src_func = build_nir_texel_fetch;
    718 		name = "meta_blit2d_image_fs";
    719 		break;
    720 	case BLIT2D_SRC_TYPE_BUFFER:
    721 		src_func = build_nir_buffer_fetch;
    722 		name = "meta_blit2d_buffer_fs";
    723 		break;
    724 	default:
    725 		unreachable("unknown blit src type\n");
    726 		break;
    727 	}
    728 
    729 	const VkPipelineVertexInputStateCreateInfo *vi_create_info;
    730 	struct radv_shader_module fs = { .nir = NULL };
    731 
    732 
    733 	fs.nir = build_nir_copy_fragment_shader(device, src_func, name);
    734 	vi_create_info = &normal_vi_create_info;
    735 
    736 	struct radv_shader_module vs = {
    737 		.nir = build_nir_vertex_shader(),
    738 	};
    739 
    740 	VkPipelineShaderStageCreateInfo pipeline_shader_stages[] = {
    741 		{
    742 			.sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
    743 			.stage = VK_SHADER_STAGE_VERTEX_BIT,
    744 			.module = radv_shader_module_to_handle(&vs),
    745 			.pName = "main",
    746 			.pSpecializationInfo = NULL
    747 		}, {
    748 			.sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
    749 			.stage = VK_SHADER_STAGE_FRAGMENT_BIT,
    750 			.module = radv_shader_module_to_handle(&fs),
    751 			.pName = "main",
    752 			.pSpecializationInfo = NULL
    753 		},
    754 	};
    755 
    756 	if (!device->meta_state.blit2d.render_passes[fs_key]) {
    757 		result = radv_CreateRenderPass(radv_device_to_handle(device),
    758 					       &(VkRenderPassCreateInfo) {
    759 						       .sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO,
    760 						       .attachmentCount = 1,
    761 						       .pAttachments = &(VkAttachmentDescription) {
    762 						       .format = format,
    763 						       .loadOp = VK_ATTACHMENT_LOAD_OP_LOAD,
    764 						       .storeOp = VK_ATTACHMENT_STORE_OP_STORE,
    765 						       .initialLayout = VK_IMAGE_LAYOUT_GENERAL,
    766 						       .finalLayout = VK_IMAGE_LAYOUT_GENERAL,
    767 						       },
    768 					       .subpassCount = 1,
    769 					       .pSubpasses = &(VkSubpassDescription) {
    770 						       .pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS,
    771 						       .inputAttachmentCount = 0,
    772 						       .colorAttachmentCount = 1,
    773 						       .pColorAttachments = &(VkAttachmentReference) {
    774 							       .attachment = 0,
    775 							       .layout = VK_IMAGE_LAYOUT_GENERAL,
    776 							},
    777 					       .pResolveAttachments = NULL,
    778 					       .pDepthStencilAttachment = &(VkAttachmentReference) {
    779 						       .attachment = VK_ATTACHMENT_UNUSED,
    780 						       .layout = VK_IMAGE_LAYOUT_GENERAL,
    781 					       },
    782 					       .preserveAttachmentCount = 1,
    783 					       .pPreserveAttachments = (uint32_t[]) { 0 },
    784 					       },
    785 					.dependencyCount = 0,
    786 				 }, &device->meta_state.alloc, &device->meta_state.blit2d.render_passes[fs_key]);
    787 	}
    788 
    789 	const VkGraphicsPipelineCreateInfo vk_pipeline_info = {
    790 		.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO,
    791 		.stageCount = ARRAY_SIZE(pipeline_shader_stages),
    792 		.pStages = pipeline_shader_stages,
    793 		.pVertexInputState = vi_create_info,
    794 		.pInputAssemblyState = &(VkPipelineInputAssemblyStateCreateInfo) {
    795 			.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,
    796 			.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP,
    797 			.primitiveRestartEnable = false,
    798 		},
    799 		.pViewportState = &(VkPipelineViewportStateCreateInfo) {
    800 			.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO,
    801 			.viewportCount = 0,
    802 			.scissorCount = 0,
    803 		},
    804 		.pRasterizationState = &(VkPipelineRasterizationStateCreateInfo) {
    805 			.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO,
    806 			.rasterizerDiscardEnable = false,
    807 			.polygonMode = VK_POLYGON_MODE_FILL,
    808 			.cullMode = VK_CULL_MODE_NONE,
    809 			.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE
    810 		},
    811 		.pMultisampleState = &(VkPipelineMultisampleStateCreateInfo) {
    812 			.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO,
    813 			.rasterizationSamples = 1,
    814 			.sampleShadingEnable = false,
    815 			.pSampleMask = (VkSampleMask[]) { UINT32_MAX },
    816 		},
    817 		.pColorBlendState = &(VkPipelineColorBlendStateCreateInfo) {
    818 			.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO,
    819 			.attachmentCount = 1,
    820 			.pAttachments = (VkPipelineColorBlendAttachmentState []) {
    821 				{ .colorWriteMask =
    822 				  VK_COLOR_COMPONENT_A_BIT |
    823 				  VK_COLOR_COMPONENT_R_BIT |
    824 				  VK_COLOR_COMPONENT_G_BIT |
    825 				  VK_COLOR_COMPONENT_B_BIT },
    826 			}
    827 		},
    828 		.pDynamicState = &(VkPipelineDynamicStateCreateInfo) {
    829 			.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO,
    830 			.dynamicStateCount = 7,
    831 			.pDynamicStates = (VkDynamicState[]) {
    832 				VK_DYNAMIC_STATE_LINE_WIDTH,
    833 				VK_DYNAMIC_STATE_DEPTH_BIAS,
    834 				VK_DYNAMIC_STATE_BLEND_CONSTANTS,
    835 				VK_DYNAMIC_STATE_DEPTH_BOUNDS,
    836 				VK_DYNAMIC_STATE_STENCIL_COMPARE_MASK,
    837 				VK_DYNAMIC_STATE_STENCIL_WRITE_MASK,
    838 				VK_DYNAMIC_STATE_STENCIL_REFERENCE,
    839 			},
    840 		},
    841 		.flags = 0,
    842 		.layout = device->meta_state.blit2d.p_layouts[src_type],
    843 		.renderPass = device->meta_state.blit2d.render_passes[fs_key],
    844 		.subpass = 0,
    845 	};
    846 
    847 	const struct radv_graphics_pipeline_create_info radv_pipeline_info = {
    848 		.use_rectlist = true
    849 	};
    850 
    851 	result = radv_graphics_pipeline_create(radv_device_to_handle(device),
    852 					       radv_pipeline_cache_to_handle(&device->meta_state.cache),
    853 					       &vk_pipeline_info, &radv_pipeline_info,
    854 					       &device->meta_state.alloc,
    855 					       &device->meta_state.blit2d.pipelines[src_type][fs_key]);
    856 
    857 
    858 	ralloc_free(vs.nir);
    859 	ralloc_free(fs.nir);
    860 
    861 	return result;
    862 }
    863 
    864 static VkResult
    865 blit2d_init_depth_only_pipeline(struct radv_device *device,
    866 				enum blit2d_src_type src_type)
    867 {
    868 	VkResult result;
    869 	const char *name;
    870 
    871 	texel_fetch_build_func src_func;
    872 	switch(src_type) {
    873 	case BLIT2D_SRC_TYPE_IMAGE:
    874 		src_func = build_nir_texel_fetch;
    875 		name = "meta_blit2d_depth_image_fs";
    876 		break;
    877 	case BLIT2D_SRC_TYPE_BUFFER:
    878 		src_func = build_nir_buffer_fetch;
    879 		name = "meta_blit2d_depth_buffer_fs";
    880 		break;
    881 	default:
    882 		unreachable("unknown blit src type\n");
    883 		break;
    884 	}
    885 
    886 	const VkPipelineVertexInputStateCreateInfo *vi_create_info;
    887 	struct radv_shader_module fs = { .nir = NULL };
    888 
    889 	fs.nir = build_nir_copy_fragment_shader_depth(device, src_func, name);
    890 	vi_create_info = &normal_vi_create_info;
    891 
    892 	struct radv_shader_module vs = {
    893 		.nir = build_nir_vertex_shader(),
    894 	};
    895 
    896 	VkPipelineShaderStageCreateInfo pipeline_shader_stages[] = {
    897 		{
    898 			.sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
    899 			.stage = VK_SHADER_STAGE_VERTEX_BIT,
    900 			.module = radv_shader_module_to_handle(&vs),
    901 			.pName = "main",
    902 			.pSpecializationInfo = NULL
    903 		}, {
    904 			.sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
    905 			.stage = VK_SHADER_STAGE_FRAGMENT_BIT,
    906 			.module = radv_shader_module_to_handle(&fs),
    907 			.pName = "main",
    908 			.pSpecializationInfo = NULL
    909 		},
    910 	};
    911 
    912 	if (!device->meta_state.blit2d.depth_only_rp) {
    913 		result = radv_CreateRenderPass(radv_device_to_handle(device),
    914 					       &(VkRenderPassCreateInfo) {
    915 						       .sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO,
    916 							       .attachmentCount = 1,
    917 							       .pAttachments = &(VkAttachmentDescription) {
    918 							       .format = 0,
    919 							       .loadOp = VK_ATTACHMENT_LOAD_OP_LOAD,
    920 							       .storeOp = VK_ATTACHMENT_STORE_OP_STORE,
    921 							       .initialLayout = VK_IMAGE_LAYOUT_GENERAL,
    922 							       .finalLayout = VK_IMAGE_LAYOUT_GENERAL,
    923 						       },
    924 						       .subpassCount = 1,
    925 						       .pSubpasses = &(VkSubpassDescription) {
    926 						       .pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS,
    927 						       .inputAttachmentCount = 0,
    928 						       .colorAttachmentCount = 0,
    929 						       .pColorAttachments = NULL,
    930 						       .pResolveAttachments = NULL,
    931 						       .pDepthStencilAttachment = &(VkAttachmentReference) {
    932 							       .attachment = 0,
    933 							       .layout = VK_IMAGE_LAYOUT_GENERAL,
    934 						       },
    935 						       .preserveAttachmentCount = 1,
    936 						       .pPreserveAttachments = (uint32_t[]) { 0 },
    937 					       },
    938 								.dependencyCount = 0,
    939 						 }, &device->meta_state.alloc, &device->meta_state.blit2d.depth_only_rp);
    940 	}
    941 
    942 	const VkGraphicsPipelineCreateInfo vk_pipeline_info = {
    943 		.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO,
    944 		.stageCount = ARRAY_SIZE(pipeline_shader_stages),
    945 		.pStages = pipeline_shader_stages,
    946 		.pVertexInputState = vi_create_info,
    947 		.pInputAssemblyState = &(VkPipelineInputAssemblyStateCreateInfo) {
    948 			.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,
    949 			.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP,
    950 			.primitiveRestartEnable = false,
    951 		},
    952 		.pViewportState = &(VkPipelineViewportStateCreateInfo) {
    953 			.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO,
    954 			.viewportCount = 0,
    955 			.scissorCount = 0,
    956 		},
    957 		.pRasterizationState = &(VkPipelineRasterizationStateCreateInfo) {
    958 			.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO,
    959 			.rasterizerDiscardEnable = false,
    960 			.polygonMode = VK_POLYGON_MODE_FILL,
    961 			.cullMode = VK_CULL_MODE_NONE,
    962 			.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE
    963 		},
    964 		.pMultisampleState = &(VkPipelineMultisampleStateCreateInfo) {
    965 			.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO,
    966 			.rasterizationSamples = 1,
    967 			.sampleShadingEnable = false,
    968 			.pSampleMask = (VkSampleMask[]) { UINT32_MAX },
    969 		},
    970 		.pColorBlendState = &(VkPipelineColorBlendStateCreateInfo) {
    971 			.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO,
    972 			.attachmentCount = 0,
    973 			.pAttachments = NULL,
    974 		},
    975 		.pDepthStencilState = &(VkPipelineDepthStencilStateCreateInfo) {
    976 			.sType = VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO,
    977 			.depthTestEnable = true,
    978 			.depthWriteEnable = true,
    979 			.depthCompareOp = VK_COMPARE_OP_ALWAYS,
    980 		},
    981 		.pDynamicState = &(VkPipelineDynamicStateCreateInfo) {
    982 			.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO,
    983 			.dynamicStateCount = 7,
    984 			.pDynamicStates = (VkDynamicState[]) {
    985 				VK_DYNAMIC_STATE_LINE_WIDTH,
    986 				VK_DYNAMIC_STATE_DEPTH_BIAS,
    987 				VK_DYNAMIC_STATE_BLEND_CONSTANTS,
    988 				VK_DYNAMIC_STATE_DEPTH_BOUNDS,
    989 				VK_DYNAMIC_STATE_STENCIL_COMPARE_MASK,
    990 				VK_DYNAMIC_STATE_STENCIL_WRITE_MASK,
    991 				VK_DYNAMIC_STATE_STENCIL_REFERENCE,
    992 			},
    993 		},
    994 		.flags = 0,
    995 		.layout = device->meta_state.blit2d.p_layouts[src_type],
    996 		.renderPass = device->meta_state.blit2d.depth_only_rp,
    997 		.subpass = 0,
    998 	};
    999 
   1000 	const struct radv_graphics_pipeline_create_info radv_pipeline_info = {
   1001 		.use_rectlist = true
   1002 	};
   1003 
   1004 	result = radv_graphics_pipeline_create(radv_device_to_handle(device),
   1005 					       radv_pipeline_cache_to_handle(&device->meta_state.cache),
   1006 					       &vk_pipeline_info, &radv_pipeline_info,
   1007 					       &device->meta_state.alloc,
   1008 					       &device->meta_state.blit2d.depth_only_pipeline[src_type]);
   1009 
   1010 
   1011 	ralloc_free(vs.nir);
   1012 	ralloc_free(fs.nir);
   1013 
   1014 	return result;
   1015 }
   1016 
   1017 static VkResult
   1018 blit2d_init_stencil_only_pipeline(struct radv_device *device,
   1019 				  enum blit2d_src_type src_type)
   1020 {
   1021 	VkResult result;
   1022 	const char *name;
   1023 
   1024 	texel_fetch_build_func src_func;
   1025 	switch(src_type) {
   1026 	case BLIT2D_SRC_TYPE_IMAGE:
   1027 		src_func = build_nir_texel_fetch;
   1028 		name = "meta_blit2d_stencil_image_fs";
   1029 		break;
   1030 	case BLIT2D_SRC_TYPE_BUFFER:
   1031 		src_func = build_nir_buffer_fetch;
   1032 		name = "meta_blit2d_stencil_buffer_fs";
   1033 		break;
   1034 	default:
   1035 		unreachable("unknown blit src type\n");
   1036 		break;
   1037 	}
   1038 
   1039 	const VkPipelineVertexInputStateCreateInfo *vi_create_info;
   1040 	struct radv_shader_module fs = { .nir = NULL };
   1041 
   1042 	fs.nir = build_nir_copy_fragment_shader_stencil(device, src_func, name);
   1043 	vi_create_info = &normal_vi_create_info;
   1044 
   1045 	struct radv_shader_module vs = {
   1046 		.nir = build_nir_vertex_shader(),
   1047 	};
   1048 
   1049 	VkPipelineShaderStageCreateInfo pipeline_shader_stages[] = {
   1050 		{
   1051 			.sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
   1052 			.stage = VK_SHADER_STAGE_VERTEX_BIT,
   1053 			.module = radv_shader_module_to_handle(&vs),
   1054 			.pName = "main",
   1055 			.pSpecializationInfo = NULL
   1056 		}, {
   1057 			.sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
   1058 			.stage = VK_SHADER_STAGE_FRAGMENT_BIT,
   1059 			.module = radv_shader_module_to_handle(&fs),
   1060 			.pName = "main",
   1061 			.pSpecializationInfo = NULL
   1062 		},
   1063 	};
   1064 
   1065 	if (!device->meta_state.blit2d.stencil_only_rp) {
   1066 		result = radv_CreateRenderPass(radv_device_to_handle(device),
   1067 					       &(VkRenderPassCreateInfo) {
   1068 						       .sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO,
   1069 							       .attachmentCount = 1,
   1070 							       .pAttachments = &(VkAttachmentDescription) {
   1071 							       .format = 0,
   1072 							       .loadOp = VK_ATTACHMENT_LOAD_OP_LOAD,
   1073 							       .storeOp = VK_ATTACHMENT_STORE_OP_STORE,
   1074 							       .initialLayout = VK_IMAGE_LAYOUT_GENERAL,
   1075 							       .finalLayout = VK_IMAGE_LAYOUT_GENERAL,
   1076 						       },
   1077 						       .subpassCount = 1,
   1078 						       .pSubpasses = &(VkSubpassDescription) {
   1079 						       .pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS,
   1080 						       .inputAttachmentCount = 0,
   1081 						       .colorAttachmentCount = 0,
   1082 						       .pColorAttachments = NULL,
   1083 						       .pResolveAttachments = NULL,
   1084 						       .pDepthStencilAttachment = &(VkAttachmentReference) {
   1085 							       .attachment = 0,
   1086 							       .layout = VK_IMAGE_LAYOUT_GENERAL,
   1087 						       },
   1088 						       .preserveAttachmentCount = 1,
   1089 						       .pPreserveAttachments = (uint32_t[]) { 0 },
   1090 					       },
   1091 								.dependencyCount = 0,
   1092 						 }, &device->meta_state.alloc, &device->meta_state.blit2d.stencil_only_rp);
   1093 	}
   1094 
   1095 	const VkGraphicsPipelineCreateInfo vk_pipeline_info = {
   1096 		.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO,
   1097 		.stageCount = ARRAY_SIZE(pipeline_shader_stages),
   1098 		.pStages = pipeline_shader_stages,
   1099 		.pVertexInputState = vi_create_info,
   1100 		.pInputAssemblyState = &(VkPipelineInputAssemblyStateCreateInfo) {
   1101 			.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,
   1102 			.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP,
   1103 			.primitiveRestartEnable = false,
   1104 		},
   1105 		.pViewportState = &(VkPipelineViewportStateCreateInfo) {
   1106 			.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO,
   1107 			.viewportCount = 0,
   1108 			.scissorCount = 0,
   1109 		},
   1110 		.pRasterizationState = &(VkPipelineRasterizationStateCreateInfo) {
   1111 			.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO,
   1112 			.rasterizerDiscardEnable = false,
   1113 			.polygonMode = VK_POLYGON_MODE_FILL,
   1114 			.cullMode = VK_CULL_MODE_NONE,
   1115 			.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE
   1116 		},
   1117 		.pMultisampleState = &(VkPipelineMultisampleStateCreateInfo) {
   1118 			.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO,
   1119 			.rasterizationSamples = 1,
   1120 			.sampleShadingEnable = false,
   1121 			.pSampleMask = (VkSampleMask[]) { UINT32_MAX },
   1122 		},
   1123 		.pColorBlendState = &(VkPipelineColorBlendStateCreateInfo) {
   1124 			.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO,
   1125 			.attachmentCount = 0,
   1126 			.pAttachments = NULL,
   1127 		},
   1128 		.pDepthStencilState = &(VkPipelineDepthStencilStateCreateInfo) {
   1129 			.sType = VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO,
   1130 			.depthTestEnable = false,
   1131 			.depthWriteEnable = false,
   1132 			.stencilTestEnable = true,
   1133 			.front = {
   1134 				.failOp = VK_STENCIL_OP_REPLACE,
   1135 				.passOp = VK_STENCIL_OP_REPLACE,
   1136 				.depthFailOp = VK_STENCIL_OP_REPLACE,
   1137 				.compareOp = VK_COMPARE_OP_ALWAYS,
   1138 				.compareMask = 0xff,
   1139 				.writeMask = 0xff,
   1140 				.reference = 0
   1141 			},
   1142 			.back = {
   1143 				.failOp = VK_STENCIL_OP_REPLACE,
   1144 				.passOp = VK_STENCIL_OP_REPLACE,
   1145 				.depthFailOp = VK_STENCIL_OP_REPLACE,
   1146 				.compareOp = VK_COMPARE_OP_ALWAYS,
   1147 				.compareMask = 0xff,
   1148 				.writeMask = 0xff,
   1149 				.reference = 0
   1150 			},
   1151 			.depthCompareOp = VK_COMPARE_OP_ALWAYS,
   1152 		},
   1153 		.pDynamicState = &(VkPipelineDynamicStateCreateInfo) {
   1154 			.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO,
   1155 			.dynamicStateCount = 4,
   1156 			.pDynamicStates = (VkDynamicState[]) {
   1157 				VK_DYNAMIC_STATE_LINE_WIDTH,
   1158 				VK_DYNAMIC_STATE_DEPTH_BIAS,
   1159 				VK_DYNAMIC_STATE_BLEND_CONSTANTS,
   1160 				VK_DYNAMIC_STATE_DEPTH_BOUNDS,
   1161 			},
   1162 		},
   1163 		.flags = 0,
   1164 		.layout = device->meta_state.blit2d.p_layouts[src_type],
   1165 		.renderPass = device->meta_state.blit2d.stencil_only_rp,
   1166 		.subpass = 0,
   1167 	};
   1168 
   1169 	const struct radv_graphics_pipeline_create_info radv_pipeline_info = {
   1170 		.use_rectlist = true
   1171 	};
   1172 
   1173 	result = radv_graphics_pipeline_create(radv_device_to_handle(device),
   1174 					       radv_pipeline_cache_to_handle(&device->meta_state.cache),
   1175 					       &vk_pipeline_info, &radv_pipeline_info,
   1176 					       &device->meta_state.alloc,
   1177 					       &device->meta_state.blit2d.stencil_only_pipeline[src_type]);
   1178 
   1179 
   1180 	ralloc_free(vs.nir);
   1181 	ralloc_free(fs.nir);
   1182 
   1183 	return result;
   1184 }
   1185 
   1186 static VkFormat pipeline_formats[] = {
   1187    VK_FORMAT_R8G8B8A8_UNORM,
   1188    VK_FORMAT_R8G8B8A8_UINT,
   1189    VK_FORMAT_R8G8B8A8_SINT,
   1190    VK_FORMAT_R16G16B16A16_UNORM,
   1191    VK_FORMAT_R16G16B16A16_SNORM,
   1192    VK_FORMAT_R16G16B16A16_UINT,
   1193    VK_FORMAT_R16G16B16A16_SINT,
   1194    VK_FORMAT_R32_SFLOAT,
   1195    VK_FORMAT_R32G32_SFLOAT,
   1196    VK_FORMAT_R32G32B32A32_SFLOAT
   1197 };
   1198 
   1199 VkResult
   1200 radv_device_init_meta_blit2d_state(struct radv_device *device)
   1201 {
   1202 	VkResult result;
   1203 
   1204 	zero(device->meta_state.blit2d);
   1205 
   1206 	result = radv_CreateDescriptorSetLayout(radv_device_to_handle(device),
   1207 						&(VkDescriptorSetLayoutCreateInfo) {
   1208 							.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO,
   1209 								.bindingCount = 1,
   1210 								.pBindings = (VkDescriptorSetLayoutBinding[]) {
   1211 								{
   1212 									.binding = 0,
   1213 									.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE,
   1214 									.descriptorCount = 1,
   1215 									.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT,
   1216 									.pImmutableSamplers = NULL
   1217 								},
   1218 							}
   1219 						}, &device->meta_state.alloc, &device->meta_state.blit2d.ds_layouts[BLIT2D_SRC_TYPE_IMAGE]);
   1220 	if (result != VK_SUCCESS)
   1221 		goto fail;
   1222 
   1223 	result = radv_CreatePipelineLayout(radv_device_to_handle(device),
   1224 					   &(VkPipelineLayoutCreateInfo) {
   1225 						   .sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO,
   1226 							   .setLayoutCount = 1,
   1227 							   .pSetLayouts = &device->meta_state.blit2d.ds_layouts[BLIT2D_SRC_TYPE_IMAGE],
   1228 							   },
   1229 					   &device->meta_state.alloc, &device->meta_state.blit2d.p_layouts[BLIT2D_SRC_TYPE_IMAGE]);
   1230 	if (result != VK_SUCCESS)
   1231 		goto fail;
   1232 
   1233 	result = radv_CreateDescriptorSetLayout(radv_device_to_handle(device),
   1234 						&(VkDescriptorSetLayoutCreateInfo) {
   1235 							.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO,
   1236 								.bindingCount = 1,
   1237 								.pBindings = (VkDescriptorSetLayoutBinding[]) {
   1238 								{
   1239 									.binding = 0,
   1240 									.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER,
   1241 									.descriptorCount = 1,
   1242 									.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT,
   1243 									.pImmutableSamplers = NULL
   1244 								},
   1245 							}
   1246 						}, &device->meta_state.alloc, &device->meta_state.blit2d.ds_layouts[BLIT2D_SRC_TYPE_BUFFER]);
   1247 	if (result != VK_SUCCESS)
   1248 		goto fail;
   1249 
   1250 	const VkPushConstantRange push_constant_range = {VK_SHADER_STAGE_FRAGMENT_BIT, 0, 4};
   1251 	result = radv_CreatePipelineLayout(radv_device_to_handle(device),
   1252 					   &(VkPipelineLayoutCreateInfo) {
   1253 						   .sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO,
   1254 						   .setLayoutCount = 1,
   1255 						   .pSetLayouts = &device->meta_state.blit2d.ds_layouts[BLIT2D_SRC_TYPE_BUFFER],
   1256 						   .pushConstantRangeCount = 1,
   1257 						   .pPushConstantRanges = &push_constant_range,
   1258 					   },
   1259 					   &device->meta_state.alloc, &device->meta_state.blit2d.p_layouts[BLIT2D_SRC_TYPE_BUFFER]);
   1260 	if (result != VK_SUCCESS)
   1261 		goto fail;
   1262 
   1263 	for (unsigned src = 0; src < BLIT2D_NUM_SRC_TYPES; src++) {
   1264 		for (unsigned j = 0; j < ARRAY_SIZE(pipeline_formats); ++j) {
   1265 			result = blit2d_init_color_pipeline(device, src, pipeline_formats[j]);
   1266 			if (result != VK_SUCCESS)
   1267 				goto fail;
   1268 		}
   1269 
   1270 		result = blit2d_init_depth_only_pipeline(device, src);
   1271 		if (result != VK_SUCCESS)
   1272 			goto fail;
   1273 
   1274 		result = blit2d_init_stencil_only_pipeline(device, src);
   1275 		if (result != VK_SUCCESS)
   1276 			goto fail;
   1277 	}
   1278 
   1279 	return VK_SUCCESS;
   1280 
   1281 fail:
   1282 	radv_device_finish_meta_blit2d_state(device);
   1283 	return result;
   1284 }
   1285