mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-08 09:08:10 +02:00
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:
parent
466df904b7
commit
c243970d50
4 changed files with 173 additions and 8 deletions
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
};
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue