st/mesa: Don't map all P01X DRM formats to P016
Allow gallium drivers to distinguish between the P010, P012, and P016
DRM formats.
Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/6486>
diff --git a/src/gallium/frontends/dri/dri_helpers.c b/src/gallium/frontends/dri/dri_helpers.c
index 90a8a39..01a1fb3 100644
--- a/src/gallium/frontends/dri/dri_helpers.c
+++ b/src/gallium/frontends/dri/dri_helpers.c
@@ -491,11 +491,11 @@
{ 1, 1, 1, __DRI_IMAGE_FORMAT_GR88, 2 } } },
{ DRM_FORMAT_P010, __DRI_IMAGE_FORMAT_NONE,
- __DRI_IMAGE_COMPONENTS_Y_UV, PIPE_FORMAT_P016, 2,
+ __DRI_IMAGE_COMPONENTS_Y_UV, PIPE_FORMAT_P010, 2,
{ { 0, 0, 0, __DRI_IMAGE_FORMAT_R16, 2 },
{ 1, 1, 1, __DRI_IMAGE_FORMAT_GR1616, 4 } } },
{ DRM_FORMAT_P012, __DRI_IMAGE_FORMAT_NONE,
- __DRI_IMAGE_COMPONENTS_Y_UV, PIPE_FORMAT_P016, 2,
+ __DRI_IMAGE_COMPONENTS_Y_UV, PIPE_FORMAT_P012, 2,
{ { 0, 0, 0, __DRI_IMAGE_FORMAT_R16, 2 },
{ 1, 1, 1, __DRI_IMAGE_FORMAT_GR1616, 4 } } },
{ DRM_FORMAT_P016, __DRI_IMAGE_FORMAT_NONE,
diff --git a/src/gallium/include/pipe/p_format.h b/src/gallium/include/pipe/p_format.h
index f1a4652..fd3cf5b 100644
--- a/src/gallium/include/pipe/p_format.h
+++ b/src/gallium/include/pipe/p_format.h
@@ -464,6 +464,7 @@
PIPE_FORMAT_FXT1_RGBA,
PIPE_FORMAT_P010,
+ PIPE_FORMAT_P012,
PIPE_FORMAT_P016,
PIPE_FORMAT_R10G10B10X2_UNORM,
@@ -582,6 +583,7 @@
case PIPE_FORMAT_YV12:
case PIPE_FORMAT_IYUV:
case PIPE_FORMAT_P010:
+ case PIPE_FORMAT_P012:
case PIPE_FORMAT_P016:
case PIPE_FORMAT_Y16_U16_V16_420_UNORM:
return PIPE_VIDEO_CHROMA_FORMAT_420;
diff --git a/src/mesa/state_tracker/st_atom_sampler.c b/src/mesa/state_tracker/st_atom_sampler.c
index 7ae981b..0c188c10 100644
--- a/src/mesa/state_tracker/st_atom_sampler.c
+++ b/src/mesa/state_tracker/st_atom_sampler.c
@@ -316,6 +316,7 @@
switch (st_get_view_format(stObj)) {
case PIPE_FORMAT_NV12:
case PIPE_FORMAT_P010:
+ case PIPE_FORMAT_P012:
case PIPE_FORMAT_P016:
case PIPE_FORMAT_YUYV:
case PIPE_FORMAT_UYVY:
diff --git a/src/mesa/state_tracker/st_atom_texture.c b/src/mesa/state_tracker/st_atom_texture.c
index 5a0f91c..f1f8dff 100644
--- a/src/mesa/state_tracker/st_atom_texture.c
+++ b/src/mesa/state_tracker/st_atom_texture.c
@@ -196,6 +196,7 @@
st->pipe->create_sampler_view(st->pipe, stObj->pt->next, &tmpl);
break;
case PIPE_FORMAT_P010:
+ case PIPE_FORMAT_P012:
case PIPE_FORMAT_P016:
/* we need one additional R16G16 view: */
tmpl.format = PIPE_FORMAT_RG1616_UNORM;
diff --git a/src/mesa/state_tracker/st_cb_eglimage.c b/src/mesa/state_tracker/st_cb_eglimage.c
index bf25e31..8b44ba3 100644
--- a/src/mesa/state_tracker/st_cb_eglimage.c
+++ b/src/mesa/state_tracker/st_cb_eglimage.c
@@ -69,6 +69,8 @@
PIPE_TEXTURE_2D, nr_samples,
nr_storage_samples, usage);
break;
+ case PIPE_FORMAT_P010:
+ case PIPE_FORMAT_P012:
case PIPE_FORMAT_P016:
supported = screen->is_format_supported(screen, PIPE_FORMAT_R16_UNORM,
PIPE_TEXTURE_2D, nr_samples,
@@ -250,6 +252,8 @@
texFormat = MESA_FORMAT_R_UNORM8;
texObj->RequiredTextureImageUnits = 2;
break;
+ case PIPE_FORMAT_P010:
+ case PIPE_FORMAT_P012:
case PIPE_FORMAT_P016:
texFormat = MESA_FORMAT_R_UNORM16;
texObj->RequiredTextureImageUnits = 2;
diff --git a/src/mesa/state_tracker/st_program.h b/src/mesa/state_tracker/st_program.h
index 7483450..7fb9438 100644
--- a/src/mesa/state_tracker/st_program.h
+++ b/src/mesa/state_tracker/st_program.h
@@ -80,6 +80,7 @@
switch (format) {
case PIPE_FORMAT_NV12:
case PIPE_FORMAT_P010:
+ case PIPE_FORMAT_P012:
case PIPE_FORMAT_P016:
key.lower_nv12 |= (1 << unit);
break;
diff --git a/src/mesa/state_tracker/st_sampler_view.c b/src/mesa/state_tracker/st_sampler_view.c
index a31e573..80ba82d 100644
--- a/src/mesa/state_tracker/st_sampler_view.c
+++ b/src/mesa/state_tracker/st_sampler_view.c
@@ -500,6 +500,7 @@
format = PIPE_FORMAT_R8_UNORM;
break;
case PIPE_FORMAT_P010:
+ case PIPE_FORMAT_P012:
case PIPE_FORMAT_P016:
format = PIPE_FORMAT_R16_UNORM;
break;
diff --git a/src/util/format/u_format.csv b/src/util/format/u_format.csv
index 2f71e70..3ed5bb8 100644
--- a/src/util/format/u_format.csv
+++ b/src/util/format/u_format.csv
@@ -396,6 +396,7 @@
PIPE_FORMAT_Y16_U16_V16_444_UNORM , planar3, 1, 1, 1, , , , , xyzw, yuv
PIPE_FORMAT_P010 , planar2, 1, 1, 1, , , , , xyzw, yuv
+PIPE_FORMAT_P012 , planar2, 1, 1, 1, , , , , xyzw, yuv
PIPE_FORMAT_P016 , planar2, 1, 1, 1, , , , , xyzw, yuv
# Usually used to implement IA44 and AI44 formats in video decoding
diff --git a/src/util/format/u_format.h b/src/util/format/u_format.h
index 034d43a..f19c6c0 100644
--- a/src/util/format/u_format.h
+++ b/src/util/format/u_format.h
@@ -1319,6 +1319,7 @@
case PIPE_FORMAT_Y16_U16_V16_444_UNORM:
return PIPE_FORMAT_R16_UNORM;
case PIPE_FORMAT_P010:
+ case PIPE_FORMAT_P012:
case PIPE_FORMAT_P016:
case PIPE_FORMAT_Y16_U16V16_422_UNORM:
return !plane ? PIPE_FORMAT_R16_UNORM : PIPE_FORMAT_R16G16_UNORM;
@@ -1338,6 +1339,7 @@
case PIPE_FORMAT_NV12:
case PIPE_FORMAT_NV21:
case PIPE_FORMAT_P010:
+ case PIPE_FORMAT_P012:
case PIPE_FORMAT_P016:
case PIPE_FORMAT_Y8_U8_V8_422_UNORM:
case PIPE_FORMAT_Y8_U8V8_422_UNORM:
@@ -1360,6 +1362,7 @@
case PIPE_FORMAT_NV12:
case PIPE_FORMAT_NV21:
case PIPE_FORMAT_P010:
+ case PIPE_FORMAT_P012:
case PIPE_FORMAT_P016:
case PIPE_FORMAT_Y16_U16_V16_420_UNORM:
return !plane ? height : (height + 1) / 2;