diff --git a/src/egl/drivers/dri2/egl_dri2.c b/src/egl/drivers/dri2/egl_dri2.c index eaff81c21dc..72012a3343b 100644 --- a/src/egl/drivers/dri2/egl_dri2.c +++ b/src/egl/drivers/dri2/egl_dri2.c @@ -2201,6 +2201,8 @@ dri2_num_fourcc_format_planes(EGLint format) case DRM_FORMAT_NV21: case DRM_FORMAT_NV16: case DRM_FORMAT_NV61: + case DRM_FORMAT_NV24: + case DRM_FORMAT_NV42: case DRM_FORMAT_NV15: case DRM_FORMAT_NV20: case DRM_FORMAT_NV30: diff --git a/src/gallium/frontends/dri/dri_helpers.c b/src/gallium/frontends/dri/dri_helpers.c index 558eb68890f..9cf6d73315a 100644 --- a/src/gallium/frontends/dri/dri_helpers.c +++ b/src/gallium/frontends/dri/dri_helpers.c @@ -617,6 +617,18 @@ static const struct dri2_format_mapping dri2_format_table[] = { PIPE_FORMAT_NV16, 2, { { 0, 0, 0, __DRI_IMAGE_FORMAT_R8 }, { 1, 1, 0, __DRI_IMAGE_FORMAT_GR88 } } }, + { DRM_FORMAT_NV61, __DRI_IMAGE_FORMAT_NONE, + PIPE_FORMAT_NV61, 2, + { { 0, 0, 0, __DRI_IMAGE_FORMAT_R8 }, + { 1, 1, 0, __DRI_IMAGE_FORMAT_GR88 } } }, + { DRM_FORMAT_NV24, __DRI_IMAGE_FORMAT_NONE, + PIPE_FORMAT_NV24, 2, + { { 0, 0, 0, __DRI_IMAGE_FORMAT_R8 }, + { 1, 0, 0, __DRI_IMAGE_FORMAT_GR88 } } }, + { DRM_FORMAT_NV42, __DRI_IMAGE_FORMAT_NONE, + PIPE_FORMAT_NV42, 2, + { { 0, 0, 0, __DRI_IMAGE_FORMAT_R8 }, + { 1, 0, 0, __DRI_IMAGE_FORMAT_GR88 } } }, { DRM_FORMAT_AYUV, __DRI_IMAGE_FORMAT_ABGR8888, PIPE_FORMAT_AYUV, 1, diff --git a/src/mesa/state_tracker/st_atom_sampler.c b/src/mesa/state_tracker/st_atom_sampler.c index cf041c6412c..f3e8b219299 100644 --- a/src/mesa/state_tracker/st_atom_sampler.c +++ b/src/mesa/state_tracker/st_atom_sampler.c @@ -288,6 +288,9 @@ update_shader_samplers(struct st_context *st, /* no additional views needed */ break; FALLTHROUGH; + case PIPE_FORMAT_NV61: + case PIPE_FORMAT_NV24: + case PIPE_FORMAT_NV42: case PIPE_FORMAT_P010: case PIPE_FORMAT_P012: case PIPE_FORMAT_P016: diff --git a/src/mesa/state_tracker/st_atom_texture.c b/src/mesa/state_tracker/st_atom_texture.c index 7626a1da0e8..9308d69da9a 100644 --- a/src/mesa/state_tracker/st_atom_texture.c +++ b/src/mesa/state_tracker/st_atom_texture.c @@ -207,6 +207,17 @@ st_get_sampler_views(struct st_context *st, /* no additional views needed */ break; + /* we need one additional R8G8 view: */ + tmpl.format = PIPE_FORMAT_RG88_UNORM; + tmpl.swizzle_g = PIPE_SWIZZLE_Y; /* tmpl from Y plane is R8 */ + extra = u_bit_scan(&free_slots); + sampler_views[extra] = + pipe->create_sampler_view(pipe, stObj->pt->next, &tmpl); + (*extra_sampler_views) |= 1 << extra; + break; + case PIPE_FORMAT_NV61: + case PIPE_FORMAT_NV24: + case PIPE_FORMAT_NV42: /* we need one additional R8G8 view: */ tmpl.format = PIPE_FORMAT_RG88_UNORM; tmpl.swizzle_g = PIPE_SWIZZLE_Y; /* tmpl from Y plane is R8 */ diff --git a/src/mesa/state_tracker/st_cb_eglimage.c b/src/mesa/state_tracker/st_cb_eglimage.c index 95516b5fb05..9feae1f3609 100644 --- a/src/mesa/state_tracker/st_cb_eglimage.c +++ b/src/mesa/state_tracker/st_cb_eglimage.c @@ -72,6 +72,9 @@ is_format_supported(struct pipe_screen *screen, enum pipe_format format, case PIPE_FORMAT_NV12: case PIPE_FORMAT_NV21: case PIPE_FORMAT_NV16: + case PIPE_FORMAT_NV61: + case PIPE_FORMAT_NV24: + case PIPE_FORMAT_NV42: supported = screen->is_format_supported(screen, PIPE_FORMAT_R8_UNORM, PIPE_TEXTURE_2D, nr_samples, nr_storage_samples, usage) && @@ -493,6 +496,12 @@ st_bind_egl_image(struct gl_context *ctx, texObj->RequiredTextureImageUnits = 2; } break; + case PIPE_FORMAT_NV61: + case PIPE_FORMAT_NV24: + case PIPE_FORMAT_NV42: + texFormat = MESA_FORMAT_R_UNORM8; + texObj->RequiredTextureImageUnits = 2; + break; case PIPE_FORMAT_NV15: if (stimg->texture->format == PIPE_FORMAT_R10_G10B10_420_UNORM) { texFormat = MESA_FORMAT_R10G10B10X2_UNORM; diff --git a/src/mesa/state_tracker/st_program.h b/src/mesa/state_tracker/st_program.h index ecf8f7c90a4..6aba1d742b7 100644 --- a/src/mesa/state_tracker/st_program.h +++ b/src/mesa/state_tracker/st_program.h @@ -117,6 +117,7 @@ st_get_external_sampler_key(struct st_context *st, struct gl_program *prog) break; } FALLTHROUGH; + case PIPE_FORMAT_NV24: case PIPE_FORMAT_P010: case PIPE_FORMAT_P012: case PIPE_FORMAT_P016: @@ -128,6 +129,9 @@ st_get_external_sampler_key(struct st_context *st, struct gl_program *prog) key.lower_yuv |= (1 << unit); break; } + FALLTHROUGH; + case PIPE_FORMAT_NV61: + case PIPE_FORMAT_NV42: key.lower_nv21 |= (1 << unit); break; case PIPE_FORMAT_NV20: diff --git a/src/mesa/state_tracker/st_sampler_view.c b/src/mesa/state_tracker/st_sampler_view.c index 7dfd429cb29..8b7ac8352bc 100644 --- a/src/mesa/state_tracker/st_sampler_view.c +++ b/src/mesa/state_tracker/st_sampler_view.c @@ -389,6 +389,10 @@ st_get_sampler_view_format(const struct st_context *st, format = texObj->pt->format; break; } + FALLTHROUGH; + case PIPE_FORMAT_NV61: + case PIPE_FORMAT_NV24: + case PIPE_FORMAT_NV42: format = PIPE_FORMAT_R8_UNORM; break; case PIPE_FORMAT_NV15: diff --git a/src/util/format/u_format.yaml b/src/util/format/u_format.yaml index 7550aa22016..c5aefe0c37d 100644 --- a/src/util/format/u_format.yaml +++ b/src/util/format/u_format.yaml @@ -2189,6 +2189,27 @@ block: {width: 1, height: 1, depth: 1} channels: [] swizzles: [X, Y, Z, W] +- name: Y8_V8U8_422_UNORM + alias: NV61 + layout: planar2 + colorspace: YUV + block: {width: 1, height: 1, depth: 1} + channels: [] + swizzles: [X, Y, Z, W] +- name: Y8_U8V8_444_UNORM + alias: NV24 + layout: planar2 + colorspace: YUV + block: {width: 1, height: 1, depth: 1} + channels: [] + swizzles: [X, Y, Z, W] +- name: Y8_V8U8_444_UNORM + alias: NV42 + layout: planar2 + colorspace: YUV + block: {width: 1, height: 1, depth: 1} + channels: [] + swizzles: [X, Y, Z, W] - name: Y8_U8_V8_444_UNORM layout: planar3 colorspace: YUV diff --git a/src/util/format/u_format_table.py b/src/util/format/u_format_table.py index 13e90c17f46..330fed883ab 100644 --- a/src/util/format/u_format_table.py +++ b/src/util/format/u_format_table.py @@ -85,7 +85,10 @@ def has_access(format): 'y8_u8_v8_420_unorm', 'y8_u8v8_420_unorm', 'y8_u8v8_422_unorm', + 'y8_u8v8_444_unorm', 'y8_v8u8_420_unorm', + 'y8_v8u8_422_unorm', + 'y8_v8u8_444_unorm', 'y10_u10v10_420_unorm', 'y10_u10v10_422_unorm', 'x6y10_x6u10x6v10_420_unorm',