Need support to add NV12 format in mesa code
Gurpreet Kaur (QUIC)
quic_gkaur at quicinc.com
Thu Jun 15 11:01:16 UTC 2023
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/20230615/63f5500b/attachment.htm>
More information about the mesa-dev
mailing list