@@ -159,6 +159,25 @@ int InvertTransformToNative(VkSurfaceTransformFlagBitsKHR transform) {
159159 }
160160}
161161
162+ const static VkColorSpaceKHR colorSpaceSupportedByVkEXTSwapchainColorspace[] = {
163+ VK_COLOR_SPACE_DISPLAY_P3_NONLINEAR_EXT,
164+ VK_COLOR_SPACE_DISPLAY_P3_LINEAR_EXT,
165+ VK_COLOR_SPACE_DCI_P3_NONLINEAR_EXT,
166+ VK_COLOR_SPACE_BT709_LINEAR_EXT,
167+ VK_COLOR_SPACE_BT709_NONLINEAR_EXT,
168+ VK_COLOR_SPACE_BT2020_LINEAR_EXT,
169+ VK_COLOR_SPACE_HDR10_ST2084_EXT,
170+ VK_COLOR_SPACE_HDR10_HLG_EXT,
171+ VK_COLOR_SPACE_ADOBERGB_LINEAR_EXT,
172+ VK_COLOR_SPACE_ADOBERGB_NONLINEAR_EXT,
173+ VK_COLOR_SPACE_PASS_THROUGH_EXT,
174+ VK_COLOR_SPACE_DCI_P3_LINEAR_EXT};
175+
176+ const static VkColorSpaceKHR
177+ colorSpaceSupportedByVkEXTSwapchainColorspaceOnFP16SurfaceOnly[] = {
178+ VK_COLOR_SPACE_EXTENDED_SRGB_LINEAR_EXT,
179+ VK_COLOR_SPACE_EXTENDED_SRGB_NONLINEAR_EXT};
180+
162181class TimingInfo {
163182 public:
164183 TimingInfo (const VkPresentTimeGOOGLE* qp, uint64_t nativeFrameId)
@@ -746,16 +765,22 @@ VkResult GetPhysicalDeviceSurfaceFormatsKHR(VkPhysicalDevice pdev,
746765 };
747766
748767 if (colorspace_ext) {
749- all_formats.emplace_back (VkSurfaceFormatKHR{
750- VK_FORMAT_R8G8B8A8_UNORM, VK_COLOR_SPACE_PASS_THROUGH_EXT});
751- all_formats.emplace_back (VkSurfaceFormatKHR{
752- VK_FORMAT_R8G8B8A8_SRGB, VK_COLOR_SPACE_PASS_THROUGH_EXT});
753- all_formats.emplace_back (VkSurfaceFormatKHR{
754- VK_FORMAT_R8G8B8A8_UNORM, VK_COLOR_SPACE_BT709_LINEAR_EXT});
755- all_formats.emplace_back (VkSurfaceFormatKHR{
756- VK_FORMAT_R8G8B8A8_UNORM, VK_COLOR_SPACE_DISPLAY_P3_NONLINEAR_EXT});
757- all_formats.emplace_back (VkSurfaceFormatKHR{
758- VK_FORMAT_R8G8B8A8_SRGB, VK_COLOR_SPACE_DISPLAY_P3_NONLINEAR_EXT});
768+ for (VkColorSpaceKHR colorSpace :
769+ colorSpaceSupportedByVkEXTSwapchainColorspace) {
770+ if (GetNativeDataspace (colorSpace, GetNativePixelFormat (
771+ VK_FORMAT_R8G8B8A8_UNORM)) !=
772+ DataSpace::UNKNOWN) {
773+ all_formats.emplace_back (
774+ VkSurfaceFormatKHR{VK_FORMAT_R8G8B8A8_UNORM, colorSpace});
775+ }
776+
777+ if (GetNativeDataspace (colorSpace, GetNativePixelFormat (
778+ VK_FORMAT_R8G8B8A8_SRGB)) !=
779+ DataSpace::UNKNOWN) {
780+ all_formats.emplace_back (
781+ VkSurfaceFormatKHR{VK_FORMAT_R8G8B8A8_SRGB, colorSpace});
782+ }
783+ }
759784 }
760785
761786 // NOTE: Any new formats that are added must be coordinated across different
@@ -767,9 +792,16 @@ VkResult GetPhysicalDeviceSurfaceFormatsKHR(VkPhysicalDevice pdev,
767792 all_formats.emplace_back (VkSurfaceFormatKHR{
768793 VK_FORMAT_R5G6B5_UNORM_PACK16, VK_COLOR_SPACE_SRGB_NONLINEAR_KHR});
769794 if (colorspace_ext) {
770- all_formats.emplace_back (
771- VkSurfaceFormatKHR{VK_FORMAT_R5G6B5_UNORM_PACK16,
772- VK_COLOR_SPACE_PASS_THROUGH_EXT});
795+ for (VkColorSpaceKHR colorSpace :
796+ colorSpaceSupportedByVkEXTSwapchainColorspace) {
797+ if (GetNativeDataspace (
798+ colorSpace,
799+ GetNativePixelFormat (VK_FORMAT_R5G6B5_UNORM_PACK16)) !=
800+ DataSpace::UNKNOWN) {
801+ all_formats.emplace_back (VkSurfaceFormatKHR{
802+ VK_FORMAT_R5G6B5_UNORM_PACK16, colorSpace});
803+ }
804+ }
773805 }
774806 }
775807
@@ -778,21 +810,28 @@ VkResult GetPhysicalDeviceSurfaceFormatsKHR(VkPhysicalDevice pdev,
778810 all_formats.emplace_back (VkSurfaceFormatKHR{
779811 VK_FORMAT_R16G16B16A16_SFLOAT, VK_COLOR_SPACE_SRGB_NONLINEAR_KHR});
780812 if (colorspace_ext) {
781- all_formats.emplace_back (
782- VkSurfaceFormatKHR{VK_FORMAT_R16G16B16A16_SFLOAT,
783- VK_COLOR_SPACE_PASS_THROUGH_EXT});
784- all_formats.emplace_back (
785- VkSurfaceFormatKHR{VK_FORMAT_R16G16B16A16_SFLOAT,
786- VK_COLOR_SPACE_EXTENDED_SRGB_LINEAR_EXT});
787- all_formats.emplace_back (
788- VkSurfaceFormatKHR{VK_FORMAT_R16G16B16A16_SFLOAT,
789- VK_COLOR_SPACE_EXTENDED_SRGB_NONLINEAR_EXT});
790- all_formats.emplace_back (
791- VkSurfaceFormatKHR{VK_FORMAT_R16G16B16A16_SFLOAT,
792- VK_COLOR_SPACE_DISPLAY_P3_NONLINEAR_EXT});
793- all_formats.emplace_back (
794- VkSurfaceFormatKHR{VK_FORMAT_R16G16B16A16_SFLOAT,
795- VK_COLOR_SPACE_DISPLAY_P3_LINEAR_EXT});
813+ for (VkColorSpaceKHR colorSpace :
814+ colorSpaceSupportedByVkEXTSwapchainColorspace) {
815+ if (GetNativeDataspace (
816+ colorSpace,
817+ GetNativePixelFormat (VK_FORMAT_R16G16B16A16_SFLOAT)) !=
818+ DataSpace::UNKNOWN) {
819+ all_formats.emplace_back (VkSurfaceFormatKHR{
820+ VK_FORMAT_R16G16B16A16_SFLOAT, colorSpace});
821+ }
822+ }
823+
824+ for (
825+ VkColorSpaceKHR colorSpace :
826+ colorSpaceSupportedByVkEXTSwapchainColorspaceOnFP16SurfaceOnly) {
827+ if (GetNativeDataspace (
828+ colorSpace,
829+ GetNativePixelFormat (VK_FORMAT_R16G16B16A16_SFLOAT)) !=
830+ DataSpace::UNKNOWN) {
831+ all_formats.emplace_back (VkSurfaceFormatKHR{
832+ VK_FORMAT_R16G16B16A16_SFLOAT, colorSpace});
833+ }
834+ }
796835 }
797836 }
798837
@@ -802,12 +841,16 @@ VkResult GetPhysicalDeviceSurfaceFormatsKHR(VkPhysicalDevice pdev,
802841 VkSurfaceFormatKHR{VK_FORMAT_A2B10G10R10_UNORM_PACK32,
803842 VK_COLOR_SPACE_SRGB_NONLINEAR_KHR});
804843 if (colorspace_ext) {
805- all_formats.emplace_back (
806- VkSurfaceFormatKHR{VK_FORMAT_A2B10G10R10_UNORM_PACK32,
807- VK_COLOR_SPACE_PASS_THROUGH_EXT});
808- all_formats.emplace_back (
809- VkSurfaceFormatKHR{VK_FORMAT_A2B10G10R10_UNORM_PACK32,
810- VK_COLOR_SPACE_DISPLAY_P3_NONLINEAR_EXT});
844+ for (VkColorSpaceKHR colorSpace :
845+ colorSpaceSupportedByVkEXTSwapchainColorspace) {
846+ if (GetNativeDataspace (
847+ colorSpace, GetNativePixelFormat (
848+ VK_FORMAT_A2B10G10R10_UNORM_PACK32)) !=
849+ DataSpace::UNKNOWN) {
850+ all_formats.emplace_back (VkSurfaceFormatKHR{
851+ VK_FORMAT_A2B10G10R10_UNORM_PACK32, colorSpace});
852+ }
853+ }
811854 }
812855 }
813856
@@ -840,12 +883,18 @@ VkResult GetPhysicalDeviceSurfaceFormatsKHR(VkPhysicalDevice pdev,
840883 VkSurfaceFormatKHR{VK_FORMAT_R10X6G10X6B10X6A10X6_UNORM_4PACK16,
841884 VK_COLOR_SPACE_SRGB_NONLINEAR_KHR});
842885 if (colorspace_ext) {
843- all_formats.emplace_back (
844- VkSurfaceFormatKHR{VK_FORMAT_R10X6G10X6B10X6A10X6_UNORM_4PACK16,
845- VK_COLOR_SPACE_PASS_THROUGH_EXT});
846- all_formats.emplace_back (
847- VkSurfaceFormatKHR{VK_FORMAT_R10X6G10X6B10X6A10X6_UNORM_4PACK16,
848- VK_COLOR_SPACE_DISPLAY_P3_NONLINEAR_EXT});
886+ for (VkColorSpaceKHR colorSpace :
887+ colorSpaceSupportedByVkEXTSwapchainColorspace) {
888+ if (GetNativeDataspace (
889+ colorSpace,
890+ GetNativePixelFormat (
891+ VK_FORMAT_R10X6G10X6B10X6A10X6_UNORM_4PACK16)) !=
892+ DataSpace::UNKNOWN) {
893+ all_formats.emplace_back (VkSurfaceFormatKHR{
894+ VK_FORMAT_R10X6G10X6B10X6A10X6_UNORM_4PACK16,
895+ colorSpace});
896+ }
897+ }
849898 }
850899 }
851900
0 commit comments