[PATCH i-g-t] tests/intel/kms_ccs: add access to control surface on xe2
Zbigniew Kempczyński
zbigniew.kempczynski at intel.com
Wed Mar 20 08:46:52 UTC 2024
On Mon, Mar 18, 2024 at 01:47:58PM +0200, Juha-Pekka Heikkila wrote:
> On random ccs test randomize also control surface content
> and on crc tests add check ccs image is compressed.
>
> Signed-off-by: Juha-Pekka Heikkila <juhapekka.heikkila at gmail.com>
Hi JP.
I got two comments, one is minor nit, but second likely needs to be
addressed. See below.
> ---
> tests/intel/kms_ccs.c | 77 +++++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 77 insertions(+)
>
> diff --git a/tests/intel/kms_ccs.c b/tests/intel/kms_ccs.c
> index 4f8e30791..96beb2de1 100644
> --- a/tests/intel/kms_ccs.c
> +++ b/tests/intel/kms_ccs.c
> @@ -365,6 +365,77 @@ static void check_all_ccs_planes(int drm_fd, igt_fb_t *fb, const float *cc_color
> }
> }
>
> +static void access_flat_ccs_surface(struct igt_fb *fb, bool verify_compression)
> +{
> + uint64_t bb_size, ccssize = fb->size / CCS_RATIO(fb->fd);
> + uint64_t ccs_bo_size = ALIGN(ccssize, xe_get_default_alignment(fb->fd));
> + struct blt_ctrl_surf_copy_data surf = {};
> + uint32_t sysmem = system_memory(fb->fd);
> + uint32_t bb1, ccs, *ccsmap;
> + uint16_t cpu_caching = DRM_XE_GEM_CPU_CACHING_WC;
> + uint8_t uc_mocs = intel_get_uc_mocs_index(fb->fd);
> + uint8_t comp_pat_index = intel_get_pat_idx_wt(fb->fd);
> + uint32_t region = (AT_LEAST_GEN(intel_get_drm_devid(fb->fd), 20) &
> + xe_has_vram(fb->fd)) ? REGION_LMEM(0) : REGION_SMEM;
> +
> + struct drm_xe_engine_class_instance inst = {
> + .engine_class = DRM_XE_ENGINE_CLASS_COPY,
> + };
> +
> + uint64_t surf_ahnd;
> + uint32_t vm, exec_queue;
> + intel_ctx_t *surf_ctx;
> +
> + vm = xe_vm_create(fb->fd, 0, 0);
> + exec_queue = xe_exec_queue_create(fb->fd, vm, &inst, 0);
> + surf_ctx = intel_ctx_xe(fb->fd, vm, exec_queue, 0, 0, 0);
> + surf_ahnd = intel_allocator_open(fb->fd, surf_ctx->vm,
> + INTEL_ALLOCATOR_RELOC);
> +
> + ccs = xe_bo_create_caching(fb->fd, 0, ccs_bo_size, sysmem, 0, cpu_caching);
> +
> + blt_ctrl_surf_copy_init(fb->fd, &surf);
> + blt_set_ctrl_surf_object(&surf.src, fb->gem_handle, region, fb->size,
> + uc_mocs, comp_pat_index, BLT_INDIRECT_ACCESS);
> + blt_set_ctrl_surf_object(&surf.dst, ccs, sysmem, ccssize, uc_mocs,
> + DEFAULT_PAT_INDEX, DIRECT_ACCESS);
> +
> + bb_size = xe_bb_size(fb->fd, SZ_4K);
> + bb1 = xe_bo_create(fb->fd, 0, bb_size, sysmem, 0);
> + blt_set_batch(&surf.bb, bb1, bb_size, sysmem);
> + blt_ctrl_surf_copy(fb->fd, surf_ctx, NULL, surf_ahnd, &surf);
> + intel_ctx_xe_sync(surf_ctx, true);
> +
> + ccsmap = xe_bo_map(fb->fd, ccs, surf.dst.size);
> +
> + if (verify_compression) {
> + for (int i = 0; i < surf.dst.size / sizeof(uint32_t); i++) {
> + if (ccsmap[i] != 0)
> + goto ccs_vefiried;
That's minor nit, s/vefiried/verified/g.
Second doesn't reside in this code, it is in the test itself:
static void fill_fb_random(int drm_fd, igt_fb_t *fb)
{
...
for (i = 0; i < fb->size; i++)
p[i] = rand();
...
Randomized data might lead your surface won't be surprised at all (data
are noise). I experimented with this some time ago when I played with
ctrl-surf-copy. Noise wasn't compressible so I think you should less
random data in case you want to check the ccs data.
--
Zbigniew
> + }
> + igt_assert_f(false, "framebuffer was not compressed!\n");
> + } else {
> + for (int i = 0; i < surf.dst.size / sizeof(uint32_t); i++)
> + ccsmap[i] = rand();
> + }
> +
> + blt_set_ctrl_surf_object(&surf.src, ccs, sysmem, ccssize,
> + uc_mocs, DEFAULT_PAT_INDEX, DIRECT_ACCESS);
> + blt_set_ctrl_surf_object(&surf.dst, fb->gem_handle, region, fb->size,
> + uc_mocs, comp_pat_index, INDIRECT_ACCESS);
> + blt_ctrl_surf_copy(fb->fd, surf_ctx, NULL, surf_ahnd, &surf);
> + intel_ctx_xe_sync(surf_ctx, true);
> +
> +ccs_vefiried:
> + munmap(ccsmap, ccssize);
> + gem_close(fb->fd, ccs);
> + gem_close(fb->fd, bb1);
> + xe_exec_queue_destroy(fb->fd, exec_queue);
> + xe_vm_destroy(fb->fd, vm);
> + free(surf_ctx);
> + put_ahnd(surf_ahnd);
> +}
> +
> static void fill_fb_random(int drm_fd, igt_fb_t *fb)
> {
> void *map;
> @@ -382,6 +453,10 @@ static void fill_fb_random(int drm_fd, igt_fb_t *fb)
> p[i] = rand();
>
> igt_assert(gem_munmap(map, fb->size) == 0);
> +
> + /* randomize also ccs surface on Xe2 */
> + if (AT_LEAST_GEN(intel_get_drm_devid(drm_fd), 20))
> + access_flat_ccs_surface(fb, false);
> }
>
> static void test_bad_ccs_plane(data_t *data, int width, int height, int ccs_plane,
> @@ -640,6 +715,8 @@ static void xe2_ccs_blit(data_t *data, struct igt_fb *fb, struct igt_fb *temp_fb
> xe_exec_queue_destroy(dst_fb->fd, exec_queue);
> xe_vm_destroy(dst_fb->fd, vm);
> free(xe_ctx);
> +
> + access_flat_ccs_surface(fb, true);
> }
>
> static void generate_fb(data_t *data, struct igt_fb *fb,
> --
> 2.25.1
>
More information about the igt-dev
mailing list