YV12 is the same as DRM_FORMAT_YVU420.
We lower it to PIPE_FORMAT_R8_B8_G8_420, which is equivalent to
PIPE_FORMAT_R8_G8_B8_420 with U/V planes swapped.
This is used for hardware that can sample from YUV but need CSC in shader.
Signed-off-by: Italo Nicola <italonicola@collabora.com>
Reviewed-by: Daniel Stone <daniels@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/24266>
/* no-op */
}
+static const struct dri2_format_mapping r8_b8_g8_mapping = {
+ DRM_FORMAT_YVU420,
+ __DRI_IMAGE_FORMAT_NONE,
+ __DRI_IMAGE_COMPONENTS_Y_U_V,
+ PIPE_FORMAT_R8_B8_G8_420_UNORM,
+ 3,
+ { { 0, 0, 0, __DRI_IMAGE_FORMAT_R8 },
+ { 2, 1, 1, __DRI_IMAGE_FORMAT_R8 },
+ { 1, 1, 1, __DRI_IMAGE_FORMAT_R8 } }
+};
+
static const struct dri2_format_mapping r8_g8_b8_mapping = {
DRM_FORMAT_YUV420,
__DRI_IMAGE_FORMAT_NONE,
tex_usage |= PIPE_BIND_SAMPLER_VIEW;
}
- /* For I420, see if we have support for sampling r8_g8_b8 */
- if (!tex_usage && map->pipe_format == PIPE_FORMAT_IYUV &&
- map->dri_fourcc == DRM_FORMAT_YUV420 &&
- pscreen->is_format_supported(pscreen, PIPE_FORMAT_R8_G8_B8_420_UNORM,
- screen->target, 0, 0, PIPE_BIND_SAMPLER_VIEW)) {
- map = &r8_g8_b8_mapping;
- tex_usage |= PIPE_BIND_SAMPLER_VIEW;
+ /* For YV12 and I420, see if we have support for sampling r8_b8_g8 or r8_g8_b8 */
+ if (!tex_usage && map->pipe_format == PIPE_FORMAT_IYUV) {
+ if (map->dri_fourcc == DRM_FORMAT_YUV420 &&
+ pscreen->is_format_supported(pscreen, PIPE_FORMAT_R8_G8_B8_420_UNORM,
+ screen->target, 0, 0, PIPE_BIND_SAMPLER_VIEW)) {
+ map = &r8_g8_b8_mapping;
+ tex_usage |= PIPE_BIND_SAMPLER_VIEW;
+ } else if (map->dri_fourcc == DRM_FORMAT_YVU420 &&
+ pscreen->is_format_supported(pscreen, PIPE_FORMAT_R8_B8_G8_420_UNORM,
+ screen->target, 0, 0, PIPE_BIND_SAMPLER_VIEW)) {
+ map = &r8_b8_g8_mapping;
+ tex_usage |= PIPE_BIND_SAMPLER_VIEW;
+ }
}
/* If the hardware supports R8G8_R8B8 style subsampled RGB formats, these
states[extra] = sampler;
break;
case PIPE_FORMAT_IYUV:
- if (stObj->pt->format == PIPE_FORMAT_R8_G8_B8_420_UNORM) {
+ if (stObj->pt->format == PIPE_FORMAT_R8_G8_B8_420_UNORM ||
+ stObj->pt->format == PIPE_FORMAT_R8_B8_G8_420_UNORM) {
/* no additional views needed */
break;
}
pipe->create_sampler_view(pipe, stObj->pt->next, &tmpl);
break;
case PIPE_FORMAT_IYUV:
- if (stObj->pt->format == PIPE_FORMAT_R8_G8_B8_420_UNORM)
+ if (stObj->pt->format == PIPE_FORMAT_R8_G8_B8_420_UNORM ||
+ stObj->pt->format == PIPE_FORMAT_R8_B8_G8_420_UNORM)
/* no additional views needed */
break;
return true;
}
+ if (out->format == PIPE_FORMAT_IYUV &&
+ out->texture->format == PIPE_FORMAT_R8_B8_G8_420_UNORM &&
+ screen->is_format_supported(screen, PIPE_FORMAT_R8_B8_G8_420_UNORM,
+ PIPE_TEXTURE_2D,
+ out->texture->nr_samples,
+ out->texture->nr_storage_samples,
+ usage)) {
+ *native_supported = false;
+ return true;
+ }
+
return false;
}
texObj->RequiredTextureImageUnits = 1;
break;
case PIPE_FORMAT_IYUV:
- if (stimg->texture->format == PIPE_FORMAT_R8_G8_B8_420_UNORM) {
+ if (stimg->texture->format == PIPE_FORMAT_R8_G8_B8_420_UNORM ||
+ stimg->texture->format == PIPE_FORMAT_R8_B8_G8_420_UNORM) {
texFormat = MESA_FORMAT_R8G8B8X8_UNORM;
texObj->RequiredTextureImageUnits = 1;
} else {
key.lower_nv21 |= (1 << unit);
break;
case PIPE_FORMAT_IYUV:
- if (stObj->pt->format == PIPE_FORMAT_R8_G8_B8_420_UNORM) {
+ if (stObj->pt->format == PIPE_FORMAT_R8_G8_B8_420_UNORM ||
+ stObj->pt->format == PIPE_FORMAT_R8_B8_G8_420_UNORM) {
key.lower_yuv |= (1 << unit);
break;
}
}
FALLTHROUGH;
case PIPE_FORMAT_IYUV:
- if (texObj->pt->format == PIPE_FORMAT_R8_G8_B8_420_UNORM) {
- format = PIPE_FORMAT_R8_G8_B8_420_UNORM;
+ if (texObj->pt->format == PIPE_FORMAT_R8_G8_B8_420_UNORM ||
+ texObj->pt->format == PIPE_FORMAT_R8_B8_G8_420_UNORM) {
+ format = texObj->pt->format;
break;
}
format = PIPE_FORMAT_R8_UNORM;
PIPE_FORMAT_R8_G8B8_420_UNORM , planar2, 1, 1, 1, un8, , , , xyzw, rgb
PIPE_FORMAT_G8_B8R8_420_UNORM , planar2, 1, 1, 1, un8, , , , xyzw, rgb
PIPE_FORMAT_R8_G8_B8_420_UNORM , planar3, 1, 1, 1, un8, , , , xyzw, rgb
+PIPE_FORMAT_R8_B8_G8_420_UNORM , planar3, 1, 1, 1, un8, , , , xyzw, rgb
PIPE_FORMAT_G8_B8_R8_420_UNORM , planar3, 1, 1, 1, un8, , , , xyzw, rgb
PIPE_FORMAT_R8_G8_B8_UNORM , planar3, 1, 1, 1, un8, , , , xyzw, rgb
'r8_g8b8_420_unorm',
'g8_b8r8_420_unorm',
'r8_g8_b8_420_unorm',
+ 'r8_b8_g8_420_unorm',
'g8_b8_r8_420_unorm',
'r8_g8_b8_unorm',
'y8_unorm',
PIPE_FORMAT_R8_G8B8_420_UNORM,
PIPE_FORMAT_G8_B8R8_420_UNORM,
PIPE_FORMAT_R8_G8_B8_420_UNORM,
+ PIPE_FORMAT_R8_B8_G8_420_UNORM,
PIPE_FORMAT_G8_B8_R8_420_UNORM,
PIPE_FORMAT_R8_G8_B8_UNORM,
PIPE_FORMAT_Y8_UNORM,