61
61
static nir_shader *
62
62
build_resolve_compute_shader(struct radv_device *dev, bool is_integer, bool is_srgb, int samples)
64
enum glsl_base_type img_base_type = is_integer ? GLSL_TYPE_UINT : GLSL_TYPE_FLOAT;
64
65
const struct glsl_type *sampler_type =
65
glsl_sampler_type(GLSL_SAMPLER_DIM_MS, false, false, GLSL_TYPE_FLOAT);
66
const struct glsl_type *img_type = glsl_image_type(GLSL_SAMPLER_DIM_2D, false, GLSL_TYPE_FLOAT);
67
nir_builder b = radv_meta_init_shader(MESA_SHADER_COMPUTE, "meta_resolve_cs-%d-%s", samples,
66
glsl_sampler_type(GLSL_SAMPLER_DIM_MS, false, false, img_base_type);
67
const struct glsl_type *img_type = glsl_image_type(GLSL_SAMPLER_DIM_2D, false, img_base_type);
68
nir_builder b = radv_meta_init_shader(dev, MESA_SHADER_COMPUTE, "meta_resolve_cs-%d-%s", samples,
68
69
is_integer ? "int" : (is_srgb ? "srgb" : "float"));
69
70
b.shader->info.workgroup_size[0] = 8;
70
71
b.shader->info.workgroup_size[1] = 8;
80
81
nir_ssa_def *global_id = get_global_ids(&b, 2);
82
nir_ssa_def *src_offset = nir_load_push_constant(&b, 2, 32, nir_imm_int(&b, 0), .range = 16);
83
nir_ssa_def *src_offset = nir_load_push_constant(&b, 2, 32, nir_imm_int(&b, 0), .range = 8);
83
84
nir_ssa_def *dst_offset = nir_load_push_constant(&b, 2, 32, nir_imm_int(&b, 8), .range = 16);
85
86
nir_ssa_def *src_coord = nir_iadd(&b, global_id, src_offset);
130
131
build_depth_stencil_resolve_compute_shader(struct radv_device *dev, int samples, int index,
131
132
VkResolveModeFlagBits resolve_mode)
134
enum glsl_base_type img_base_type = index == DEPTH_RESOLVE ? GLSL_TYPE_FLOAT : GLSL_TYPE_UINT;
133
135
const struct glsl_type *sampler_type =
134
glsl_sampler_type(GLSL_SAMPLER_DIM_MS, false, true, GLSL_TYPE_FLOAT);
135
const struct glsl_type *img_type = glsl_image_type(GLSL_SAMPLER_DIM_2D, true, GLSL_TYPE_FLOAT);
136
glsl_sampler_type(GLSL_SAMPLER_DIM_MS, false, true, img_base_type);
137
const struct glsl_type *img_type = glsl_image_type(GLSL_SAMPLER_DIM_2D, true, img_base_type);
137
nir_builder b = radv_meta_init_shader(MESA_SHADER_COMPUTE, "meta_resolve_cs_%s-%s-%d",
139
nir_builder b = radv_meta_init_shader(dev, MESA_SHADER_COMPUTE, "meta_resolve_cs_%s-%s-%d",
138
140
index == DEPTH_RESOLVE ? "depth" : "stencil",
139
141
get_resolve_mode_str(resolve_mode), samples);
140
142
b.shader->info.workgroup_size[0] = 8;
384
386
res = create_resolve_pipeline(device, samples, false, false,
385
387
&state->resolve_compute.rc[i].pipeline);
386
388
if (res != VK_SUCCESS)
389
391
res = create_resolve_pipeline(device, samples, true, false,
390
392
&state->resolve_compute.rc[i].i_pipeline);
391
393
if (res != VK_SUCCESS)
394
396
res = create_resolve_pipeline(device, samples, false, true,
395
397
&state->resolve_compute.rc[i].srgb_pipeline);
396
398
if (res != VK_SUCCESS)
399
401
res = create_depth_stencil_resolve_pipeline(
400
402
device, samples, DEPTH_RESOLVE, VK_RESOLVE_MODE_AVERAGE_BIT,
401
403
&state->resolve_compute.depth[i].average_pipeline);
402
404
if (res != VK_SUCCESS)
405
407
res = create_depth_stencil_resolve_pipeline(device, samples, DEPTH_RESOLVE,
406
408
VK_RESOLVE_MODE_MAX_BIT,
407
409
&state->resolve_compute.depth[i].max_pipeline);
408
410
if (res != VK_SUCCESS)
411
413
res = create_depth_stencil_resolve_pipeline(device, samples, DEPTH_RESOLVE,
412
414
VK_RESOLVE_MODE_MIN_BIT,
413
415
&state->resolve_compute.depth[i].min_pipeline);
414
416
if (res != VK_SUCCESS)
417
419
res = create_depth_stencil_resolve_pipeline(device, samples, STENCIL_RESOLVE,
418
420
VK_RESOLVE_MODE_MAX_BIT,
419
421
&state->resolve_compute.stencil[i].max_pipeline);
420
422
if (res != VK_SUCCESS)
423
425
res = create_depth_stencil_resolve_pipeline(device, samples, STENCIL_RESOLVE,
424
426
VK_RESOLVE_MODE_MIN_BIT,
425
427
&state->resolve_compute.stencil[i].min_pipeline);
426
428
if (res != VK_SUCCESS)
430
432
res = create_depth_stencil_resolve_pipeline(device, 0, DEPTH_RESOLVE,
431
433
VK_RESOLVE_MODE_SAMPLE_ZERO_BIT,
432
434
&state->resolve_compute.depth_zero_pipeline);
433
435
if (res != VK_SUCCESS)
436
res = create_depth_stencil_resolve_pipeline(device, 0, STENCIL_RESOLVE,
437
VK_RESOLVE_MODE_SAMPLE_ZERO_BIT,
438
&state->resolve_compute.stencil_zero_pipeline);
439
if (res != VK_SUCCESS)
444
radv_device_finish_meta_resolve_compute_state(device);
438
return create_depth_stencil_resolve_pipeline(device, 0, STENCIL_RESOLVE,
439
VK_RESOLVE_MODE_SAMPLE_ZERO_BIT,
440
&state->resolve_compute.stencil_zero_pipeline);
481
476
radv_DestroyPipeline(radv_device_to_handle(device), state->resolve_compute.stencil_zero_pipeline,
484
radv_DestroyDescriptorSetLayout(radv_device_to_handle(device), state->resolve_compute.ds_layout,
479
device->vk.dispatch_table.DestroyDescriptorSetLayout(
480
radv_device_to_handle(device), state->resolve_compute.ds_layout, &state->alloc);
486
481
radv_DestroyPipelineLayout(radv_device_to_handle(device), state->resolve_compute.p_layout,
496
491
uint32_t samples_log2 = ffs(samples) - 1;
497
492
VkPipeline *pipeline;
499
if (vk_format_is_int(src_iview->vk_format))
494
if (vk_format_is_int(src_iview->vk.format))
500
495
pipeline = &state->resolve_compute.rc[samples_log2].i_pipeline;
501
else if (vk_format_is_srgb(src_iview->vk_format))
496
else if (vk_format_is_srgb(src_iview->vk.format))
502
497
pipeline = &state->resolve_compute.rc[samples_log2].srgb_pipeline;
504
499
pipeline = &state->resolve_compute.rc[samples_log2].pipeline;
506
501
if (!*pipeline) {
509
ret = create_resolve_pipeline(device, samples, vk_format_is_int(src_iview->vk_format),
510
vk_format_is_srgb(src_iview->vk_format), pipeline);
504
ret = create_resolve_pipeline(device, samples, vk_format_is_int(src_iview->vk.format),
505
vk_format_is_srgb(src_iview->vk.format), pipeline);
511
506
if (ret != VK_SUCCESS) {
512
507
cmd_buffer->record_result = ret;
700
695
const uint32_t dest_base_layer =
701
696
radv_meta_get_iview_layer(dest_image, ®ion->dstSubresource, ®ion->dstOffset);
703
const struct VkExtent3D extent = radv_sanitize_image_extent(src_image->type, region->extent);
704
const struct VkOffset3D srcOffset =
705
radv_sanitize_image_offset(src_image->type, region->srcOffset);
706
const struct VkOffset3D dstOffset =
707
radv_sanitize_image_offset(dest_image->type, region->dstOffset);
698
const struct VkExtent3D extent = vk_image_sanitize_extent(&src_image->vk, region->extent);
699
const struct VkOffset3D srcOffset = vk_image_sanitize_offset(&src_image->vk, region->srcOffset);
700
const struct VkOffset3D dstOffset = vk_image_sanitize_offset(&dest_image->vk, region->dstOffset);
709
702
for (uint32_t layer = 0; layer < region->srcSubresource.layerCount; ++layer) {
810
803
.srcSubresource =
811
804
(VkImageSubresourceLayers){
812
805
.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT,
813
.mipLevel = src_iview->base_mip,
814
.baseArrayLayer = src_iview->base_layer,
806
.mipLevel = src_iview->vk.base_mip_level,
807
.baseArrayLayer = src_iview->vk.base_array_layer,
815
808
.layerCount = layer_count,
817
810
.dstSubresource =
818
811
(VkImageSubresourceLayers){
819
812
.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT,
820
.mipLevel = dst_iview->base_mip,
821
.baseArrayLayer = dst_iview->base_layer,
813
.mipLevel = dst_iview->vk.base_mip_level,
814
.baseArrayLayer = dst_iview->vk.base_array_layer,
822
815
.layerCount = layer_count,
824
817
.srcOffset = (VkOffset3D){0, 0, 0},
825
818
.dstOffset = (VkOffset3D){0, 0, 0},
828
radv_meta_resolve_compute_image(cmd_buffer, src_iview->image, src_iview->vk_format,
829
src_att.layout, dst_iview->image, dst_iview->vk_format,
821
radv_meta_resolve_compute_image(cmd_buffer, src_iview->image, src_iview->vk.format,
822
src_att.layout, dst_iview->image, dst_iview->vk.format,
830
823
dst_att.layout, ®ion);
864
857
region.sType = VK_STRUCTURE_TYPE_IMAGE_RESOLVE_2;
865
858
region.srcSubresource.aspectMask = aspects;
866
859
region.srcSubresource.mipLevel = 0;
867
region.srcSubresource.baseArrayLayer = src_iview->base_layer;
860
region.srcSubresource.baseArrayLayer = src_iview->vk.base_array_layer;
868
861
region.srcSubresource.layerCount = layer_count;
870
863
radv_decompress_resolve_src(cmd_buffer, src_image, src_att.layout, ®ion);
882
875
.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
883
876
.image = radv_image_to_handle(src_image),
884
877
.viewType = radv_meta_get_view_type(src_image),
885
.format = src_iview->vk_format,
878
.format = src_iview->vk.format,
886
879
.subresourceRange =
888
881
.aspectMask = aspects,
889
.baseMipLevel = src_iview->base_mip,
882
.baseMipLevel = src_iview->vk.base_mip_level,
891
.baseArrayLayer = src_iview->base_layer,
884
.baseArrayLayer = src_iview->vk.base_array_layer,
892
885
.layerCount = layer_count,
897
890
struct radv_image_view tdst_iview;
898
891
radv_image_view_init(&tdst_iview, cmd_buffer->device,
900
893
.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
901
894
.image = radv_image_to_handle(dst_image),
902
895
.viewType = radv_meta_get_view_type(dst_image),
903
.format = dst_iview->vk_format,
896
.format = dst_iview->vk.format,
904
897
.subresourceRange =
906
899
.aspectMask = aspects,
907
.baseMipLevel = dst_iview->base_mip,
900
.baseMipLevel = dst_iview->vk.base_mip_level,
909
.baseArrayLayer = dst_iview->base_layer,
902
.baseArrayLayer = dst_iview->vk.base_array_layer,
910
903
.layerCount = layer_count,
915
908
emit_depth_stencil_resolve(cmd_buffer, &tsrc_iview, &tdst_iview,
916
909
&(VkExtent3D){fb->width, fb->height, layer_count}, aspects,
927
920
if (radv_layout_is_htile_compressed(cmd_buffer->device, dst_image, layout, false, queue_mask)) {
928
921
VkImageSubresourceRange range = {0};
929
922
range.aspectMask = aspects;
930
range.baseMipLevel = dst_iview->base_mip;
923
range.baseMipLevel = dst_iview->vk.base_mip_level;
931
924
range.levelCount = 1;
932
range.baseArrayLayer = dst_iview->base_layer;
925
range.baseArrayLayer = dst_iview->vk.base_array_layer;
933
926
range.layerCount = layer_count;
935
928
uint32_t htile_value = radv_get_htile_initial_value(cmd_buffer->device, dst_image);