[Mesa-dev] [PATCH 2/3] mesa/st: Add Gallium support for EXT_texture_sRGB_R8
Roland Scheidegger
sroland at vmware.com
Mon Oct 29 15:52:22 UTC 2018
This patch should probably be split into adding the format to gallium
and using it in mesa/st.
More comments inline.
Am 29.10.18 um 08:35 schrieb Gert Wollny:
> This only adds support on the Gallium core level, for the drivers
> it is likely that additional changes are needed to support the
> new texture format.
>
> Enables on softpipe and makes pass:
> dEQP-GLES31.functional.srgb_texture_decode.skip_decode.sr8.*
>
> v2: - add include for getting GL_SR8_EXT
> - add mapping to linear format for PIPE_FORMATR_R8_SRGB
> v3: - Add texture format to svga format table since otherwise building
> mesa will fail when this driver is enabled. It was not tested
> whether the extension actually works.
>
> Signed-off-by: Gert Wollny <gert.wollny at collabora.com>
> ---
> src/gallium/auxiliary/util/u_format.csv | 1 +
> src/gallium/auxiliary/util/u_format.h | 4 ++++
> src/gallium/auxiliary/util/u_format_tests.c | 4 ++++
> src/gallium/drivers/svga/include/svga3d_devcaps.h | 1 +
> src/gallium/drivers/svga/include/svga3d_surfacedefs.h | 5 +++++
> src/gallium/drivers/svga/include/svga3d_types.h | 2 +-
> src/gallium/drivers/svga/svga_format.c | 7 +++++++
> src/gallium/include/pipe/p_format.h | 2 ++
> src/mesa/state_tracker/st_extensions.c | 4 ++++
> src/mesa/state_tracker/st_format.c | 10 ++++++++++
> 10 files changed, 39 insertions(+), 1 deletion(-)
>
> diff --git a/src/gallium/auxiliary/util/u_format.csv b/src/gallium/auxiliary/util/u_format.csv
> index f9e4925f27..911ac07d32 100644
> --- a/src/gallium/auxiliary/util/u_format.csv
> +++ b/src/gallium/auxiliary/util/u_format.csv
> @@ -114,6 +114,7 @@ PIPE_FORMAT_I32_FLOAT , plain, 1, 1, f32 , , , , xxxx, r
>
> # SRGB formats
> PIPE_FORMAT_L8_SRGB , plain, 1, 1, un8 , , , , xxx1, srgb
> +PIPE_FORMAT_R8_SRGB , plain, 1, 1, un8 , , , , x001, srgb
> PIPE_FORMAT_L8A8_SRGB , plain, 1, 1, un8 , un8 , , , xxxy, srgb
> PIPE_FORMAT_R8G8B8_SRGB , plain, 1, 1, un8 , un8 , un8 , , xyz1, srgb
> PIPE_FORMAT_R8G8B8A8_SRGB , plain, 1, 1, un8 , un8 , un8 , un8 , xyzw, srgb
> diff --git a/src/gallium/auxiliary/util/u_format.h b/src/gallium/auxiliary/util/u_format.h
> index e66849c16b..5bcfc1f115 100644
> --- a/src/gallium/auxiliary/util/u_format.h
> +++ b/src/gallium/auxiliary/util/u_format.h
> @@ -925,6 +925,8 @@ util_format_srgb(enum pipe_format format)
> switch (format) {
> case PIPE_FORMAT_L8_UNORM:
> return PIPE_FORMAT_L8_SRGB;
> + case PIPE_FORMAT_R8_UNORM:
> + return PIPE_FORMAT_R8_SRGB;
> case PIPE_FORMAT_L8A8_UNORM:
> return PIPE_FORMAT_L8A8_SRGB;
> case PIPE_FORMAT_R8G8B8_UNORM:
> @@ -1001,6 +1003,8 @@ util_format_linear(enum pipe_format format)
> switch (format) {
> case PIPE_FORMAT_L8_SRGB:
> return PIPE_FORMAT_L8_UNORM;
> + case PIPE_FORMAT_R8_SRGB:
> + return PIPE_FORMAT_R8_UNORM;
> case PIPE_FORMAT_L8A8_SRGB:
> return PIPE_FORMAT_L8A8_UNORM;
> case PIPE_FORMAT_R8G8B8_SRGB:
> diff --git a/src/gallium/auxiliary/util/u_format_tests.c b/src/gallium/auxiliary/util/u_format_tests.c
> index 9c9a5838d1..dee52533c1 100644
> --- a/src/gallium/auxiliary/util/u_format_tests.c
> +++ b/src/gallium/auxiliary/util/u_format_tests.c
> @@ -236,6 +236,10 @@ util_format_test_cases[] =
> {PIPE_FORMAT_L8_SRGB, PACKED_1x8(0xff), PACKED_1x8(0xbc), UNPACKED_1x1(0.502886458033, 0.502886458033, 0.502886458033, 1.0)},
> {PIPE_FORMAT_L8_SRGB, PACKED_1x8(0xff), PACKED_1x8(0xff), UNPACKED_1x1(1.0, 1.0, 1.0, 1.0)},
>
> + {PIPE_FORMAT_R8_SRGB, PACKED_1x8(0xff), PACKED_1x8(0x00), UNPACKED_1x1(0.0, 0.0, 0.0, 1.0)},
> + {PIPE_FORMAT_R8_SRGB, PACKED_1x8(0xff), PACKED_1x8(0xbc), UNPACKED_1x1(0.502886458033, 0.0, 0.0, 1.0)},
> + {PIPE_FORMAT_R8_SRGB, PACKED_1x8(0xff), PACKED_1x8(0xff), UNPACKED_1x1(1.0, 0.0, 0.0, 1.0)},
> +
> {PIPE_FORMAT_L8A8_SRGB, PACKED_1x16(0xffff), PACKED_1x16(0x0000), UNPACKED_1x1(0.0, 0.0, 0.0, 0.0)},
> {PIPE_FORMAT_L8A8_SRGB, PACKED_1x16(0xffff), PACKED_1x16(0x00bc), UNPACKED_1x1(0.502886458033, 0.502886458033, 0.502886458033, 0.0)},
> {PIPE_FORMAT_L8A8_SRGB, PACKED_1x16(0xffff), PACKED_1x16(0x00ff), UNPACKED_1x1(1.0, 1.0, 1.0, 0.0)},
> diff --git a/src/gallium/drivers/svga/include/svga3d_devcaps.h b/src/gallium/drivers/svga/include/svga3d_devcaps.h
> index a519198b64..996fe23952 100644
> --- a/src/gallium/drivers/svga/include/svga3d_devcaps.h
> +++ b/src/gallium/drivers/svga/include/svga3d_devcaps.h
> @@ -437,6 +437,7 @@ typedef enum {
>
> SVGA3D_DEVCAP_MULTISAMPLE_2X = 245,
> SVGA3D_DEVCAP_MULTISAMPLE_4X = 246,
> + SVGA3D_DEVCAP_DXFMT_R8_UNORM_SRGB = 247,
This won't work. Those devcaps are defined by our svga device (this is
just a copy of the file here), the guest driver only gets to query them.
>
> SVGA3D_DEVCAP_MAX /* This must be the last index. */
> } SVGA3dDevCapIndex;
> diff --git a/src/gallium/drivers/svga/include/svga3d_surfacedefs.h b/src/gallium/drivers/svga/include/svga3d_surfacedefs.h
> index 9054e72207..01e09c31f4 100644
> --- a/src/gallium/drivers/svga/include/svga3d_surfacedefs.h
> +++ b/src/gallium/drivers/svga/include/svga3d_surfacedefs.h
> @@ -900,6 +900,11 @@ static const struct svga3d_surface_desc svga3d_surface_descs[] = {
> {4, 4, 1}, 16, 16,
> 128, {{0}, {0}, {128}, {0}},
> {{0}, {0}, {0}, {0}}},
> + {SVGA3D_R8_UNORM_SRGB, SVGA3DBLOCKDESC_RED,
> + {1, 1, 1}, 1, 1,
> + 8, {{0}, {0}, {8}, {0}},
> + {{0}, {0}, {0}, {0}}},
> +
> };
Same here. The device doesn't support this format.
>
>
> diff --git a/src/gallium/drivers/svga/include/svga3d_types.h b/src/gallium/drivers/svga/include/svga3d_types.h
> index 6bb99e1cb7..05cafeb1dc 100644
> --- a/src/gallium/drivers/svga/include/svga3d_types.h
> +++ b/src/gallium/drivers/svga/include/svga3d_types.h
> @@ -339,7 +339,7 @@ typedef enum SVGA3dSurfaceFormat {
> SVGA3D_B8G8R8X8_UNORM = 142,
> SVGA3D_BC4_UNORM = 143,
> SVGA3D_BC5_UNORM = 144,
> -
> + SVGA3D_R8_UNORM_SRGB = 145,
> SVGA3D_FORMAT_MAX
> } SVGA3dSurfaceFormat;
Same again.
> diff --git a/src/gallium/drivers/svga/svga_format.c b/src/gallium/drivers/svga/svga_format.c
> index 9f6a618706..b4beb5d27f 100644
> --- a/src/gallium/drivers/svga/svga_format.c
> +++ b/src/gallium/drivers/svga/svga_format.c
> @@ -370,6 +370,7 @@ static const struct vgpu10_format_entry format_conversion_table[] =
> { PIPE_FORMAT_A1B5G5R5_UNORM, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 },
> { PIPE_FORMAT_X1B5G5R5_UNORM, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 },
> { PIPE_FORMAT_A4B4G4R4_UNORM, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 },
> + { PIPE_FORMAT_R8_SRGB, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, SVGA3D_FORMAT_INVALID, 0 },
> };
>
>
> @@ -1520,6 +1521,12 @@ static const struct format_cap format_cap_table[] = {
> SVGA3D_BC5_UNORM,
> SVGA3D_DEVCAP_DXFMT_BC5_UNORM,
> 4, 4, 16, 0
> + },
> + {
> + "SVGA3D_R8_UNORM_SRGB",
> + SVGA3D_R8_UNORM_SRGB,
> + SVGA3D_DEVCAP_DXFMT_R8_UNORM_SRGB,
> + 1, 1, 1, 0
> }
Same.
Roland
> };
>
> diff --git a/src/gallium/include/pipe/p_format.h b/src/gallium/include/pipe/p_format.h
> index 57399800fa..6fb91222f2 100644
> --- a/src/gallium/include/pipe/p_format.h
> +++ b/src/gallium/include/pipe/p_format.h
> @@ -396,6 +396,8 @@ enum pipe_format {
> PIPE_FORMAT_X1B5G5R5_UNORM = 310,
> PIPE_FORMAT_A4B4G4R4_UNORM = 311,
>
> + PIPE_FORMAT_R8_SRGB = 312,
> +
> PIPE_FORMAT_COUNT
> };
>
> diff --git a/src/mesa/state_tracker/st_extensions.c b/src/mesa/state_tracker/st_extensions.c
> index 798ee60875..16889074f6 100644
> --- a/src/mesa/state_tracker/st_extensions.c
> +++ b/src/mesa/state_tracker/st_extensions.c
> @@ -889,6 +889,10 @@ void st_init_extensions(struct pipe_screen *screen,
> PIPE_FORMAT_R8G8B8A8_SRGB},
> GL_TRUE }, /* at least one format must be supported */
>
> + { { o(EXT_texture_sRGB_R8) },
> + { PIPE_FORMAT_R8_SRGB },
> + GL_TRUE },
> +
> { { o(EXT_texture_type_2_10_10_10_REV) },
> { PIPE_FORMAT_R10G10B10A2_UNORM,
> PIPE_FORMAT_B10G10R10A2_UNORM },
> diff --git a/src/mesa/state_tracker/st_format.c b/src/mesa/state_tracker/st_format.c
> index 16a18c272d..4f4d8062b5 100644
> --- a/src/mesa/state_tracker/st_format.c
> +++ b/src/mesa/state_tracker/st_format.c
> @@ -54,6 +54,8 @@
> #include "st_format.h"
> #include "st_texture.h"
>
> +#include <GLES2/gl2.h>
> +#include <GLES2/gl2ext.h>
>
> /**
> * Translate Mesa format to Gallium format.
> @@ -169,6 +171,8 @@ st_mesa_format_to_pipe_format(const struct st_context *st,
> return PIPE_FORMAT_AL88_SRGB;
> case MESA_FORMAT_L_SRGB8:
> return PIPE_FORMAT_L8_SRGB;
> + case MESA_FORMAT_R_SRGB8:
> + return PIPE_FORMAT_R8_SRGB;
> case MESA_FORMAT_BGR_SRGB8:
> return PIPE_FORMAT_R8G8B8_SRGB;
> case MESA_FORMAT_A8B8G8R8_SRGB:
> @@ -719,6 +723,8 @@ st_pipe_format_to_mesa_format(enum pipe_format format)
> return MESA_FORMAT_A8L8_SRGB;
> case PIPE_FORMAT_L8_SRGB:
> return MESA_FORMAT_L_SRGB8;
> + case PIPE_FORMAT_R8_SRGB:
> + return MESA_FORMAT_R_SRGB8;
> case PIPE_FORMAT_R8G8B8_SRGB:
> return MESA_FORMAT_BGR_SRGB8;
> case PIPE_FORMAT_ABGR8888_SRGB:
> @@ -1423,6 +1429,10 @@ static const struct format_mapping format_map[] = {
> 0 },
> { PIPE_FORMAT_L8_SRGB, DEFAULT_SRGBA_FORMATS }
> },
> + {
> + { GL_SR8_EXT, 0 },
> + { PIPE_FORMAT_R8_SRGB, DEFAULT_SRGBA_FORMATS }
> + },
>
> /* 16-bit float formats */
> {
>
More information about the mesa-dev
mailing list