2 * Copyright © 2016 Red Hat
5 * Copyright © 2016 Intel Corporation
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:
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
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
27 #include "radv_meta.h"
28 #include "nir/nir_builder.h"
29 #include "vk_format.h"
31 enum blit2d_src_type
{
32 BLIT2D_SRC_TYPE_IMAGE
,
33 BLIT2D_SRC_TYPE_IMAGE_3D
,
34 BLIT2D_SRC_TYPE_BUFFER
,
39 create_iview(struct radv_cmd_buffer
*cmd_buffer
,
40 struct radv_meta_blit2d_surf
*surf
,
41 struct radv_image_view
*iview
, VkFormat depth_format
,
42 VkImageAspectFlagBits aspects
)
45 VkImageViewType view_type
= cmd_buffer
->device
->physical_device
->rad_info
.chip_class
< GFX9
? VK_IMAGE_VIEW_TYPE_2D
:
46 radv_meta_get_view_type(surf
->image
);
49 format
= depth_format
;
51 format
= surf
->format
;
53 radv_image_view_init(iview
, cmd_buffer
->device
,
54 &(VkImageViewCreateInfo
) {
55 .sType
= VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO
,
56 .image
= radv_image_to_handle(surf
->image
),
57 .viewType
= view_type
,
60 .aspectMask
= aspects
,
61 .baseMipLevel
= surf
->level
,
63 .baseArrayLayer
= surf
->layer
,
70 create_bview(struct radv_cmd_buffer
*cmd_buffer
,
71 struct radv_meta_blit2d_buffer
*src
,
72 struct radv_buffer_view
*bview
, VkFormat depth_format
)
77 format
= depth_format
;
80 radv_buffer_view_init(bview
, cmd_buffer
->device
,
81 &(VkBufferViewCreateInfo
) {
82 .sType
= VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO
,
84 .buffer
= radv_buffer_to_handle(src
->buffer
),
86 .offset
= src
->offset
,
87 .range
= VK_WHOLE_SIZE
,
92 struct blit2d_src_temps
{
93 struct radv_image_view iview
;
94 struct radv_buffer_view bview
;
98 blit2d_bind_src(struct radv_cmd_buffer
*cmd_buffer
,
99 struct radv_meta_blit2d_surf
*src_img
,
100 struct radv_meta_blit2d_buffer
*src_buf
,
101 struct blit2d_src_temps
*tmp
,
102 enum blit2d_src_type src_type
, VkFormat depth_format
,
103 VkImageAspectFlagBits aspects
,
104 uint32_t log2_samples
)
106 struct radv_device
*device
= cmd_buffer
->device
;
108 if (src_type
== BLIT2D_SRC_TYPE_BUFFER
) {
109 create_bview(cmd_buffer
, src_buf
, &tmp
->bview
, depth_format
);
111 radv_meta_push_descriptor_set(cmd_buffer
, VK_PIPELINE_BIND_POINT_GRAPHICS
,
112 device
->meta_state
.blit2d
[log2_samples
].p_layouts
[src_type
],
114 1, /* descriptorWriteCount */
115 (VkWriteDescriptorSet
[]) {
117 .sType
= VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET
,
119 .dstArrayElement
= 0,
120 .descriptorCount
= 1,
121 .descriptorType
= VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER
,
122 .pTexelBufferView
= (VkBufferView
[]) { radv_buffer_view_to_handle(&tmp
->bview
) }
126 radv_CmdPushConstants(radv_cmd_buffer_to_handle(cmd_buffer
),
127 device
->meta_state
.blit2d
[log2_samples
].p_layouts
[src_type
],
128 VK_SHADER_STAGE_FRAGMENT_BIT
, 16, 4,
131 create_iview(cmd_buffer
, src_img
, &tmp
->iview
, depth_format
, aspects
);
133 if (src_type
== BLIT2D_SRC_TYPE_IMAGE_3D
)
134 radv_CmdPushConstants(radv_cmd_buffer_to_handle(cmd_buffer
),
135 device
->meta_state
.blit2d
[log2_samples
].p_layouts
[src_type
],
136 VK_SHADER_STAGE_FRAGMENT_BIT
, 16, 4,
139 radv_meta_push_descriptor_set(cmd_buffer
, VK_PIPELINE_BIND_POINT_GRAPHICS
,
140 device
->meta_state
.blit2d
[log2_samples
].p_layouts
[src_type
],
142 1, /* descriptorWriteCount */
143 (VkWriteDescriptorSet
[]) {
145 .sType
= VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET
,
147 .dstArrayElement
= 0,
148 .descriptorCount
= 1,
149 .descriptorType
= VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE
,
150 .pImageInfo
= (VkDescriptorImageInfo
[]) {
152 .sampler
= VK_NULL_HANDLE
,
153 .imageView
= radv_image_view_to_handle(&tmp
->iview
),
154 .imageLayout
= VK_IMAGE_LAYOUT_GENERAL
,
162 struct blit2d_dst_temps
{
164 struct radv_image_view iview
;
169 blit2d_bind_dst(struct radv_cmd_buffer
*cmd_buffer
,
170 struct radv_meta_blit2d_surf
*dst
,
173 VkFormat depth_format
,
174 struct blit2d_dst_temps
*tmp
,
175 VkImageAspectFlagBits aspects
)
177 create_iview(cmd_buffer
, dst
, &tmp
->iview
, depth_format
, aspects
);
179 radv_CreateFramebuffer(radv_device_to_handle(cmd_buffer
->device
),
180 &(VkFramebufferCreateInfo
) {
181 .sType
= VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO
,
182 .attachmentCount
= 1,
183 .pAttachments
= (VkImageView
[]) {
184 radv_image_view_to_handle(&tmp
->iview
),
189 }, &cmd_buffer
->pool
->alloc
, &tmp
->fb
);
193 bind_pipeline(struct radv_cmd_buffer
*cmd_buffer
,
194 enum blit2d_src_type src_type
, unsigned fs_key
,
195 uint32_t log2_samples
)
197 VkPipeline pipeline
=
198 cmd_buffer
->device
->meta_state
.blit2d
[log2_samples
].pipelines
[src_type
][fs_key
];
200 radv_CmdBindPipeline(radv_cmd_buffer_to_handle(cmd_buffer
),
201 VK_PIPELINE_BIND_POINT_GRAPHICS
, pipeline
);
205 bind_depth_pipeline(struct radv_cmd_buffer
*cmd_buffer
,
206 enum blit2d_src_type src_type
,
207 uint32_t log2_samples
)
209 VkPipeline pipeline
=
210 cmd_buffer
->device
->meta_state
.blit2d
[log2_samples
].depth_only_pipeline
[src_type
];
212 radv_CmdBindPipeline(radv_cmd_buffer_to_handle(cmd_buffer
),
213 VK_PIPELINE_BIND_POINT_GRAPHICS
, pipeline
);
217 bind_stencil_pipeline(struct radv_cmd_buffer
*cmd_buffer
,
218 enum blit2d_src_type src_type
,
219 uint32_t log2_samples
)
221 VkPipeline pipeline
=
222 cmd_buffer
->device
->meta_state
.blit2d
[log2_samples
].stencil_only_pipeline
[src_type
];
224 radv_CmdBindPipeline(radv_cmd_buffer_to_handle(cmd_buffer
),
225 VK_PIPELINE_BIND_POINT_GRAPHICS
, pipeline
);
229 radv_meta_blit2d_normal_dst(struct radv_cmd_buffer
*cmd_buffer
,
230 struct radv_meta_blit2d_surf
*src_img
,
231 struct radv_meta_blit2d_buffer
*src_buf
,
232 struct radv_meta_blit2d_surf
*dst
,
234 struct radv_meta_blit2d_rect
*rects
, enum blit2d_src_type src_type
,
235 uint32_t log2_samples
)
237 struct radv_device
*device
= cmd_buffer
->device
;
239 for (unsigned r
= 0; r
< num_rects
; ++r
) {
241 for_each_bit(i
, dst
->aspect_mask
) {
242 unsigned aspect_mask
= 1u << i
;
243 VkFormat depth_format
= 0;
244 if (aspect_mask
== VK_IMAGE_ASPECT_STENCIL_BIT
)
245 depth_format
= vk_format_stencil_only(dst
->image
->vk_format
);
246 else if (aspect_mask
== VK_IMAGE_ASPECT_DEPTH_BIT
)
247 depth_format
= vk_format_depth_only(dst
->image
->vk_format
);
248 struct blit2d_src_temps src_temps
;
249 blit2d_bind_src(cmd_buffer
, src_img
, src_buf
, &src_temps
, src_type
, depth_format
, aspect_mask
, log2_samples
);
251 struct blit2d_dst_temps dst_temps
;
252 blit2d_bind_dst(cmd_buffer
, dst
, rects
[r
].dst_x
+ rects
[r
].width
,
253 rects
[r
].dst_y
+ rects
[r
].height
, depth_format
, &dst_temps
, aspect_mask
);
255 float vertex_push_constants
[4] = {
258 rects
[r
].src_x
+ rects
[r
].width
,
259 rects
[r
].src_y
+ rects
[r
].height
,
262 radv_CmdPushConstants(radv_cmd_buffer_to_handle(cmd_buffer
),
263 device
->meta_state
.blit2d
[log2_samples
].p_layouts
[src_type
],
264 VK_SHADER_STAGE_VERTEX_BIT
, 0, 16,
265 vertex_push_constants
);
267 if (aspect_mask
== VK_IMAGE_ASPECT_COLOR_BIT
) {
268 unsigned fs_key
= radv_format_meta_fs_key(dst_temps
.iview
.vk_format
);
269 unsigned dst_layout
= radv_meta_dst_layout_from_layout(dst
->current_layout
);
271 radv_CmdBeginRenderPass(radv_cmd_buffer_to_handle(cmd_buffer
),
272 &(VkRenderPassBeginInfo
) {
273 .sType
= VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO
,
274 .renderPass
= device
->meta_state
.blit2d_render_passes
[fs_key
][dst_layout
],
275 .framebuffer
= dst_temps
.fb
,
277 .offset
= { rects
[r
].dst_x
, rects
[r
].dst_y
, },
278 .extent
= { rects
[r
].width
, rects
[r
].height
},
280 .clearValueCount
= 0,
281 .pClearValues
= NULL
,
282 }, VK_SUBPASS_CONTENTS_INLINE
);
285 bind_pipeline(cmd_buffer
, src_type
, fs_key
, log2_samples
);
286 } else if (aspect_mask
== VK_IMAGE_ASPECT_DEPTH_BIT
) {
287 enum radv_blit_ds_layout ds_layout
= radv_meta_blit_ds_to_type(dst
->current_layout
);
288 radv_CmdBeginRenderPass(radv_cmd_buffer_to_handle(cmd_buffer
),
289 &(VkRenderPassBeginInfo
) {
290 .sType
= VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO
,
291 .renderPass
= device
->meta_state
.blit2d_depth_only_rp
[ds_layout
],
292 .framebuffer
= dst_temps
.fb
,
294 .offset
= { rects
[r
].dst_x
, rects
[r
].dst_y
, },
295 .extent
= { rects
[r
].width
, rects
[r
].height
},
297 .clearValueCount
= 0,
298 .pClearValues
= NULL
,
299 }, VK_SUBPASS_CONTENTS_INLINE
);
302 bind_depth_pipeline(cmd_buffer
, src_type
, log2_samples
);
304 } else if (aspect_mask
== VK_IMAGE_ASPECT_STENCIL_BIT
) {
305 enum radv_blit_ds_layout ds_layout
= radv_meta_blit_ds_to_type(dst
->current_layout
);
306 radv_CmdBeginRenderPass(radv_cmd_buffer_to_handle(cmd_buffer
),
307 &(VkRenderPassBeginInfo
) {
308 .sType
= VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO
,
309 .renderPass
= device
->meta_state
.blit2d_stencil_only_rp
[ds_layout
],
310 .framebuffer
= dst_temps
.fb
,
312 .offset
= { rects
[r
].dst_x
, rects
[r
].dst_y
, },
313 .extent
= { rects
[r
].width
, rects
[r
].height
},
315 .clearValueCount
= 0,
316 .pClearValues
= NULL
,
317 }, VK_SUBPASS_CONTENTS_INLINE
);
320 bind_stencil_pipeline(cmd_buffer
, src_type
, log2_samples
);
322 unreachable("Processing blit2d with multiple aspects.");
324 radv_CmdSetViewport(radv_cmd_buffer_to_handle(cmd_buffer
), 0, 1, &(VkViewport
) {
327 .width
= rects
[r
].width
,
328 .height
= rects
[r
].height
,
333 radv_CmdSetScissor(radv_cmd_buffer_to_handle(cmd_buffer
), 0, 1, &(VkRect2D
) {
334 .offset
= (VkOffset2D
) { rects
[r
].dst_x
, rects
[r
].dst_y
},
335 .extent
= (VkExtent2D
) { rects
[r
].width
, rects
[r
].height
},
340 if (log2_samples
> 0) {
341 for (uint32_t sample
= 0; sample
< src_img
->image
->info
.samples
; sample
++) {
342 uint32_t sample_mask
= 1 << sample
;
343 radv_CmdPushConstants(radv_cmd_buffer_to_handle(cmd_buffer
),
344 device
->meta_state
.blit2d
[log2_samples
].p_layouts
[src_type
],
345 VK_SHADER_STAGE_FRAGMENT_BIT
, 20, 4,
348 radv_CmdPushConstants(radv_cmd_buffer_to_handle(cmd_buffer
),
349 device
->meta_state
.blit2d
[log2_samples
].p_layouts
[src_type
],
350 VK_SHADER_STAGE_FRAGMENT_BIT
, 24, 4,
353 radv_CmdDraw(radv_cmd_buffer_to_handle(cmd_buffer
), 3, 1, 0, 0);
357 radv_CmdDraw(radv_cmd_buffer_to_handle(cmd_buffer
), 3, 1, 0, 0);
358 radv_CmdEndRenderPass(radv_cmd_buffer_to_handle(cmd_buffer
));
360 /* At the point where we emit the draw call, all data from the
361 * descriptor sets, etc. has been used. We are free to delete it.
363 radv_DestroyFramebuffer(radv_device_to_handle(device
),
365 &cmd_buffer
->pool
->alloc
);
371 radv_meta_blit2d(struct radv_cmd_buffer
*cmd_buffer
,
372 struct radv_meta_blit2d_surf
*src_img
,
373 struct radv_meta_blit2d_buffer
*src_buf
,
374 struct radv_meta_blit2d_surf
*dst
,
376 struct radv_meta_blit2d_rect
*rects
)
378 bool use_3d
= cmd_buffer
->device
->physical_device
->rad_info
.chip_class
>= GFX9
&&
379 (src_img
&& src_img
->image
->type
== VK_IMAGE_TYPE_3D
);
380 enum blit2d_src_type src_type
= src_buf
? BLIT2D_SRC_TYPE_BUFFER
:
381 use_3d
? BLIT2D_SRC_TYPE_IMAGE_3D
: BLIT2D_SRC_TYPE_IMAGE
;
382 radv_meta_blit2d_normal_dst(cmd_buffer
, src_img
, src_buf
, dst
,
383 num_rects
, rects
, src_type
,
384 src_img
? util_logbase2(src_img
->image
->info
.samples
) : 0);
388 build_nir_vertex_shader(void)
390 const struct glsl_type
*vec4
= glsl_vec4_type();
391 const struct glsl_type
*vec2
= glsl_vector_type(GLSL_TYPE_FLOAT
, 2);
394 nir_builder_init_simple_shader(&b
, NULL
, MESA_SHADER_VERTEX
, NULL
);
395 b
.shader
->info
.name
= ralloc_strdup(b
.shader
, "meta_blit2d_vs");
397 nir_variable
*pos_out
= nir_variable_create(b
.shader
, nir_var_shader_out
,
398 vec4
, "gl_Position");
399 pos_out
->data
.location
= VARYING_SLOT_POS
;
401 nir_variable
*tex_pos_out
= nir_variable_create(b
.shader
, nir_var_shader_out
,
403 tex_pos_out
->data
.location
= VARYING_SLOT_VAR0
;
404 tex_pos_out
->data
.interpolation
= INTERP_MODE_SMOOTH
;
406 nir_ssa_def
*outvec
= radv_meta_gen_rect_vertices(&b
);
407 nir_store_var(&b
, pos_out
, outvec
, 0xf);
409 nir_intrinsic_instr
*src_box
= nir_intrinsic_instr_create(b
.shader
, nir_intrinsic_load_push_constant
);
410 src_box
->src
[0] = nir_src_for_ssa(nir_imm_int(&b
, 0));
411 nir_intrinsic_set_base(src_box
, 0);
412 nir_intrinsic_set_range(src_box
, 16);
413 src_box
->num_components
= 4;
414 nir_ssa_dest_init(&src_box
->instr
, &src_box
->dest
, 4, 32, "src_box");
415 nir_builder_instr_insert(&b
, &src_box
->instr
);
417 nir_intrinsic_instr
*vertex_id
= nir_intrinsic_instr_create(b
.shader
, nir_intrinsic_load_vertex_id_zero_base
);
418 nir_ssa_dest_init(&vertex_id
->instr
, &vertex_id
->dest
, 1, 32, "vertexid");
419 nir_builder_instr_insert(&b
, &vertex_id
->instr
);
421 /* vertex 0 - src_x, src_y */
422 /* vertex 1 - src_x, src_y+h */
423 /* vertex 2 - src_x+w, src_y */
424 /* so channel 0 is vertex_id != 2 ? src_x : src_x + w
425 channel 1 is vertex id != 1 ? src_y : src_y + w */
427 nir_ssa_def
*c0cmp
= nir_ine(&b
, &vertex_id
->dest
.ssa
,
429 nir_ssa_def
*c1cmp
= nir_ine(&b
, &vertex_id
->dest
.ssa
,
432 nir_ssa_def
*comp
[2];
433 comp
[0] = nir_bcsel(&b
, c0cmp
,
434 nir_channel(&b
, &src_box
->dest
.ssa
, 0),
435 nir_channel(&b
, &src_box
->dest
.ssa
, 2));
437 comp
[1] = nir_bcsel(&b
, c1cmp
,
438 nir_channel(&b
, &src_box
->dest
.ssa
, 1),
439 nir_channel(&b
, &src_box
->dest
.ssa
, 3));
440 nir_ssa_def
*out_tex_vec
= nir_vec(&b
, comp
, 2);
441 nir_store_var(&b
, tex_pos_out
, out_tex_vec
, 0x3);
445 typedef nir_ssa_def
* (*texel_fetch_build_func
)(struct nir_builder
*,
446 struct radv_device
*,
447 nir_ssa_def
*, bool, bool);
450 build_nir_texel_fetch(struct nir_builder
*b
, struct radv_device
*device
,
451 nir_ssa_def
*tex_pos
, bool is_3d
, bool is_multisampled
)
453 enum glsl_sampler_dim dim
=
454 is_3d
? GLSL_SAMPLER_DIM_3D
: is_multisampled
? GLSL_SAMPLER_DIM_MS
: GLSL_SAMPLER_DIM_2D
;
455 const struct glsl_type
*sampler_type
=
456 glsl_sampler_type(dim
, false, false, GLSL_TYPE_UINT
);
457 nir_variable
*sampler
= nir_variable_create(b
->shader
, nir_var_uniform
,
458 sampler_type
, "s_tex");
459 sampler
->data
.descriptor_set
= 0;
460 sampler
->data
.binding
= 0;
462 nir_ssa_def
*tex_pos_3d
= NULL
;
463 nir_intrinsic_instr
*sample_idx
= NULL
;
465 nir_intrinsic_instr
*layer
= nir_intrinsic_instr_create(b
->shader
, nir_intrinsic_load_push_constant
);
466 nir_intrinsic_set_base(layer
, 16);
467 nir_intrinsic_set_range(layer
, 4);
468 layer
->src
[0] = nir_src_for_ssa(nir_imm_int(b
, 0));
469 layer
->num_components
= 1;
470 nir_ssa_dest_init(&layer
->instr
, &layer
->dest
, 1, 32, "layer");
471 nir_builder_instr_insert(b
, &layer
->instr
);
473 nir_ssa_def
*chans
[3];
474 chans
[0] = nir_channel(b
, tex_pos
, 0);
475 chans
[1] = nir_channel(b
, tex_pos
, 1);
476 chans
[2] = &layer
->dest
.ssa
;
477 tex_pos_3d
= nir_vec(b
, chans
, 3);
479 if (is_multisampled
) {
480 sample_idx
= nir_intrinsic_instr_create(b
->shader
, nir_intrinsic_load_push_constant
);
481 nir_intrinsic_set_base(sample_idx
, 20);
482 nir_intrinsic_set_range(sample_idx
, 4);
483 sample_idx
->src
[0] = nir_src_for_ssa(nir_imm_int(b
, 0));
484 sample_idx
->num_components
= 1;
485 nir_ssa_dest_init(&sample_idx
->instr
, &sample_idx
->dest
, 1, 32, "sample_idx");
486 nir_builder_instr_insert(b
, &sample_idx
->instr
);
489 nir_ssa_def
*tex_deref
= &nir_build_deref_var(b
, sampler
)->dest
.ssa
;
491 nir_tex_instr
*tex
= nir_tex_instr_create(b
->shader
, is_multisampled
? 4 : 3);
492 tex
->sampler_dim
= dim
;
493 tex
->op
= is_multisampled
? nir_texop_txf_ms
: nir_texop_txf
;
494 tex
->src
[0].src_type
= nir_tex_src_coord
;
495 tex
->src
[0].src
= nir_src_for_ssa(is_3d
? tex_pos_3d
: tex_pos
);
496 tex
->src
[1].src_type
= is_multisampled
? nir_tex_src_ms_index
: nir_tex_src_lod
;
497 tex
->src
[1].src
= nir_src_for_ssa(is_multisampled
? &sample_idx
->dest
.ssa
: nir_imm_int(b
, 0));
498 tex
->src
[2].src_type
= nir_tex_src_texture_deref
;
499 tex
->src
[2].src
= nir_src_for_ssa(tex_deref
);
500 if (is_multisampled
) {
501 tex
->src
[3].src_type
= nir_tex_src_lod
;
502 tex
->src
[3].src
= nir_src_for_ssa(nir_imm_int(b
, 0));
504 tex
->dest_type
= nir_type_uint
;
505 tex
->is_array
= false;
506 tex
->coord_components
= is_3d
? 3 : 2;
508 nir_ssa_dest_init(&tex
->instr
, &tex
->dest
, 4, 32, "tex");
509 nir_builder_instr_insert(b
, &tex
->instr
);
511 return &tex
->dest
.ssa
;
516 build_nir_buffer_fetch(struct nir_builder
*b
, struct radv_device
*device
,
517 nir_ssa_def
*tex_pos
, bool is_3d
, bool is_multisampled
)
519 const struct glsl_type
*sampler_type
=
520 glsl_sampler_type(GLSL_SAMPLER_DIM_BUF
, false, false, GLSL_TYPE_UINT
);
521 nir_variable
*sampler
= nir_variable_create(b
->shader
, nir_var_uniform
,
522 sampler_type
, "s_tex");
523 sampler
->data
.descriptor_set
= 0;
524 sampler
->data
.binding
= 0;
526 nir_intrinsic_instr
*width
= nir_intrinsic_instr_create(b
->shader
, nir_intrinsic_load_push_constant
);
527 nir_intrinsic_set_base(width
, 16);
528 nir_intrinsic_set_range(width
, 4);
529 width
->src
[0] = nir_src_for_ssa(nir_imm_int(b
, 0));
530 width
->num_components
= 1;
531 nir_ssa_dest_init(&width
->instr
, &width
->dest
, 1, 32, "width");
532 nir_builder_instr_insert(b
, &width
->instr
);
534 nir_ssa_def
*pos_x
= nir_channel(b
, tex_pos
, 0);
535 nir_ssa_def
*pos_y
= nir_channel(b
, tex_pos
, 1);
536 pos_y
= nir_imul(b
, pos_y
, &width
->dest
.ssa
);
537 pos_x
= nir_iadd(b
, pos_x
, pos_y
);
538 //pos_x = nir_iadd(b, pos_x, nir_imm_int(b, 100000));
540 nir_ssa_def
*tex_deref
= &nir_build_deref_var(b
, sampler
)->dest
.ssa
;
542 nir_tex_instr
*tex
= nir_tex_instr_create(b
->shader
, 2);
543 tex
->sampler_dim
= GLSL_SAMPLER_DIM_BUF
;
544 tex
->op
= nir_texop_txf
;
545 tex
->src
[0].src_type
= nir_tex_src_coord
;
546 tex
->src
[0].src
= nir_src_for_ssa(pos_x
);
547 tex
->src
[1].src_type
= nir_tex_src_texture_deref
;
548 tex
->src
[1].src
= nir_src_for_ssa(tex_deref
);
549 tex
->dest_type
= nir_type_uint
;
550 tex
->is_array
= false;
551 tex
->coord_components
= 1;
553 nir_ssa_dest_init(&tex
->instr
, &tex
->dest
, 4, 32, "tex");
554 nir_builder_instr_insert(b
, &tex
->instr
);
556 return &tex
->dest
.ssa
;
559 static const VkPipelineVertexInputStateCreateInfo normal_vi_create_info
= {
560 .sType
= VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO
,
561 .vertexBindingDescriptionCount
= 0,
562 .vertexAttributeDescriptionCount
= 0,
566 build_nir_store_sample_mask(struct nir_builder
*b
)
568 nir_intrinsic_instr
*sample_mask
= nir_intrinsic_instr_create(b
->shader
, nir_intrinsic_load_push_constant
);
569 nir_intrinsic_set_base(sample_mask
, 24);
570 nir_intrinsic_set_range(sample_mask
, 4);
571 sample_mask
->src
[0] = nir_src_for_ssa(nir_imm_int(b
, 0));
572 sample_mask
->num_components
= 1;
573 nir_ssa_dest_init(&sample_mask
->instr
, &sample_mask
->dest
, 1, 32, "sample_mask");
574 nir_builder_instr_insert(b
, &sample_mask
->instr
);
576 const struct glsl_type
*sample_mask_out_type
= glsl_uint_type();
578 nir_variable
*sample_mask_out
=
579 nir_variable_create(b
->shader
, nir_var_shader_out
,
580 sample_mask_out_type
, "sample_mask_out");
581 sample_mask_out
->data
.location
= FRAG_RESULT_SAMPLE_MASK
;
583 nir_store_var(b
, sample_mask_out
, &sample_mask
->dest
.ssa
, 0x1);
587 build_nir_copy_fragment_shader(struct radv_device
*device
,
588 texel_fetch_build_func txf_func
, const char* name
, bool is_3d
,
589 bool is_multisampled
)
591 const struct glsl_type
*vec4
= glsl_vec4_type();
592 const struct glsl_type
*vec2
= glsl_vector_type(GLSL_TYPE_FLOAT
, 2);
595 nir_builder_init_simple_shader(&b
, NULL
, MESA_SHADER_FRAGMENT
, NULL
);
596 b
.shader
->info
.name
= ralloc_strdup(b
.shader
, name
);
598 nir_variable
*tex_pos_in
= nir_variable_create(b
.shader
, nir_var_shader_in
,
600 tex_pos_in
->data
.location
= VARYING_SLOT_VAR0
;
602 nir_variable
*color_out
= nir_variable_create(b
.shader
, nir_var_shader_out
,
604 color_out
->data
.location
= FRAG_RESULT_DATA0
;
606 if (is_multisampled
) {
607 build_nir_store_sample_mask(&b
);
610 nir_ssa_def
*pos_int
= nir_f2i32(&b
, nir_load_var(&b
, tex_pos_in
));
611 nir_ssa_def
*tex_pos
= nir_channels(&b
, pos_int
, 0x3);
613 nir_ssa_def
*color
= txf_func(&b
, device
, tex_pos
, is_3d
, is_multisampled
);
614 nir_store_var(&b
, color_out
, color
, 0xf);
620 build_nir_copy_fragment_shader_depth(struct radv_device
*device
,
621 texel_fetch_build_func txf_func
, const char* name
, bool is_3d
,
622 bool is_multisampled
)
624 const struct glsl_type
*vec4
= glsl_vec4_type();
625 const struct glsl_type
*vec2
= glsl_vector_type(GLSL_TYPE_FLOAT
, 2);
628 nir_builder_init_simple_shader(&b
, NULL
, MESA_SHADER_FRAGMENT
, NULL
);
629 b
.shader
->info
.name
= ralloc_strdup(b
.shader
, name
);
631 nir_variable
*tex_pos_in
= nir_variable_create(b
.shader
, nir_var_shader_in
,
633 tex_pos_in
->data
.location
= VARYING_SLOT_VAR0
;
635 nir_variable
*color_out
= nir_variable_create(b
.shader
, nir_var_shader_out
,
637 color_out
->data
.location
= FRAG_RESULT_DEPTH
;
639 if (is_multisampled
) {
640 build_nir_store_sample_mask(&b
);
643 nir_ssa_def
*pos_int
= nir_f2i32(&b
, nir_load_var(&b
, tex_pos_in
));
644 nir_ssa_def
*tex_pos
= nir_channels(&b
, pos_int
, 0x3);
646 nir_ssa_def
*color
= txf_func(&b
, device
, tex_pos
, is_3d
, is_multisampled
);
647 nir_store_var(&b
, color_out
, color
, 0x1);
653 build_nir_copy_fragment_shader_stencil(struct radv_device
*device
,
654 texel_fetch_build_func txf_func
, const char* name
, bool is_3d
,
655 bool is_multisampled
)
657 const struct glsl_type
*vec4
= glsl_vec4_type();
658 const struct glsl_type
*vec2
= glsl_vector_type(GLSL_TYPE_FLOAT
, 2);
661 nir_builder_init_simple_shader(&b
, NULL
, MESA_SHADER_FRAGMENT
, NULL
);
662 b
.shader
->info
.name
= ralloc_strdup(b
.shader
, name
);
664 nir_variable
*tex_pos_in
= nir_variable_create(b
.shader
, nir_var_shader_in
,
666 tex_pos_in
->data
.location
= VARYING_SLOT_VAR0
;
668 nir_variable
*color_out
= nir_variable_create(b
.shader
, nir_var_shader_out
,
670 color_out
->data
.location
= FRAG_RESULT_STENCIL
;
672 if (is_multisampled
) {
673 build_nir_store_sample_mask(&b
);
676 nir_ssa_def
*pos_int
= nir_f2i32(&b
, nir_load_var(&b
, tex_pos_in
));
677 nir_ssa_def
*tex_pos
= nir_channels(&b
, pos_int
, 0x3);
679 nir_ssa_def
*color
= txf_func(&b
, device
, tex_pos
, is_3d
, is_multisampled
);
680 nir_store_var(&b
, color_out
, color
, 0x1);
686 radv_device_finish_meta_blit2d_state(struct radv_device
*device
)
688 struct radv_meta_state
*state
= &device
->meta_state
;
690 for(unsigned j
= 0; j
< NUM_META_FS_KEYS
; ++j
) {
691 for (unsigned k
= 0; k
< RADV_META_DST_LAYOUT_COUNT
; ++k
) {
692 radv_DestroyRenderPass(radv_device_to_handle(device
),
693 state
->blit2d_render_passes
[j
][k
],
698 for (enum radv_blit_ds_layout j
= RADV_BLIT_DS_LAYOUT_TILE_ENABLE
; j
< RADV_BLIT_DS_LAYOUT_COUNT
; j
++) {
699 radv_DestroyRenderPass(radv_device_to_handle(device
),
700 state
->blit2d_depth_only_rp
[j
], &state
->alloc
);
701 radv_DestroyRenderPass(radv_device_to_handle(device
),
702 state
->blit2d_stencil_only_rp
[j
], &state
->alloc
);
705 for (unsigned log2_samples
= 0; log2_samples
< 1 + MAX_SAMPLES_LOG2
; ++log2_samples
) {
706 for (unsigned src
= 0; src
< BLIT2D_NUM_SRC_TYPES
; src
++) {
707 radv_DestroyPipelineLayout(radv_device_to_handle(device
),
708 state
->blit2d
[log2_samples
].p_layouts
[src
],
710 radv_DestroyDescriptorSetLayout(radv_device_to_handle(device
),
711 state
->blit2d
[log2_samples
].ds_layouts
[src
],
714 for (unsigned j
= 0; j
< NUM_META_FS_KEYS
; ++j
) {
715 radv_DestroyPipeline(radv_device_to_handle(device
),
716 state
->blit2d
[log2_samples
].pipelines
[src
][j
],
720 radv_DestroyPipeline(radv_device_to_handle(device
),
721 state
->blit2d
[log2_samples
].depth_only_pipeline
[src
],
723 radv_DestroyPipeline(radv_device_to_handle(device
),
724 state
->blit2d
[log2_samples
].stencil_only_pipeline
[src
],
731 blit2d_init_color_pipeline(struct radv_device
*device
,
732 enum blit2d_src_type src_type
,
734 uint32_t log2_samples
)
737 unsigned fs_key
= radv_format_meta_fs_key(format
);
740 texel_fetch_build_func src_func
;
742 case BLIT2D_SRC_TYPE_IMAGE
:
743 src_func
= build_nir_texel_fetch
;
744 name
= "meta_blit2d_image_fs";
746 case BLIT2D_SRC_TYPE_IMAGE_3D
:
747 src_func
= build_nir_texel_fetch
;
748 name
= "meta_blit3d_image_fs";
750 case BLIT2D_SRC_TYPE_BUFFER
:
751 src_func
= build_nir_buffer_fetch
;
752 name
= "meta_blit2d_buffer_fs";
755 unreachable("unknown blit src type\n");
759 const VkPipelineVertexInputStateCreateInfo
*vi_create_info
;
760 struct radv_shader_module fs
= { .nir
= NULL
};
763 fs
.nir
= build_nir_copy_fragment_shader(device
, src_func
, name
, src_type
== BLIT2D_SRC_TYPE_IMAGE_3D
, log2_samples
> 0);
764 vi_create_info
= &normal_vi_create_info
;
766 struct radv_shader_module vs
= {
767 .nir
= build_nir_vertex_shader(),
770 VkPipelineShaderStageCreateInfo pipeline_shader_stages
[] = {
772 .sType
= VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO
,
773 .stage
= VK_SHADER_STAGE_VERTEX_BIT
,
774 .module
= radv_shader_module_to_handle(&vs
),
776 .pSpecializationInfo
= NULL
778 .sType
= VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO
,
779 .stage
= VK_SHADER_STAGE_FRAGMENT_BIT
,
780 .module
= radv_shader_module_to_handle(&fs
),
782 .pSpecializationInfo
= NULL
786 for (unsigned dst_layout
= 0; dst_layout
< RADV_META_DST_LAYOUT_COUNT
; ++dst_layout
) {
787 if (!device
->meta_state
.blit2d_render_passes
[fs_key
][dst_layout
]) {
788 VkImageLayout layout
= radv_meta_dst_layout_to_layout(dst_layout
);
790 result
= radv_CreateRenderPass(radv_device_to_handle(device
),
791 &(VkRenderPassCreateInfo
) {
792 .sType
= VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO
,
793 .attachmentCount
= 1,
794 .pAttachments
= &(VkAttachmentDescription
) {
796 .loadOp
= VK_ATTACHMENT_LOAD_OP_LOAD
,
797 .storeOp
= VK_ATTACHMENT_STORE_OP_STORE
,
798 .initialLayout
= layout
,
799 .finalLayout
= layout
,
802 .pSubpasses
= &(VkSubpassDescription
) {
803 .pipelineBindPoint
= VK_PIPELINE_BIND_POINT_GRAPHICS
,
804 .inputAttachmentCount
= 0,
805 .colorAttachmentCount
= 1,
806 .pColorAttachments
= &(VkAttachmentReference
) {
810 .pResolveAttachments
= NULL
,
811 .pDepthStencilAttachment
= &(VkAttachmentReference
) {
812 .attachment
= VK_ATTACHMENT_UNUSED
,
815 .preserveAttachmentCount
= 1,
816 .pPreserveAttachments
= (uint32_t[]) { 0 },
818 .dependencyCount
= 0,
819 }, &device
->meta_state
.alloc
, &device
->meta_state
.blit2d_render_passes
[fs_key
][dst_layout
]);
823 const VkGraphicsPipelineCreateInfo vk_pipeline_info
= {
824 .sType
= VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO
,
825 .stageCount
= ARRAY_SIZE(pipeline_shader_stages
),
826 .pStages
= pipeline_shader_stages
,
827 .pVertexInputState
= vi_create_info
,
828 .pInputAssemblyState
= &(VkPipelineInputAssemblyStateCreateInfo
) {
829 .sType
= VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO
,
830 .topology
= VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP
,
831 .primitiveRestartEnable
= false,
833 .pViewportState
= &(VkPipelineViewportStateCreateInfo
) {
834 .sType
= VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO
,
838 .pRasterizationState
= &(VkPipelineRasterizationStateCreateInfo
) {
839 .sType
= VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO
,
840 .rasterizerDiscardEnable
= false,
841 .polygonMode
= VK_POLYGON_MODE_FILL
,
842 .cullMode
= VK_CULL_MODE_NONE
,
843 .frontFace
= VK_FRONT_FACE_COUNTER_CLOCKWISE
845 .pMultisampleState
= &(VkPipelineMultisampleStateCreateInfo
) {
846 .sType
= VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO
,
847 .rasterizationSamples
= 1 << log2_samples
,
848 .sampleShadingEnable
= false,
849 .pSampleMask
= (VkSampleMask
[]) { UINT32_MAX
},
851 .pColorBlendState
= &(VkPipelineColorBlendStateCreateInfo
) {
852 .sType
= VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO
,
853 .attachmentCount
= 1,
854 .pAttachments
= (VkPipelineColorBlendAttachmentState
[]) {
856 VK_COLOR_COMPONENT_A_BIT
|
857 VK_COLOR_COMPONENT_R_BIT
|
858 VK_COLOR_COMPONENT_G_BIT
|
859 VK_COLOR_COMPONENT_B_BIT
},
862 .pDynamicState
= &(VkPipelineDynamicStateCreateInfo
) {
863 .sType
= VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO
,
864 .dynamicStateCount
= 9,
865 .pDynamicStates
= (VkDynamicState
[]) {
866 VK_DYNAMIC_STATE_VIEWPORT
,
867 VK_DYNAMIC_STATE_SCISSOR
,
868 VK_DYNAMIC_STATE_LINE_WIDTH
,
869 VK_DYNAMIC_STATE_DEPTH_BIAS
,
870 VK_DYNAMIC_STATE_BLEND_CONSTANTS
,
871 VK_DYNAMIC_STATE_DEPTH_BOUNDS
,
872 VK_DYNAMIC_STATE_STENCIL_COMPARE_MASK
,
873 VK_DYNAMIC_STATE_STENCIL_WRITE_MASK
,
874 VK_DYNAMIC_STATE_STENCIL_REFERENCE
,
878 .layout
= device
->meta_state
.blit2d
[log2_samples
].p_layouts
[src_type
],
879 .renderPass
= device
->meta_state
.blit2d_render_passes
[fs_key
][0],
883 const struct radv_graphics_pipeline_create_info radv_pipeline_info
= {
887 result
= radv_graphics_pipeline_create(radv_device_to_handle(device
),
888 radv_pipeline_cache_to_handle(&device
->meta_state
.cache
),
889 &vk_pipeline_info
, &radv_pipeline_info
,
890 &device
->meta_state
.alloc
,
891 &device
->meta_state
.blit2d
[log2_samples
].pipelines
[src_type
][fs_key
]);
901 blit2d_init_depth_only_pipeline(struct radv_device
*device
,
902 enum blit2d_src_type src_type
,
903 uint32_t log2_samples
)
908 texel_fetch_build_func src_func
;
910 case BLIT2D_SRC_TYPE_IMAGE
:
911 src_func
= build_nir_texel_fetch
;
912 name
= "meta_blit2d_depth_image_fs";
914 case BLIT2D_SRC_TYPE_IMAGE_3D
:
915 src_func
= build_nir_texel_fetch
;
916 name
= "meta_blit3d_depth_image_fs";
918 case BLIT2D_SRC_TYPE_BUFFER
:
919 src_func
= build_nir_buffer_fetch
;
920 name
= "meta_blit2d_depth_buffer_fs";
923 unreachable("unknown blit src type\n");
927 const VkPipelineVertexInputStateCreateInfo
*vi_create_info
;
928 struct radv_shader_module fs
= { .nir
= NULL
};
930 fs
.nir
= build_nir_copy_fragment_shader_depth(device
, src_func
, name
, src_type
== BLIT2D_SRC_TYPE_IMAGE_3D
, log2_samples
> 0);
931 vi_create_info
= &normal_vi_create_info
;
933 struct radv_shader_module vs
= {
934 .nir
= build_nir_vertex_shader(),
937 VkPipelineShaderStageCreateInfo pipeline_shader_stages
[] = {
939 .sType
= VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO
,
940 .stage
= VK_SHADER_STAGE_VERTEX_BIT
,
941 .module
= radv_shader_module_to_handle(&vs
),
943 .pSpecializationInfo
= NULL
945 .sType
= VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO
,
946 .stage
= VK_SHADER_STAGE_FRAGMENT_BIT
,
947 .module
= radv_shader_module_to_handle(&fs
),
949 .pSpecializationInfo
= NULL
953 for (enum radv_blit_ds_layout ds_layout
= RADV_BLIT_DS_LAYOUT_TILE_ENABLE
; ds_layout
< RADV_BLIT_DS_LAYOUT_COUNT
; ds_layout
++) {
954 if (!device
->meta_state
.blit2d_depth_only_rp
[ds_layout
]) {
955 VkImageLayout layout
= radv_meta_blit_ds_to_layout(ds_layout
);
956 result
= radv_CreateRenderPass(radv_device_to_handle(device
),
957 &(VkRenderPassCreateInfo
) {
958 .sType
= VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO
,
959 .attachmentCount
= 1,
960 .pAttachments
= &(VkAttachmentDescription
) {
961 .format
= VK_FORMAT_D32_SFLOAT
,
962 .loadOp
= VK_ATTACHMENT_LOAD_OP_LOAD
,
963 .storeOp
= VK_ATTACHMENT_STORE_OP_STORE
,
964 .initialLayout
= layout
,
965 .finalLayout
= layout
,
968 .pSubpasses
= &(VkSubpassDescription
) {
969 .pipelineBindPoint
= VK_PIPELINE_BIND_POINT_GRAPHICS
,
970 .inputAttachmentCount
= 0,
971 .colorAttachmentCount
= 0,
972 .pColorAttachments
= NULL
,
973 .pResolveAttachments
= NULL
,
974 .pDepthStencilAttachment
= &(VkAttachmentReference
) {
978 .preserveAttachmentCount
= 1,
979 .pPreserveAttachments
= (uint32_t[]) { 0 },
981 .dependencyCount
= 0,
982 }, &device
->meta_state
.alloc
, &device
->meta_state
.blit2d_depth_only_rp
[ds_layout
]);
986 const VkGraphicsPipelineCreateInfo vk_pipeline_info
= {
987 .sType
= VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO
,
988 .stageCount
= ARRAY_SIZE(pipeline_shader_stages
),
989 .pStages
= pipeline_shader_stages
,
990 .pVertexInputState
= vi_create_info
,
991 .pInputAssemblyState
= &(VkPipelineInputAssemblyStateCreateInfo
) {
992 .sType
= VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO
,
993 .topology
= VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP
,
994 .primitiveRestartEnable
= false,
996 .pViewportState
= &(VkPipelineViewportStateCreateInfo
) {
997 .sType
= VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO
,
1001 .pRasterizationState
= &(VkPipelineRasterizationStateCreateInfo
) {
1002 .sType
= VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO
,
1003 .rasterizerDiscardEnable
= false,
1004 .polygonMode
= VK_POLYGON_MODE_FILL
,
1005 .cullMode
= VK_CULL_MODE_NONE
,
1006 .frontFace
= VK_FRONT_FACE_COUNTER_CLOCKWISE
1008 .pMultisampleState
= &(VkPipelineMultisampleStateCreateInfo
) {
1009 .sType
= VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO
,
1010 .rasterizationSamples
= 1 << log2_samples
,
1011 .sampleShadingEnable
= false,
1012 .pSampleMask
= (VkSampleMask
[]) { UINT32_MAX
},
1014 .pColorBlendState
= &(VkPipelineColorBlendStateCreateInfo
) {
1015 .sType
= VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO
,
1016 .attachmentCount
= 0,
1017 .pAttachments
= NULL
,
1019 .pDepthStencilState
= &(VkPipelineDepthStencilStateCreateInfo
) {
1020 .sType
= VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO
,
1021 .depthTestEnable
= true,
1022 .depthWriteEnable
= true,
1023 .depthCompareOp
= VK_COMPARE_OP_ALWAYS
,
1025 .pDynamicState
= &(VkPipelineDynamicStateCreateInfo
) {
1026 .sType
= VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO
,
1027 .dynamicStateCount
= 9,
1028 .pDynamicStates
= (VkDynamicState
[]) {
1029 VK_DYNAMIC_STATE_VIEWPORT
,
1030 VK_DYNAMIC_STATE_SCISSOR
,
1031 VK_DYNAMIC_STATE_LINE_WIDTH
,
1032 VK_DYNAMIC_STATE_DEPTH_BIAS
,
1033 VK_DYNAMIC_STATE_BLEND_CONSTANTS
,
1034 VK_DYNAMIC_STATE_DEPTH_BOUNDS
,
1035 VK_DYNAMIC_STATE_STENCIL_COMPARE_MASK
,
1036 VK_DYNAMIC_STATE_STENCIL_WRITE_MASK
,
1037 VK_DYNAMIC_STATE_STENCIL_REFERENCE
,
1041 .layout
= device
->meta_state
.blit2d
[log2_samples
].p_layouts
[src_type
],
1042 .renderPass
= device
->meta_state
.blit2d_depth_only_rp
[0],
1046 const struct radv_graphics_pipeline_create_info radv_pipeline_info
= {
1047 .use_rectlist
= true
1050 result
= radv_graphics_pipeline_create(radv_device_to_handle(device
),
1051 radv_pipeline_cache_to_handle(&device
->meta_state
.cache
),
1052 &vk_pipeline_info
, &radv_pipeline_info
,
1053 &device
->meta_state
.alloc
,
1054 &device
->meta_state
.blit2d
[log2_samples
].depth_only_pipeline
[src_type
]);
1057 ralloc_free(vs
.nir
);
1058 ralloc_free(fs
.nir
);
1064 blit2d_init_stencil_only_pipeline(struct radv_device
*device
,
1065 enum blit2d_src_type src_type
,
1066 uint32_t log2_samples
)
1071 texel_fetch_build_func src_func
;
1073 case BLIT2D_SRC_TYPE_IMAGE
:
1074 src_func
= build_nir_texel_fetch
;
1075 name
= "meta_blit2d_stencil_image_fs";
1077 case BLIT2D_SRC_TYPE_IMAGE_3D
:
1078 src_func
= build_nir_texel_fetch
;
1079 name
= "meta_blit3d_stencil_image_fs";
1081 case BLIT2D_SRC_TYPE_BUFFER
:
1082 src_func
= build_nir_buffer_fetch
;
1083 name
= "meta_blit2d_stencil_buffer_fs";
1086 unreachable("unknown blit src type\n");
1090 const VkPipelineVertexInputStateCreateInfo
*vi_create_info
;
1091 struct radv_shader_module fs
= { .nir
= NULL
};
1093 fs
.nir
= build_nir_copy_fragment_shader_stencil(device
, src_func
, name
, src_type
== BLIT2D_SRC_TYPE_IMAGE_3D
, log2_samples
> 0);
1094 vi_create_info
= &normal_vi_create_info
;
1096 struct radv_shader_module vs
= {
1097 .nir
= build_nir_vertex_shader(),
1100 VkPipelineShaderStageCreateInfo pipeline_shader_stages
[] = {
1102 .sType
= VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO
,
1103 .stage
= VK_SHADER_STAGE_VERTEX_BIT
,
1104 .module
= radv_shader_module_to_handle(&vs
),
1106 .pSpecializationInfo
= NULL
1108 .sType
= VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO
,
1109 .stage
= VK_SHADER_STAGE_FRAGMENT_BIT
,
1110 .module
= radv_shader_module_to_handle(&fs
),
1112 .pSpecializationInfo
= NULL
1116 for (enum radv_blit_ds_layout ds_layout
= RADV_BLIT_DS_LAYOUT_TILE_ENABLE
; ds_layout
< RADV_BLIT_DS_LAYOUT_COUNT
; ds_layout
++) {
1117 if (!device
->meta_state
.blit2d_stencil_only_rp
[ds_layout
]) {
1118 VkImageLayout layout
= radv_meta_blit_ds_to_layout(ds_layout
);
1119 result
= radv_CreateRenderPass(radv_device_to_handle(device
),
1120 &(VkRenderPassCreateInfo
) {
1121 .sType
= VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO
,
1122 .attachmentCount
= 1,
1123 .pAttachments
= &(VkAttachmentDescription
) {
1124 .format
= VK_FORMAT_S8_UINT
,
1125 .loadOp
= VK_ATTACHMENT_LOAD_OP_LOAD
,
1126 .storeOp
= VK_ATTACHMENT_STORE_OP_STORE
,
1127 .initialLayout
= layout
,
1128 .finalLayout
= layout
,
1131 .pSubpasses
= &(VkSubpassDescription
) {
1132 .pipelineBindPoint
= VK_PIPELINE_BIND_POINT_GRAPHICS
,
1133 .inputAttachmentCount
= 0,
1134 .colorAttachmentCount
= 0,
1135 .pColorAttachments
= NULL
,
1136 .pResolveAttachments
= NULL
,
1137 .pDepthStencilAttachment
= &(VkAttachmentReference
) {
1141 .preserveAttachmentCount
= 1,
1142 .pPreserveAttachments
= (uint32_t[]) { 0 },
1144 .dependencyCount
= 0,
1145 }, &device
->meta_state
.alloc
, &device
->meta_state
.blit2d_stencil_only_rp
[ds_layout
]);
1149 const VkGraphicsPipelineCreateInfo vk_pipeline_info
= {
1150 .sType
= VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO
,
1151 .stageCount
= ARRAY_SIZE(pipeline_shader_stages
),
1152 .pStages
= pipeline_shader_stages
,
1153 .pVertexInputState
= vi_create_info
,
1154 .pInputAssemblyState
= &(VkPipelineInputAssemblyStateCreateInfo
) {
1155 .sType
= VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO
,
1156 .topology
= VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP
,
1157 .primitiveRestartEnable
= false,
1159 .pViewportState
= &(VkPipelineViewportStateCreateInfo
) {
1160 .sType
= VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO
,
1164 .pRasterizationState
= &(VkPipelineRasterizationStateCreateInfo
) {
1165 .sType
= VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO
,
1166 .rasterizerDiscardEnable
= false,
1167 .polygonMode
= VK_POLYGON_MODE_FILL
,
1168 .cullMode
= VK_CULL_MODE_NONE
,
1169 .frontFace
= VK_FRONT_FACE_COUNTER_CLOCKWISE
1171 .pMultisampleState
= &(VkPipelineMultisampleStateCreateInfo
) {
1172 .sType
= VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO
,
1173 .rasterizationSamples
= 1 << log2_samples
,
1174 .sampleShadingEnable
= false,
1175 .pSampleMask
= (VkSampleMask
[]) { UINT32_MAX
},
1177 .pColorBlendState
= &(VkPipelineColorBlendStateCreateInfo
) {
1178 .sType
= VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO
,
1179 .attachmentCount
= 0,
1180 .pAttachments
= NULL
,
1182 .pDepthStencilState
= &(VkPipelineDepthStencilStateCreateInfo
) {
1183 .sType
= VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO
,
1184 .depthTestEnable
= false,
1185 .depthWriteEnable
= false,
1186 .stencilTestEnable
= true,
1188 .failOp
= VK_STENCIL_OP_REPLACE
,
1189 .passOp
= VK_STENCIL_OP_REPLACE
,
1190 .depthFailOp
= VK_STENCIL_OP_REPLACE
,
1191 .compareOp
= VK_COMPARE_OP_ALWAYS
,
1192 .compareMask
= 0xff,
1197 .failOp
= VK_STENCIL_OP_REPLACE
,
1198 .passOp
= VK_STENCIL_OP_REPLACE
,
1199 .depthFailOp
= VK_STENCIL_OP_REPLACE
,
1200 .compareOp
= VK_COMPARE_OP_ALWAYS
,
1201 .compareMask
= 0xff,
1205 .depthCompareOp
= VK_COMPARE_OP_ALWAYS
,
1207 .pDynamicState
= &(VkPipelineDynamicStateCreateInfo
) {
1208 .sType
= VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO
,
1209 .dynamicStateCount
= 6,
1210 .pDynamicStates
= (VkDynamicState
[]) {
1211 VK_DYNAMIC_STATE_VIEWPORT
,
1212 VK_DYNAMIC_STATE_SCISSOR
,
1213 VK_DYNAMIC_STATE_LINE_WIDTH
,
1214 VK_DYNAMIC_STATE_DEPTH_BIAS
,
1215 VK_DYNAMIC_STATE_BLEND_CONSTANTS
,
1216 VK_DYNAMIC_STATE_DEPTH_BOUNDS
,
1220 .layout
= device
->meta_state
.blit2d
[log2_samples
].p_layouts
[src_type
],
1221 .renderPass
= device
->meta_state
.blit2d_stencil_only_rp
[0],
1225 const struct radv_graphics_pipeline_create_info radv_pipeline_info
= {
1226 .use_rectlist
= true
1229 result
= radv_graphics_pipeline_create(radv_device_to_handle(device
),
1230 radv_pipeline_cache_to_handle(&device
->meta_state
.cache
),
1231 &vk_pipeline_info
, &radv_pipeline_info
,
1232 &device
->meta_state
.alloc
,
1233 &device
->meta_state
.blit2d
[log2_samples
].stencil_only_pipeline
[src_type
]);
1236 ralloc_free(vs
.nir
);
1237 ralloc_free(fs
.nir
);
1242 static VkFormat pipeline_formats
[] = {
1243 VK_FORMAT_R8G8B8A8_UNORM
,
1244 VK_FORMAT_R8G8B8A8_UINT
,
1245 VK_FORMAT_R8G8B8A8_SINT
,
1246 VK_FORMAT_A2R10G10B10_UINT_PACK32
,
1247 VK_FORMAT_A2R10G10B10_SINT_PACK32
,
1248 VK_FORMAT_R16G16B16A16_UNORM
,
1249 VK_FORMAT_R16G16B16A16_SNORM
,
1250 VK_FORMAT_R16G16B16A16_UINT
,
1251 VK_FORMAT_R16G16B16A16_SINT
,
1252 VK_FORMAT_R32_SFLOAT
,
1253 VK_FORMAT_R32G32_SFLOAT
,
1254 VK_FORMAT_R32G32B32A32_SFLOAT
1258 meta_blit2d_create_pipe_layout(struct radv_device
*device
,
1260 uint32_t log2_samples
)
1263 VkDescriptorType desc_type
= (idx
== BLIT2D_SRC_TYPE_BUFFER
) ? VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER
: VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE
;
1264 const VkPushConstantRange push_constant_ranges
[] = {
1265 {VK_SHADER_STAGE_VERTEX_BIT
, 0, 16},
1266 {VK_SHADER_STAGE_FRAGMENT_BIT
, 16, 12},
1268 int num_push_constant_range
= (idx
!= BLIT2D_SRC_TYPE_IMAGE
|| log2_samples
> 0) ? 2 : 1;
1270 result
= radv_CreateDescriptorSetLayout(radv_device_to_handle(device
),
1271 &(VkDescriptorSetLayoutCreateInfo
) {
1272 .sType
= VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO
,
1273 .flags
= VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR
,
1275 .pBindings
= (VkDescriptorSetLayoutBinding
[]) {
1278 .descriptorType
= desc_type
,
1279 .descriptorCount
= 1,
1280 .stageFlags
= VK_SHADER_STAGE_FRAGMENT_BIT
,
1281 .pImmutableSamplers
= NULL
1284 }, &device
->meta_state
.alloc
, &device
->meta_state
.blit2d
[log2_samples
].ds_layouts
[idx
]);
1285 if (result
!= VK_SUCCESS
)
1288 result
= radv_CreatePipelineLayout(radv_device_to_handle(device
),
1289 &(VkPipelineLayoutCreateInfo
) {
1290 .sType
= VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO
,
1291 .setLayoutCount
= 1,
1292 .pSetLayouts
= &device
->meta_state
.blit2d
[log2_samples
].ds_layouts
[idx
],
1293 .pushConstantRangeCount
= num_push_constant_range
,
1294 .pPushConstantRanges
= push_constant_ranges
,
1296 &device
->meta_state
.alloc
, &device
->meta_state
.blit2d
[log2_samples
].p_layouts
[idx
]);
1297 if (result
!= VK_SUCCESS
)
1305 radv_device_init_meta_blit2d_state(struct radv_device
*device
)
1308 bool create_3d
= device
->physical_device
->rad_info
.chip_class
>= GFX9
;
1310 for (unsigned log2_samples
= 0; log2_samples
< 1 + MAX_SAMPLES_LOG2
; log2_samples
++) {
1311 for (unsigned src
= 0; src
< BLIT2D_NUM_SRC_TYPES
; src
++) {
1312 if (src
== BLIT2D_SRC_TYPE_IMAGE_3D
&& !create_3d
)
1315 /* Don't need to handle copies between buffers and multisample images. */
1316 if (src
== BLIT2D_SRC_TYPE_BUFFER
&& log2_samples
> 0)
1319 result
= meta_blit2d_create_pipe_layout(device
, src
, log2_samples
);
1320 if (result
!= VK_SUCCESS
)
1323 for (unsigned j
= 0; j
< ARRAY_SIZE(pipeline_formats
); ++j
) {
1324 result
= blit2d_init_color_pipeline(device
, src
, pipeline_formats
[j
], log2_samples
);
1325 if (result
!= VK_SUCCESS
)
1329 result
= blit2d_init_depth_only_pipeline(device
, src
, log2_samples
);
1330 if (result
!= VK_SUCCESS
)
1333 result
= blit2d_init_stencil_only_pipeline(device
, src
, log2_samples
);
1334 if (result
!= VK_SUCCESS
)
1342 radv_device_finish_meta_blit2d_state(device
);