diff options
author | Robert Tarasov <tutankhamen@google.com> | 2022-04-27 20:01:36 +0000 |
---|---|---|
committer | Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com> | 2022-04-27 20:01:36 +0000 |
commit | b873e6ad330dda3f1fd0aa17f4f2b618942030ae (patch) | |
tree | b79805b2ba59d012920c08a4c90378978e3828fc | |
parent | 7786c1d3d609846e3ee5ba9bbdfd68ad4e8195c6 (diff) | |
parent | 72529ecf88cb5368c213c41a85613fa020419baa (diff) | |
download | mesa3d-android13-qpr2-release.tar.gz |
Fixes YV12 image creation crash am: d007afcf24 am: 04911f9ef2 am: 72529ecf88android-t-qpr3-beta-3-gplandroid-t-qpr3-beta-1-gplandroid-t-qpr2-beta-3-gplandroid-t-qpr2-beta-2-gplandroid-13.0.0_r83android-13.0.0_r82android-13.0.0_r81android-13.0.0_r80android-13.0.0_r79android-13.0.0_r78android-13.0.0_r77android-13.0.0_r76android-13.0.0_r75android-13.0.0_r74android-13.0.0_r73android-13.0.0_r72android-13.0.0_r71android-13.0.0_r70android-13.0.0_r69android-13.0.0_r68android-13.0.0_r67android-13.0.0_r66android-13.0.0_r65android-13.0.0_r64android-13.0.0_r63android-13.0.0_r62android-13.0.0_r61android-13.0.0_r60android-13.0.0_r59android-13.0.0_r58android-13.0.0_r56android-13.0.0_r54android-13.0.0_r53android-13.0.0_r52android-13.0.0_r51android-13.0.0_r50android-13.0.0_r49android-13.0.0_r48android-13.0.0_r47android-13.0.0_r46android-13.0.0_r45android-13.0.0_r44android-13.0.0_r43android-13.0.0_r42android-13.0.0_r41android-13.0.0_r40android-13.0.0_r39android-13.0.0_r38android-13.0.0_r37android-13.0.0_r36android-13.0.0_r35android-13.0.0_r34android-13.0.0_r33android-13.0.0_r32android13-qpr3-s9-releaseandroid13-qpr3-s8-releaseandroid13-qpr3-s7-releaseandroid13-qpr3-s6-releaseandroid13-qpr3-s5-releaseandroid13-qpr3-s4-releaseandroid13-qpr3-s3-releaseandroid13-qpr3-s2-releaseandroid13-qpr3-s14-releaseandroid13-qpr3-s13-releaseandroid13-qpr3-s12-releaseandroid13-qpr3-s11-releaseandroid13-qpr3-s10-releaseandroid13-qpr3-s1-releaseandroid13-qpr3-releaseandroid13-qpr3-c-s8-releaseandroid13-qpr3-c-s7-releaseandroid13-qpr3-c-s6-releaseandroid13-qpr3-c-s5-releaseandroid13-qpr3-c-s4-releaseandroid13-qpr3-c-s3-releaseandroid13-qpr3-c-s2-releaseandroid13-qpr3-c-s12-releaseandroid13-qpr3-c-s11-releaseandroid13-qpr3-c-s10-releaseandroid13-qpr3-c-s1-releaseandroid13-qpr2-s9-releaseandroid13-qpr2-s8-releaseandroid13-qpr2-s7-releaseandroid13-qpr2-s6-releaseandroid13-qpr2-s5-releaseandroid13-qpr2-s3-releaseandroid13-qpr2-s2-releaseandroid13-qpr2-s12-releaseandroid13-qpr2-s11-releaseandroid13-qpr2-s10-releaseandroid13-qpr2-s1-releaseandroid13-qpr2-releaseandroid13-qpr2-b-s1-releaseandroid13-d4-s2-releaseandroid13-d4-s1-releaseandroid13-d4-release
Original change: https://googleplex-android-review.googlesource.com/c/platform/external/mesa3d/+/17939448
Change-Id: I3dfd1ca4788be61ae2a5c6a8dcfb015b645567b4
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
-rw-r--r-- | src/egl/drivers/dri2/platform_android.c | 62 |
1 files changed, 47 insertions, 15 deletions
diff --git a/src/egl/drivers/dri2/platform_android.c b/src/egl/drivers/dri2/platform_android.c index 782d66a3a87..c8e0e7b2402 100644 --- a/src/egl/drivers/dri2/platform_android.c +++ b/src/egl/drivers/dri2/platform_android.c @@ -203,24 +203,56 @@ droid_create_image_from_prime_fds_yuv(_EGLDisplay *disp, int ret; unsigned error; - if (!dri2_dpy->gralloc->lock_ycbcr) { - _eglLog(_EGL_WARNING, "Gralloc does not support lock_ycbcr"); - return NULL; - } - memset(&ycbcr, 0, sizeof(ycbcr)); - ret = dri2_dpy->gralloc->lock_ycbcr(dri2_dpy->gralloc, buf->handle, - 0, 0, 0, 0, 0, &ycbcr); - if (ret) { - /* HACK: See droid_create_image_from_prime_fds() and - * https://issuetracker.google.com/32077885.*/ - if (buf->format == HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED) + if (dri2_dpy->gralloc->lock_ycbcr) { + ret = dri2_dpy->gralloc->lock_ycbcr(dri2_dpy->gralloc, buf->handle, + 0, 0, 0, 0, 0, &ycbcr); + if (ret) { + /* HACK: See droid_create_image_from_prime_fds() and + * https://issuetracker.google.com/32077885.*/ + if (buf->format == HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED) + return NULL; + + _eglLog(_EGL_WARNING, "gralloc->lock_ycbcr failed: %d", ret); return NULL; - - _eglLog(_EGL_WARNING, "gralloc->lock_ycbcr failed: %d", ret); - return NULL; + } + dri2_dpy->gralloc->unlock(dri2_dpy->gralloc, buf->handle); + } else { + _eglLog(_EGL_WARNING, "Gralloc does not support lock_ycbcr!"); + // HACK: Prepare a hardcoded ycrcb struct to prevent crashes while trying + // to create a YVU420_ANDROID or FLEX_YCbCr_420 (NV12) image with gralloc4 + // see: b/225392099 + if (buf->format == HAL_PIXEL_FORMAT_YV12) { + // HAL_PIXEL_FORMAT_YV12 => DRM_FORMAT_YVU420_ANDROID + // The stride of Android YV12 buffers is required to be aligned to 16 bytes + size_t luma_stride = ALIGN(buf->width, 32); + size_t chroma_stride = ALIGN(buf->width/2, 16); + ycbcr.y = 0; + ycbcr.cr = (void*)(luma_stride*buf->height); + ycbcr.cb = (void*)(luma_stride*buf->height+chroma_stride*buf->height/2); + ycbcr.ystride = luma_stride; + ycbcr.cstride = chroma_stride; + ycbcr.chroma_step = 1; + _eglLog(_EGL_WARNING, + "Using a hardcoded ycbcr struct for DRM_FORMAT_YVU420_ANDROID format."); + } else if (buf->format == HAL_PIXEL_FORMAT_YCbCr_420_888) { + // HAL_PIXEL_FORMAT_YCbCr_420_888 => DRM_FORMAT_FLEX_YCbCr_420_888 + size_t luma_stride = buf->width; + size_t chroma_stride = buf->width; + ycbcr.y = 0; + ycbcr.cr = (void*)(luma_stride*buf->height+1); + ycbcr.cb = (void*)(luma_stride*buf->height); + ycbcr.ystride = luma_stride; + ycbcr.cstride = chroma_stride; + ycbcr.chroma_step = 2; + _eglLog(_EGL_WARNING, + "Using a hardcoded ycbcr struct for DRM_FORMAT_FLEX_YCbCr_420_888 format."); + } else { + _eglLog(_EGL_WARNING, + "Unable to create an image for native YUV format %x", buf->format); + return NULL; + } } - dri2_dpy->gralloc->unlock(dri2_dpy->gralloc, buf->handle); /* When lock_ycbcr's usage argument contains no SW_READ/WRITE flags * it will return the .y/.cb/.cr pointers based on a NULL pointer, |