diff options
author | Laurent Pinchart <laurent.pinchart@ideasonboard.com> | 2014-12-09 22:00:58 +0200 |
---|---|---|
committer | Laurent Pinchart <laurent.pinchart@ideasonboard.com> | 2015-01-11 14:37:53 +0200 |
commit | d7c0a08bc576deb07df6c3f91f393ca8edd0c4bf (patch) | |
tree | 8655e690adaeb888110ef392abf799c3217871e2 /tests/modetest/modetest.c | |
parent | 566c3ce877a4be72697e15cdfc421ce965f7c37d (diff) |
modetest: Allocate dumb buffers with the correct bpp
The modetest application uses libkms to allocate dumb buffers, leading
to overallocation due to the hardcoded 32 bpp value. This can even cause
failures in drivers when the resulting pitch is too large for the
hardware to handle and gets rejected by the driver when creating the
frame buffer.
Fix this by computing the required bpp value and allocating dumb buffers
directly without going through libkms.
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Diffstat (limited to 'tests/modetest/modetest.c')
-rw-r--r-- | tests/modetest/modetest.c | 45 |
1 files changed, 21 insertions, 24 deletions
diff --git a/tests/modetest/modetest.c b/tests/modetest/modetest.c index 2c9a17a1..4b9cf2f5 100644 --- a/tests/modetest/modetest.c +++ b/tests/modetest/modetest.c @@ -57,7 +57,6 @@ #include "xf86drm.h" #include "xf86drmMode.h" #include "drm_fourcc.h" -#include "libkms.h" #include "buffers.h" #include "cursor.h" @@ -104,14 +103,13 @@ struct device { int fd; struct resources *resources; - struct kms_driver *kms; struct { unsigned int width; unsigned int height; unsigned int fb_id; - struct kms_bo *bo; + struct bo *bo; } mode; }; @@ -968,7 +966,7 @@ static int set_plane(struct device *dev, struct plane_arg *p) drmModePlane *ovr; uint32_t handles[4], pitches[4], offsets[4] = {0}; /* we only use [0] */ uint32_t plane_id = 0; - struct kms_bo *plane_bo; + struct bo *plane_bo; uint32_t plane_flags = 0; int crtc_x, crtc_y, crtc_w, crtc_h; struct crtc *crtc = NULL; @@ -1009,8 +1007,8 @@ static int set_plane(struct device *dev, struct plane_arg *p) fprintf(stderr, "testing %dx%d@%s overlay plane %u\n", p->w, p->h, p->format_str, plane_id); - plane_bo = create_test_buffer(dev->kms, p->fourcc, p->w, p->h, handles, - pitches, offsets, PATTERN_TILES); + plane_bo = bo_create(dev->fd, p->fourcc, p->w, p->h, handles, + pitches, offsets, PATTERN_TILES); if (plane_bo == NULL) return -1; @@ -1050,7 +1048,7 @@ static void set_mode(struct device *dev, struct pipe_arg *pipes, unsigned int co { uint32_t handles[4], pitches[4], offsets[4] = {0}; /* we only use [0] */ unsigned int fb_id; - struct kms_bo *bo; + struct bo *bo; unsigned int i; unsigned int j; int ret, x; @@ -1070,9 +1068,8 @@ static void set_mode(struct device *dev, struct pipe_arg *pipes, unsigned int co dev->mode.height = pipe->mode->vdisplay; } - bo = create_test_buffer(dev->kms, pipes[0].fourcc, - dev->mode.width, dev->mode.height, - handles, pitches, offsets, PATTERN_SMPTE); + bo = bo_create(dev->fd, pipes[0].fourcc, dev->mode.width, dev->mode.height, + handles, pitches, offsets, PATTERN_SMPTE); if (bo == NULL) return; @@ -1129,7 +1126,7 @@ static void set_planes(struct device *dev, struct plane_arg *p, unsigned int cou static void set_cursors(struct device *dev, struct pipe_arg *pipes, unsigned int count) { uint32_t handles[4], pitches[4], offsets[4] = {0}; /* we only use [0] */ - struct kms_bo *bo; + struct bo *bo; unsigned int i; int ret; @@ -1140,8 +1137,8 @@ static void set_cursors(struct device *dev, struct pipe_arg *pipes, unsigned int /* create cursor bo.. just using PATTERN_PLAIN as it has * translucent alpha */ - bo = create_test_buffer(dev->kms, DRM_FORMAT_ARGB8888, - cw, ch, handles, pitches, offsets, PATTERN_PLAIN); + bo = bo_create(dev->fd, DRM_FORMAT_ARGB8888, cw, ch, handles, pitches, + offsets, PATTERN_PLAIN); if (bo == NULL) return; @@ -1170,14 +1167,14 @@ static void test_page_flip(struct device *dev, struct pipe_arg *pipes, unsigned { uint32_t handles[4], pitches[4], offsets[4] = {0}; /* we only use [0] */ unsigned int other_fb_id; - struct kms_bo *other_bo; + struct bo *other_bo; drmEventContext evctx; unsigned int i; int ret; - other_bo = create_test_buffer(dev->kms, pipes[0].fourcc, - dev->mode.width, dev->mode.height, - handles, pitches, offsets, PATTERN_PLAIN); + other_bo = bo_create(dev->fd, pipes[0].fourcc, + dev->mode.width, dev->mode.height, + handles, pitches, offsets, PATTERN_PLAIN); if (other_bo == NULL) return; @@ -1252,7 +1249,7 @@ static void test_page_flip(struct device *dev, struct pipe_arg *pipes, unsigned drmHandleEvent(dev->fd, &evctx); } - kms_bo_destroy(&other_bo); + bo_destroy(other_bo); } #define min(a, b) ((a) < (b) ? (a) : (b)) @@ -1611,10 +1608,11 @@ int main(int argc, char **argv) set_property(&dev, &prop_args[i]); if (count || plane_count) { - ret = kms_create(dev.fd, &dev.kms); - if (ret) { - fprintf(stderr, "failed to create kms driver: %s\n", - strerror(-ret)); + uint64_t cap = 0; + + ret = drmGetCap(dev.fd, DRM_CAP_DUMB_BUFFER, &cap); + if (ret || cap == 0) { + fprintf(stderr, "driver doesn't support the dumb buffer API\n"); return 1; } @@ -1638,8 +1636,7 @@ int main(int argc, char **argv) if (test_cursor) clear_cursors(&dev); - kms_bo_destroy(&dev.mode.bo); - kms_destroy(&dev.kms); + bo_destroy(dev.mode.bo); } free_resources(dev.resources); |