[igt-dev] [PATCH i-g-t 1/5] lib/igt_draw: Use XY_FAST_COLOR_BLT on DG2

Juha-Pekka Heikkila juhapekka.heikkila at gmail.com
Tue Mar 15 15:59:17 UTC 2022


Hi Jeevan,

On 9.3.2022 18.44, Jeevan B wrote:
> From: Matt Roper <matthew.d.roper at intel.com>
> 
> The XY_COLOR_BLT instruction used by igt_draw's blitter implementation
> doesn't support F-tile (plus we've heard informally from the hardware
^^
tile4

that draw_rect_blt(..) which is being patched is not very pretty 
function with lot of magic but it matches to style what was already there..

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

> team that the instruction is deprecated in general).  Switch to
> XY_FAST_COLOR_BLT to perform our solid fills on DG2.  This instruction
> will also allow us to extend the igt_draw support to 64bit+ color depths
> in the future too if we have tests that start wanting to test that.
> 
> Note that we don't currently pass enough information down to this
> routine to pick an appropriate value for the smem vs lmem performance
> hint bit, but that doesn't impact the output generated.
> 
> Signed-off-by: Matt Roper <matthew.d.roper at intel.com>
> Signed-off-by: Jeevan B <jeevan.b at intel.com>
> ---
>   lib/igt_draw.c  | 107 ++++++++++++++++++++++++++++++++++++------------
>   lib/intel_reg.h |   2 +
>   2 files changed, 83 insertions(+), 26 deletions(-)
> 
> diff --git a/lib/igt_draw.c b/lib/igt_draw.c
> index d78ecdf0..056101b9 100644
> --- a/lib/igt_draw.c
> +++ b/lib/igt_draw.c
> @@ -666,36 +666,91 @@ static void draw_rect_blt(int fd, struct cmd_data *cmd_data,
>   	ibb = intel_bb_create(fd, PAGE_SIZE);
>   	intel_bb_add_intel_buf(ibb, dst, true);
>   
> -	switch (buf->bpp) {
> -	case 8:
> -		blt_cmd_depth = 0;
> -		break;
> -	case 16: /* we're assuming 565 */
> -		blt_cmd_depth = 1 << 24;
> -		break;
> -	case 32:
> -		blt_cmd_depth = 3 << 24;
> -		break;
> -	default:
> -		igt_assert(false);
> -	}
> +	if (IS_DG2(intel_get_drm_devid(fd))) {
> +		int buf_height = buf->size / buf->stride;
> +
> +		switch (buf->bpp) {
> +		case 8:
> +			blt_cmd_depth = 0;
> +			break;
> +		case 16: /* we're assuming 565 */
> +			blt_cmd_depth = 1 << 19;
> +			break;
> +		case 32:
> +			blt_cmd_depth = 2 << 19;
> +			break;
> +		case 64:
> +			/* Not used or supported yet */
> +		default:
> +			igt_assert(false);
> +		}
> +
> +		switch (tiling) {
> +		case I915_TILING_NONE:
> +			blt_cmd_tiling = 0;
> +			break;
> +		case I915_TILING_X:
> +			blt_cmd_tiling = 1 << 30;
> +			break;
> +		case I915_TILING_4:
> +			blt_cmd_tiling = 2 << 30;
> +			break;
> +		default:
> +			igt_assert(false);
> +		}
> +
> +		pitch = tiling ? buf->stride / 4 : buf->stride;
> +
> +		intel_bb_out(ibb, XY_FAST_COLOR_BLT | blt_cmd_depth);
> +		/* DG2 MOCS entry 2 is "UC - Non-Coherent; GO:Memory" */
> +		intel_bb_out(ibb, blt_cmd_tiling | 2 << 21 | (pitch-1));
> +		intel_bb_out(ibb, (rect->y << 16) | rect->x);
> +		intel_bb_out(ibb, ((rect->y + rect->h) << 16) | (rect->x + rect->w));
> +		intel_bb_emit_reloc_fenced(ibb, dst->handle, 0,
> +					   I915_GEM_DOMAIN_RENDER, 0,
> +					   dst->addr.offset);
> +		intel_bb_out(ibb, 0);	/* TODO: Pass down enough info for target memory hint */
> +		intel_bb_out(ibb, color);
> +		intel_bb_out(ibb, 0);	/* 64 bit color */
> +		intel_bb_out(ibb, 0);	/* 96 bit color */
> +		intel_bb_out(ibb, 0);	/* 128 bit color */
> +		intel_bb_out(ibb, 0);	/* clear address */
> +		intel_bb_out(ibb, 0);	/* clear address */
> +		intel_bb_out(ibb, (1 << 29) | ((pitch-1) << 14) | (buf_height-1));
> +		intel_bb_out(ibb, 0);	/* mipmap levels / qpitch */
> +		intel_bb_out(ibb, 0);	/* mipmap index / alignment */
> +	} else {
> +		switch (buf->bpp) {
> +		case 8:
> +			blt_cmd_depth = 0;
> +			break;
> +		case 16: /* we're assuming 565 */
> +			blt_cmd_depth = 1 << 24;
> +			break;
> +		case 32:
> +			blt_cmd_depth = 3 << 24;
> +			break;
> +		default:
> +			igt_assert(false);
> +		}
>   
> -	blt_cmd_len = (gen >= 8) ?  0x5 : 0x4;
> -	blt_cmd_tiling = (tiling) ? XY_COLOR_BLT_TILED : 0;
> -	pitch = (gen >= 4 && tiling) ? buf->stride / 4 : buf->stride;
> +		blt_cmd_len = (gen >= 8) ?  0x5 : 0x4;
> +		blt_cmd_tiling = (tiling) ? XY_COLOR_BLT_TILED : 0;
> +		pitch = (gen >= 4 && tiling) ? buf->stride / 4 : buf->stride;
>   
> -	switch_blt_tiling(ibb, tiling, true);
> +		switch_blt_tiling(ibb, tiling, true);
>   
> -	intel_bb_out(ibb, XY_COLOR_BLT_CMD_NOLEN | XY_COLOR_BLT_WRITE_ALPHA |
> -		     XY_COLOR_BLT_WRITE_RGB | blt_cmd_tiling | blt_cmd_len);
> -	intel_bb_out(ibb, blt_cmd_depth | (0xF0 << 16) | pitch);
> -	intel_bb_out(ibb, (rect->y << 16) | rect->x);
> -	intel_bb_out(ibb, ((rect->y + rect->h) << 16) | (rect->x + rect->w));
> -	intel_bb_emit_reloc_fenced(ibb, dst->handle, 0, I915_GEM_DOMAIN_RENDER,
> -				   0, dst->addr.offset);
> -	intel_bb_out(ibb, color);
> +		intel_bb_out(ibb, XY_COLOR_BLT_CMD_NOLEN | XY_COLOR_BLT_WRITE_ALPHA |
> +			     XY_COLOR_BLT_WRITE_RGB | blt_cmd_tiling | blt_cmd_len);
> +		intel_bb_out(ibb, blt_cmd_depth | (0xF0 << 16) | pitch);
> +		intel_bb_out(ibb, (rect->y << 16) | rect->x);
> +		intel_bb_out(ibb, ((rect->y + rect->h) << 16) | (rect->x + rect->w));
> +		intel_bb_emit_reloc_fenced(ibb, dst->handle, 0, I915_GEM_DOMAIN_RENDER,
> +					   0, dst->addr.offset);
> +		intel_bb_out(ibb, color);
>   
> -	switch_blt_tiling(ibb, tiling, false);
> +		switch_blt_tiling(ibb, tiling, false);
> +	}
>   
>   	intel_bb_flush_blit(ibb);
>   	intel_bb_destroy(ibb);
> diff --git a/lib/intel_reg.h b/lib/intel_reg.h
> index 44b0d480..cb627288 100644
> --- a/lib/intel_reg.h
> +++ b/lib/intel_reg.h
> @@ -2557,6 +2557,8 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
>   #define XY_MONO_SRC_BLT_WRITE_ALPHA	(1<<21)
>   #define XY_MONO_SRC_BLT_WRITE_RGB	(1<<20)
>   
> +#define XY_FAST_COLOR_BLT		((0x2<<29)|(0x44<<22)|0xe)
> +
>   #define XY_FAST_COPY_BLT				((2<<29)|(0x42<<22)|0x8)
>   /* dword 0 */
>   #define   XY_FAST_COPY_SRC_TILING_LINEAR		(0 << 20)



More information about the igt-dev mailing list