summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Kocialkowski <paul.kocialkowski@bootlin.com>2019-02-20 16:11:16 +0100
committerPaul Kocialkowski <paul.kocialkowski@bootlin.com>2019-02-26 09:45:54 +0100
commit9e0c839821cec85e38f9ddb719e134759e892b0a (patch)
treee1118c8895dae7ad33b200e8d2e193792f590425
parente1092cb8a1f6f0b92bb5867e2c87e141c13b8178 (diff)
lib/igt_fb: Refactor create_bo_for_fb to prepare for VC4 support
The current create_bo_for_fb uses a device-specific BO instead of dumb allocation when dumb allocation is not appropriate and the driver is Intel. Then, it will assert that the parameters are appropriate for dumb allocation. The conditions related to tiling, size and stride are sufficient for needing a device-specific BO and they are not specific to Intel. However, a device-specific BO for YUV is only needed for Intel. Change the conditions accordingly and set a device_bo variable. This variable allows making fb->size calculation common between the device-specific and dumb paths. Use the variable after that and distinguish between the device types for allocating and error out if it's not supported. This makes the extra checks that dumb allocation is valid redundant, since these cases will always fall under device-specific allocation and potentially error out then. Signed-off-by: Paul Kocialkowski <paul.kocialkowski@bootlin.com> Reviewed-by: Maxime Ripard <maxime.ripard@bootlin.com> Reviewed-by: Lyude Paul <lyude@redhat.com>
-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 058cfab6..1178dddf 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);