Igt-dev Archive on lore.kernel.org
 help / color / mirror / Atom feed
From: Zack Rusin <zack@kde.org>
To: igt-dev@lists.freedesktop.org
Cc: banackm@vmware.com, krastevm@vmware.com, iforbes@vmware.com,
	mombasawalam@vmware.com
Subject: [igt-dev] [PATCH i-g-t v4 3/8] tests/vmwgfx: Add triangle test
Date: Wed, 12 Apr 2023 21:24:21 -0400	[thread overview]
Message-ID: <20230413012426.503658-4-zack@kde.org> (raw)
In-Reply-To: <20230413012426.503658-1-zack@kde.org>

From: Maaz Mombasawala <mombasawalam@vmware.com>

Add vmwgfx tests support in tests/meson and a tri test.
This basic test draws a triangle using vmwgfx and checks if it has
been rendered correctly.

Signed-off-by: Roye Eshed <reshed@vmware.com>
Signed-off-by: Zack Rusin <zackr@vmware.com>
Signed-off-by: Maaz Mombasawala <mombasawalam@vmware.com>
Reviewed-by: Martin Krastev <krastevm@vmware.com>
---
 tests/meson.build        |   2 +
 tests/vmwgfx/meson.build |  14 +++
 tests/vmwgfx/vmw_tri.c   | 214 +++++++++++++++++++++++++++++++++++++++
 3 files changed, 230 insertions(+)
 create mode 100644 tests/vmwgfx/meson.build
 create mode 100644 tests/vmwgfx/vmw_tri.c

diff --git a/tests/meson.build b/tests/meson.build
index da31e782..9072cfad 100644
--- a/tests/meson.build
+++ b/tests/meson.build
@@ -510,6 +510,8 @@ subdir('v3d')
 
 subdir('vc4')
 
+subdir('vmwgfx')
+
 gen_testlist = find_program('generate_testlist.sh')
 test_list_target = custom_target('testlist',
 	      output : 'test-list.txt',
diff --git a/tests/vmwgfx/meson.build b/tests/vmwgfx/meson.build
new file mode 100644
index 00000000..e2e5a86b
--- /dev/null
+++ b/tests/vmwgfx/meson.build
@@ -0,0 +1,14 @@
+
+vmwgfx_progs = [
+	'vmw_tri'
+]
+vmwgfx_deps = test_deps
+
+foreach prog : vmwgfx_progs
+	test_executables += executable(prog, prog + '.c',
+				       dependencies : vmwgfx_deps,
+				       install_dir : vmwgfxdir,
+				       install_rpath : vmwgfx_rpathdir,
+				       install : true)
+	test_list += join_paths('vmwgfx', prog)
+endforeach
diff --git a/tests/vmwgfx/vmw_tri.c b/tests/vmwgfx/vmw_tri.c
new file mode 100644
index 00000000..f5a59229
--- /dev/null
+++ b/tests/vmwgfx/vmw_tri.c
@@ -0,0 +1,214 @@
+// SPDX-License-Identifier: GPL-2.0 OR MIT
+/**********************************************************
+ * Copyright 2021-2022 VMware, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person
+ * obtaining a copy of this software and associated documentation
+ * files (the "Software"), to deal in the Software without
+ * restriction, including without limitation the rights to use, copy,
+ * modify, merge, publish, distribute, sublicense, and/or sell copies
+ * of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ *
+ **********************************************************/
+
+#include "igt_vmwgfx.h"
+
+IGT_TEST_DESCRIPTION("Check whether basic 3D pipeline works correctly.");
+
+static void draw_triangle(struct vmw_svga_device *device, int32 cid)
+{
+	struct vmw_default_objects objects;
+	uint8 *rendered_img;
+	bool save_status;
+
+	vmw_create_default_objects(device, cid, &objects,
+				   &vmw_default_rect_size);
+	rendered_img = vmw_triangle_draw(device, cid, &objects, true);
+
+	save_status = vmw_save_data_as_png(objects.color_rt, rendered_img,
+					   "vmw_tri.png");
+	igt_assert(save_status);
+
+	vmw_triangle_assert_values(rendered_img, objects.color_rt);
+
+	/* Clean up */
+	free(rendered_img);
+	vmw_destroy_default_objects(device, &objects);
+}
+
+static void replace_with_coherent_rt(struct vmw_svga_device *device,
+				     int32 context_id,
+				     struct vmw_default_objects *objects,
+				     const SVGA3dSize *rt_size)
+{
+	struct vmw_execbuf *cmd_buf;
+	SVGA3dRenderTargetViewDesc rtv_desc = { 0 };
+	SVGA3dCmdDXDefineRenderTargetView rt_view_define_cmd = { 0 };
+	SVGA3dCmdDXDefineDepthStencilView ds_view_define_cmd = { 0 };
+
+	objects->color_rt = vmw_ioctl_create_surface_full(
+		device->drm_fd,
+		SVGA3D_SURFACE_HINT_TEXTURE | SVGA3D_SURFACE_HINT_RENDERTARGET |
+			SVGA3D_SURFACE_BIND_RENDER_TARGET,
+		SVGA3D_R8G8B8A8_UNORM, 0, SVGA3D_MS_PATTERN_NONE,
+		SVGA3D_MS_QUALITY_NONE, SVGA3D_TEX_FILTER_NONE, 1, 1, *rt_size,
+		NULL, drm_vmw_surface_flag_coherent);
+
+	objects->depth_rt = vmw_ioctl_create_surface_full(
+		device->drm_fd,
+		SVGA3D_SURFACE_HINT_DEPTHSTENCIL |
+			SVGA3D_SURFACE_HINT_RENDERTARGET |
+			SVGA3D_SURFACE_BIND_DEPTH_STENCIL,
+		SVGA3D_R24G8_TYPELESS, 0, SVGA3D_MS_PATTERN_NONE,
+		SVGA3D_MS_QUALITY_NONE, SVGA3D_TEX_FILTER_NONE, 1, 1, *rt_size,
+		NULL, drm_vmw_surface_flag_coherent);
+
+	cmd_buf = vmw_execbuf_create(device->drm_fd, context_id);
+
+	rtv_desc.tex.arraySize = 1;
+	rtv_desc.tex.firstArraySlice = 0;
+	rtv_desc.tex.mipSlice = 0;
+	vmw_bitvector_find_next_bit(device->rt_view_bv,
+				    &rt_view_define_cmd.renderTargetViewId);
+	rt_view_define_cmd.sid = objects->color_rt->base.handle;
+	rt_view_define_cmd.format = SVGA3D_R8G8B8A8_UNORM;
+	rt_view_define_cmd.resourceDimension = SVGA3D_RESOURCE_TEXTURE2D;
+	rt_view_define_cmd.desc = rtv_desc;
+	vmw_execbuf_append(cmd_buf, SVGA_3D_CMD_DX_DEFINE_RENDERTARGET_VIEW,
+			   &rt_view_define_cmd, sizeof(rt_view_define_cmd), NULL,
+			   0);
+	objects->color_rt_id = rt_view_define_cmd.renderTargetViewId;
+
+	vmw_bitvector_find_next_bit(device->ds_view_bv,
+				    &ds_view_define_cmd.depthStencilViewId);
+	ds_view_define_cmd.sid = objects->depth_rt->base.handle;
+	ds_view_define_cmd.format = SVGA3D_D24_UNORM_S8_UINT;
+	ds_view_define_cmd.resourceDimension = SVGA3D_RESOURCE_TEXTURE2D;
+	ds_view_define_cmd.mipSlice = 0;
+	ds_view_define_cmd.firstArraySlice = 0;
+	ds_view_define_cmd.arraySize = 1;
+	vmw_execbuf_append(cmd_buf, SVGA_3D_CMD_DX_DEFINE_DEPTHSTENCIL_VIEW,
+			   &ds_view_define_cmd, sizeof(ds_view_define_cmd), NULL,
+			   0);
+	objects->ds_view_id = ds_view_define_cmd.depthStencilViewId;
+
+	vmw_execbuf_submit(cmd_buf, NULL);
+	vmw_execbuf_destroy(cmd_buf);
+}
+
+static void destroy_rt(struct vmw_svga_device *device, int32 context_id,
+		       struct vmw_default_objects *objects)
+{
+	struct vmw_execbuf *cmd_buf;
+
+	SVGA3dCmdDXDestroyRenderTargetView rt_view_cmd = {
+		.renderTargetViewId = objects->color_rt_id
+	};
+
+	SVGA3dCmdDXDestroyDepthStencilView ds_view_cmd = {
+		.depthStencilViewId = objects->ds_view_id
+	};
+
+	cmd_buf = vmw_execbuf_create(device->drm_fd, objects->context_id);
+
+	vmw_execbuf_append(cmd_buf, SVGA_3D_CMD_DX_DESTROY_RENDERTARGET_VIEW,
+			   &rt_view_cmd, sizeof(rt_view_cmd), NULL, 0);
+
+	vmw_execbuf_append(cmd_buf, SVGA_3D_CMD_DX_DESTROY_DEPTHSTENCIL_VIEW,
+			   &ds_view_cmd, sizeof(ds_view_cmd), NULL, 0);
+
+	vmw_ioctl_surface_unref(device->drm_fd, objects->color_rt);
+	vmw_ioctl_surface_unref(device->drm_fd, objects->depth_rt);
+
+	vmw_bitvector_free_bit(device->rt_view_bv, objects->color_rt_id);
+	vmw_bitvector_free_bit(device->ds_view_bv, objects->ds_view_id);
+
+	vmw_execbuf_submit(cmd_buf, NULL);
+	vmw_execbuf_destroy(cmd_buf);
+}
+
+static void draw_triangle_on_coherent_rt(struct vmw_svga_device *device,
+					 int32 cid)
+{
+	struct vmw_default_objects objects;
+	uint8 *rendered_img;
+	struct vmw_surface *default_color_rt;
+	struct vmw_surface *default_depth_rt;
+	SVGA3dRenderTargetViewId default_color_rt_id;
+	SVGA3dDepthStencilViewId default_ds_view_id;
+
+	vmw_create_default_objects(device, cid, &objects,
+				   &vmw_default_rect_size);
+
+	/* Replace default rendertargets with coherent equivalents */
+	default_color_rt = objects.color_rt;
+	default_depth_rt = objects.depth_rt;
+	default_color_rt_id = objects.color_rt_id;
+	default_ds_view_id = objects.ds_view_id;
+	replace_with_coherent_rt(device, cid, &objects, &vmw_default_rect_size);
+
+	rendered_img = vmw_triangle_draw(device, cid, &objects, false);
+
+	vmw_triangle_assert_values(rendered_img, objects.color_rt);
+
+	/* Clean up */
+	free(rendered_img);
+
+	destroy_rt(device, cid, &objects);
+	objects.color_rt = default_color_rt;
+	objects.depth_rt = default_depth_rt;
+	objects.color_rt_id = default_color_rt_id;
+	objects.ds_view_id = default_ds_view_id;
+
+	vmw_destroy_default_objects(device, &objects);
+}
+
+igt_main
+{
+	struct vmw_svga_device device;
+	int32 cid;
+
+	igt_fixture
+	{
+		vmw_svga_device_init(&device, vmw_svga_device_node_render);
+		igt_require(device.drm_fd != -1);
+
+		cid = vmw_ioctl_context_create(device.drm_fd);
+		igt_require(cid != SVGA3D_INVALID_ID);
+	}
+
+	igt_describe("Tests rendering of a trivial triangle.");
+	igt_subtest("tri")
+	{
+		draw_triangle(&device, cid);
+	}
+
+	/*
+	 * Check that vmwgfx correctly handles coherent rendertarget
+	 * surfaces when no explicit sync is given from userspace
+	 */
+	igt_describe("Tests rendering of a triangle with coherency.");
+	igt_subtest("tri-no-sync-coherent")
+	{
+		draw_triangle_on_coherent_rt(&device, cid);
+	}
+
+	igt_fixture
+	{
+		vmw_ioctl_context_destroy(device.drm_fd, cid);
+		vmw_svga_device_fini(&device);
+	}
+}
-- 
2.39.2

  parent reply	other threads:[~2023-04-13  1:24 UTC|newest]

Thread overview: 18+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-04-13  1:24 [igt-dev] [PATCH i-g-t v4 0/8] Add vmwgfx support Zack Rusin
2023-04-13  1:24 ` [igt-dev] [PATCH i-g-t v4 1/8] lib/svga: Add generated headers for the svga device Zack Rusin
2023-04-17 12:41   ` Kamil Konieczny
2023-04-13  1:24 ` [igt-dev] [PATCH i-g-t v4 2/8] lib: Add vmwgfx support Zack Rusin
2023-04-13 10:44   ` Kamil Konieczny
2023-04-13  1:24 ` Zack Rusin [this message]
2023-04-13  1:24 ` [igt-dev] [PATCH i-g-t v4 4/8] tests/vmwgfx: Add execution buffer test Zack Rusin
2023-04-13  1:24 ` [igt-dev] [PATCH i-g-t v4 5/8] tests/vmwgfx: Add surface copy test Zack Rusin
2023-04-13  1:24 ` [igt-dev] [PATCH i-g-t v4 6/8] tests/vmwgfx: Add mob stress test Zack Rusin
2023-04-13  1:24 ` [igt-dev] [PATCH i-g-t v4 7/8] tests/vmwgfx: Add reference counting tests Zack Rusin
2023-04-13  1:24 ` [igt-dev] [PATCH i-g-t v4 8/8] lib: Fix igt_kms for drivers with 8 crtc's Zack Rusin
2023-04-17 12:39   ` Kamil Konieczny
2023-04-19  4:41     ` Karthik B S
2023-04-13  2:05 ` [igt-dev] ✗ Fi.CI.BAT: failure for Add vmwgfx support (rev4) Patchwork
2023-04-13  9:47   ` Kamil Konieczny
2023-04-13 11:31     ` Yedireswarapu, SaiX Nandan
2023-04-13 11:28 ` [igt-dev] ✓ Fi.CI.BAT: success " Patchwork
2023-04-13 13:37 ` [igt-dev] ✓ Fi.CI.IGT: " Patchwork

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20230413012426.503658-4-zack@kde.org \
    --to=zack@kde.org \
    --cc=banackm@vmware.com \
    --cc=iforbes@vmware.com \
    --cc=igt-dev@lists.freedesktop.org \
    --cc=krastevm@vmware.com \
    --cc=mombasawalam@vmware.com \
    --cc=zackr@vmware.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox