Need support to add NV12 format in mesa code
Marek Olšák
maraeo at gmail.com
Sat Jun 17 17:12:06 UTC 2023
I don't think u_format.csv can describe it. It only describes formats of
pixels in a single plane. All formats that have multiple planes where a
single pixel stores only a subset of its bits in each plane are handled as
special cases. Drivers also don't support such formats directly. For
example, drivers usually handle NV12 as 2 separate textures R8 and R8G8.
Marek
On Fri, Jun 16, 2023, 11:30 Gurpreet Kaur (QUIC) <quic_gkaur at quicinc.com>
wrote:
> Hi All,
>
>
>
> While trying to add support of GBM_FORMAT_NV12 format in mesa GBM, we are
> facing some issues to modify u_format.csv file.
>
>
>
> *Progress till now:*
>
> Initially we have faced gbm_dri_bo_create API failure because
> gbm_format_to_dri_format API was returning 0. Since gbm_dri_visual_table
> does not have mapping for GBM_FORMAT_NV12. So, this has been resolved by
> adding mapping for GBM_FORMAT_NV12 as:
>
> *diff --git a/src/gbm/backends/dri/gbm_dri.c
> b/src/gbm/backends/dri/gbm_dri.c*
>
> *index 560b97f2b70..67e23d5b368 100644*
>
> *--- a/src/gbm/backends/dri/gbm_dri.c*
>
> *+++ b/src/gbm/backends/dri/gbm_dri.c*
>
> *@@ -605,6 +605,9 @@ static const struct gbm_dri_visual
> gbm_dri_visuals_table[] = {*
>
> * { 16, 16, 16, 16 },*
>
> * true,*
>
> * },*
>
> *+ {*
>
> *+ GBM_FORMAT_NV12, __DRI_IMAGE_FORMAT_NV12,*
>
> *+ },*
>
> *};*
>
>
>
> After that it required additional changes, as loader_dri_create_image was
> not successful which eventually is calling dri2_create_image_common. Based
> on format, we are getting dri_format_mapping and mapping for
> __DRI_IMAGE_FORMAT_NV12 was missing. So, resolved this by adding below
> changes:
>
>
>
> *diff --git a/src/gallium/frontends/dri/dri_helpers.c
> b/src/gallium/frontends/dri/dri_helpers.c*
>
> *index 215fb4e4e3a..6ae1fc85d12 100644*
>
> *--- a/src/gallium/frontends/dri/dri_helpers.c*
>
> *+++ b/src/gallium/frontends/dri/dri_helpers.c*
>
> *@@ -484,6 +484,11 @@ static const struct dri2_format_mapping
> dri2_format_table[] = {*
>
> * __DRI_IMAGE_COMPONENTS_RG, PIPE_FORMAT_RG1616_UNORM, 1,*
>
> * { { 0, 0, 0, __DRI_IMAGE_FORMAT_GR1616 } } },*
>
> *+ { DRM_FORMAT_NV12, __DRI_IMAGE_FORMAT_NV12,*
>
> *+ __DRI_IMAGE_COMPONENTS_Y_UV, PIPE_FORMAT_NV12, 2,*
>
> *+ { { 0, 0, 0, __DRI_IMAGE_FORMAT_R8 },*
>
> *+ { 1, 1, 1, __DRI_IMAGE_FORMAT_GR88 } } },*
>
>
>
> Then in kms_sw_displaytarget_create API, DRM_IOCTL_MODE_CREATE_DUMB was
> getting failed with return value as -1. As util_format_get_blocksizebits
> was returning bpp value as zero which is incorrect for NV12 format. When we
> manually pass bpp value as 8, then we can see gbm_bo_create API is
> successful.
>
>
>
>
>
>
>
> diff --git a/src/gallium/winsys/sw/kms-dri/kms_dri_sw_winsys.c
>
> index c91f7e2ca9a..6a649e9c173 100644
>
> --- a/src/gallium/winsys/sw/kms-dri/kms_dri_sw_winsys.c
>
> +++ b/src/gallium/winsys/sw/kms-dri/kms_dri_sw_winsys.c
>
> *@@ -181,25 +181,33 @@ kms_sw_displaytarget_create(struct sw_winsys *ws,*
>
> * kms_sw_dt->ro_mapped = MAP_FAILED;*
>
> * kms_sw_dt->format = format;*
>
> * memset(&create_req, 0, sizeof(create_req));*
>
> * create_req.bpp = util_format_get_blocksizebits(format);*
>
> *+ if(format == 213)*
>
> *+ create_req.bpp = 8;*
>
>
>
> *Next Challenge:*
>
> Next challenge for us is to get correct bpp value which is 8. As format
> description is coming from u_format.csv file. We have tried to modify
> u_format.csv file for PIPE_FORMAT_NV12 row by adding number of bits in a
> cell, but that does not seem to be working. We need help for the same how
> to modify u_format.csv as it is getting generated at compile time.
>
> Please provide your valuable feedback how we can add bpp value in
> u_format.csv.
>
>
>
> Thanks,
>
> Gurpreet
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20230617/40704896/attachment.htm>
More information about the mesa-dev
mailing list