summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/igt_fb.c45
1 files changed, 25 insertions, 20 deletions
diff --git a/lib/igt_fb.c b/lib/igt_fb.c
index 058cfab60..1178dddf2 100644
--- a/lib/igt_fb.c
+++ b/lib/igt_fb.c
@@ -610,36 +610,41 @@ static int create_bo_for_fb(struct igt_fb *fb)
unsigned int bpp = 0;
unsigned int plane;
unsigned *strides = &fb->strides[0];
+ bool device_bo = false;
int fd = fb->fd;
+ uint64_t size;
- if (is_i915_device(fd) &&
- (fb->tiling || fb->size || fb->strides[0] || igt_format_is_yuv(fb->drm_format))) {
- uint64_t size;
+ /*
+ * The current dumb buffer allocation API doesn't really allow to
+ * specify a custom size or stride. Yet the caller is free to specify
+ * them, so we need to make sure to use a device BO then.
+ */
+ if (fb->tiling || fb->size || fb->strides[0] ||
+ (is_i915_device(fd) && igt_format_is_yuv(fb->drm_format)))
+ device_bo = true;
- size = calc_fb_size(fb);
+ /* Sets offets and stride if necessary. */
+ size = calc_fb_size(fb);
- /* respect the size requested by the caller */
- if (fb->size == 0)
- fb->size = size;
+ /* Respect the size requested by the caller. */
+ if (fb->size == 0)
+ fb->size = size;
+ if (device_bo) {
fb->is_dumb = false;
- fb->gem_handle = gem_create(fd, fb->size);
- gem_set_tiling(fd, fb->gem_handle,
- igt_fb_mod_to_tiling(fb->tiling),
- fb->strides[0]);
+
+ if (is_i915_device(fd)) {
+ fb->gem_handle = gem_create(fd, fb->size);
+ gem_set_tiling(fd, fb->gem_handle,
+ igt_fb_mod_to_tiling(fb->tiling),
+ fb->strides[0]);
+ } else {
+ igt_assert(false);
+ }
goto out;
}
- /*
- * The current dumb buffer allocation API doesn't really allow to
- * specify a custom size or stride. Yet the caller is free to specify
- * them, so we need to make sure to error out in this case.
- */
- igt_assert(fb->size == 0);
- igt_assert(fb->strides[0] == 0);
-
- fb->size = calc_fb_size(fb);
for (plane = 0; plane < fb->num_planes; plane++)
bpp += DIV_ROUND_UP(fb->plane_bpp[plane],
plane ? fmt->hsub * fmt->vsub : 1);