Skip to content

Commit 7facd57

Browse files
committed
Add more supported vulkan color space
This change lists the vulkan color space that is said to be supported by VK_EXT_swapchain_colorspace extension, and enable them on the VkFormat that is supported by AHardwareBuffer. VK_COLOR_SPACE_EXTENDED_SRGB_LINEAR_EXT and VK_COLOR_SPACE_EXTENDED_SRGB_NONLINEAR_EXT are enabled on VK_FORMAT_R16G16B16A16_SFLOAT VkFormat surfaces only as the transfer function is only meaningful for FP16 pixel formats. VK_COLOR_SPACE_PASS_THROUGH_EXT is the only VK_EXT_swapchain_colorspace color space that is enabled on VK_FORMAT_R8_UNORM VkFormat. Color space doesn't apply to single-channel pixel format, and we should use pass through to keep the original pixel color value. VK_COLOR_SPACE_DOLBYVISION_EXT is not supported on Android platform, and it is excluded from the VK_EXT_swapchain_colorspace supported color space lists. Bug: b/322044839 Test: atest --verbose CtsViewTestCases:android.view.cts.TextureViewTest Change-Id: I6ee3cbf9c6c61fc353ec9f3e515884645382c665
1 parent 63cdb2e commit 7facd57

1 file changed

Lines changed: 89 additions & 40 deletions

File tree

vulkan/libvulkan/swapchain.cpp

Lines changed: 89 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
162181
class 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

Comments
 (0)