[PATCH i-g-t 11/37] lib/rendercopy: Add specific support for 2:10:10:10 formats

Juha-Pekka Heikkila juhapekka.heikkila at gmail.com
Tue Aug 27 16:03:26 UTC 2024


Reviewed-by: Juha-Pekka Heikkila <juhapekka.heikkila at gmail.com>

On 3.7.2024 2.27, Ville Syrjala wrote:
> From: Ville Syrjälä <ville.syrjala at linux.intel.com>
> 
> Use B10G10R10A2_UNORM instead of B8G8R8A8_UNORM when dealing
> with actual 10bpc pixel formats.
> 
> This is needed on tgl+ because the display hardware decompressor
> expects some magic bit shuffling to have taken place. If the
> compressor didn't do that we get garbage.
> 
> Also if the clear color is involved then the hardware needs
> to know the actual pixel format in order to correctly generate
> the native version of the clear color (which will be consumed
> by the display hardware.
> 
> Signed-off-by: Ville Syrjälä <ville.syrjala at linux.intel.com>
> ---
>   lib/intel_bufops.h    | 2 +-
>   lib/rendercopy_gen4.c | 2 +-
>   lib/rendercopy_gen6.c | 2 +-
>   lib/rendercopy_gen7.c | 2 +-
>   lib/rendercopy_gen8.c | 2 +-
>   lib/rendercopy_gen9.c | 2 +-
>   lib/surfaceformat.h   | 8 ++++++--
>   7 files changed, 12 insertions(+), 8 deletions(-)
> 
> diff --git a/lib/intel_bufops.h b/lib/intel_bufops.h
> index 06e72ba4ba93..d111346aaa86 100644
> --- a/lib/intel_bufops.h
> +++ b/lib/intel_bufops.h
> @@ -21,7 +21,7 @@ struct intel_buf {
>   	uint32_t width;
>   	uint32_t height;
>   	uint32_t tiling;
> -	uint32_t bpp;
> +	uint32_t bpp, depth;
>   	uint32_t compression;
>   	uint32_t swizzle_mode;
>   	uint32_t yuv_semiplanar_bpp;
> diff --git a/lib/rendercopy_gen4.c b/lib/rendercopy_gen4.c
> index 8289abbabe0f..fa553765d475 100644
> --- a/lib/rendercopy_gen4.c
> +++ b/lib/rendercopy_gen4.c
> @@ -138,7 +138,7 @@ gen4_bind_buf(struct intel_bb *ibb, const struct intel_buf *buf, int is_dst)
>   	ss = intel_bb_ptr_align(ibb, 32);
>   
>   	ss->ss0.surface_type = SURFACE_2D;
> -	ss->ss0.surface_format = gen4_surface_format(buf->bpp);
> +	ss->ss0.surface_format = gen4_surface_format(buf->bpp, buf->depth);
>   	ss->ss0.data_return_format = SURFACERETURNFORMAT_FLOAT32;
>   	ss->ss0.color_blend = 1;
>   
> diff --git a/lib/rendercopy_gen6.c b/lib/rendercopy_gen6.c
> index 0c71bd9cbf19..233ec3bf6e85 100644
> --- a/lib/rendercopy_gen6.c
> +++ b/lib/rendercopy_gen6.c
> @@ -79,7 +79,7 @@ gen6_bind_buf(struct intel_bb *ibb, const struct intel_buf *buf, int is_dst)
>   
>   	ss = intel_bb_ptr_align(ibb, 32);
>   	ss->ss0.surface_type = SURFACE_2D;
> -	ss->ss0.surface_format = gen4_surface_format(buf->bpp);
> +	ss->ss0.surface_format = gen4_surface_format(buf->bpp, buf->depth);
>   	ss->ss0.data_return_format = SURFACERETURNFORMAT_FLOAT32;
>   	ss->ss0.color_blend = 1;
>   
> diff --git a/lib/rendercopy_gen7.c b/lib/rendercopy_gen7.c
> index 8fcbbc21cdd8..0cd165809b69 100644
> --- a/lib/rendercopy_gen7.c
> +++ b/lib/rendercopy_gen7.c
> @@ -76,7 +76,7 @@ gen7_bind_buf(struct intel_bb *ibb,
>   
>   	ss[0] = (SURFACE_2D << GEN7_SURFACE_TYPE_SHIFT |
>   		 gen7_tiling_bits(buf->tiling) |
> -		 gen4_surface_format(buf->bpp) << GEN7_SURFACE_FORMAT_SHIFT);
> +		 gen4_surface_format(buf->bpp, buf->depth) << GEN7_SURFACE_FORMAT_SHIFT);
>   
>   	address = intel_bb_offset_reloc_with_delta(ibb, buf->handle,
>   						   read_domain, write_domain,
> diff --git a/lib/rendercopy_gen8.c b/lib/rendercopy_gen8.c
> index 28c703fca393..206af226a346 100644
> --- a/lib/rendercopy_gen8.c
> +++ b/lib/rendercopy_gen8.c
> @@ -88,7 +88,7 @@ gen8_bind_buf(struct intel_bb *ibb,
>   	ss = intel_bb_ptr_align(ibb, 64);
>   
>   	ss->ss0.surface_type = SURFACE_2D;
> -	ss->ss0.surface_format = gen4_surface_format(buf->bpp);
> +	ss->ss0.surface_format = gen4_surface_format(buf->bpp, buf->depth);
>   	ss->ss0.render_cache_read_write = 1;
>   	ss->ss0.vertical_alignment = 1; /* align 4 */
>   	ss->ss0.horizontal_alignment = 1; /* align 4 */
> diff --git a/lib/rendercopy_gen9.c b/lib/rendercopy_gen9.c
> index eafdf50581d3..4014100a23b5 100644
> --- a/lib/rendercopy_gen9.c
> +++ b/lib/rendercopy_gen9.c
> @@ -190,7 +190,7 @@ gen9_bind_buf(struct intel_bb *ibb, const struct intel_buf *buf, int is_dst,
>   	ss = intel_bb_ptr_align(ibb, 64);
>   
>   	ss->ss0.surface_type = SURFACE_2D;
> -	ss->ss0.surface_format = gen4_surface_format(buf->bpp);
> +	ss->ss0.surface_format = gen4_surface_format(buf->bpp, buf->depth);
>   	ss->ss0.vertical_alignment = 1; /* align 4 */
>   	ss->ss0.horizontal_alignment = 1; /* align 4 or HALIGN_32 on display ver >= 13*/
>   
> diff --git a/lib/surfaceformat.h b/lib/surfaceformat.h
> index 58ef41e6d3cd..9090d7707647 100644
> --- a/lib/surfaceformat.h
> +++ b/lib/surfaceformat.h
> @@ -186,7 +186,7 @@
>   #define SURFACE_MIPMAPLAYOUT_BELOW	0
>   #define SURFACE_MIPMAPLAYOUT_RIGHT	1
>   
> -static inline uint32_t gen4_surface_format(int bpp)
> +static inline uint32_t gen4_surface_format(int bpp, int depth)
>   {
>   	switch (bpp) {
>   	case 8:
> @@ -194,7 +194,11 @@ static inline uint32_t gen4_surface_format(int bpp)
>   	case 16:
>   		return SURFACEFORMAT_R8G8_UNORM;
>   	case 32:
> -		return SURFACEFORMAT_B8G8R8A8_UNORM;
> +		/* only needed for proper CCS handling */
> +		if (depth == 30)
> +			return SURFACEFORMAT_B10G10R10A2_UNORM;
> +		else
> +			return SURFACEFORMAT_B8G8R8A8_UNORM;
>   	case 64:
>   		return SURFACEFORMAT_R16G16B16A16_FLOAT;
>   	default:



More information about the igt-dev mailing list