#include <assert.h>
#include <errno.h>
-#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
return DRM_FORMAT_MOD_LINEAR;
}
+
+/*
+ * Search a list of modifiers to see if a given modifier is present
+ */
+bool drv_has_modifier(const uint64_t *list, uint32_t count, uint64_t modifier)
+{
+ uint32_t i;
+ for (i = 0; i < count; i++)
+ if (list[i] == modifier)
+ return true;
+
+ return false;
+}
#ifndef HELPERS_H
#define HELPERS_H
+#include <stdbool.h>
+
#include "drv.h"
#include "helpers_array.h"
int drv_modify_linear_combinations(struct driver *drv);
uint64_t drv_pick_modifier(const uint64_t *modifiers, uint32_t count,
const uint64_t *modifier_order, uint32_t order_count);
+bool drv_has_modifier(const uint64_t *list, uint32_t count, uint64_t modifier);
#endif
return drv_modify_linear_combinations(drv);
}
-static int mediatek_bo_create(struct bo *bo, uint32_t width, uint32_t height, uint32_t format,
- uint64_t use_flags)
+static int mediatek_bo_create_with_modifiers(struct bo *bo, uint32_t width, uint32_t height,
+ uint32_t format, const uint64_t *modifiers,
+ uint32_t count)
{
int ret;
size_t plane;
uint32_t stride;
struct drm_mtk_gem_create gem_create;
+ if (!drv_has_modifier(modifiers, count, DRM_FORMAT_MOD_LINEAR)) {
+ errno = EINVAL;
+ drv_log("no usable modifier found\n");
+ return -EINVAL;
+ }
+
/*
* Since the ARM L1 cache line size is 64 bytes, align to that as a
* performance optimization.
return 0;
}
+static int mediatek_bo_create(struct bo *bo, uint32_t width, uint32_t height, uint32_t format,
+ uint64_t use_flags)
+{
+ uint64_t modifiers[] = { DRM_FORMAT_MOD_LINEAR };
+ return mediatek_bo_create_with_modifiers(bo, width, height, format, modifiers,
+ ARRAY_SIZE(modifiers));
+}
+
static void *mediatek_bo_map(struct bo *bo, struct vma *vma, size_t plane, uint32_t map_flags)
{
int ret, prime_fd;
.name = "mediatek",
.init = mediatek_init,
.bo_create = mediatek_bo_create,
+ .bo_create_with_modifiers = mediatek_bo_create_with_modifiers,
.bo_destroy = drv_gem_bo_destroy,
.bo_import = drv_prime_bo_import,
.bo_map = mediatek_bo_map,
#include <errno.h>
#include <rockchip_drm.h>
-#include <stdbool.h>
#include <stdio.h>
#include <string.h>
#include <sys/mman.h>
return 0;
}
-static bool has_modifier(const uint64_t *list, uint32_t count, uint64_t modifier)
-{
- uint32_t i;
- for (i = 0; i < count; i++)
- if (list[i] == modifier)
- return true;
-
- return false;
-}
-
static int rockchip_bo_create_with_modifiers(struct bo *bo, uint32_t width, uint32_t height,
uint32_t format, const uint64_t *modifiers,
uint32_t count)
drv_bo_from_format(bo, aligned_width, height, format);
bo->total_size = bo->strides[0] * aligned_height + w_mbs * h_mbs * 128;
} else if (width <= 2560 &&
- has_modifier(modifiers, count, DRM_FORMAT_MOD_CHROMEOS_ROCKCHIP_AFBC)) {
+ drv_has_modifier(modifiers, count, DRM_FORMAT_MOD_CHROMEOS_ROCKCHIP_AFBC)) {
/* If the caller has decided they can use AFBC, always
* pick that */
afbc_bo_from_format(bo, width, height, format);
} else {
- if (!has_modifier(modifiers, count, DRM_FORMAT_MOD_LINEAR)) {
+ if (!drv_has_modifier(modifiers, count, DRM_FORMAT_MOD_LINEAR)) {
errno = EINVAL;
drv_log("no usable modifier found\n");
return -1;