@@ -59,7 +59,7 @@ bool IsFormatAstcCompressed(VkFormat format)
59
59
return vkuFormatIsCompressed_ASTC_HDR (format) || vkuFormatIsCompressed_ASTC_LDR (format);
60
60
}
61
61
62
- util::imagewriter::DataFormats VkFormatToImageWriterDataFormat (VkFormat format)
62
+ static util::imagewriter::DataFormats VkFormatToImageWriterDataFormat (VkFormat format)
63
63
{
64
64
if (IsFormatAstcCompressed (format))
65
65
{
@@ -68,9 +68,6 @@ util::imagewriter::DataFormats VkFormatToImageWriterDataFormat(VkFormat format)
68
68
69
69
switch (format)
70
70
{
71
- case VK_FORMAT_R8_UNORM:
72
- return util::imagewriter::DataFormats::kFormat_R8 ;
73
-
74
71
case VK_FORMAT_R8G8B8_UNORM:
75
72
return util::imagewriter::DataFormats::kFormat_RGB ;
76
73
@@ -81,19 +78,10 @@ util::imagewriter::DataFormats VkFormatToImageWriterDataFormat(VkFormat format)
81
78
case VK_FORMAT_B8G8R8_UNORM:
82
79
return util::imagewriter::DataFormats::kFormat_BGR ;
83
80
84
- case VK_FORMAT_R16G16B16A16_SFLOAT:
85
- return util::imagewriter::DataFormats::kFormat_R16G16B16A16_SFLOAT ;
86
-
87
- case VK_FORMAT_B10G11R11_UFLOAT_PACK32:
88
- return util::imagewriter::DataFormats::kFormat_B10G11R11_UFLOAT ;
89
-
90
81
case VK_FORMAT_B8G8R8A8_SRGB:
91
82
case VK_FORMAT_B8G8R8A8_UNORM:
92
83
return util::imagewriter::DataFormats::kFormat_BGRA ;
93
84
94
- case VK_FORMAT_A2B10G10R10_UNORM_PACK32:
95
- return util::imagewriter::DataFormats::kFormat_A2B10G10R10 ;
96
-
97
85
case VK_FORMAT_D32_SFLOAT:
98
86
case VK_FORMAT_D32_SFLOAT_S8_UINT:
99
87
return util::imagewriter::DataFormats::kFormat_D32_FLOAT ;
@@ -109,36 +97,45 @@ util::imagewriter::DataFormats VkFormatToImageWriterDataFormat(VkFormat format)
109
97
}
110
98
}
111
99
112
- const char * ImageFileExtension (VkFormat format, util::ScreenshotFormat image_file_format )
100
+ const char * ImageFileExtension (DumpedImageFormat image_format )
113
101
{
114
- const util::imagewriter::DataFormats output_image_format = VkFormatToImageWriterDataFormat (format);
115
-
116
- if (output_image_format != util::imagewriter::DataFormats::kFormat_UNSPECIFIED )
102
+ switch (image_format)
117
103
{
118
- if (output_image_format == util::imagewriter::DataFormats::kFormat_ASTC )
119
- {
104
+ case kFormatBMP :
105
+ return " .bmp" ;
106
+
107
+ case KFormatPNG:
108
+ return " .png" ;
109
+
110
+ case KFormatAstc:
120
111
return " .astc" ;
121
- }
122
- else
123
- {
124
- switch (image_file_format)
125
- {
126
- case util::ScreenshotFormat::kBmp :
127
- return " .bmp" ;
128
112
129
- case util::ScreenshotFormat::kPng :
130
- return " .png" ;
113
+ case KFormatRaw:
114
+ default :
115
+ return " .bin" ;
116
+ }
117
+ }
131
118
132
- default :
133
- assert (0 );
134
- return " .bmp" ;
135
- }
136
- }
119
+ static VkFormat ChooseDestinationImageFormat (VkFormat format)
120
+ {
121
+ VkFormat dst_format;
122
+
123
+ if (vkuFormatIsSRGB (format))
124
+ {
125
+ dst_format = vkuFormatHasAlpha (format) ? VK_FORMAT_B8G8R8A8_SRGB : VK_FORMAT_B8G8R8_SRGB;
126
+ }
127
+ else if (vkuFormatIsDepthOrStencil (format))
128
+ {
129
+ // Converting depth format with vkCmdBlit is not allowed.
130
+ // We will do the conversion on the cpu.
131
+ dst_format = format;
137
132
}
138
133
else
139
134
{
140
- return " .bin " ;
135
+ dst_format = vkuFormatHasAlpha (format) ? VK_FORMAT_B8G8R8A8_UNORM : VK_FORMAT_B8G8R8_UNORM ;
141
136
}
137
+
138
+ return dst_format;
142
139
}
143
140
144
141
uint32_t GetMemoryTypeIndex (const VkPhysicalDeviceMemoryProperties& memory_properties,
@@ -448,6 +445,7 @@ VkResult DumpImageToFile(const ImageInfo* image_info,
448
445
std::vector<bool >& scaling_supported,
449
446
util::ScreenshotFormat image_file_format,
450
447
bool dump_all_subresources,
448
+ bool dump_image_raw,
451
449
VkImageLayout layout,
452
450
const VkExtent3D* extent_p)
453
451
{
@@ -477,6 +475,8 @@ VkResult DumpImageToFile(const ImageInfo* image_info,
477
475
(extent_p != nullptr ) ? extent_p->height : image_info->extent .height ,
478
476
(extent_p != nullptr ) ? extent_p->depth : image_info->extent .depth };
479
477
478
+ const VkFormat dst_format = ChooseDestinationImageFormat (image_info->format );
479
+
480
480
uint32_t f = 0 ;
481
481
for (size_t i = 0 ; i < aspects.size (); ++i)
482
482
{
@@ -504,7 +504,8 @@ VkResult DumpImageToFile(const ImageInfo* image_info,
504
504
subresource_sizes,
505
505
scaled,
506
506
false ,
507
- scale);
507
+ scale,
508
+ dst_format);
508
509
509
510
assert (!subresource_offsets.empty ());
510
511
assert (!subresource_sizes.empty ());
@@ -519,7 +520,18 @@ VkResult DumpImageToFile(const ImageInfo* image_info,
519
520
return res;
520
521
}
521
522
522
- const util::imagewriter::DataFormats output_image_format = VkFormatToImageWriterDataFormat (image_info->format );
523
+ const DumpedImageFormat output_image_format = GetDumpedImageFormat (device_info,
524
+ device_table,
525
+ instance_table,
526
+ object_info_table,
527
+ image_info->format ,
528
+ image_info->tiling ,
529
+ image_info->type ,
530
+ image_file_format,
531
+ dump_image_raw);
532
+
533
+ const util::imagewriter::DataFormats image_writer_format = VkFormatToImageWriterDataFormat (dst_format);
534
+ assert (image_writer_format != util::imagewriter::DataFormats::kFormat_UNSPECIFIED );
523
535
524
536
if ((image_info->level_count == 1 && image_info->layer_count == 1 ) || !dump_all_subresources)
525
537
{
@@ -529,7 +541,7 @@ VkResult DumpImageToFile(const ImageInfo* image_info,
529
541
if (aspects[i] == VK_IMAGE_ASPECT_STENCIL_BIT)
530
542
continue ;
531
543
532
- if (output_image_format != util::imagewriter::DataFormats:: kFormat_UNSPECIFIED )
544
+ if (output_image_format != KFormatRaw )
533
545
{
534
546
VkExtent3D scaled_extent;
535
547
if (scale != 1 .0f && scaled)
@@ -543,10 +555,10 @@ VkResult DumpImageToFile(const ImageInfo* image_info,
543
555
scaled_extent = image_info->extent ;
544
556
}
545
557
546
- const uint32_t texel_size = vkuFormatElementSizeWithAspect (image_info-> format , aspects[i]);
558
+ const uint32_t texel_size = vkuFormatElementSizeWithAspect (dst_format , aspects[i]);
547
559
const uint32_t stride = texel_size * scaled_extent.width ;
548
560
549
- if (output_image_format == util::imagewriter::DataFormats:: kFormat_ASTC )
561
+ if (output_image_format == KFormatAstc )
550
562
{
551
563
VKU_FORMAT_INFO format_info = vkuGetFormatInfo (image_info->format );
552
564
@@ -560,26 +572,26 @@ VkResult DumpImageToFile(const ImageInfo* image_info,
560
572
data.data (),
561
573
subresource_sizes[0 ]);
562
574
}
563
- else if (image_file_format == util::ScreenshotFormat:: kBmp )
575
+ else if (output_image_format == kFormatBMP )
564
576
{
565
577
util::imagewriter::WriteBmpImage (filename,
566
578
scaled_extent.width ,
567
579
scaled_extent.height ,
568
580
subresource_sizes[0 ],
569
581
data.data (),
570
582
stride,
571
- output_image_format ,
583
+ image_writer_format ,
572
584
vkuFormatHasAlpha (image_info->format ));
573
585
}
574
- else if (image_file_format == util::ScreenshotFormat:: kPng )
586
+ else if (output_image_format == KFormatPNG )
575
587
{
576
588
util::imagewriter::WritePngImage (filename,
577
589
scaled_extent.width ,
578
590
scaled_extent.height ,
579
591
subresource_sizes[0 ],
580
592
data.data (),
581
593
stride,
582
- output_image_format ,
594
+ image_writer_format ,
583
595
vkuFormatHasAlpha (image_info->format ));
584
596
}
585
597
}
@@ -607,7 +619,7 @@ VkResult DumpImageToFile(const ImageInfo* image_info,
607
619
const void * data_offset = reinterpret_cast <const void *>(
608
620
reinterpret_cast <const uint8_t *>(data.data ()) + subresource_offsets[sub_res_idx]);
609
621
610
- if (output_image_format != util::imagewriter::DataFormats:: kFormat_UNSPECIFIED )
622
+ if (output_image_format != KFormatRaw )
611
623
{
612
624
VkExtent3D scaled_extent;
613
625
if (scale != 1 .0f && scaled)
@@ -628,7 +640,7 @@ VkResult DumpImageToFile(const ImageInfo* image_info,
628
640
const uint32_t texel_size = vkuFormatElementSizeWithAspect (image_info->format , aspect);
629
641
const uint32_t stride = texel_size * scaled_extent.width ;
630
642
631
- if (output_image_format == util::imagewriter::DataFormats:: kFormat_ASTC )
643
+ if (output_image_format == KFormatAstc )
632
644
{
633
645
VKU_FORMAT_INFO format_info = vkuGetFormatInfo (image_info->format );
634
646
@@ -642,25 +654,25 @@ VkResult DumpImageToFile(const ImageInfo* image_info,
642
654
data.data (),
643
655
subresource_sizes[sub_res_idx]);
644
656
}
645
- else if (image_file_format == util::ScreenshotFormat:: kBmp )
657
+ else if (output_image_format == kFormatBMP )
646
658
{
647
659
util::imagewriter::WriteBmpImage (filename,
648
660
scaled_extent.width ,
649
661
scaled_extent.height ,
650
662
subresource_sizes[sub_res_idx],
651
663
data_offset,
652
664
stride,
653
- output_image_format );
665
+ image_writer_format );
654
666
}
655
- else if (image_file_format == util::ScreenshotFormat:: kPng )
667
+ else if (output_image_format == KFormatPNG )
656
668
{
657
669
util::imagewriter::WritePngImage (filename,
658
670
scaled_extent.width ,
659
671
scaled_extent.height ,
660
672
subresource_sizes[sub_res_idx],
661
673
data_offset,
662
674
stride,
663
- output_image_format );
675
+ image_writer_format );
664
676
}
665
677
}
666
678
else
@@ -854,5 +866,69 @@ void GetFormatAspects(VkFormat format, std::vector<VkImageAspectFlagBits>& aspec
854
866
}
855
867
}
856
868
869
+ DumpedImageFormat GetDumpedImageFormat (const DeviceInfo* device_info,
870
+ const encode::VulkanDeviceTable* device_table,
871
+ const encode::VulkanInstanceTable* instance_table,
872
+ VulkanObjectInfoTable& object_info_table,
873
+ VkFormat src_format,
874
+ VkImageTiling src_image_tiling,
875
+ VkImageType type,
876
+ util::ScreenshotFormat image_file_format,
877
+ bool dump_raw)
878
+ {
879
+ const PhysicalDeviceInfo* phys_dev_info = object_info_table.GetPhysicalDeviceInfo (device_info->parent_id );
880
+ assert (phys_dev_info);
881
+
882
+ // If there's a request for images to be dumped as raw bin files
883
+ if (dump_raw)
884
+ {
885
+ // We consider astc as a raw bin format
886
+ if (IsFormatAstcCompressed (src_format))
887
+ {
888
+ return KFormatAstc;
889
+ }
890
+ else
891
+ {
892
+ return KFormatRaw;
893
+ }
894
+ }
895
+
896
+ // Astc images will be dumped as .astc files
897
+ if (IsFormatAstcCompressed (src_format))
898
+ {
899
+ return KFormatAstc;
900
+ }
901
+
902
+ graphics::VulkanResourcesUtil resource_util (device_info->handle ,
903
+ device_info->parent ,
904
+ *device_table,
905
+ *instance_table,
906
+ *phys_dev_info->replay_device_info ->memory_properties );
907
+
908
+ // Image cannot be converted into a format compatible for dumping in an image file
909
+ const VkFormat dst_format = ChooseDestinationImageFormat (src_format);
910
+ bool is_blit_supported = resource_util.IsBlitSupported (src_format, src_image_tiling, dst_format);
911
+ if (!vkuFormatIsDepthOrStencil (src_format) && src_format != dst_format && !is_blit_supported)
912
+ {
913
+ return KFormatRaw;
914
+ }
915
+
916
+ // Choose the requested preference for image file extension
917
+ switch (image_file_format)
918
+ {
919
+ case util::ScreenshotFormat::kBmp :
920
+ return kFormatBMP ;
921
+
922
+ case util::ScreenshotFormat::kPng :
923
+ return KFormatPNG;
924
+
925
+ default :
926
+ assert (0 );
927
+ return KFormatRaw;
928
+ }
929
+
930
+ return KFormatRaw;
931
+ }
932
+
857
933
GFXRECON_END_NAMESPACE (gfxrecon)
858
934
GFXRECON_END_NAMESPACE(decode)
0 commit comments