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, ®ion->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, ®ion->srcSubresource) ==
436 vk_image_subresource_layer_count(&dst_image->vk, ®ion->dstSubresource));
437
438 const uint32_t dst_base_layer = radv_meta_get_iview_layer(dst_image, ®ion->dstSubresource, ®ion->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, ®ion->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, ®ion->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, ®ion);
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