mirror of
https://github.com/tiagovignatti/intel-gpu-tools.git
synced 2025-06-11 18:06:13 +00:00
igt/gem_concurrent_all: struct buffers for all
Now that we started packaging all parameters in one handy struct, pass them everywhere. This allows us to pass along requirements so that we can perform the checks inside each indvidual subtest and so not anger the igt gods. Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
This commit is contained in:
parent
dcb39b5270
commit
4eba8e22fa
@ -268,7 +268,7 @@ void intel_require_memory(uint64_t count, uint64_t size, unsigned mode)
|
|||||||
{
|
{
|
||||||
uint64_t required, total;
|
uint64_t required, total;
|
||||||
|
|
||||||
igt_skip_on_f(!__intel_check_memory(count, size, mode,
|
igt_require_f(__intel_check_memory(count, size, mode,
|
||||||
&required, &total),
|
&required, &total),
|
||||||
"Estimated that we need %'llu objects and %'llu MiB for the test, but only have %'llu MiB available (%s%s) and a maximum of %'llu objects\n",
|
"Estimated that we need %'llu objects and %'llu MiB for the test, but only have %'llu MiB available (%s%s) and a maximum of %'llu objects\n",
|
||||||
(long long)count,
|
(long long)count,
|
||||||
|
@ -57,7 +57,15 @@ int fd, devid, gen;
|
|||||||
int all;
|
int all;
|
||||||
int pass;
|
int pass;
|
||||||
|
|
||||||
|
struct create {
|
||||||
|
const char *name;
|
||||||
|
void (*require)(const struct create *);
|
||||||
|
drm_intel_bo *(*create)(drm_intel_bufmgr *, uint64_t size);
|
||||||
|
};
|
||||||
|
|
||||||
struct buffers {
|
struct buffers {
|
||||||
|
const char *name;
|
||||||
|
const struct create *create;
|
||||||
const struct access_mode *mode;
|
const struct access_mode *mode;
|
||||||
drm_intel_bufmgr *bufmgr;
|
drm_intel_bufmgr *bufmgr;
|
||||||
struct intel_batchbuffer *batch;
|
struct intel_batchbuffer *batch;
|
||||||
@ -66,6 +74,7 @@ struct buffers {
|
|||||||
uint32_t *tmp;
|
uint32_t *tmp;
|
||||||
int width, height, size;
|
int width, height, size;
|
||||||
int count, num_buffers;
|
int count, num_buffers;
|
||||||
|
unsigned allow_mem;
|
||||||
};
|
};
|
||||||
|
|
||||||
#define MIN_BUFFERS 3
|
#define MIN_BUFFERS 3
|
||||||
@ -127,11 +136,11 @@ create_normal_bo(drm_intel_bufmgr *bufmgr, uint64_t size)
|
|||||||
return bo;
|
return bo;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool can_create_normal(void)
|
static void can_create_normal(const struct create *create)
|
||||||
{
|
{
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if HAVE_CREATE_PRIVATE
|
||||||
static drm_intel_bo *
|
static drm_intel_bo *
|
||||||
create_private_bo(drm_intel_bufmgr *bufmgr, uint64_t size)
|
create_private_bo(drm_intel_bufmgr *bufmgr, uint64_t size)
|
||||||
{
|
{
|
||||||
@ -147,11 +156,13 @@ create_private_bo(drm_intel_bufmgr *bufmgr, uint64_t size)
|
|||||||
return bo;
|
return bo;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool can_create_private(void)
|
static void can_create_private(const struct create *create)
|
||||||
{
|
{
|
||||||
return false;
|
igt_require(0);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if HAVE_CREATE_STOLEN
|
||||||
static drm_intel_bo *
|
static drm_intel_bo *
|
||||||
create_stolen_bo(drm_intel_bufmgr *bufmgr, uint64_t size)
|
create_stolen_bo(drm_intel_bufmgr *bufmgr, uint64_t size)
|
||||||
{
|
{
|
||||||
@ -167,53 +178,51 @@ create_stolen_bo(drm_intel_bufmgr *bufmgr, uint64_t size)
|
|||||||
return bo;
|
return bo;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool can_create_stolen(void)
|
static void can_create_stolen(const struct create *create)
|
||||||
{
|
{
|
||||||
/* XXX check num_buffers against available stolen */
|
/* XXX check num_buffers against available stolen */
|
||||||
return false;
|
igt_require(0);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static void create_cpu_require(const struct create *create)
|
||||||
|
{
|
||||||
|
#if HAVE_CREATE_STOLEN
|
||||||
|
igt_require(create->create != create_stolen_bo);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
static drm_intel_bo *
|
static drm_intel_bo *
|
||||||
(*create_func)(drm_intel_bufmgr *bufmgr, uint64_t size);
|
unmapped_create_bo(const struct buffers *b)
|
||||||
|
|
||||||
static bool create_cpu_require(void)
|
|
||||||
{
|
{
|
||||||
return create_func != create_stolen_bo;
|
return b->create->create(b->bufmgr, 4*b->size);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void create_snoop_require(const struct create *create)
|
||||||
|
{
|
||||||
|
create_cpu_require(create);
|
||||||
|
igt_require(!gem_has_llc(fd));
|
||||||
}
|
}
|
||||||
|
|
||||||
static drm_intel_bo *
|
static drm_intel_bo *
|
||||||
unmapped_create_bo(drm_intel_bufmgr *bufmgr, int width, int height)
|
snoop_create_bo(const struct buffers *b)
|
||||||
{
|
|
||||||
return create_func(bufmgr, (uint64_t)4*width*height);
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool create_snoop_require(void)
|
|
||||||
{
|
|
||||||
if (!create_cpu_require())
|
|
||||||
return false;
|
|
||||||
|
|
||||||
return !gem_has_llc(fd);
|
|
||||||
}
|
|
||||||
|
|
||||||
static drm_intel_bo *
|
|
||||||
snoop_create_bo(drm_intel_bufmgr *bufmgr, int width, int height)
|
|
||||||
{
|
{
|
||||||
drm_intel_bo *bo;
|
drm_intel_bo *bo;
|
||||||
|
|
||||||
bo = unmapped_create_bo(bufmgr, width, height);
|
bo = unmapped_create_bo(b);
|
||||||
gem_set_caching(fd, bo->handle, I915_CACHING_CACHED);
|
gem_set_caching(fd, bo->handle, I915_CACHING_CACHED);
|
||||||
drm_intel_bo_disable_reuse(bo);
|
drm_intel_bo_disable_reuse(bo);
|
||||||
|
|
||||||
return bo;
|
return bo;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool create_userptr_require(void)
|
static void create_userptr_require(const struct create *create)
|
||||||
{
|
{
|
||||||
static int found = -1;
|
static int has_userptr = -1;
|
||||||
if (found < 0) {
|
if (has_userptr < 0) {
|
||||||
struct drm_i915_gem_userptr arg;
|
struct drm_i915_gem_userptr arg;
|
||||||
|
|
||||||
found = 0;
|
has_userptr = 0;
|
||||||
|
|
||||||
memset(&arg, 0, sizeof(arg));
|
memset(&arg, 0, sizeof(arg));
|
||||||
arg.user_ptr = -4096ULL;
|
arg.user_ptr = -4096ULL;
|
||||||
@ -223,25 +232,25 @@ static bool create_userptr_require(void)
|
|||||||
if (errno == EFAULT) {
|
if (errno == EFAULT) {
|
||||||
igt_assert(posix_memalign((void **)&arg.user_ptr,
|
igt_assert(posix_memalign((void **)&arg.user_ptr,
|
||||||
4096, arg.user_size) == 0);
|
4096, arg.user_size) == 0);
|
||||||
found = drmIoctl(fd,
|
has_userptr = drmIoctl(fd,
|
||||||
LOCAL_IOCTL_I915_GEM_USERPTR,
|
LOCAL_IOCTL_I915_GEM_USERPTR,
|
||||||
&arg) == 0;
|
&arg) == 0;
|
||||||
free((void *)(uintptr_t)arg.user_ptr);
|
free((void *)(uintptr_t)arg.user_ptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
return found;
|
igt_require(has_userptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
static drm_intel_bo *
|
static drm_intel_bo *
|
||||||
userptr_create_bo(drm_intel_bufmgr *bufmgr, int width, int height)
|
userptr_create_bo(const struct buffers *b)
|
||||||
{
|
{
|
||||||
struct local_i915_gem_userptr userptr;
|
struct local_i915_gem_userptr userptr;
|
||||||
drm_intel_bo *bo;
|
drm_intel_bo *bo;
|
||||||
void *ptr;
|
void *ptr;
|
||||||
|
|
||||||
memset(&userptr, 0, sizeof(userptr));
|
memset(&userptr, 0, sizeof(userptr));
|
||||||
userptr.user_size = width * height * 4;
|
userptr.user_size = b->size * 4;
|
||||||
userptr.user_size = (userptr.user_size + 4095) & -4096;
|
userptr.user_size = (userptr.user_size + 4095) & -4096;
|
||||||
|
|
||||||
ptr = mmap(NULL, userptr.user_size,
|
ptr = mmap(NULL, userptr.user_size,
|
||||||
@ -250,7 +259,7 @@ userptr_create_bo(drm_intel_bufmgr *bufmgr, int width, int height)
|
|||||||
userptr.user_ptr = (uintptr_t)ptr;
|
userptr.user_ptr = (uintptr_t)ptr;
|
||||||
|
|
||||||
do_or_die(drmIoctl(fd, LOCAL_IOCTL_I915_GEM_USERPTR, &userptr));
|
do_or_die(drmIoctl(fd, LOCAL_IOCTL_I915_GEM_USERPTR, &userptr));
|
||||||
bo = gem_handle_to_libdrm_bo(bufmgr, fd, "userptr", userptr.handle);
|
bo = gem_handle_to_libdrm_bo(b->bufmgr, fd, "userptr", userptr.handle);
|
||||||
bo->virtual = (void *)(uintptr_t)userptr.user_ptr;
|
bo->virtual = (void *)(uintptr_t)userptr.user_ptr;
|
||||||
gem_close(fd, userptr.handle);
|
gem_close(fd, userptr.handle);
|
||||||
|
|
||||||
@ -292,10 +301,10 @@ userptr_release_bo(drm_intel_bo *bo)
|
|||||||
drm_intel_bo_unreference(bo);
|
drm_intel_bo_unreference(bo);
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool create_dmabuf_require(void)
|
static void create_dmabuf_require(const struct create *create)
|
||||||
{
|
{
|
||||||
static int found = -1;
|
static int has_dmabuf = -1;
|
||||||
if (found < 0) {
|
if (has_dmabuf < 0) {
|
||||||
struct drm_prime_handle args;
|
struct drm_prime_handle args;
|
||||||
void *ptr;
|
void *ptr;
|
||||||
|
|
||||||
@ -307,16 +316,16 @@ static bool create_dmabuf_require(void)
|
|||||||
drmIoctl(fd, DRM_IOCTL_PRIME_HANDLE_TO_FD, &args);
|
drmIoctl(fd, DRM_IOCTL_PRIME_HANDLE_TO_FD, &args);
|
||||||
gem_close(fd, args.handle);
|
gem_close(fd, args.handle);
|
||||||
|
|
||||||
found = 0;
|
has_dmabuf = 0;
|
||||||
ptr = mmap(NULL, 4096, PROT_READ, MAP_SHARED, args.fd, 0);
|
ptr = mmap(NULL, 4096, PROT_READ, MAP_SHARED, args.fd, 0);
|
||||||
if (ptr != MAP_FAILED) {
|
if (ptr != MAP_FAILED) {
|
||||||
found = 1;
|
has_dmabuf = 1;
|
||||||
munmap(ptr, 4096);
|
munmap(ptr, 4096);
|
||||||
}
|
}
|
||||||
|
|
||||||
close(args.fd);
|
close(args.fd);
|
||||||
}
|
}
|
||||||
return found;
|
igt_require(has_dmabuf);
|
||||||
}
|
}
|
||||||
|
|
||||||
struct dmabuf {
|
struct dmabuf {
|
||||||
@ -325,14 +334,14 @@ struct dmabuf {
|
|||||||
};
|
};
|
||||||
|
|
||||||
static drm_intel_bo *
|
static drm_intel_bo *
|
||||||
dmabuf_create_bo(drm_intel_bufmgr *bufmgr, int width, int height)
|
dmabuf_create_bo(const struct buffers *b)
|
||||||
{
|
{
|
||||||
struct drm_prime_handle args;
|
struct drm_prime_handle args;
|
||||||
drm_intel_bo *bo;
|
drm_intel_bo *bo;
|
||||||
struct dmabuf *dmabuf;
|
struct dmabuf *dmabuf;
|
||||||
int size;
|
int size;
|
||||||
|
|
||||||
size = 4*width*height;
|
size = 4*b->size;
|
||||||
size = (size + 4095) & -4096;
|
size = (size + 4095) & -4096;
|
||||||
|
|
||||||
memset(&args, 0, sizeof(args));
|
memset(&args, 0, sizeof(args));
|
||||||
@ -343,7 +352,7 @@ dmabuf_create_bo(drm_intel_bufmgr *bufmgr, int width, int height)
|
|||||||
do_ioctl(fd, DRM_IOCTL_PRIME_HANDLE_TO_FD, &args);
|
do_ioctl(fd, DRM_IOCTL_PRIME_HANDLE_TO_FD, &args);
|
||||||
gem_close(fd, args.handle);
|
gem_close(fd, args.handle);
|
||||||
|
|
||||||
bo = drm_intel_bo_gem_create_from_prime(bufmgr, args.fd, size);
|
bo = drm_intel_bo_gem_create_from_prime(b->bufmgr, args.fd, size);
|
||||||
igt_assert(bo);
|
igt_assert(bo);
|
||||||
|
|
||||||
dmabuf = malloc(sizeof(*dmabuf));
|
dmabuf = malloc(sizeof(*dmabuf));
|
||||||
@ -445,25 +454,25 @@ tile_bo(drm_intel_bo *bo, int width)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static drm_intel_bo *
|
static drm_intel_bo *
|
||||||
gtt_create_bo(drm_intel_bufmgr *bufmgr, int width, int height)
|
gtt_create_bo(const struct buffers *b)
|
||||||
{
|
{
|
||||||
return map_bo(unmapped_create_bo(bufmgr, width, height));
|
return map_bo(unmapped_create_bo(b));
|
||||||
}
|
}
|
||||||
|
|
||||||
static drm_intel_bo *
|
static drm_intel_bo *
|
||||||
gttX_create_bo(drm_intel_bufmgr *bufmgr, int width, int height)
|
gttX_create_bo(const struct buffers *b)
|
||||||
{
|
{
|
||||||
return tile_bo(gtt_create_bo(bufmgr, width, height), width);
|
return tile_bo(gtt_create_bo(b), b->width);
|
||||||
}
|
}
|
||||||
|
|
||||||
static drm_intel_bo *
|
static drm_intel_bo *
|
||||||
wc_create_bo(drm_intel_bufmgr *bufmgr, int width, int height)
|
wc_create_bo(const struct buffers *b)
|
||||||
{
|
{
|
||||||
drm_intel_bo *bo;
|
drm_intel_bo *bo;
|
||||||
|
|
||||||
gem_require_mmap_wc(fd);
|
gem_require_mmap_wc(fd);
|
||||||
|
|
||||||
bo = unmapped_create_bo(bufmgr, width, height);
|
bo = unmapped_create_bo(b);
|
||||||
bo->virtual = __gem_mmap__wc(fd, bo->handle, 0, bo->size, PROT_READ | PROT_WRITE);
|
bo->virtual = __gem_mmap__wc(fd, bo->handle, 0, bo->size, PROT_READ | PROT_WRITE);
|
||||||
return bo;
|
return bo;
|
||||||
}
|
}
|
||||||
@ -480,15 +489,15 @@ wc_release_bo(drm_intel_bo *bo)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static drm_intel_bo *
|
static drm_intel_bo *
|
||||||
gpu_create_bo(drm_intel_bufmgr *bufmgr, int width, int height)
|
gpu_create_bo(const struct buffers *b)
|
||||||
{
|
{
|
||||||
return unmapped_create_bo(bufmgr, width, height);
|
return unmapped_create_bo(b);
|
||||||
}
|
}
|
||||||
|
|
||||||
static drm_intel_bo *
|
static drm_intel_bo *
|
||||||
gpuX_create_bo(drm_intel_bufmgr *bufmgr, int width, int height)
|
gpuX_create_bo(const struct buffers *b)
|
||||||
{
|
{
|
||||||
return tile_bo(gpu_create_bo(bufmgr, width, height), width);
|
return tile_bo(gpu_create_bo(b), b->width);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -584,176 +593,189 @@ gpu_cmp_bo(struct buffers *b, drm_intel_bo *bo, uint32_t val)
|
|||||||
|
|
||||||
const struct access_mode {
|
const struct access_mode {
|
||||||
const char *name;
|
const char *name;
|
||||||
bool (*require)(void);
|
void (*require)(const struct create *);
|
||||||
|
drm_intel_bo *(*create_bo)(const struct buffers *b);
|
||||||
void (*set_bo)(struct buffers *b, drm_intel_bo *bo, uint32_t val);
|
void (*set_bo)(struct buffers *b, drm_intel_bo *bo, uint32_t val);
|
||||||
void (*cmp_bo)(struct buffers *b, drm_intel_bo *bo, uint32_t val);
|
void (*cmp_bo)(struct buffers *b, drm_intel_bo *bo, uint32_t val);
|
||||||
drm_intel_bo *(*create_bo)(drm_intel_bufmgr *bufmgr, int width, int height);
|
|
||||||
void (*release_bo)(drm_intel_bo *bo);
|
void (*release_bo)(drm_intel_bo *bo);
|
||||||
} access_modes[] = {
|
} access_modes[] = {
|
||||||
{
|
{
|
||||||
.name = "prw",
|
.name = "prw",
|
||||||
|
.create_bo = unmapped_create_bo,
|
||||||
.set_bo = prw_set_bo,
|
.set_bo = prw_set_bo,
|
||||||
.cmp_bo = prw_cmp_bo,
|
.cmp_bo = prw_cmp_bo,
|
||||||
.create_bo = unmapped_create_bo,
|
|
||||||
.release_bo = nop_release_bo,
|
.release_bo = nop_release_bo,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.name = "partial",
|
.name = "partial",
|
||||||
|
.create_bo = unmapped_create_bo,
|
||||||
.set_bo = partial_set_bo,
|
.set_bo = partial_set_bo,
|
||||||
.cmp_bo = partial_cmp_bo,
|
.cmp_bo = partial_cmp_bo,
|
||||||
.create_bo = unmapped_create_bo,
|
|
||||||
.release_bo = nop_release_bo,
|
.release_bo = nop_release_bo,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.name = "cpu",
|
.name = "cpu",
|
||||||
|
.create_bo = unmapped_create_bo,
|
||||||
.require = create_cpu_require,
|
.require = create_cpu_require,
|
||||||
.set_bo = cpu_set_bo,
|
.set_bo = cpu_set_bo,
|
||||||
.cmp_bo = cpu_cmp_bo,
|
.cmp_bo = cpu_cmp_bo,
|
||||||
.create_bo = unmapped_create_bo,
|
|
||||||
.release_bo = nop_release_bo,
|
.release_bo = nop_release_bo,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.name = "snoop",
|
.name = "snoop",
|
||||||
|
.create_bo = snoop_create_bo,
|
||||||
.require = create_snoop_require,
|
.require = create_snoop_require,
|
||||||
.set_bo = cpu_set_bo,
|
.set_bo = cpu_set_bo,
|
||||||
.cmp_bo = cpu_cmp_bo,
|
.cmp_bo = cpu_cmp_bo,
|
||||||
.create_bo = snoop_create_bo,
|
|
||||||
.release_bo = nop_release_bo,
|
.release_bo = nop_release_bo,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.name = "userptr",
|
.name = "userptr",
|
||||||
|
.create_bo = userptr_create_bo,
|
||||||
.require = create_userptr_require,
|
.require = create_userptr_require,
|
||||||
.set_bo = userptr_set_bo,
|
.set_bo = userptr_set_bo,
|
||||||
.cmp_bo = userptr_cmp_bo,
|
.cmp_bo = userptr_cmp_bo,
|
||||||
.create_bo = userptr_create_bo,
|
|
||||||
.release_bo = userptr_release_bo,
|
.release_bo = userptr_release_bo,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.name = "dmabuf",
|
.name = "dmabuf",
|
||||||
|
.create_bo = dmabuf_create_bo,
|
||||||
.require = create_dmabuf_require,
|
.require = create_dmabuf_require,
|
||||||
.set_bo = dmabuf_set_bo,
|
.set_bo = dmabuf_set_bo,
|
||||||
.cmp_bo = dmabuf_cmp_bo,
|
.cmp_bo = dmabuf_cmp_bo,
|
||||||
.create_bo = dmabuf_create_bo,
|
|
||||||
.release_bo = dmabuf_release_bo,
|
.release_bo = dmabuf_release_bo,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.name = "gtt",
|
.name = "gtt",
|
||||||
|
.create_bo = gtt_create_bo,
|
||||||
.set_bo = gtt_set_bo,
|
.set_bo = gtt_set_bo,
|
||||||
.cmp_bo = gtt_cmp_bo,
|
.cmp_bo = gtt_cmp_bo,
|
||||||
.create_bo = gtt_create_bo,
|
|
||||||
.release_bo = nop_release_bo,
|
.release_bo = nop_release_bo,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.name = "gttX",
|
.name = "gttX",
|
||||||
|
.create_bo = gttX_create_bo,
|
||||||
.set_bo = gtt_set_bo,
|
.set_bo = gtt_set_bo,
|
||||||
.cmp_bo = gtt_cmp_bo,
|
.cmp_bo = gtt_cmp_bo,
|
||||||
.create_bo = gttX_create_bo,
|
|
||||||
.release_bo = nop_release_bo,
|
.release_bo = nop_release_bo,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.name = "wc",
|
.name = "wc",
|
||||||
|
.create_bo = wc_create_bo,
|
||||||
.set_bo = gtt_set_bo,
|
.set_bo = gtt_set_bo,
|
||||||
.cmp_bo = gtt_cmp_bo,
|
.cmp_bo = gtt_cmp_bo,
|
||||||
.create_bo = wc_create_bo,
|
|
||||||
.release_bo = wc_release_bo,
|
.release_bo = wc_release_bo,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.name = "gpu",
|
.name = "gpu",
|
||||||
|
.create_bo = gpu_create_bo,
|
||||||
.set_bo = gpu_set_bo,
|
.set_bo = gpu_set_bo,
|
||||||
.cmp_bo = gpu_cmp_bo,
|
.cmp_bo = gpu_cmp_bo,
|
||||||
.create_bo = gpu_create_bo,
|
|
||||||
.release_bo = nop_release_bo,
|
.release_bo = nop_release_bo,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.name = "gpuX",
|
.name = "gpuX",
|
||||||
|
.create_bo = gpuX_create_bo,
|
||||||
.set_bo = gpu_set_bo,
|
.set_bo = gpu_set_bo,
|
||||||
.cmp_bo = gpu_cmp_bo,
|
.cmp_bo = gpu_cmp_bo,
|
||||||
.create_bo = gpuX_create_bo,
|
|
||||||
.release_bo = nop_release_bo,
|
.release_bo = nop_release_bo,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
igt_render_copyfunc_t rendercopy;
|
igt_render_copyfunc_t rendercopy;
|
||||||
|
|
||||||
static void buffers_init(struct buffers *data,
|
static void buffers_init(struct buffers *b,
|
||||||
|
const char *name,
|
||||||
|
const struct create *create,
|
||||||
const struct access_mode *mode,
|
const struct access_mode *mode,
|
||||||
int num_buffers,
|
int num_buffers,
|
||||||
int width, int height,
|
int width, int height,
|
||||||
|
unsigned allow_mem,
|
||||||
int _fd, int enable_reuse)
|
int _fd, int enable_reuse)
|
||||||
{
|
{
|
||||||
memset(data, 0, sizeof(*data));
|
igt_debug("%s: using 2x%d buffers, each 1MiB\n", name, num_buffers);
|
||||||
data->mode = mode;
|
|
||||||
data->num_buffers = num_buffers;
|
|
||||||
data->count = 0;
|
|
||||||
|
|
||||||
data->width = width;
|
memset(b, 0, sizeof(*b));
|
||||||
data->height = height;
|
b->name = name;
|
||||||
data->size = width * height;
|
b->create = create;
|
||||||
data->tmp = malloc(4*data->size);
|
b->mode = mode;
|
||||||
igt_assert(data->tmp);
|
b->num_buffers = num_buffers;
|
||||||
|
b->allow_mem = allow_mem;
|
||||||
|
b->count = 0;
|
||||||
|
|
||||||
data->bufmgr = drm_intel_bufmgr_gem_init(_fd, 4096);
|
b->width = width;
|
||||||
igt_assert(data->bufmgr);
|
b->height = height;
|
||||||
|
b->size = width * height;
|
||||||
|
b->tmp = malloc(4*b->size);
|
||||||
|
igt_assert(b->tmp);
|
||||||
|
|
||||||
data->src = malloc(2*sizeof(drm_intel_bo *)*num_buffers);
|
b->bufmgr = drm_intel_bufmgr_gem_init(_fd, 4096);
|
||||||
igt_assert(data->src);
|
igt_assert(b->bufmgr);
|
||||||
data->dst = data->src + num_buffers;
|
|
||||||
|
b->src = malloc(2*sizeof(drm_intel_bo *)*num_buffers);
|
||||||
|
igt_assert(b->src);
|
||||||
|
b->dst = b->src + num_buffers;
|
||||||
|
|
||||||
if (enable_reuse)
|
if (enable_reuse)
|
||||||
drm_intel_bufmgr_gem_enable_reuse(data->bufmgr);
|
drm_intel_bufmgr_gem_enable_reuse(b->bufmgr);
|
||||||
data->batch = intel_batchbuffer_alloc(data->bufmgr, devid);
|
b->batch = intel_batchbuffer_alloc(b->bufmgr, devid);
|
||||||
igt_assert(data->batch);
|
igt_assert(b->batch);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void buffers_destroy(struct buffers *data)
|
static void buffers_destroy(struct buffers *b)
|
||||||
{
|
{
|
||||||
int count = data->count;
|
int count = b->count;
|
||||||
if (count == 0)
|
if (count == 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
for (int i = 0; i < count; i++) {
|
for (int i = 0; i < count; i++) {
|
||||||
data->mode->release_bo(data->src[i]);
|
b->mode->release_bo(b->src[i]);
|
||||||
data->mode->release_bo(data->dst[i]);
|
b->mode->release_bo(b->dst[i]);
|
||||||
}
|
}
|
||||||
nop_release_bo(data->snoop);
|
nop_release_bo(b->snoop);
|
||||||
data->mode->release_bo(data->spare);
|
b->mode->release_bo(b->spare);
|
||||||
data->count = 0;
|
b->count = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void buffers_create(struct buffers *data)
|
static void buffers_create(struct buffers *b)
|
||||||
{
|
{
|
||||||
int count = data->num_buffers;
|
int count = b->num_buffers;
|
||||||
int width = data->width, height = data->height;
|
igt_assert(b->bufmgr);
|
||||||
igt_assert(data->bufmgr);
|
|
||||||
|
|
||||||
buffers_destroy(data);
|
if (b->create->require)
|
||||||
igt_assert(data->count == 0);
|
b->create->require(b->create);
|
||||||
|
|
||||||
|
if (b->mode->require)
|
||||||
|
b->mode->require(b->create);
|
||||||
|
|
||||||
|
intel_require_memory(2*count, 4*b->size, b->allow_mem);
|
||||||
|
|
||||||
|
buffers_destroy(b);
|
||||||
|
igt_assert(b->count == 0);
|
||||||
|
|
||||||
for (int i = 0; i < count; i++) {
|
for (int i = 0; i < count; i++) {
|
||||||
data->src[i] =
|
b->src[i] = b->mode->create_bo(b);
|
||||||
data->mode->create_bo(data->bufmgr, width, height);
|
b->dst[i] = b->mode->create_bo(b);
|
||||||
data->dst[i] =
|
|
||||||
data->mode->create_bo(data->bufmgr, width, height);
|
|
||||||
}
|
}
|
||||||
data->spare = data->mode->create_bo(data->bufmgr, width, height);
|
b->spare = b->mode->create_bo(b);
|
||||||
data->snoop = snoop_create_bo(data->bufmgr, width, height);
|
b->snoop = snoop_create_bo(b);
|
||||||
data->count = count;
|
b->count = count;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void buffers_fini(struct buffers *data)
|
static void buffers_fini(struct buffers *b)
|
||||||
{
|
{
|
||||||
if (data->bufmgr == NULL)
|
if (b->bufmgr == NULL)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
buffers_destroy(data);
|
buffers_destroy(b);
|
||||||
|
|
||||||
free(data->tmp);
|
free(b->tmp);
|
||||||
free(data->src);
|
free(b->src);
|
||||||
|
|
||||||
intel_batchbuffer_free(data->batch);
|
intel_batchbuffer_free(b->batch);
|
||||||
drm_intel_bufmgr_destroy(data->bufmgr);
|
drm_intel_bufmgr_destroy(b->bufmgr);
|
||||||
|
|
||||||
memset(data, 0, sizeof(*data));
|
memset(b, 0, sizeof(*b));
|
||||||
}
|
}
|
||||||
|
|
||||||
typedef void (*do_copy)(struct buffers *b, drm_intel_bo *dst, drm_intel_bo *src);
|
typedef void (*do_copy)(struct buffers *b, drm_intel_bo *dst, drm_intel_bo *src);
|
||||||
@ -1224,7 +1246,8 @@ static void run_interruptible(struct buffers *buffers,
|
|||||||
do_copy do_copy_func,
|
do_copy do_copy_func,
|
||||||
do_hang do_hang_func)
|
do_hang do_hang_func)
|
||||||
{
|
{
|
||||||
for (pass = 0; pass < 10; pass++)
|
struct timespec start = {};
|
||||||
|
while (igt_seconds_elapsed(&start) < 10)
|
||||||
do_test_func(buffers, do_copy_func, do_hang_func);
|
do_test_func(buffers, do_copy_func, do_hang_func);
|
||||||
pass = 0;
|
pass = 0;
|
||||||
igt_assert_eq(intel_detect_and_clear_missed_interrupts(fd), 0);
|
igt_assert_eq(intel_detect_and_clear_missed_interrupts(fd), 0);
|
||||||
@ -1261,8 +1284,11 @@ static void __run_forked(struct buffers *buffers,
|
|||||||
igt_fork(child, num_children) {
|
igt_fork(child, num_children) {
|
||||||
/* recreate process local variables */
|
/* recreate process local variables */
|
||||||
fd = drm_open_driver(DRIVER_INTEL);
|
fd = drm_open_driver(DRIVER_INTEL);
|
||||||
buffers_init(buffers, buffers->mode, _num_buffers,
|
buffers_init(buffers, buffers->name,
|
||||||
|
buffers->create, buffers->mode,
|
||||||
|
_num_buffers,
|
||||||
buffers->width, buffers->height,
|
buffers->width, buffers->height,
|
||||||
|
buffers->allow_mem,
|
||||||
fd, true);
|
fd, true);
|
||||||
|
|
||||||
buffers_create(buffers);
|
buffers_create(buffers);
|
||||||
@ -1338,8 +1364,10 @@ static void rcs_require(void)
|
|||||||
|
|
||||||
static void
|
static void
|
||||||
run_basic_modes(const char *prefix,
|
run_basic_modes(const char *prefix,
|
||||||
|
const struct create *create,
|
||||||
const struct access_mode *mode,
|
const struct access_mode *mode,
|
||||||
const int num_buffers,
|
const int num_buffers,
|
||||||
|
const unsigned allow_mem,
|
||||||
const char *suffix,
|
const char *suffix,
|
||||||
run_wrap run_wrap_func)
|
run_wrap run_wrap_func)
|
||||||
{
|
{
|
||||||
@ -1373,8 +1401,9 @@ run_basic_modes(const char *prefix,
|
|||||||
struct buffers buffers;
|
struct buffers buffers;
|
||||||
|
|
||||||
igt_fixture
|
igt_fixture
|
||||||
buffers_init(&buffers, mode, num_buffers,
|
buffers_init(&buffers, prefix, create, mode,
|
||||||
512, 512, fd,
|
num_buffers, 512, 512, allow_mem,
|
||||||
|
fd,
|
||||||
run_wrap_func != run_child);
|
run_wrap_func != run_child);
|
||||||
|
|
||||||
igt_subtest_f("%s-%s-%s-sanitycheck0%s%s", prefix, mode->name, p->prefix, suffix, h->suffix) {
|
igt_subtest_f("%s-%s-%s-sanitycheck0%s%s", prefix, mode->name, p->prefix, suffix, h->suffix) {
|
||||||
@ -1526,43 +1555,36 @@ run_basic_modes(const char *prefix,
|
|||||||
|
|
||||||
static void
|
static void
|
||||||
run_modes(const char *style,
|
run_modes(const char *style,
|
||||||
|
const struct create *create,
|
||||||
const struct access_mode *mode,
|
const struct access_mode *mode,
|
||||||
const int num_buffers,
|
const int num_buffers,
|
||||||
unsigned allow_mem)
|
unsigned allow_mem)
|
||||||
{
|
{
|
||||||
if (!igt_only_list_subtests()) {
|
run_basic_modes(style, create, mode, num_buffers, allow_mem,
|
||||||
if (mode->require && !mode->require())
|
"", run_single);
|
||||||
return;
|
run_basic_modes(style, create, mode, num_buffers, allow_mem,
|
||||||
|
"-child", run_child);
|
||||||
igt_debug("%s: using 2x%d buffers, each 1MiB\n",
|
run_basic_modes(style, create, mode, num_buffers, allow_mem,
|
||||||
style, num_buffers);
|
"-forked", run_forked);
|
||||||
if (!__intel_check_memory(2*num_buffers, 1024*1024, allow_mem,
|
|
||||||
NULL, NULL))
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
run_basic_modes(style, mode, num_buffers, "", run_single);
|
|
||||||
run_basic_modes(style, mode, num_buffers, "-child", run_child);
|
|
||||||
run_basic_modes(style, mode, num_buffers, "-forked", run_forked);
|
|
||||||
|
|
||||||
igt_fork_signal_helper();
|
igt_fork_signal_helper();
|
||||||
run_basic_modes(style, mode, num_buffers,
|
run_basic_modes(style, create, mode, num_buffers, allow_mem,
|
||||||
"-interruptible", run_interruptible);
|
"-interruptible", run_interruptible);
|
||||||
run_basic_modes(style, mode, num_buffers,
|
run_basic_modes(style, create, mode, num_buffers, allow_mem,
|
||||||
"-bomb", run_bomb);
|
"-bomb", run_bomb);
|
||||||
igt_stop_signal_helper();
|
igt_stop_signal_helper();
|
||||||
}
|
}
|
||||||
|
|
||||||
igt_main
|
igt_main
|
||||||
{
|
{
|
||||||
const struct {
|
const struct create create[] = {
|
||||||
const char *name;
|
{ "", can_create_normal, create_normal_bo},
|
||||||
drm_intel_bo *(*create)(drm_intel_bufmgr *, uint64_t size);
|
#if HAVE_CREATE_PRIVATE
|
||||||
bool (*require)(void);
|
{ "private-", can_create_private, create_private_bo},
|
||||||
} create[] = {
|
#endif
|
||||||
{ "", create_normal_bo, can_create_normal},
|
#if HAVE_CREATE_STOLEN
|
||||||
{ "private-", create_private_bo, can_create_private },
|
{ "stolen-", can_create_stolen, create_stolen_bo},
|
||||||
{ "stolen-", create_stolen_bo, can_create_stolen },
|
#endif
|
||||||
{ NULL, NULL }
|
{ NULL, NULL }
|
||||||
}, *c;
|
}, *c;
|
||||||
uint64_t pin_sz = 0;
|
uint64_t pin_sz = 0;
|
||||||
@ -1586,54 +1608,47 @@ igt_main
|
|||||||
for (c = create; c->name; c++) {
|
for (c = create; c->name; c++) {
|
||||||
char name[80];
|
char name[80];
|
||||||
|
|
||||||
create_func = c->create;
|
|
||||||
|
|
||||||
num_buffers = MIN_BUFFERS;
|
num_buffers = MIN_BUFFERS;
|
||||||
if (c->require()) {
|
snprintf(name, sizeof(name), "%s%s", c->name, "tiny");
|
||||||
snprintf(name, sizeof(name), "%s%s", c->name, "tiny");
|
for (i = 0; i < ARRAY_SIZE(access_modes); i++)
|
||||||
for (i = 0; i < ARRAY_SIZE(access_modes); i++)
|
run_modes(name, c, &access_modes[i],
|
||||||
run_modes(name, &access_modes[i], num_buffers, CHECK_RAM);
|
num_buffers, CHECK_RAM);
|
||||||
}
|
|
||||||
|
|
||||||
igt_fixture {
|
igt_fixture {
|
||||||
num_buffers = gem_mappable_aperture_size() / (1024 * 1024) / 4;
|
num_buffers = gem_mappable_aperture_size() / (1024 * 1024) / 4;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (c->require()) {
|
snprintf(name, sizeof(name), "%s%s", c->name, "small");
|
||||||
snprintf(name, sizeof(name), "%s%s", c->name, "small");
|
for (i = 0; i < ARRAY_SIZE(access_modes); i++)
|
||||||
for (i = 0; i < ARRAY_SIZE(access_modes); i++)
|
run_modes(name, c, &access_modes[i],
|
||||||
run_modes(name, &access_modes[i], num_buffers, CHECK_RAM);
|
num_buffers, CHECK_RAM);
|
||||||
}
|
|
||||||
|
|
||||||
igt_fixture {
|
igt_fixture {
|
||||||
num_buffers = gem_mappable_aperture_size() / (1024 * 1024);
|
num_buffers = gem_mappable_aperture_size() / (1024 * 1024);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (c->require()) {
|
snprintf(name, sizeof(name), "%s%s", c->name, "thrash");
|
||||||
snprintf(name, sizeof(name), "%s%s", c->name, "thrash");
|
for (i = 0; i < ARRAY_SIZE(access_modes); i++)
|
||||||
for (i = 0; i < ARRAY_SIZE(access_modes); i++)
|
run_modes(name, c, &access_modes[i],
|
||||||
run_modes(name, &access_modes[i], num_buffers, CHECK_RAM);
|
num_buffers, CHECK_RAM);
|
||||||
}
|
|
||||||
|
|
||||||
igt_fixture {
|
igt_fixture {
|
||||||
num_buffers = gem_global_aperture_size(fd) / (1024 * 1024);
|
num_buffers = gem_global_aperture_size(fd) / (1024 * 1024);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (c->require()) {
|
snprintf(name, sizeof(name), "%s%s", c->name, "global");
|
||||||
snprintf(name, sizeof(name), "%s%s", c->name, "global");
|
for (i = 0; i < ARRAY_SIZE(access_modes); i++)
|
||||||
for (i = 0; i < ARRAY_SIZE(access_modes); i++)
|
run_modes(name, c, &access_modes[i],
|
||||||
run_modes(name, &access_modes[i], num_buffers, CHECK_RAM);
|
num_buffers, CHECK_RAM);
|
||||||
}
|
|
||||||
|
|
||||||
igt_fixture {
|
igt_fixture {
|
||||||
num_buffers = gem_aperture_size(fd) / (1024 * 1024);
|
num_buffers = gem_aperture_size(fd) / (1024 * 1024);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (c->require()) {
|
snprintf(name, sizeof(name), "%s%s", c->name, "full");
|
||||||
snprintf(name, sizeof(name), "%s%s", c->name, "full");
|
for (i = 0; i < ARRAY_SIZE(access_modes); i++)
|
||||||
for (i = 0; i < ARRAY_SIZE(access_modes); i++)
|
run_modes(name, c, &access_modes[i],
|
||||||
run_modes(name, &access_modes[i], num_buffers, CHECK_RAM);
|
num_buffers, CHECK_RAM);
|
||||||
}
|
|
||||||
|
|
||||||
igt_fixture {
|
igt_fixture {
|
||||||
num_buffers = gem_mappable_aperture_size() / (1024 * 1024);
|
num_buffers = gem_mappable_aperture_size() / (1024 * 1024);
|
||||||
@ -1651,11 +1666,10 @@ igt_main
|
|||||||
igt_require(pinned);
|
igt_require(pinned);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (c->require()) {
|
snprintf(name, sizeof(name), "%s%s", c->name, "swap");
|
||||||
snprintf(name, sizeof(name), "%s%s", c->name, "swap");
|
for (i = 0; i < ARRAY_SIZE(access_modes); i++)
|
||||||
for (i = 0; i < ARRAY_SIZE(access_modes); i++)
|
run_modes(name, c, &access_modes[i],
|
||||||
run_modes(name, &access_modes[i], num_buffers, CHECK_RAM | CHECK_SWAP);
|
num_buffers, CHECK_RAM | CHECK_SWAP);
|
||||||
}
|
|
||||||
|
|
||||||
igt_fixture {
|
igt_fixture {
|
||||||
if (pinned) {
|
if (pinned) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user