diff --git a/src/gfxstream/guest/android/GrallocMinigbm.cpp b/src/gfxstream/guest/android/GrallocMinigbm.cpp index 7ddc6561cd2..0401a87e4f3 100644 --- a/src/gfxstream/guest/android/GrallocMinigbm.cpp +++ b/src/gfxstream/guest/android/GrallocMinigbm.cpp @@ -178,4 +178,13 @@ int MinigbmGralloc::getId(const AHardwareBuffer* ahb, uint64_t* id) { #endif } +int32_t MinigbmGralloc::getDataspace(const AHardwareBuffer* ahb) { +#if ANDROID_API_LEVEL >= 34 + return AHardwareBuffer_getDataSpace(ahb); +#else + (void)ahb; + return GFXSTREAM_AHB_DATASPACE_UNKNOWN; +#endif +} + } // namespace gfxstream diff --git a/src/gfxstream/guest/android/GrallocMinigbm.h b/src/gfxstream/guest/android/GrallocMinigbm.h index 82fcfb958a5..c10771c1d51 100644 --- a/src/gfxstream/guest/android/GrallocMinigbm.h +++ b/src/gfxstream/guest/android/GrallocMinigbm.h @@ -50,6 +50,8 @@ class MinigbmGralloc : public Gralloc { int getId(const AHardwareBuffer* ahb, uint64_t* id) override; + int32_t getDataspace(const AHardwareBuffer* ahb) override; + private: std::unique_ptr mDevice; }; diff --git a/src/gfxstream/guest/android/include/gfxstream/guest/GfxStreamGralloc.h b/src/gfxstream/guest/android/include/gfxstream/guest/GfxStreamGralloc.h index 4036885feee..26d10fb02fb 100644 --- a/src/gfxstream/guest/android/include/gfxstream/guest/GfxStreamGralloc.h +++ b/src/gfxstream/guest/android/include/gfxstream/guest/GfxStreamGralloc.h @@ -21,8 +21,7 @@ constexpr uint32_t kGlRGB = 0x1907; constexpr uint32_t kGlRGBA = 0x1908; constexpr uint32_t kGlRGB565 = 0x8D62; -// Buffer pixel formats mirrored from Android to avoid extra -// build dependencies on Android libraries. +// Enums mirrored from Android to avoid extra build dependencies. enum { GFXSTREAM_AHB_FORMAT_R8G8B8A8_UNORM = 1, GFXSTREAM_AHB_FORMAT_R8G8B8X8_UNORM = 2, @@ -46,6 +45,81 @@ enum { GFXSTREAM_AHB_FORMAT_R8_UNORM = 0x38, }; +enum GfxstreamAhbDataspace { + GFXSTREAM_AHB_DATASPACE_UNKNOWN = 0, + GFXSTREAM_AHB_DATASPACE_ARBITRARY = 1, + GFXSTREAM_AHB_DATASPACE_STANDARD_SHIFT = 16, + GFXSTREAM_AHB_DATASPACE_STANDARD_MASK = 4128768, // (63 << STANDARD_SHIFT) + GFXSTREAM_AHB_DATASPACE_STANDARD_UNSPECIFIED = 0, // (0 << STANDARD_SHIFT) + GFXSTREAM_AHB_DATASPACE_STANDARD_BT709 = 65536, // (1 << STANDARD_SHIFT) + GFXSTREAM_AHB_DATASPACE_STANDARD_BT601_625 = 131072, // (2 << STANDARD_SHIFT) + GFXSTREAM_AHB_DATASPACE_STANDARD_BT601_625_UNADJUSTED = 196608, // (3 << STANDARD_SHIFT) + GFXSTREAM_AHB_DATASPACE_STANDARD_BT601_525 = 262144, // (4 << STANDARD_SHIFT) + GFXSTREAM_AHB_DATASPACE_STANDARD_BT601_525_UNADJUSTED = 327680, // (5 << STANDARD_SHIFT) + GFXSTREAM_AHB_DATASPACE_STANDARD_BT2020 = 393216, // (6 << STANDARD_SHIFT) + GFXSTREAM_AHB_DATASPACE_STANDARD_BT2020_CONSTANT_LUMINANCE = 458752, // (7 << STANDARD_SHIFT) + GFXSTREAM_AHB_DATASPACE_STANDARD_BT470M = 524288, // (8 << STANDARD_SHIFT) + GFXSTREAM_AHB_DATASPACE_STANDARD_FILM = 589824, // (9 << STANDARD_SHIFT) + GFXSTREAM_AHB_DATASPACE_STANDARD_DCI_P3 = 655360, // (10 << STANDARD_SHIFT) + GFXSTREAM_AHB_DATASPACE_STANDARD_ADOBE_RGB = 720896, // (11 << STANDARD_SHIFT) + GFXSTREAM_AHB_DATASPACE_TRANSFER_SHIFT = 22, + GFXSTREAM_AHB_DATASPACE_TRANSFER_MASK = 130023424, // (31 << TRANSFER_SHIFT) + GFXSTREAM_AHB_DATASPACE_TRANSFER_UNSPECIFIED = 0, // (0 << TRANSFER_SHIFT) + GFXSTREAM_AHB_DATASPACE_TRANSFER_LINEAR = 4194304, // (1 << TRANSFER_SHIFT) + GFXSTREAM_AHB_DATASPACE_TRANSFER_SRGB = 8388608, // (2 << TRANSFER_SHIFT) + GFXSTREAM_AHB_DATASPACE_TRANSFER_SMPTE_170M = 12582912, // (3 << TRANSFER_SHIFT) + GFXSTREAM_AHB_DATASPACE_TRANSFER_GAMMA2_2 = 16777216, // (4 << TRANSFER_SHIFT) + GFXSTREAM_AHB_DATASPACE_TRANSFER_GAMMA2_6 = 20971520, // (5 << TRANSFER_SHIFT) + GFXSTREAM_AHB_DATASPACE_TRANSFER_GAMMA2_8 = 25165824, // (6 << TRANSFER_SHIFT) + GFXSTREAM_AHB_DATASPACE_TRANSFER_ST2084 = 29360128, // (7 << TRANSFER_SHIFT) + GFXSTREAM_AHB_DATASPACE_TRANSFER_HLG = 33554432, // (8 << TRANSFER_SHIFT) + GFXSTREAM_AHB_DATASPACE_RANGE_SHIFT = 27, + GFXSTREAM_AHB_DATASPACE_RANGE_MASK = 939524096, // (7 << RANGE_SHIFT) + GFXSTREAM_AHB_DATASPACE_RANGE_UNSPECIFIED = 0, // (0 << RANGE_SHIFT) + GFXSTREAM_AHB_DATASPACE_RANGE_FULL = 134217728, // (1 << RANGE_SHIFT) + GFXSTREAM_AHB_DATASPACE_RANGE_LIMITED = 268435456, // (2 << RANGE_SHIFT) + GFXSTREAM_AHB_DATASPACE_RANGE_EXTENDED = 402653184, // (3 << RANGE_SHIFT) + GFXSTREAM_AHB_DATASPACE_SRGB_LINEAR = 512, + GFXSTREAM_AHB_DATASPACE_V0_SRGB_LINEAR = + 138477568, // ((STANDARD_BT709 | TRANSFER_LINEAR) | RANGE_FULL) + GFXSTREAM_AHB_DATASPACE_V0_SCRGB_LINEAR = + 406913024, // ((STANDARD_BT709 | TRANSFER_LINEAR) | RANGE_EXTENDED) + GFXSTREAM_AHB_DATASPACE_SRGB = 513, + GFXSTREAM_AHB_DATASPACE_V0_SRGB = 142671872, // ((STANDARD_BT709 | TRANSFER_SRGB) | RANGE_FULL) + GFXSTREAM_AHB_DATASPACE_V0_SCRGB = + 411107328, // ((STANDARD_BT709 | TRANSFER_SRGB) | RANGE_EXTENDED) + GFXSTREAM_AHB_DATASPACE_JFIF = 257, + GFXSTREAM_AHB_DATASPACE_V0_JFIF = + 146931712, // ((STANDARD_BT601_625 | TRANSFER_SMPTE_170M) | RANGE_FULL) + GFXSTREAM_AHB_DATASPACE_BT601_625 = 258, + GFXSTREAM_AHB_DATASPACE_V0_BT601_625 = + 281149440, // ((STANDARD_BT601_625 | TRANSFER_SMPTE_170M) | RANGE_LIMITED) + GFXSTREAM_AHB_DATASPACE_BT601_525 = 259, + GFXSTREAM_AHB_DATASPACE_V0_BT601_525 = + 281280512, // ((STANDARD_BT601_525 | TRANSFER_SMPTE_170M) | RANGE_LIMITED) + GFXSTREAM_AHB_DATASPACE_BT709 = 260, + GFXSTREAM_AHB_DATASPACE_V0_BT709 = + 281083904, // ((STANDARD_BT709 | TRANSFER_SMPTE_170M) | RANGE_LIMITED) + GFXSTREAM_AHB_DATASPACE_DCI_P3_LINEAR = + 139067392, // ((STANDARD_DCI_P3 | TRANSFER_LINEAR) | RANGE_FULL) + GFXSTREAM_AHB_DATASPACE_DCI_P3 = + 155844608, // ((STANDARD_DCI_P3 | TRANSFER_GAMMA2_6) | RANGE_FULL) + GFXSTREAM_AHB_DATASPACE_DISPLAY_P3_LINEAR = + 139067392, // ((STANDARD_DCI_P3 | TRANSFER_LINEAR) | RANGE_FULL) + GFXSTREAM_AHB_DATASPACE_DISPLAY_P3 = + 143261696, // ((STANDARD_DCI_P3 | TRANSFER_SRGB) | RANGE_FULL) + GFXSTREAM_AHB_DATASPACE_ADOBE_RGB = + 151715840, // ((STANDARD_ADOBE_RGB | TRANSFER_GAMMA2_2) | RANGE_FULL) + GFXSTREAM_AHB_DATASPACE_BT2020_LINEAR = + 138805248, // ((STANDARD_BT2020 | TRANSFER_LINEAR) | RANGE_FULL) + GFXSTREAM_AHB_DATASPACE_BT2020 = + 147193856, // ((STANDARD_BT2020 | TRANSFER_SMPTE_170M) | RANGE_FULL) + GFXSTREAM_AHB_DATASPACE_BT2020_PQ = + 163971072, // ((STANDARD_BT2020 | TRANSFER_ST2084) | RANGE_FULL) + GFXSTREAM_AHB_DATASPACE_DEPTH = 4096, + GFXSTREAM_AHB_DATASPACE_SENSOR = 4097, +}; + enum GrallocType { GRALLOC_TYPE_GOLDFISH = 1, GRALLOC_TYPE_MINIGBM = 2, @@ -102,6 +176,10 @@ class Gralloc { virtual int getId(const AHardwareBuffer* ahb, uint64_t* id) = 0; virtual bool treatBlobAsImage() { return false; } + + virtual int32_t getDataspace(const AHardwareBuffer* ahb) { + return GFXSTREAM_AHB_DATASPACE_UNKNOWN; + } }; Gralloc* createPlatformGralloc(int32_t descriptor = -1); diff --git a/src/gfxstream/guest/vulkan_enc/AndroidHardwareBuffer.cpp b/src/gfxstream/guest/vulkan_enc/AndroidHardwareBuffer.cpp index 11b7b194402..42c49a2041c 100644 --- a/src/gfxstream/guest/vulkan_enc/AndroidHardwareBuffer.cpp +++ b/src/gfxstream/guest/vulkan_enc/AndroidHardwareBuffer.cpp @@ -155,6 +155,11 @@ VkResult getAndroidHardwareBufferPropertiesANDROID( ahbFormatProps->samplerYcbcrConversionComponents.b = VK_COMPONENT_SWIZZLE_IDENTITY; ahbFormatProps->samplerYcbcrConversionComponents.a = VK_COMPONENT_SWIZZLE_IDENTITY; + ahbFormatProps->suggestedYcbcrModel = VK_SAMPLER_YCBCR_MODEL_CONVERSION_RGB_IDENTITY; + ahbFormatProps->suggestedYcbcrRange = VK_SAMPLER_YCBCR_RANGE_ITU_NARROW; + ahbFormatProps->suggestedXChromaOffset = VK_CHROMA_LOCATION_MIDPOINT; + ahbFormatProps->suggestedYChromaOffset = VK_CHROMA_LOCATION_MIDPOINT; + #if defined(__ANDROID__) || defined(__linux__) if (android_format_is_yuv(format)) { uint32_t drmFormat = grallocHelper->getFormatDrmFourcc(buffer); @@ -215,15 +220,86 @@ VkResult getAndroidHardwareBufferPropertiesANDROID( break; } } + + int32_t dataspace = grallocHelper->getDataspace(buffer); + + // Some of the dataspace enums are not composites built from the bitwise-or of the model, + // transfer, and range. Replace those enums with their corresponding composite enums: + switch (dataspace) { + case GFXSTREAM_AHB_DATASPACE_UNKNOWN: { + dataspace = GFXSTREAM_AHB_DATASPACE_V0_JFIF; + break; + } + case GFXSTREAM_AHB_DATASPACE_BT601_525: { + dataspace = GFXSTREAM_AHB_DATASPACE_V0_BT601_525; + break; + } + case GFXSTREAM_AHB_DATASPACE_BT601_625: { + dataspace = GFXSTREAM_AHB_DATASPACE_V0_BT601_625; + break; + } + case GFXSTREAM_AHB_DATASPACE_BT709: { + dataspace = GFXSTREAM_AHB_DATASPACE_V0_BT709; + break; + } + case GFXSTREAM_AHB_DATASPACE_JFIF: { + dataspace = GFXSTREAM_AHB_DATASPACE_V0_JFIF; + break; + } + case GFXSTREAM_AHB_DATASPACE_SRGB: { + dataspace = GFXSTREAM_AHB_DATASPACE_V0_SRGB; + break; + } + case GFXSTREAM_AHB_DATASPACE_SRGB_LINEAR: { + dataspace = GFXSTREAM_AHB_DATASPACE_V0_SRGB_LINEAR; + break; + } + } + + const int32_t model = dataspace & GFXSTREAM_AHB_DATASPACE_STANDARD_MASK; + switch (model) { + case GFXSTREAM_AHB_DATASPACE_STANDARD_BT601_525: + case GFXSTREAM_AHB_DATASPACE_STANDARD_BT601_525_UNADJUSTED: + case GFXSTREAM_AHB_DATASPACE_STANDARD_BT601_625: + case GFXSTREAM_AHB_DATASPACE_STANDARD_BT601_625_UNADJUSTED: { + ahbFormatProps->suggestedYcbcrModel = VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_601; + break; + } + case GFXSTREAM_AHB_DATASPACE_STANDARD_BT709: { + ahbFormatProps->suggestedYcbcrModel = VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_709; + break; + } + case GFXSTREAM_AHB_DATASPACE_STANDARD_BT2020: + case GFXSTREAM_AHB_DATASPACE_STANDARD_BT2020_CONSTANT_LUMINANCE: { + ahbFormatProps->suggestedYcbcrModel = VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_2020; + break; + } + default: { + mesa_logw("Unhandled AHB dataspace model: %d. Assuming YCBCR_601", model); + ahbFormatProps->suggestedYcbcrModel = VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_601; + break; + } + } + + const int32_t range = dataspace & GFXSTREAM_AHB_DATASPACE_RANGE_MASK; + switch (range) { + case GFXSTREAM_AHB_DATASPACE_RANGE_FULL: { + ahbFormatProps->suggestedYcbcrRange = VK_SAMPLER_YCBCR_RANGE_ITU_FULL; + break; + } + case GFXSTREAM_AHB_DATASPACE_RANGE_LIMITED: { + ahbFormatProps->suggestedYcbcrRange = VK_SAMPLER_YCBCR_RANGE_ITU_NARROW; + break; + } + default: { + mesa_logw("Unhandled AHB dataspace range: %d. Assuming full.", range); + ahbFormatProps->suggestedYcbcrRange = VK_SAMPLER_YCBCR_RANGE_ITU_FULL; + break; + } + } } #endif - ahbFormatProps->suggestedYcbcrModel = android_format_is_yuv(format) - ? VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_601 - : VK_SAMPLER_YCBCR_MODEL_CONVERSION_RGB_IDENTITY; - ahbFormatProps->suggestedYcbcrRange = VK_SAMPLER_YCBCR_RANGE_ITU_FULL; - ahbFormatProps->suggestedXChromaOffset = VK_CHROMA_LOCATION_MIDPOINT; - ahbFormatProps->suggestedYChromaOffset = VK_CHROMA_LOCATION_MIDPOINT; } uint32_t colorBufferHandle = grallocHelper->getHostHandle(buffer);