225b4b2d4120500ae4de6303ed0b5d7d699892f0
[mesa.git] / src / amd / vulkan / radv_meta_blit2d.c
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 }