/* no-op */
}
+static const struct dri2_format_mapping r8_g8_b8_mapping = {
+ DRM_FORMAT_YUV420,
+ __DRI_IMAGE_FORMAT_NONE,
+ __DRI_IMAGE_COMPONENTS_Y_U_V,
+ PIPE_FORMAT_R8_G8_B8_420_UNORM,
+ 3,
+ { { 0, 0, 0, __DRI_IMAGE_FORMAT_R8 },
+ { 1, 1, 1, __DRI_IMAGE_FORMAT_R8 },
+ { 2, 1, 1, __DRI_IMAGE_FORMAT_R8 } }
+};
+
static const struct dri2_format_mapping r8_g8b8_mapping = {
DRM_FORMAT_NV12,
__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;
+ }
+
/* If the hardware supports R8G8_R8B8 style subsampled RGB formats, these
* can be used for YUYV and UYVY formats.
*/
states[extra] = sampler;
break;
case PIPE_FORMAT_IYUV:
+ if (stObj->pt->format == PIPE_FORMAT_R8_G8_B8_420_UNORM) {
+ /* no additional views needed */
+ break;
+ }
/* we need two additional samplers: */
extra = u_bit_scan(&free_slots);
states[extra] = sampler;
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)
+ /* no additional views needed */
+ break;
+
/* we need two additional R8 views: */
tmpl.format = PIPE_FORMAT_R8_UNORM;
extra = u_bit_scan(&free_slots);
return false;
}
+static bool
+is_i420_as_r8_g8_b8_420_supported(struct pipe_screen *screen,
+ struct st_egl_image *out,
+ unsigned usage, bool *native_supported)
+{
+ if (out->format == PIPE_FORMAT_IYUV &&
+ out->texture->format == PIPE_FORMAT_R8_G8_B8_420_UNORM &&
+ screen->is_format_supported(screen, PIPE_FORMAT_R8_G8_B8_420_UNORM,
+ PIPE_TEXTURE_2D,
+ out->texture->nr_samples,
+ out->texture->nr_storage_samples,
+ usage)) {
+ *native_supported = false;
+ return true;
+ }
+
+ return false;
+}
/**
* Return the gallium texture of an EGLImage.
}
if (!is_nv12_as_r8_g8b8_supported(screen, out, usage, native_supported) &&
+ !is_i420_as_r8_g8_b8_420_supported(screen, out, usage, native_supported) &&
!is_format_supported(screen, out->format, out->texture->nr_samples,
out->texture->nr_storage_samples, usage,
native_supported)) {
texObj->RequiredTextureImageUnits = 1;
break;
case PIPE_FORMAT_IYUV:
- texFormat = MESA_FORMAT_R_UNORM8;
- texObj->RequiredTextureImageUnits = 3;
+ if (stimg->texture->format == PIPE_FORMAT_R8_G8_B8_420_UNORM) {
+ texFormat = MESA_FORMAT_R8G8B8X8_UNORM;
+ texObj->RequiredTextureImageUnits = 1;
+ } else {
+ texFormat = MESA_FORMAT_R_UNORM8;
+ texObj->RequiredTextureImageUnits = 3;
+ }
break;
case PIPE_FORMAT_YUYV:
case PIPE_FORMAT_YVYU:
key.lower_nv21 |= (1 << unit);
break;
case PIPE_FORMAT_IYUV:
+ if (stObj->pt->format == PIPE_FORMAT_R8_G8_B8_420_UNORM) {
+ key.lower_yuv |= (1 << unit);
+ break;
+ }
key.lower_iyuv |= (1 << unit);
break;
case PIPE_FORMAT_YUYV:
}
FALLTHROUGH;
case PIPE_FORMAT_IYUV:
+ if (texObj->pt->format == PIPE_FORMAT_R8_G8_B8_420_UNORM) {
+ format = PIPE_FORMAT_R8_G8_B8_420_UNORM;
+ break;
+ }
format = PIPE_FORMAT_R8_UNORM;
break;
case PIPE_FORMAT_P010:
# multiplane textures but needs color-space conversion in the shader.
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_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
'y16_u16_v16_444_unorm',
'r8_g8b8_420_unorm',
'g8_b8r8_420_unorm',
+ 'r8_g8_b8_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_G8_B8_R8_420_UNORM,
PIPE_FORMAT_R8_G8_B8_UNORM,
PIPE_FORMAT_Y8_UNORM,