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