• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright © 2016 Dave Airlie
3  *
4  * SPDX-License-Identifier: MIT
5  */
6 
7 #include <assert.h>
8 #include <stdbool.h>
9 
10 #include "nir/nir_builder.h"
11 #include "nir/nir_format_convert.h"
12 
13 #include "radv_entrypoints.h"
14 #include "radv_formats.h"
15 #include "radv_meta.h"
16 #include "sid.h"
17 #include "vk_common_entrypoints.h"
18 #include "vk_format.h"
19 #include "vk_shader_module.h"
20 
21 static nir_def *
radv_meta_build_resolve_srgb_conversion(nir_builder * b,nir_def * input)22 radv_meta_build_resolve_srgb_conversion(nir_builder *b, nir_def *input)
23 {
24    unsigned i;
25    nir_def *comp[4];
26    for (i = 0; i < 3; i++)
27       comp[i] = nir_format_linear_to_srgb(b, nir_channel(b, input, i));
28    comp[3] = nir_channels(b, input, 1 << 3);
29    return nir_vec(b, comp, 4);
30 }
31 
32 static nir_shader *
build_resolve_compute_shader(struct radv_device * dev,bool is_integer,bool is_srgb,int samples)33 build_resolve_compute_shader(struct radv_device *dev, bool is_integer, bool is_srgb, int samples)
34 {
35    enum glsl_base_type img_base_type = is_integer ? GLSL_TYPE_UINT : GLSL_TYPE_FLOAT;
36    const struct glsl_type *sampler_type = glsl_sampler_type(GLSL_SAMPLER_DIM_MS, false, false, img_base_type);
37    const struct glsl_type *img_type = glsl_image_type(GLSL_SAMPLER_DIM_2D, false, img_base_type);
38    nir_builder b = radv_meta_init_shader(dev, MESA_SHADER_COMPUTE, "meta_resolve_cs-%d-%s", samples,
39                                          is_integer ? "int" : (is_srgb ? "srgb" : "float"));
40    b.shader->info.workgroup_size[0] = 8;
41    b.shader->info.workgroup_size[1] = 8;
42 
43    nir_variable *input_img = nir_variable_create(b.shader, nir_var_uniform, sampler_type, "s_tex");
44    input_img->data.descriptor_set = 0;
45    input_img->data.binding = 0;
46 
47    nir_variable *output_img = nir_variable_create(b.shader, nir_var_image, img_type, "out_img");
48    output_img->data.descriptor_set = 0;
49    output_img->data.binding = 1;
50 
51    nir_def *global_id = get_global_ids(&b, 2);
52 
53    nir_def *src_offset = nir_load_push_constant(&b, 2, 32, nir_imm_int(&b, 0), .range = 8);
54    nir_def *dst_offset = nir_load_push_constant(&b, 2, 32, nir_imm_int(&b, 8), .range = 16);
55 
56    nir_def *src_coord = nir_iadd(&b, global_id, src_offset);
57    nir_def *dst_coord = nir_iadd(&b, global_id, dst_offset);
58 
59    nir_variable *color = nir_local_variable_create(b.impl, glsl_vec4_type(), "color");
60 
61    radv_meta_build_resolve_shader_core(dev, &b, is_integer, samples, input_img, color, src_coord);
62 
63    nir_def *outval = nir_load_var(&b, color);
64    if (is_srgb)
65       outval = radv_meta_build_resolve_srgb_conversion(&b, outval);
66 
67    nir_def *img_coord = nir_vec4(&b, nir_channel(&b, dst_coord, 0), nir_channel(&b, dst_coord, 1), nir_undef(&b, 1, 32),
68                                  nir_undef(&b, 1, 32));
69 
70    nir_image_deref_store(&b, &nir_build_deref_var(&b, output_img)->def, img_coord, nir_undef(&b, 1, 32), outval,
71                          nir_imm_int(&b, 0), .image_dim = GLSL_SAMPLER_DIM_2D);
72    return b.shader;
73 }
74 
75 enum {
76    DEPTH_RESOLVE,
77    STENCIL_RESOLVE,
78 };
79 
80 static const char *
get_resolve_mode_str(VkResolveModeFlagBits resolve_mode)81 get_resolve_mode_str(VkResolveModeFlagBits resolve_mode)
82 {
83    switch (resolve_mode) {
84    case VK_RESOLVE_MODE_SAMPLE_ZERO_BIT:
85       return "zero";
86    case VK_RESOLVE_MODE_AVERAGE_BIT:
87       return "average";
88    case VK_RESOLVE_MODE_MIN_BIT:
89       return "min";
90    case VK_RESOLVE_MODE_MAX_BIT:
91       return "max";
92    default:
93       unreachable("invalid resolve mode");
94    }
95 }
96 
97 static nir_shader *
build_depth_stencil_resolve_compute_shader(struct radv_device * dev,int samples,int index,VkResolveModeFlagBits resolve_mode)98 build_depth_stencil_resolve_compute_shader(struct radv_device *dev, int samples, int index,
99                                            VkResolveModeFlagBits resolve_mode)
100 {
101    enum glsl_base_type img_base_type = index == DEPTH_RESOLVE ? GLSL_TYPE_FLOAT : GLSL_TYPE_UINT;
102    const struct glsl_type *sampler_type = glsl_sampler_type(GLSL_SAMPLER_DIM_MS, false, true, img_base_type);
103    const struct glsl_type *img_type = glsl_image_type(GLSL_SAMPLER_DIM_2D, true, img_base_type);
104 
105    nir_builder b =
106       radv_meta_init_shader(dev, MESA_SHADER_COMPUTE, "meta_resolve_cs_%s-%s-%d",
107                             index == DEPTH_RESOLVE ? "depth" : "stencil", get_resolve_mode_str(resolve_mode), samples);
108    b.shader->info.workgroup_size[0] = 8;
109    b.shader->info.workgroup_size[1] = 8;
110 
111    nir_variable *input_img = nir_variable_create(b.shader, nir_var_uniform, sampler_type, "s_tex");
112    input_img->data.descriptor_set = 0;
113    input_img->data.binding = 0;
114 
115    nir_variable *output_img = nir_variable_create(b.shader, nir_var_image, img_type, "out_img");
116    output_img->data.descriptor_set = 0;
117    output_img->data.binding = 1;
118 
119    nir_def *global_id = get_global_ids(&b, 3);
120 
121    nir_def *offset = nir_load_push_constant(&b, 2, 32, nir_imm_int(&b, 0), .range = 8);
122 
123    nir_def *resolve_coord = nir_iadd(&b, nir_trim_vector(&b, global_id, 2), offset);
124 
125    nir_def *img_coord =
126       nir_vec3(&b, nir_channel(&b, resolve_coord, 0), nir_channel(&b, resolve_coord, 1), nir_channel(&b, global_id, 2));
127 
128    nir_deref_instr *input_img_deref = nir_build_deref_var(&b, input_img);
129    nir_def *outval = nir_txf_ms_deref(&b, input_img_deref, img_coord, nir_imm_int(&b, 0));
130 
131    if (resolve_mode != VK_RESOLVE_MODE_SAMPLE_ZERO_BIT) {
132       for (int i = 1; i < samples; i++) {
133          nir_def *si = nir_txf_ms_deref(&b, input_img_deref, img_coord, nir_imm_int(&b, i));
134 
135          switch (resolve_mode) {
136          case VK_RESOLVE_MODE_AVERAGE_BIT:
137             assert(index == DEPTH_RESOLVE);
138             outval = nir_fadd(&b, outval, si);
139             break;
140          case VK_RESOLVE_MODE_MIN_BIT:
141             if (index == DEPTH_RESOLVE)
142                outval = nir_fmin(&b, outval, si);
143             else
144                outval = nir_umin(&b, outval, si);
145             break;
146          case VK_RESOLVE_MODE_MAX_BIT:
147             if (index == DEPTH_RESOLVE)
148                outval = nir_fmax(&b, outval, si);
149             else
150                outval = nir_umax(&b, outval, si);
151             break;
152          default:
153             unreachable("invalid resolve mode");
154          }
155       }
156 
157       if (resolve_mode == VK_RESOLVE_MODE_AVERAGE_BIT)
158          outval = nir_fdiv_imm(&b, outval, samples);
159    }
160 
161    nir_def *coord = nir_vec4(&b, nir_channel(&b, img_coord, 0), nir_channel(&b, img_coord, 1),
162                              nir_channel(&b, img_coord, 2), nir_undef(&b, 1, 32));
163    nir_image_deref_store(&b, &nir_build_deref_var(&b, output_img)->def, coord, nir_undef(&b, 1, 32), outval,
164                          nir_imm_int(&b, 0), .image_dim = GLSL_SAMPLER_DIM_2D, .image_array = true);
165    return b.shader;
166 }
167 
168 static VkResult
create_layout(struct radv_device * device,VkPipelineLayout * layout_out)169 create_layout(struct radv_device *device, VkPipelineLayout *layout_out)
170 {
171    const char *key_data = "radv-resolve-cs-layout";
172 
173    const VkDescriptorSetLayoutBinding bindings[] = {
174       {
175          .binding = 0,
176          .descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE,
177          .descriptorCount = 1,
178          .stageFlags = VK_SHADER_STAGE_COMPUTE_BIT,
179       },
180       {
181          .binding = 1,
182          .descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
183          .descriptorCount = 1,
184          .stageFlags = VK_SHADER_STAGE_COMPUTE_BIT,
185       },
186    };
187 
188    const VkDescriptorSetLayoutCreateInfo desc_info = {
189       .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO,
190       .flags = VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT,
191       .bindingCount = 2,
192       .pBindings = bindings,
193    };
194 
195    const VkPushConstantRange pc_range = {
196       .stageFlags = VK_SHADER_STAGE_COMPUTE_BIT,
197       .size = 16,
198    };
199 
200    return vk_meta_get_pipeline_layout(&device->vk, &device->meta_state.device, &desc_info, &pc_range, key_data,
201                                       strlen(key_data), layout_out);
202 }
203 
204 static VkResult
get_color_resolve_pipeline(struct radv_device * device,struct radv_image_view * src_iview,VkPipeline * pipeline_out,VkPipelineLayout * layout_out)205 get_color_resolve_pipeline(struct radv_device *device, struct radv_image_view *src_iview, VkPipeline *pipeline_out,
206                            VkPipelineLayout *layout_out)
207 {
208    const bool is_integer = vk_format_is_int(src_iview->vk.format);
209    const bool is_srgb = vk_format_is_srgb(src_iview->vk.format);
210    uint32_t samples = src_iview->image->vk.samples;
211    char key_data[64];
212    VkResult result;
213 
214    result = create_layout(device, layout_out);
215    if (result != VK_SUCCESS)
216       return result;
217 
218    snprintf(key_data, sizeof(key_data), "radv-color-resolve-cs--%d-%d-%d", is_integer, is_srgb, samples);
219 
220    VkPipeline pipeline_from_cache = vk_meta_lookup_pipeline(&device->meta_state.device, key_data, strlen(key_data));
221    if (pipeline_from_cache != VK_NULL_HANDLE) {
222       *pipeline_out = pipeline_from_cache;
223       return VK_SUCCESS;
224    }
225 
226    nir_shader *cs = build_resolve_compute_shader(device, is_integer, is_srgb, samples);
227 
228    const VkPipelineShaderStageCreateInfo stage_info = {
229       .sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
230       .stage = VK_SHADER_STAGE_COMPUTE_BIT,
231       .module = vk_shader_module_handle_from_nir(cs),
232       .pName = "main",
233       .pSpecializationInfo = NULL,
234    };
235 
236    const VkComputePipelineCreateInfo pipeline_info = {
237       .sType = VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
238       .stage = stage_info,
239       .flags = 0,
240       .layout = *layout_out,
241    };
242 
243    result = vk_meta_create_compute_pipeline(&device->vk, &device->meta_state.device, &pipeline_info, key_data,
244                                             strlen(key_data), pipeline_out);
245 
246    ralloc_free(cs);
247    return result;
248 }
249 
250 static void
emit_resolve(struct radv_cmd_buffer * cmd_buffer,struct radv_image_view * src_iview,struct radv_image_view * dst_iview,const VkOffset2D * src_offset,const VkOffset2D * dst_offset,const VkExtent2D * resolve_extent)251 emit_resolve(struct radv_cmd_buffer *cmd_buffer, struct radv_image_view *src_iview, struct radv_image_view *dst_iview,
252              const VkOffset2D *src_offset, const VkOffset2D *dst_offset, const VkExtent2D *resolve_extent)
253 {
254    struct radv_device *device = radv_cmd_buffer_device(cmd_buffer);
255    VkPipelineLayout layout;
256    VkPipeline pipeline;
257    VkResult result;
258 
259    result = get_color_resolve_pipeline(device, src_iview, &pipeline, &layout);
260    if (result != VK_SUCCESS) {
261       vk_command_buffer_set_error(&cmd_buffer->vk, result);
262       return;
263    }
264 
265    radv_meta_push_descriptor_set(cmd_buffer, VK_PIPELINE_BIND_POINT_COMPUTE, layout, 0, 2,
266                                  (VkWriteDescriptorSet[]){{.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET,
267                                                            .dstBinding = 0,
268                                                            .dstArrayElement = 0,
269                                                            .descriptorCount = 1,
270                                                            .descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE,
271                                                            .pImageInfo =
272                                                               (VkDescriptorImageInfo[]){
273                                                                  {.sampler = VK_NULL_HANDLE,
274                                                                   .imageView = radv_image_view_to_handle(src_iview),
275                                                                   .imageLayout = VK_IMAGE_LAYOUT_GENERAL},
276                                                               }},
277                                                           {.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET,
278                                                            .dstBinding = 1,
279                                                            .dstArrayElement = 0,
280                                                            .descriptorCount = 1,
281                                                            .descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
282                                                            .pImageInfo = (VkDescriptorImageInfo[]){
283                                                               {
284                                                                  .sampler = VK_NULL_HANDLE,
285                                                                  .imageView = radv_image_view_to_handle(dst_iview),
286                                                                  .imageLayout = VK_IMAGE_LAYOUT_GENERAL,
287                                                               },
288                                                            }}});
289 
290    radv_CmdBindPipeline(radv_cmd_buffer_to_handle(cmd_buffer), VK_PIPELINE_BIND_POINT_COMPUTE, pipeline);
291 
292    unsigned push_constants[4] = {
293       src_offset->x,
294       src_offset->y,
295       dst_offset->x,
296       dst_offset->y,
297    };
298    vk_common_CmdPushConstants(radv_cmd_buffer_to_handle(cmd_buffer), layout, VK_SHADER_STAGE_COMPUTE_BIT, 0, 16,
299                               push_constants);
300    radv_unaligned_dispatch(cmd_buffer, resolve_extent->width, resolve_extent->height, 1);
301 }
302 
303 static VkResult
get_depth_stencil_resolve_pipeline(struct radv_device * device,int samples,VkImageAspectFlags aspects,VkResolveModeFlagBits resolve_mode,VkPipeline * pipeline_out,VkPipelineLayout * layout_out)304 get_depth_stencil_resolve_pipeline(struct radv_device *device, int samples, VkImageAspectFlags aspects,
305                                    VkResolveModeFlagBits resolve_mode, VkPipeline *pipeline_out,
306                                    VkPipelineLayout *layout_out)
307 
308 {
309    const int index = aspects == VK_IMAGE_ASPECT_DEPTH_BIT ? DEPTH_RESOLVE : STENCIL_RESOLVE;
310    char key_data[64];
311    VkResult result;
312 
313    result = create_layout(device, layout_out);
314    if (result != VK_SUCCESS)
315       return result;
316 
317    snprintf(key_data, sizeof(key_data), "radv-ds-resolve-cs-%d-%d-%d", index, resolve_mode, samples);
318 
319    VkPipeline pipeline_from_cache = vk_meta_lookup_pipeline(&device->meta_state.device, key_data, strlen(key_data));
320    if (pipeline_from_cache != VK_NULL_HANDLE) {
321       *pipeline_out = pipeline_from_cache;
322       return VK_SUCCESS;
323    }
324 
325    nir_shader *cs = build_depth_stencil_resolve_compute_shader(device, samples, index, resolve_mode);
326 
327    const VkPipelineShaderStageCreateInfo stage_info = {
328       .sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
329       .stage = VK_SHADER_STAGE_COMPUTE_BIT,
330       .module = vk_shader_module_handle_from_nir(cs),
331       .pName = "main",
332       .pSpecializationInfo = NULL,
333    };
334 
335    const VkComputePipelineCreateInfo pipeline_info = {
336       .sType = VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
337       .stage = stage_info,
338       .flags = 0,
339       .layout = *layout_out,
340    };
341 
342    result = vk_meta_create_compute_pipeline(&device->vk, &device->meta_state.device, &pipeline_info, key_data,
343                                             strlen(key_data), pipeline_out);
344 
345    ralloc_free(cs);
346    return result;
347 }
348 
349 static void
emit_depth_stencil_resolve(struct radv_cmd_buffer * cmd_buffer,struct radv_image_view * src_iview,struct radv_image_view * dst_iview,const VkOffset2D * resolve_offset,const VkExtent3D * resolve_extent,VkImageAspectFlags aspects,VkResolveModeFlagBits resolve_mode)350 emit_depth_stencil_resolve(struct radv_cmd_buffer *cmd_buffer, struct radv_image_view *src_iview,
351                            struct radv_image_view *dst_iview, const VkOffset2D *resolve_offset,
352                            const VkExtent3D *resolve_extent, VkImageAspectFlags aspects,
353                            VkResolveModeFlagBits resolve_mode)
354 {
355    struct radv_device *device = radv_cmd_buffer_device(cmd_buffer);
356    const uint32_t samples = src_iview->image->vk.samples;
357    VkPipelineLayout layout;
358    VkPipeline pipeline;
359    VkResult result;
360 
361    result = get_depth_stencil_resolve_pipeline(device, samples, aspects, resolve_mode, &pipeline, &layout);
362    if (result != VK_SUCCESS) {
363       vk_command_buffer_set_error(&cmd_buffer->vk, result);
364       return;
365    }
366 
367    radv_meta_push_descriptor_set(cmd_buffer, VK_PIPELINE_BIND_POINT_COMPUTE, layout, 0, 2,
368                                  (VkWriteDescriptorSet[]){{.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET,
369                                                            .dstBinding = 0,
370                                                            .dstArrayElement = 0,
371                                                            .descriptorCount = 1,
372                                                            .descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE,
373                                                            .pImageInfo =
374                                                               (VkDescriptorImageInfo[]){
375                                                                  {.sampler = VK_NULL_HANDLE,
376                                                                   .imageView = radv_image_view_to_handle(src_iview),
377                                                                   .imageLayout = VK_IMAGE_LAYOUT_GENERAL},
378                                                               }},
379                                                           {.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET,
380                                                            .dstBinding = 1,
381                                                            .dstArrayElement = 0,
382                                                            .descriptorCount = 1,
383                                                            .descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
384                                                            .pImageInfo = (VkDescriptorImageInfo[]){
385                                                               {
386                                                                  .sampler = VK_NULL_HANDLE,
387                                                                  .imageView = radv_image_view_to_handle(dst_iview),
388                                                                  .imageLayout = VK_IMAGE_LAYOUT_GENERAL,
389                                                               },
390                                                            }}});
391 
392    radv_CmdBindPipeline(radv_cmd_buffer_to_handle(cmd_buffer), VK_PIPELINE_BIND_POINT_COMPUTE, pipeline);
393 
394    uint32_t push_constants[2] = {resolve_offset->x, resolve_offset->y};
395 
396    vk_common_CmdPushConstants(radv_cmd_buffer_to_handle(cmd_buffer), layout, VK_SHADER_STAGE_COMPUTE_BIT, 0,
397                               sizeof(push_constants), push_constants);
398 
399    radv_unaligned_dispatch(cmd_buffer, resolve_extent->width, resolve_extent->height, resolve_extent->depth);
400 }
401 
402 void
radv_meta_resolve_compute_image(struct radv_cmd_buffer * cmd_buffer,struct radv_image * src_image,VkFormat src_format,VkImageLayout src_image_layout,struct radv_image * dst_image,VkFormat dst_format,VkImageLayout dst_image_layout,const VkImageResolve2 * region)403 radv_meta_resolve_compute_image(struct radv_cmd_buffer *cmd_buffer, struct radv_image *src_image, VkFormat src_format,
404                                 VkImageLayout src_image_layout, struct radv_image *dst_image, VkFormat dst_format,
405                                 VkImageLayout dst_image_layout, const VkImageResolve2 *region)
406 {
407    struct radv_device *device = radv_cmd_buffer_device(cmd_buffer);
408    struct radv_meta_saved_state saved_state;
409 
410    /* For partial resolves, DCC should be decompressed before resolving
411     * because the metadata is re-initialized to the uncompressed after.
412     */
413    uint32_t queue_mask = radv_image_queue_family_mask(dst_image, cmd_buffer->qf, cmd_buffer->qf);
414 
415    if (!radv_image_use_dcc_image_stores(device, dst_image) &&
416        radv_layout_dcc_compressed(device, dst_image, region->dstSubresource.mipLevel, dst_image_layout, queue_mask) &&
417        (region->dstOffset.x || region->dstOffset.y || region->dstOffset.z ||
418         region->extent.width != dst_image->vk.extent.width || region->extent.height != dst_image->vk.extent.height ||
419         region->extent.depth != dst_image->vk.extent.depth)) {
420       radv_decompress_dcc(cmd_buffer, dst_image,
421                           &(VkImageSubresourceRange){
422                              .aspectMask = region->dstSubresource.aspectMask,
423                              .baseMipLevel = region->dstSubresource.mipLevel,
424                              .levelCount = 1,
425                              .baseArrayLayer = region->dstSubresource.baseArrayLayer,
426                              .layerCount = vk_image_subresource_layer_count(&dst_image->vk, &region->dstSubresource),
427                           });
428    }
429 
430    radv_meta_save(&saved_state, cmd_buffer,
431                   RADV_META_SAVE_COMPUTE_PIPELINE | RADV_META_SAVE_CONSTANTS | RADV_META_SAVE_DESCRIPTORS);
432 
433    assert(region->srcSubresource.aspectMask == VK_IMAGE_ASPECT_COLOR_BIT);
434    assert(region->dstSubresource.aspectMask == VK_IMAGE_ASPECT_COLOR_BIT);
435    assert(vk_image_subresource_layer_count(&src_image->vk, &region->srcSubresource) ==
436           vk_image_subresource_layer_count(&dst_image->vk, &region->dstSubresource));
437 
438    const uint32_t dst_base_layer = radv_meta_get_iview_layer(dst_image, &region->dstSubresource, &region->dstOffset);
439 
440    const struct VkExtent3D extent = vk_image_sanitize_extent(&src_image->vk, region->extent);
441    const struct VkOffset3D srcOffset = vk_image_sanitize_offset(&src_image->vk, region->srcOffset);
442    const struct VkOffset3D dstOffset = vk_image_sanitize_offset(&dst_image->vk, region->dstOffset);
443    const unsigned src_layer_count = vk_image_subresource_layer_count(&src_image->vk, &region->srcSubresource);
444 
445    for (uint32_t layer = 0; layer < src_layer_count; ++layer) {
446 
447       struct radv_image_view src_iview;
448       radv_image_view_init(&src_iview, device,
449                            &(VkImageViewCreateInfo){
450                               .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
451                               .image = radv_image_to_handle(src_image),
452                               .viewType = VK_IMAGE_VIEW_TYPE_2D,
453                               .format = src_format,
454                               .subresourceRange =
455                                  {
456                                     .aspectMask = VK_IMAGE_ASPECT_COLOR_BIT,
457                                     .baseMipLevel = 0,
458                                     .levelCount = 1,
459                                     .baseArrayLayer = region->srcSubresource.baseArrayLayer + layer,
460                                     .layerCount = 1,
461                                  },
462                            },
463                            NULL);
464 
465       struct radv_image_view dst_iview;
466       radv_image_view_init(&dst_iview, device,
467                            &(VkImageViewCreateInfo){
468                               .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
469                               .image = radv_image_to_handle(dst_image),
470                               .viewType = radv_meta_get_view_type(dst_image),
471                               .format = vk_format_no_srgb(dst_format),
472                               .subresourceRange =
473                                  {
474                                     .aspectMask = VK_IMAGE_ASPECT_COLOR_BIT,
475                                     .baseMipLevel = region->dstSubresource.mipLevel,
476                                     .levelCount = 1,
477                                     .baseArrayLayer = dst_base_layer + layer,
478                                     .layerCount = 1,
479                                  },
480                            },
481                            NULL);
482 
483       emit_resolve(cmd_buffer, &src_iview, &dst_iview, &(VkOffset2D){srcOffset.x, srcOffset.y},
484                    &(VkOffset2D){dstOffset.x, dstOffset.y}, &(VkExtent2D){extent.width, extent.height});
485 
486       radv_image_view_finish(&src_iview);
487       radv_image_view_finish(&dst_iview);
488    }
489 
490    radv_meta_restore(&saved_state, cmd_buffer);
491 
492    if (!radv_image_use_dcc_image_stores(device, dst_image) &&
493        radv_layout_dcc_compressed(device, dst_image, region->dstSubresource.mipLevel, dst_image_layout, queue_mask)) {
494 
495       cmd_buffer->state.flush_bits |= RADV_CMD_FLAG_CS_PARTIAL_FLUSH | RADV_CMD_FLAG_INV_VCACHE;
496 
497       VkImageSubresourceRange range = {
498          .aspectMask = VK_IMAGE_ASPECT_COLOR_BIT,
499          .baseMipLevel = region->dstSubresource.mipLevel,
500          .levelCount = 1,
501          .baseArrayLayer = dst_base_layer,
502          .layerCount = vk_image_subresource_layer_count(&dst_image->vk, &region->dstSubresource),
503       };
504 
505       cmd_buffer->state.flush_bits |= radv_init_dcc(cmd_buffer, dst_image, &range, 0xffffffff);
506    }
507 }
508 
509 void
radv_cmd_buffer_resolve_rendering_cs(struct radv_cmd_buffer * cmd_buffer,struct radv_image_view * src_iview,VkImageLayout src_layout,struct radv_image_view * dst_iview,VkImageLayout dst_layout,const VkImageResolve2 * region)510 radv_cmd_buffer_resolve_rendering_cs(struct radv_cmd_buffer *cmd_buffer, struct radv_image_view *src_iview,
511                                      VkImageLayout src_layout, struct radv_image_view *dst_iview,
512                                      VkImageLayout dst_layout, const VkImageResolve2 *region)
513 {
514    radv_meta_resolve_compute_image(cmd_buffer, src_iview->image, src_iview->vk.format, src_layout, dst_iview->image,
515                                    dst_iview->vk.format, dst_layout, region);
516 
517    cmd_buffer->state.flush_bits |= RADV_CMD_FLAG_CS_PARTIAL_FLUSH | RADV_CMD_FLAG_INV_VCACHE |
518                                    radv_src_access_flush(cmd_buffer, VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
519                                                          VK_ACCESS_2_SHADER_WRITE_BIT, NULL, NULL);
520 }
521 
522 void
radv_depth_stencil_resolve_rendering_cs(struct radv_cmd_buffer * cmd_buffer,VkImageAspectFlags aspects,VkResolveModeFlagBits resolve_mode)523 radv_depth_stencil_resolve_rendering_cs(struct radv_cmd_buffer *cmd_buffer, VkImageAspectFlags aspects,
524                                         VkResolveModeFlagBits resolve_mode)
525 {
526    struct radv_device *device = radv_cmd_buffer_device(cmd_buffer);
527    const struct radv_rendering_state *render = &cmd_buffer->state.render;
528    VkRect2D resolve_area = render->area;
529    struct radv_meta_saved_state saved_state;
530 
531    uint32_t layer_count = render->layer_count;
532    if (render->view_mask)
533       layer_count = util_last_bit(render->view_mask);
534 
535    /* Resolves happen before the end-of-subpass barriers get executed, so
536     * we have to make the attachment shader-readable.
537     */
538    cmd_buffer->state.flush_bits |=
539       radv_src_access_flush(cmd_buffer, VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
540                             VK_ACCESS_2_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT, NULL, NULL) |
541       radv_dst_access_flush(cmd_buffer, VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT, VK_ACCESS_2_SHADER_READ_BIT, NULL, NULL);
542 
543    struct radv_image_view *src_iview = render->ds_att.iview;
544    VkImageLayout src_layout =
545       aspects & VK_IMAGE_ASPECT_DEPTH_BIT ? render->ds_att.layout : render->ds_att.stencil_layout;
546    struct radv_image *src_image = src_iview->image;
547 
548    VkImageResolve2 region = {0};
549    region.sType = VK_STRUCTURE_TYPE_IMAGE_RESOLVE_2;
550    region.srcSubresource.aspectMask = aspects;
551    region.srcSubresource.mipLevel = 0;
552    region.srcSubresource.baseArrayLayer = src_iview->vk.base_array_layer;
553    region.srcSubresource.layerCount = layer_count;
554 
555    radv_decompress_resolve_src(cmd_buffer, src_image, src_layout, &region);
556 
557    radv_meta_save(&saved_state, cmd_buffer, RADV_META_SAVE_COMPUTE_PIPELINE | RADV_META_SAVE_DESCRIPTORS);
558 
559    struct radv_image_view *dst_iview = render->ds_att.resolve_iview;
560    VkImageLayout dst_layout =
561       aspects & VK_IMAGE_ASPECT_DEPTH_BIT ? render->ds_att.resolve_layout : render->ds_att.stencil_resolve_layout;
562    struct radv_image *dst_image = dst_iview->image;
563 
564    struct radv_image_view tsrc_iview;
565    radv_image_view_init(&tsrc_iview, device,
566                         &(VkImageViewCreateInfo){
567                            .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
568                            .image = radv_image_to_handle(src_image),
569                            .viewType = VK_IMAGE_VIEW_TYPE_2D,
570                            .format = src_iview->vk.format,
571                            .subresourceRange =
572                               {
573                                  .aspectMask = aspects,
574                                  .baseMipLevel = 0,
575                                  .levelCount = 1,
576                                  .baseArrayLayer = src_iview->vk.base_array_layer,
577                                  .layerCount = layer_count,
578                               },
579                         },
580                         NULL);
581 
582    struct radv_image_view tdst_iview;
583    radv_image_view_init(&tdst_iview, device,
584                         &(VkImageViewCreateInfo){
585                            .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
586                            .image = radv_image_to_handle(dst_image),
587                            .viewType = radv_meta_get_view_type(dst_image),
588                            .format = dst_iview->vk.format,
589                            .subresourceRange =
590                               {
591                                  .aspectMask = aspects,
592                                  .baseMipLevel = dst_iview->vk.base_mip_level,
593                                  .levelCount = 1,
594                                  .baseArrayLayer = dst_iview->vk.base_array_layer,
595                                  .layerCount = layer_count,
596                               },
597                         },
598                         NULL);
599 
600    emit_depth_stencil_resolve(cmd_buffer, &tsrc_iview, &tdst_iview, &resolve_area.offset,
601                               &(VkExtent3D){resolve_area.extent.width, resolve_area.extent.height, layer_count},
602                               aspects, resolve_mode);
603 
604    cmd_buffer->state.flush_bits |= RADV_CMD_FLAG_CS_PARTIAL_FLUSH | RADV_CMD_FLAG_INV_VCACHE |
605                                    radv_src_access_flush(cmd_buffer, VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
606                                                          VK_ACCESS_2_SHADER_WRITE_BIT, NULL, NULL);
607 
608    uint32_t queue_mask = radv_image_queue_family_mask(dst_image, cmd_buffer->qf, cmd_buffer->qf);
609 
610    if (radv_layout_is_htile_compressed(device, dst_image, dst_layout, queue_mask)) {
611       VkImageSubresourceRange range = {0};
612       range.aspectMask = aspects;
613       range.baseMipLevel = dst_iview->vk.base_mip_level;
614       range.levelCount = 1;
615       range.baseArrayLayer = dst_iview->vk.base_array_layer;
616       range.layerCount = layer_count;
617 
618       uint32_t htile_value = radv_get_htile_initial_value(device, dst_image);
619 
620       cmd_buffer->state.flush_bits |= radv_clear_htile(cmd_buffer, dst_image, &range, htile_value, false);
621    }
622 
623    radv_image_view_finish(&tsrc_iview);
624    radv_image_view_finish(&tdst_iview);
625 
626    radv_meta_restore(&saved_state, cmd_buffer);
627 }
628