summaryrefslogtreecommitdiff
path: root/tests/kms_prime.c
diff options
context:
space:
mode:
authorArkadiusz Hiler <arkadiusz.hiler@intel.com>2020-05-04 10:37:07 +0300
committerArkadiusz Hiler <arkadiusz.hiler@intel.com>2020-05-05 09:46:39 +0300
commit7b527cab1691bac7934bd4d5c521bcd397168f52 (patch)
tree94ba04c44b42b0964e1ffe4f563edd2f40f21b73 /tests/kms_prime.c
parent4e0597fd0c6eae92dc920eb17cd9a20da11c4a8c (diff)
test/kms_prime: Use drm_open_driver_another
The test now uses dumb buffers explicitly instead of the vgem helpers. By default the first two devices that are matching provided chipset requirements are used (ANY + VGEM). This is sensitive to enumeration order, but as long as there are only two devices it's fine - PRIME will get tested both directions. IGT-Version: 1.25-g0b58fd8c (x86_64) (Linux: 5.7.0-rc2-CI-CI_DRM_8370+ x86_64) Starting subtest: basic-crc Starting dynamic subtest: first-to-second Test requirement not met in function igt_require_pipe_crc, file ../lib/igt_debugfs.c:522: Test requirement: fstatat(dir, "crtc-0/crc/control", &stat, 0) == 0 CRCs not supported on this platform Last errno: 2, No such file or directory Dynamic subtest first-to-second: SKIP (0,000s) Starting dynamic subtest: second-to-first Dynamic subtest second-to-first: SUCCESS (1,779s) Subtest basic-crc: SUCCESS (2,024s) In case there are more than two devices you can specify which ones should be used or force ordering, e.g.: sys:/sys/devices/pci0000:00/0000:00:02.0 subsystem : pci drm card : /dev/dri/card0 drm render : /dev/dri/renderD128 vendor : 8086 device : 9A49 sys:/sys/devices/platform/vgem subsystem : platform drm card : /dev/dri/card1 drm render : /dev/dri/renderD129 IGT-Version: 1.25-g0b58fd8c (x86_64) (Linux: 5.7.0-rc2-CI-CI_DRM_8370+ x86_64) Starting subtest: basic-crc Looking for devices to open using filter 0: sys:/sys/devices/platform/vgem Filter matched /dev/dri/card1 | /dev/dri/renderD129 Looking for devices to open using filter 1: pci:vendor=Intel Filter matched /dev/dri/card0 | /dev/dri/renderD128 Starting dynamic subtest: first-to-second Dynamic subtest first-to-second: SUCCESS (1,978s) Starting dynamic subtest: second-to-first Test requirement not met in function igt_require_pipe_crc, file ../lib/igt_debugfs.c:522: Test requirement: fstatat(dir, "crtc-0/crc/control", &stat, 0) == 0 CRCs not supported on this platform Last errno: 2, No such file or directory Dynamic subtest second-to-first: SKIP (0,000s) Subtest basic-crc: SUCCESS (2,944s) Cc: Petri Latvala <petri.latvala@intel.com> Signed-off-by: Arkadiusz Hiler <arkadiusz.hiler@intel.com> Reviewed-by: Petri Latvala <petri.latvala@intel.com>
Diffstat (limited to 'tests/kms_prime.c')
-rw-r--r--tests/kms_prime.c103
1 files changed, 65 insertions, 38 deletions
diff --git a/tests/kms_prime.c b/tests/kms_prime.c
index 3241c514..8cb2ca2a 100644
--- a/tests/kms_prime.c
+++ b/tests/kms_prime.c
@@ -22,12 +22,19 @@
*/
#include "igt.h"
-#include "igt_vgem.h"
+#include "igt_device.h"
#include <sys/ioctl.h>
#include <sys/poll.h>
#include <time.h>
+struct dumb_bo {
+ uint32_t handle;
+ uint32_t width, height;
+ uint32_t bpp, pitch;
+ uint64_t size;
+};
+
struct crc_info {
igt_crc_t crc;
char *str;
@@ -67,23 +74,24 @@ static bool has_prime_export(int fd)
}
static igt_output_t *setup_display(int importer_fd, igt_display_t *display,
- enum pipe pipe)
+ enum pipe *pipe)
{
igt_output_t *output;
+ bool found = false;
- igt_display_require(display, importer_fd);
- igt_skip_on(pipe >= display->n_pipes);
- output = igt_get_single_output_for_pipe(display, pipe);
+ for_each_pipe_with_valid_output(display, *pipe, output) {
+ found = true;
+ break;
+ }
- igt_require_f(output, "No connector found for pipe %s\n",
- kmstest_pipe_name(pipe));
+ igt_require_f(found, "No valid connector/pipe found\n");
igt_display_reset(display);
- igt_output_set_pipe(output, pipe);
+ igt_output_set_pipe(output, *pipe);
return output;
}
-static void prepare_scratch(int exporter_fd, struct vgem_bo *scratch,
+static void prepare_scratch(int exporter_fd, struct dumb_bo *scratch,
drmModeModeInfo *mode, uint32_t color)
{
uint32_t *ptr;
@@ -91,16 +99,27 @@ static void prepare_scratch(int exporter_fd, struct vgem_bo *scratch,
scratch->width = mode->hdisplay;
scratch->height = mode->vdisplay;
scratch->bpp = 32;
- vgem_create(exporter_fd, scratch);
- ptr = vgem_mmap(exporter_fd, scratch, PROT_WRITE);
+ scratch->handle = kmstest_dumb_create(exporter_fd,
+ scratch->width,
+ scratch->height,
+ scratch->bpp,
+ &scratch->pitch,
+ &scratch->size);
+
+
+ ptr = kmstest_dumb_map_buffer(exporter_fd,
+ scratch->handle,
+ scratch->size,
+ PROT_WRITE);
+
for (size_t idx = 0; idx < scratch->size / sizeof(*ptr); ++idx)
ptr[idx] = color;
munmap(ptr, scratch->size);
}
-static void prepare_fb(int importer_fd, struct vgem_bo *scratch, struct igt_fb *fb)
+static void prepare_fb(int importer_fd, struct dumb_bo *scratch, struct igt_fb *fb)
{
enum igt_color_encoding color_encoding = IGT_COLOR_YCBCR_BT709;
enum igt_color_range color_range = IGT_COLOR_YCBCR_LIMITED_RANGE;
@@ -126,6 +145,7 @@ static void import_fb(int importer_fd, struct igt_fb *fb,
DRM_FORMAT_XRGB8888,
handles, pitches, offsets,
&fb->fb_id, 0);
+
igt_assert(ret == 0);
}
@@ -162,19 +182,19 @@ static void test_crc(int exporter_fd, int importer_fd)
igt_display_t display;
igt_output_t *output;
igt_pipe_crc_t *pipe_crc;
- enum pipe pipe = PIPE_A;
+ enum pipe pipe;
struct igt_fb fb;
int dmabuf_fd;
- struct vgem_bo scratch = {}; /* despite the name, it suits for any
- * gem-compatible device
- * TODO: rename
- */
+ struct dumb_bo scratch = {};
+ bool crc_equal;
int i, j;
drmModeModeInfo *mode;
- bool crc_equal = false;
+ igt_device_set_master(importer_fd);
+ igt_require_pipe_crc(importer_fd);
+ igt_display_require(&display, importer_fd);
- output = setup_display(importer_fd, &display, pipe);
+ output = setup_display(importer_fd, &display, &pipe);
mode = igt_output_get_mode(output);
pipe_crc = igt_pipe_crc_new(importer_fd, pipe, INTEL_PIPE_CRC_SOURCE_AUTO);
@@ -188,6 +208,7 @@ static void test_crc(int exporter_fd, int importer_fd)
import_fb(importer_fd, &fb, dmabuf_fd, scratch.pitch);
close(dmabuf_fd);
+
colors[i].prime_crc.name = "prime";
collect_crc_for_fb(importer_fd, &fb, &display, output,
pipe_crc, colors[i].color, &colors[i].prime_crc);
@@ -228,29 +249,35 @@ static void test_crc(int exporter_fd, int importer_fd)
igt_display_fini(&display);
}
-static void run_test_crc(int export_chipset, int import_chipset)
+igt_main
{
- int importer_fd = -1;
- int exporter_fd = -1;
+ igt_fixture
+ kmstest_set_vt_graphics_mode();
- exporter_fd = drm_open_driver(export_chipset);
- importer_fd = drm_open_driver_master(import_chipset);
+ igt_describe("Make a dumb color buffer, export to another device and"
+ " compare the CRCs with a buffer native to that device");
+ igt_subtest_with_dynamic("basic-crc") {
+ int first_fd = -1;
+ int second_fd = -1;
- igt_require(has_prime_export(exporter_fd));
- igt_require(has_prime_import(importer_fd));
- igt_require_pipe_crc(importer_fd);
+ /* ANY = anything that is not VGEM */
+ first_fd = __drm_open_driver_another(0, DRIVER_ANY | DRIVER_VGEM);
+ igt_require(first_fd >= 0);
- test_crc(exporter_fd, importer_fd);
- close(importer_fd);
- close(exporter_fd);
-}
+ second_fd = __drm_open_driver_another(1, DRIVER_ANY | DRIVER_VGEM);
+ igt_require(second_fd >= 0);
-igt_main
-{
- igt_fixture {
- kmstest_set_vt_graphics_mode();
+ if (has_prime_export(first_fd) &&
+ has_prime_import(second_fd))
+ igt_dynamic("first-to-second")
+ test_crc(first_fd, second_fd);
+
+ if (has_prime_import(first_fd) &&
+ has_prime_export(second_fd))
+ igt_dynamic("second-to-first")
+ test_crc(second_fd, first_fd);
+
+ close(first_fd);
+ close(second_fd);
}
- igt_describe("Make a dumb buffer inside vgem, fill it, export to another device and compare the CRC");
- igt_subtest("basic-crc")
- run_test_crc(DRIVER_VGEM, DRIVER_ANY);
}