<div dir="auto">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.<div dir="auto"><br></div><div dir="auto">Marek</div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Fri, Jun 16, 2023, 11:30 Gurpreet Kaur (QUIC) <<a href="mailto:quic_gkaur@quicinc.com">quic_gkaur@quicinc.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div lang="EN-US" link="#0563C1" vlink="#954F72" style="word-wrap:break-word">
<div class="m_6761923548700057465WordSection1">
<p class="MsoNormal">Hi All,<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">While trying to add support of GBM_FORMAT_NV12 format in mesa GBM, we are facing some issues to modify u_format.csv file.<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal"><b>Progress till now:<u></u><u></u></b></p>
<p class="MsoNormal">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: <u></u><u></u></p>
<p class="MsoNormal"><i><span style="color:#0070c0">diff --git a/src/gbm/backends/dri/gbm_dri.c b/src/gbm/backends/dri/gbm_dri.c<u></u><u></u></span></i></p>
<p class="MsoNormal"><i><span style="color:#0070c0">index 560b97f2b70..67e23d5b368 100644<u></u><u></u></span></i></p>
<p class="MsoNormal"><i><span style="color:#0070c0">--- a/src/gbm/backends/dri/gbm_dri.c<u></u><u></u></span></i></p>
<p class="MsoNormal"><i><span style="color:#0070c0">+++ b/src/gbm/backends/dri/gbm_dri.c<u></u><u></u></span></i></p>
<p class="MsoNormal"><i><span style="color:#0070c0">@@ -605,6 +605,9 @@ static const struct gbm_dri_visual gbm_dri_visuals_table[] = {<u></u><u></u></span></i></p>
<p class="MsoNormal"><i><span style="color:#0070c0"> { 16, 16, 16, 16 },<u></u><u></u></span></i></p>
<p class="MsoNormal"><i><span style="color:#0070c0"> true,<u></u><u></u></span></i></p>
<p class="MsoNormal"><i><span style="color:#0070c0"> },<u></u><u></u></span></i></p>
<p class="MsoNormal"><i><span style="color:#0070c0">+ {<u></u><u></u></span></i></p>
<p class="MsoNormal"><i><span style="color:#0070c0">+ GBM_FORMAT_NV12, __DRI_IMAGE_FORMAT_NV12,<u></u><u></u></span></i></p>
<p class="MsoNormal"><i><span style="color:#0070c0">+ },<u></u><u></u></span></i></p>
<p class="MsoNormal"><i><span style="color:#0070c0">};<u></u><u></u></span></i></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">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:<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal"><i><span style="color:#0070c0">diff --git a/src/gallium/frontends/dri/dri_helpers.c b/src/gallium/frontends/dri/dri_helpers.c<u></u><u></u></span></i></p>
<p class="MsoNormal"><i><span style="color:#0070c0">index 215fb4e4e3a..6ae1fc85d12 100644<u></u><u></u></span></i></p>
<p class="MsoNormal"><i><span style="color:#0070c0">--- a/src/gallium/frontends/dri/dri_helpers.c<u></u><u></u></span></i></p>
<p class="MsoNormal"><i><span style="color:#0070c0">+++ b/src/gallium/frontends/dri/dri_helpers.c<u></u><u></u></span></i></p>
<p class="MsoNormal"><i><span style="color:#0070c0">@@ -484,6 +484,11 @@ static const struct dri2_format_mapping dri2_format_table[] = {<u></u><u></u></span></i></p>
<p class="MsoNormal"><i><span style="color:#0070c0"> __DRI_IMAGE_COMPONENTS_RG, PIPE_FORMAT_RG1616_UNORM, 1,<u></u><u></u></span></i></p>
<p class="MsoNormal"><i><span style="color:#0070c0"> { { 0, 0, 0, __DRI_IMAGE_FORMAT_GR1616 } } },<u></u><u></u></span></i></p>
<p class="MsoNormal"><i><span style="color:#0070c0"><u></u><u></u></span></i></p>
<p class="MsoNormal"><i><span style="color:#0070c0">+ { DRM_FORMAT_NV12, __DRI_IMAGE_FORMAT_NV12,<u></u><u></u></span></i></p>
<p class="MsoNormal"><i><span style="color:#0070c0">+ __DRI_IMAGE_COMPONENTS_Y_UV, PIPE_FORMAT_NV12, 2,<u></u><u></u></span></i></p>
<p class="MsoNormal"><i><span style="color:#0070c0">+ { { 0, 0, 0, __DRI_IMAGE_FORMAT_R8 },<u></u><u></u></span></i></p>
<p class="MsoNormal"><i><span style="color:#0070c0">+ { 1, 1, 1, __DRI_IMAGE_FORMAT_GR88 } } },<u></u><u></u></span></i></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">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.<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal"><span style="color:#0070c0"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="color:#0070c0">diff --git a/src/gallium/winsys/sw/kms-dri/kms_dri_sw_winsys.c
<u></u><u></u></span></p>
<p class="MsoNormal"><span style="color:#0070c0">index c91f7e2ca9a..6a649e9c173 100644<u></u><u></u></span></p>
<p class="MsoNormal"><span style="color:#0070c0">--- a/src/gallium/winsys/sw/kms-dri/kms_dri_sw_winsys.c<u></u><u></u></span></p>
<p class="MsoNormal"><span style="color:#0070c0">+++ b/src/gallium/winsys/sw/kms-dri/kms_dri_sw_winsys.c<u></u><u></u></span></p>
<p class="MsoNormal"><i><span style="color:#0070c0">@@ -181,25 +181,33 @@ kms_sw_displaytarget_create(struct sw_winsys *ws,<u></u><u></u></span></i></p>
<p class="MsoNormal"><i><span style="color:#0070c0"> kms_sw_dt->ro_mapped = MAP_FAILED;<u></u><u></u></span></i></p>
<p class="MsoNormal"><i><span style="color:#0070c0"><u></u><u></u></span></i></p>
<p class="MsoNormal"><i><span style="color:#0070c0"> kms_sw_dt->format = format;<u></u><u></u></span></i></p>
<p class="MsoNormal"><i><span style="color:#0070c0"> memset(&create_req, 0, sizeof(create_req));<u></u><u></u></span></i></p>
<p class="MsoNormal"><i><span style="color:#0070c0"> create_req.bpp = util_format_get_blocksizebits(format);<u></u><u></u></span></i></p>
<p class="MsoNormal"><i><span style="color:#0070c0">+ if(format == 213)<u></u><u></u></span></i></p>
<p class="MsoNormal"><i><span style="color:#0070c0">+ create_req.bpp = 8;<u></u><u></u></span></i></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal"><b>Next Challenge:<u></u><u></u></b></p>
<p class="MsoNormal">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.
<u></u><u></u></p>
<p class="MsoNormal">Please provide your valuable feedback how we can add bpp value in u_format.csv.<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">Thanks,<u></u><u></u></p>
<p class="MsoNormal">Gurpreet<u></u><u></u></p>
</div>
</div>
</blockquote></div>