mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-25 04:20:08 +01:00
mesa: Add R16G16_R16B16_UNORM and related formats
Including the 10 bit variant X6R10X6G10_X6R10X6B10_UNORM. Only the RG_RB variants seem to have fourccs, so those are the only ones being added for now, although they would, obviously, be easy to add). These are used for Y210, Y212, and Y216 fourccs. In particular Y210 is interesting for panfrost, as it is the fourcc used to indicate a 10 bit single plane 4:2:2 encoded as AFBC (similar to how YUYV is the canonical AFBC for 10 bit 4:2:0). Reviewed-by: Boris Brezillon <boris.brezillon@collabora.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/35771>
This commit is contained in:
parent
55735b6146
commit
b11f543c4e
10 changed files with 112 additions and 13 deletions
|
|
@ -562,6 +562,21 @@ static const struct dri2_format_mapping g8r8_b8r8_mapping = {
|
|||
{ 0, 1, 0, __DRI_IMAGE_FORMAT_ABGR8888 } }
|
||||
};
|
||||
|
||||
static const struct dri2_format_mapping r16g16_r16b16_mapping = {
|
||||
DRM_FORMAT_Y216,
|
||||
__DRI_IMAGE_FORMAT_NONE,
|
||||
PIPE_FORMAT_R16G16_R16B16_422_UNORM, 2,
|
||||
{ { 0, 0, 0, __DRI_IMAGE_FORMAT_GR1616 },
|
||||
{ 0, 1, 0, __DRI_IMAGE_FORMAT_ABGR16161616 } }
|
||||
};
|
||||
static const struct dri2_format_mapping r10g10_r10b10_mapping = {
|
||||
DRM_FORMAT_Y210,
|
||||
__DRI_IMAGE_FORMAT_NONE,
|
||||
PIPE_FORMAT_X6R10X6G10_X6R10X6B10_422_UNORM, 2,
|
||||
{ { 0, 0, 0, __DRI_IMAGE_FORMAT_GR1616 },
|
||||
{ 0, 1, 0, __DRI_IMAGE_FORMAT_ABGR16161616 } }
|
||||
};
|
||||
|
||||
static const struct dri2_format_mapping r10_g10b10_mapping = {
|
||||
DRM_FORMAT_NV15,
|
||||
__DRI_IMAGE_FORMAT_NONE,
|
||||
|
|
@ -768,6 +783,18 @@ dri_create_image_from_winsys(struct dri_screen *screen,
|
|||
map = &b8r8_g8r8_mapping;
|
||||
tex_usage |= PIPE_BIND_SAMPLER_VIEW;
|
||||
}
|
||||
if (!tex_usage && map->pipe_format == PIPE_FORMAT_Y210 &&
|
||||
pscreen->is_format_supported(pscreen, PIPE_FORMAT_X6R10X6G10_X6R10X6B10_422_UNORM,
|
||||
screen->target, 0, 0, PIPE_BIND_SAMPLER_VIEW)) {
|
||||
map = &r10g10_r10b10_mapping;
|
||||
tex_usage |= PIPE_BIND_SAMPLER_VIEW;
|
||||
}
|
||||
if (!tex_usage && map->pipe_format == PIPE_FORMAT_Y216 &&
|
||||
pscreen->is_format_supported(pscreen, PIPE_FORMAT_R16G16_R16B16_422_UNORM,
|
||||
screen->target, 0, 0, PIPE_BIND_SAMPLER_VIEW)) {
|
||||
map = &r16g16_r16b16_mapping;
|
||||
tex_usage |= PIPE_BIND_SAMPLER_VIEW;
|
||||
}
|
||||
|
||||
if (!tex_usage && util_format_is_yuv(map->pipe_format)) {
|
||||
/* YUV format sampling can be emulated by the GL gallium frontend by
|
||||
|
|
|
|||
|
|
@ -99,6 +99,9 @@ MESA_FORMAT_RB_RG_UNORM8 , other , 2, 1, 1, x16 , , ,
|
|||
MESA_FORMAT_GR_BR_UNORM8 , other , 2, 1, 1, x16 , , , , xyz1, rgb
|
||||
MESA_FORMAT_BR_GR_UNORM8 , other , 2, 1, 1, x16 , , , , xyz1, rgb
|
||||
|
||||
MESA_FORMAT_RG_RB_UNORM10 , other , 2, 1, 1, x32 , , , , xyz1, rgb
|
||||
MESA_FORMAT_RG_RB_UNORM16 , other , 2, 1, 1, x32 , , , , xyz1, rgb
|
||||
|
||||
# Array normalized formats
|
||||
MESA_FORMAT_A_UNORM8 , array , 1, 1, 1, un8 , , , , 000x, rgb
|
||||
MESA_FORMAT_A_UNORM16 , array , 1, 1, 1, un16, , , , 000x, rgb
|
||||
|
|
|
|||
|
Can't render this file because it contains an unexpected character in line 9 and column 3.
|
|
|
@ -391,6 +391,8 @@ typedef enum pipe_format mesa_format;
|
|||
#define MESA_FORMAT_RB_RG_UNORM8 PIPE_FORMAT_R8B8_R8G8_UNORM
|
||||
#define MESA_FORMAT_GR_BR_UNORM8 PIPE_FORMAT_G8R8_B8R8_UNORM
|
||||
#define MESA_FORMAT_BR_GR_UNORM8 PIPE_FORMAT_B8R8_G8R8_UNORM
|
||||
#define MESA_FORMAT_RG_RB_UNORM10 PIPE_FORMAT_X6R10X6G10_X6R10X6B10_422_UNORM
|
||||
#define MESA_FORMAT_RG_RB_UNORM16 PIPE_FORMAT_R16G16_R16B16_422_UNORM
|
||||
#define MESA_FORMAT_A_UNORM8 PIPE_FORMAT_A8_UNORM
|
||||
#define MESA_FORMAT_A_UNORM16 PIPE_FORMAT_A16_UNORM
|
||||
#define MESA_FORMAT_L_UNORM8 PIPE_FORMAT_L8_UNORM
|
||||
|
|
|
|||
|
|
@ -305,7 +305,9 @@ update_shader_samplers(struct st_context *st,
|
|||
if (stObj->pt->format == PIPE_FORMAT_R8G8_R8B8_UNORM ||
|
||||
stObj->pt->format == PIPE_FORMAT_R8B8_R8G8_UNORM ||
|
||||
stObj->pt->format == PIPE_FORMAT_B8R8_G8R8_UNORM ||
|
||||
stObj->pt->format == PIPE_FORMAT_G8R8_B8R8_UNORM) {
|
||||
stObj->pt->format == PIPE_FORMAT_G8R8_B8R8_UNORM ||
|
||||
stObj->pt->format == PIPE_FORMAT_R16G16_R16B16_422_UNORM ||
|
||||
stObj->pt->format == PIPE_FORMAT_X6R10X6G10_X6R10X6B10_422_UNORM) {
|
||||
/* no additional views needed */
|
||||
break;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -310,6 +310,11 @@ st_get_sampler_views(struct st_context *st,
|
|||
case PIPE_FORMAT_Y210:
|
||||
case PIPE_FORMAT_Y212:
|
||||
case PIPE_FORMAT_Y216:
|
||||
if (stObj->pt->format == PIPE_FORMAT_R16G16_R16B16_422_UNORM ||
|
||||
stObj->pt->format == PIPE_FORMAT_X6R10X6G10_X6R10X6B10_422_UNORM)
|
||||
/* no additional views needed */
|
||||
break;
|
||||
|
||||
/* we need one additional R16G16B16A16 view: */
|
||||
tmpl.format = PIPE_FORMAT_R16G16B16A16_UNORM;
|
||||
tmpl.swizzle_b = PIPE_SWIZZLE_Z;
|
||||
|
|
|
|||
|
|
@ -107,14 +107,30 @@ is_format_supported(struct pipe_screen *screen, enum pipe_format format,
|
|||
nr_storage_samples, usage);
|
||||
break;
|
||||
case PIPE_FORMAT_Y210:
|
||||
case PIPE_FORMAT_Y212:
|
||||
case PIPE_FORMAT_Y216:
|
||||
supported = screen->is_format_supported(screen, PIPE_FORMAT_R16G16_UNORM,
|
||||
/* in principle this could be emulated by R16G16_R16B16_UNORM, but in
|
||||
* practice we won't pick that format for Y210, only the 10 bit variant
|
||||
*/
|
||||
supported = screen->is_format_supported(screen, PIPE_FORMAT_X6R10X6G10_X6R10X6B10_422_UNORM,
|
||||
PIPE_TEXTURE_2D, nr_samples,
|
||||
nr_storage_samples, usage) ||
|
||||
(screen->is_format_supported(screen, PIPE_FORMAT_R16G16_UNORM,
|
||||
PIPE_TEXTURE_2D, nr_samples,
|
||||
nr_storage_samples, usage) &&
|
||||
screen->is_format_supported(screen, PIPE_FORMAT_R16G16B16A16_UNORM,
|
||||
PIPE_TEXTURE_2D, nr_samples,
|
||||
nr_storage_samples, usage);
|
||||
nr_storage_samples, usage));
|
||||
break;
|
||||
case PIPE_FORMAT_Y212:
|
||||
case PIPE_FORMAT_Y216:
|
||||
supported = screen->is_format_supported(screen, PIPE_FORMAT_R16G16_R16B16_422_UNORM,
|
||||
PIPE_TEXTURE_2D, nr_samples,
|
||||
nr_storage_samples, usage) ||
|
||||
(screen->is_format_supported(screen, PIPE_FORMAT_R16G16_UNORM,
|
||||
PIPE_TEXTURE_2D, nr_samples,
|
||||
nr_storage_samples, usage) &&
|
||||
screen->is_format_supported(screen, PIPE_FORMAT_R16G16B16A16_UNORM,
|
||||
PIPE_TEXTURE_2D, nr_samples,
|
||||
nr_storage_samples, usage));
|
||||
break;
|
||||
case PIPE_FORMAT_Y410:
|
||||
supported = screen->is_format_supported(screen, PIPE_FORMAT_R10G10B10A2_UNORM,
|
||||
|
|
@ -526,10 +542,23 @@ st_bind_egl_image(struct gl_context *ctx,
|
|||
texObj->RequiredTextureImageUnits = 2;
|
||||
break;
|
||||
case PIPE_FORMAT_Y210:
|
||||
if (stimg->texture->format == PIPE_FORMAT_X6R10X6G10_X6R10X6B10_422_UNORM) {
|
||||
texFormat = MESA_FORMAT_RG_RB_UNORM10;
|
||||
texObj->RequiredTextureImageUnits = 1;
|
||||
} else {
|
||||
texFormat = MESA_FORMAT_RG_UNORM16;
|
||||
texObj->RequiredTextureImageUnits = 2;
|
||||
}
|
||||
break;
|
||||
case PIPE_FORMAT_Y212:
|
||||
case PIPE_FORMAT_Y216:
|
||||
texFormat = MESA_FORMAT_RG_UNORM16;
|
||||
texObj->RequiredTextureImageUnits = 2;
|
||||
if (stimg->texture->format == PIPE_FORMAT_R16G16_R16B16_422_UNORM) {
|
||||
texFormat = MESA_FORMAT_RG_RB_UNORM16;
|
||||
texObj->RequiredTextureImageUnits = 1;
|
||||
} else {
|
||||
texFormat = MESA_FORMAT_RG_UNORM16;
|
||||
texObj->RequiredTextureImageUnits = 2;
|
||||
}
|
||||
break;
|
||||
case PIPE_FORMAT_Y410:
|
||||
texFormat = MESA_FORMAT_B10G10R10A2_UNORM;
|
||||
|
|
|
|||
|
|
@ -166,15 +166,23 @@ st_get_external_sampler_key(struct st_context *st, struct gl_program *prog)
|
|||
key.lower_iyuv |= (1 << unit);
|
||||
break;
|
||||
case PIPE_FORMAT_YUYV:
|
||||
if (stObj->pt->format == PIPE_FORMAT_R8G8_R8B8_UNORM) {
|
||||
if (stObj->pt->format == PIPE_FORMAT_R8G8_R8B8_UNORM)
|
||||
key.lower_yu_yv |= (1 << unit);
|
||||
break;
|
||||
}
|
||||
FALLTHROUGH;
|
||||
else
|
||||
key.lower_yx_xuxv |= (1 << unit);
|
||||
break;
|
||||
case PIPE_FORMAT_Y210:
|
||||
if (stObj->pt->format == PIPE_FORMAT_X6R10X6G10_X6R10X6B10_422_UNORM)
|
||||
key.lower_yu_yv |= (1 << unit);
|
||||
else
|
||||
key.lower_yx_xuxv |= (1 << unit);
|
||||
break;
|
||||
case PIPE_FORMAT_Y212:
|
||||
case PIPE_FORMAT_Y216:
|
||||
key.lower_yx_xuxv |= (1 << unit);
|
||||
if (stObj->pt->format == PIPE_FORMAT_R16G16_R16B16_422_UNORM)
|
||||
key.lower_yu_yv |= (1 << unit);
|
||||
else
|
||||
key.lower_yx_xuxv |= (1 << unit);
|
||||
break;
|
||||
case PIPE_FORMAT_UYVY:
|
||||
if (stObj->pt->format == PIPE_FORMAT_G8R8_B8R8_UNORM) {
|
||||
|
|
|
|||
|
|
@ -423,9 +423,17 @@ st_get_sampler_view_format(const struct st_context *st,
|
|||
format = PIPE_FORMAT_R16_UNORM;
|
||||
break;
|
||||
case PIPE_FORMAT_Y210:
|
||||
if (texObj->pt->format == PIPE_FORMAT_X6R10X6G10_X6R10X6B10_422_UNORM)
|
||||
format = texObj->pt->format;
|
||||
else
|
||||
format = PIPE_FORMAT_R16G16_UNORM;
|
||||
break;
|
||||
case PIPE_FORMAT_Y212:
|
||||
case PIPE_FORMAT_Y216:
|
||||
format = PIPE_FORMAT_R16G16_UNORM;
|
||||
if (texObj->pt->format == PIPE_FORMAT_R16G16_R16B16_422_UNORM)
|
||||
format = texObj->pt->format;
|
||||
else
|
||||
format = PIPE_FORMAT_R16G16_UNORM;
|
||||
break;
|
||||
case PIPE_FORMAT_Y410:
|
||||
format = PIPE_FORMAT_R10G10B10A2_UNORM;
|
||||
|
|
|
|||
|
|
@ -794,6 +794,19 @@
|
|||
channels: [UN8, UN8, UN8, UN8]
|
||||
swizzles: [X, Y, Z, 1]
|
||||
|
||||
# 16 bit versions
|
||||
- name: R16G16_R16B16_422_UNORM
|
||||
layout: subsampled
|
||||
colorspace: RGB
|
||||
block: {width: 2, height: 1, depth: 1}
|
||||
channels: [UN16, UN16, UN16, UN16]
|
||||
swizzles: [X, Y, Z, 1]
|
||||
- name: X6R10X6G10_X6R10X6B10_422_UNORM
|
||||
layout: subsampled
|
||||
colorspace: RGB
|
||||
block: {width: 2, height: 1, depth: 1}
|
||||
channels: [UN16, UN16, UN16, UN16]
|
||||
swizzles: [X, Y, Z, 1]
|
||||
|
||||
# some special formats not fitting anywhere else
|
||||
- name: R11G11B10_FLOAT
|
||||
|
|
|
|||
|
|
@ -110,6 +110,8 @@ def has_access(format):
|
|||
'g8r8_g8b8_422_unorm',
|
||||
'g8b8_g8r8_422_unorm',
|
||||
'b8g8_r8g8_422_unorm',
|
||||
'r16g16_r16b16_422_unorm',
|
||||
'x6r10x6g10_x6r10x6b10_422_unorm',
|
||||
'x6g10_x6b10x6r10_420_unorm',
|
||||
'x4g12_x4b12x4r12_420_unorm',
|
||||
'y8_400_unorm',
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue