gfxstream: use gralloc metadata in vkGetAHBPropertiesANDROID

... now that gralloc buffer metadata is more widely available
and actually populated.

Test: cvd start --gpu_mode=gfxstream_guest_angle_host_swiftshader
Test: cts -m CtsGraphicsTestCases
Test: cts -m CtsMediaCodecTestCases
Test: cts -m CtsMediaDecoderTestCases
Test: cts -m CtsViewTestCasesTest
Test: Open Youtube in Webview
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/31330>
This commit is contained in:
Jason Macnak 2024-09-23 14:58:53 -07:00 committed by Marge Bot
parent 466df904b7
commit c243970d50
4 changed files with 173 additions and 8 deletions

View file

@ -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

View file

@ -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<VirtGpuDevice> mDevice;
};

View file

@ -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);

View file

@ -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);