Re: [igt-dev] [PATCH v2 6/6] tests/gem_render_copy: Add media compression subtests

Kahola, Mika
2019-12-05T11:28:30Z

On Wed, 2019-12-04 at 15:50 +0200, Imre Deak wrote:
> Add subtests using the vebox copy function to test the blit
> functionality involving media compressed source and destination
> buffers.
>
> These cover all the source and destination tiling formats supported
> by
> the vebox engine and validate the buffer sharing between the render
> and
> vebox engine (a render compressed buffer used by the vebox engine and
> a
> media compressed buffer used by the render engine).
>
> v2:
> - Rebase on latest igt.
> Simplify the condition for enabling media compression in the
> surface
> state.
>
> Cc: Mika Kahola <mika.kahola@intel.com>
> Cc: Brian Welty <brian.welty@intel.com>
> Cc: Chris Wilson <chris@chris-wilson.co.uk>
> Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
> Signed-off-by: Imre Deak <imre.deak@intel.com>

Reviewed-by: Mika Kahola <mika.kahola@intel.com>

> ---
> lib/gen9_render.h | 44 ++++++++----
> lib/rendercopy_gen9.c | 14 ++--
> tests/i915/gem_render_copy.c | 127
> ++++++++++++++++++++++++++++++++++-
> 3 files changed, 162 insertions(+), 23 deletions(-)
>
> diff --git a/lib/gen9_render.h b/lib/gen9_render.h
> index ab99563a..6274e902 100644
> --- a/lib/gen9_render.h
> +++ b/lib/gen9_render.h
> @@ -86,20 +86,36 @@ struct gen9_surface_state {
> uint32_t pad1:1;
> } ss6;
>
> - struct {
> - uint32_t resource_min_lod:12;
> -
> - /* Only on Haswell */
> - uint32_t pad0:4;
> - uint32_t shader_chanel_select_a:3;
> - uint32_t shader_chanel_select_b:3;
> - uint32_t shader_chanel_select_g:3;
> - uint32_t shader_chanel_select_r:3;
> -
> - uint32_t alpha_clear_color:1;
> - uint32_t blue_clear_color:1;
> - uint32_t green_clear_color:1;
> - uint32_t red_clear_color:1;
> + union {
> + struct {
> + uint32_t resource_min_lod:12;
> +
> + /* Only on Haswell */
> + uint32_t pad0:4;
> + uint32_t shader_chanel_select_a:3;
> + uint32_t shader_chanel_select_b:3;
> + uint32_t shader_chanel_select_g:3;
> + uint32_t shader_chanel_select_r:3;
> +
> + uint32_t alpha_clear_color:1;
> + uint32_t blue_clear_color:1;
> + uint32_t green_clear_color:1;
> + uint32_t red_clear_color:1;
> + } skl;
> + struct {
> + uint32_t resource_min_lod:12;
> +
> + /* Only on Haswell */
> + uint32_t pad0:4;
> + uint32_t shader_chanel_select_a:3;
> + uint32_t shader_chanel_select_b:3;
> + uint32_t shader_chanel_select_g:3;
> + uint32_t shader_chanel_select_r:3;
> +
> + uint32_t pad1:2;
> + uint32_t media_compression:1;
> + uint32_t pad2:1;
> + } tgl;
> } ss7;
>
> struct {
> diff --git a/lib/rendercopy_gen9.c b/lib/rendercopy_gen9.c
> index bf9d2ee1..63b1023d 100644
> --- a/lib/rendercopy_gen9.c
> +++ b/lib/rendercopy_gen9.c
> @@ -252,12 +252,14 @@ gen8_bind_buf(struct intel_batchbuffer *batch,
> const struct igt_buf *buf,
> ss->ss2.width = igt_buf_width(buf) - 1;
> ss->ss3.pitch = buf->stride - 1;
>
> - ss->ss7.shader_chanel_select_r = 4;
> - ss->ss7.shader_chanel_select_g = 5;
> - ss->ss7.shader_chanel_select_b = 6;
> - ss->ss7.shader_chanel_select_a = 7;
> -
> - if (buf->aux.stride) {
> + ss->ss7.skl.shader_chanel_select_r = 4;
> + ss->ss7.skl.shader_chanel_select_g = 5;
> + ss->ss7.skl.shader_chanel_select_b = 6;
> + ss->ss7.skl.shader_chanel_select_a = 7;
> +
> + if (buf->compression == I915_COMPRESSION_MEDIA)
> + ss->ss7.tgl.media_compression = 1;
> + else if (buf->aux.stride) {
> ss->ss6.aux_mode = 0x5; /* AUX_CCS_E */
> ss->ss6.aux_pitch = (buf->aux.stride / 128) - 1;
>
> diff --git a/tests/i915/gem_render_copy.c
> b/tests/i915/gem_render_copy.c
> index 9c36f38b..137c7c18 100644
> --- a/tests/i915/gem_render_copy.c
> +++ b/tests/i915/gem_render_copy.c
> @@ -59,6 +59,7 @@ typedef struct {
> drm_intel_bufmgr *bufmgr;
> struct intel_batchbuffer *batch;
> igt_render_copyfunc_t render_copy;
> + igt_vebox_copyfunc_t vebox_copy;
> } data_t;
> static int opt_dump_png = false;
> static int check_all_pixels = false;
> @@ -595,6 +596,7 @@ static void scratch_buf_aux_check(data_t *data,
> }
>
> #define SOURCE_MIXED_TILED 1
> +#define FORCE_VEBOX_DST_COPY 2
>
> static void test(data_t *data, uint32_t src_tiling, uint32_t
> dst_tiling,
> enum i915_compression src_compression,
> @@ -634,6 +636,7 @@ static void test(data_t *data, uint32_t
> src_tiling, uint32_t dst_tiling,
> const bool src_mixed_tiled = flags & SOURCE_MIXED_TILED;
> const bool src_compressed = src_compression !=
> I915_COMPRESSION_NONE;
> const bool dst_compressed = dst_compression !=
> I915_COMPRESSION_NONE;
> + const bool force_vebox_dst_copy = flags & FORCE_VEBOX_DST_COPY;
>
> /*
> * The source tilings for mixed source tiling test cases are
> determined
> @@ -641,6 +644,14 @@ static void test(data_t *data, uint32_t
> src_tiling, uint32_t dst_tiling,
> */
> igt_assert(src_tiling == I915_TILING_NONE || !src_mixed_tiled);
>
> + /*
> + * The vebox engine can produce only a media compressed or
> + * uncompressed surface.
> + */
> + igt_assert(!force_vebox_dst_copy ||
> + dst_compression == I915_COMPRESSION_MEDIA ||
> + dst_compression == I915_COMPRESSION_NONE);
> +
> /* no Yf before gen9 */
> if (intel_gen(data->devid) < 9)
> num_src--;
> @@ -733,6 +744,10 @@ static void test(data_t *data, uint32_t
> src_tiling, uint32_t dst_tiling,
> &src_tiled, 0, 0, WIDTH,
> HEIGHT,
> &src_ccs,
> 0, 0);
> + else if (src_compression == I915_COMPRESSION_MEDIA)
> + data->vebox_copy(data->batch,
> + &src_tiled, WIDTH, HEIGHT,
> + &src_ccs);
>
> if (dst_compression == I915_COMPRESSION_RENDER) {
> data->render_copy(data->batch, NULL,
> @@ -746,6 +761,21 @@ static void test(data_t *data, uint32_t
> src_tiling, uint32_t dst_tiling,
> 0, 0, WIDTH, HEIGHT,
> &dst,
> 0, 0);
> + } else if (dst_compression == I915_COMPRESSION_MEDIA) {
> + data->vebox_copy(data->batch,
> + src_compressed ? &src_ccs :
> &src_tiled,
> + WIDTH, HEIGHT,
> + &dst_ccs);
> +
> + data->vebox_copy(data->batch,
> + &dst_ccs,
> + WIDTH, HEIGHT,
> + &dst);
> + } else if (force_vebox_dst_copy) {
> + data->vebox_copy(data->batch,
> + src_compressed ? &src_ccs :
> &src_tiled,
> + WIDTH, HEIGHT,
> + &dst);
> } else {
> data->render_copy(data->batch, NULL,
> src_compressed ? &src_ccs :
> &src_tiled,
> @@ -854,6 +884,9 @@ static void buf_mode_to_str(uint32_t tiling, bool
> mixed_tiled,
> case I915_COMPRESSION_RENDER:
> compression_str = "ccs";
> break;
> + case I915_COMPRESSION_MEDIA:
> + compression_str = "mc-ccs";
> + break;
> default:
> igt_assert(0);
> }
> @@ -929,6 +962,73 @@ igt_main_args("da", NULL, help_str, opt_handler,
> NULL)
> { I915_TILING_Yf, I915_TILING_Y,
> I915_COMPRESSION_RENDER, I915_COMPRESSION_REND
> ER,
> 0, },
> +
> + { I915_TILING_NONE, I915_TILING_Yf,
> + I915_COMPRESSION_NONE, I915_COMPRESSION_NONE,
> + FORCE_VEBOX_DST_COPY, },
> + { I915_TILING_NONE, I915_TILING_Y,
> + I915_COMPRESSION_NONE, I915_COMPRESSION_NONE,
> + FORCE_VEBOX_DST_COPY, },
> +
> + { I915_TILING_X, I915_TILING_Yf,
> + I915_COMPRESSION_NONE, I915_COMPRESSION_NONE,
> + FORCE_VEBOX_DST_COPY, },
> + { I915_TILING_X, I915_TILING_Y,
> + I915_COMPRESSION_NONE, I915_COMPRESSION_NONE,
> + FORCE_VEBOX_DST_COPY, },
> +
> + { I915_TILING_Y, I915_TILING_NONE,
> + I915_COMPRESSION_NONE, I915_COMPRESSION_NONE,
> + FORCE_VEBOX_DST_COPY, },
> + { I915_TILING_Y, I915_TILING_X,
> + I915_COMPRESSION_NONE, I915_COMPRESSION_NONE,
> + FORCE_VEBOX_DST_COPY, },
> + { I915_TILING_Y, I915_TILING_Y,
> + I915_COMPRESSION_NONE, I915_COMPRESSION_NONE,
> + FORCE_VEBOX_DST_COPY, },
> + { I915_TILING_Y, I915_TILING_Yf,
> + I915_COMPRESSION_NONE, I915_COMPRESSION_NONE,
> + FORCE_VEBOX_DST_COPY, },
> +
> + { I915_TILING_Yf, I915_TILING_NONE,
> + I915_COMPRESSION_NONE, I915_COMPRESSION_NONE,
> + FORCE_VEBOX_DST_COPY, },
> + { I915_TILING_Yf, I915_TILING_X,
> + I915_COMPRESSION_NONE, I915_COMPRESSION_NONE,
> + FORCE_VEBOX_DST_COPY, },
> + { I915_TILING_Yf, I915_TILING_Yf,
> + I915_COMPRESSION_NONE, I915_COMPRESSION_NONE,
> + FORCE_VEBOX_DST_COPY, },
> + { I915_TILING_Yf, I915_TILING_Y,
> + I915_COMPRESSION_NONE, I915_COMPRESSION_NONE,
> + FORCE_VEBOX_DST_COPY, },
> +
> + { I915_TILING_Y, I915_TILING_Y,
> + I915_COMPRESSION_MEDIA, I915_COMPRESSION_NONE,
> + FORCE_VEBOX_DST_COPY, },
> + { I915_TILING_Yf, I915_TILING_Yf,
> + I915_COMPRESSION_MEDIA, I915_COMPRESSION_NONE,
> + FORCE_VEBOX_DST_COPY, },
> + { I915_TILING_Y, I915_TILING_Yf,
> + I915_COMPRESSION_MEDIA, I915_COMPRESSION_NONE,
> + FORCE_VEBOX_DST_COPY, },
> + { I915_TILING_Yf, I915_TILING_Y,
> + I915_COMPRESSION_MEDIA, I915_COMPRESSION_NONE,
> + FORCE_VEBOX_DST_COPY, },
> +
> + { I915_TILING_Y, I915_TILING_Y,
> + I915_COMPRESSION_MEDIA, I915_COMPRESSION_RENDER,
> + 0, },
> + { I915_TILING_Y, I915_TILING_Yf,
> + I915_COMPRESSION_MEDIA, I915_COMPRESSION_RENDER,
> + 0, },
> +
> + { I915_TILING_Y, I915_TILING_Y,
> + I915_COMPRESSION_RENDER, I915_COMPRESSION_MEDI
> A,
> + 0, },
> + { I915_TILING_Y, I915_TILING_Yf,
> + I915_COMPRESSION_RENDER, I915_COMPRESSION_MEDI
> A,
> + 0, },
> };
> int i;
>
> @@ -946,6 +1046,8 @@ igt_main_args("da", NULL, help_str, opt_handler,
> NULL)
> igt_require_f(data.render_copy,
> "no render-copy function\n");
>
> + data.vebox_copy = igt_get_vebox_copyfunc(data.devid);
> +
> data.batch = intel_batchbuffer_alloc(data.bufmgr,
> data.devid);
> igt_assert(data.batch);
>
> @@ -957,13 +1059,25 @@ igt_main_args("da", NULL, help_str,
> opt_handler, NULL)
> char src_mode[32];
> char dst_mode[32];
> const bool src_mixed_tiled = t->flags &
> SOURCE_MIXED_TILED;
> + const bool force_vebox_dst_copy = t->flags &
> FORCE_VEBOX_DST_COPY;
> + const bool vebox_copy_used =
> + t->src_compression == I915_COMPRESSION_MEDIA ||
> + t->dst_compression == I915_COMPRESSION_MEDIA ||
> + force_vebox_dst_copy;
> + const bool render_copy_used =
> + !vebox_copy_used ||
> + t->src_compression == I915_COMPRESSION_RENDER
> ||
> + t->dst_compression == I915_COMPRESSION_RENDER;
>
> buf_mode_to_str(t->src_tiling, src_mixed_tiled,
> t->src_compression, src_mode,
> sizeof(src_mode));
> buf_mode_to_str(t->dst_tiling, false,
> t->dst_compression, dst_mode,
> sizeof(dst_mode));
>
> - igt_describe_f("Test render_copy() from a %s to a %s
> buffer.",
> + igt_describe_f("Test %s%s%s from a %s to a %s buffer.",
> + render_copy_used ? "render_copy()" : "",
> + render_copy_used && vebox_copy_used ? "
> and " : "",
> + vebox_copy_used ? "vebox_copy()" : "",
> src_mode, dst_mode);
>
> /* Preserve original test names */
> @@ -971,12 +1085,19 @@ igt_main_args("da", NULL, help_str,
> opt_handler, NULL)
> t->dst_compression == I915_COMPRESSION_NONE)
> src_mode[0] = '\0';
>
> - igt_subtest_f("%s%s%s",
> - src_mode, src_mode[0] ? "-to-" : "",
> dst_mode)
> + igt_subtest_f("%s%s%s%s",
> + src_mode,
> + src_mode[0] ? "-to-" : "",
> + force_vebox_dst_copy ? "vebox-" : "",
> + dst_mode) {
> + igt_require_f(data.vebox_copy ||
> !vebox_copy_used,
> + "no vebox-copy function\n");
> +
> test(&data,
> t->src_tiling, t->dst_tiling,
> t->src_compression, t->dst_compression,
> t->flags);
> + }
> }
>
> igt_fixture {