X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=exynos.c;h=0d935ebf13cce5f93e5d8239d22f278d06c548ca;hb=4b5d0bf2ab4da0f475f01575fb369b7eb9415d7c;hp=2b1fa362745d6c86a86566f81f60410de706a205;hpb=7a755de4f3d105f50a6c8ba25c74ff8e97653159;p=android-x86%2Fexternal-minigbm.git diff --git a/exynos.c b/exynos.c index 2b1fa36..0d935eb 100644 --- a/exynos.c +++ b/exynos.c @@ -6,33 +6,41 @@ #ifdef DRV_EXYNOS +// clang-format off #include #include #include #include #include #include +// clang-format on #include "drv_priv.h" #include "helpers.h" #include "util.h" -static struct supported_combination combos[5] = { - {DRM_FORMAT_ARGB8888, DRM_FORMAT_MOD_NONE, BO_USE_CURSOR | BO_USE_LINEAR}, - {DRM_FORMAT_ARGB8888, DRM_FORMAT_MOD_NONE, BO_USE_RENDERING}, - {DRM_FORMAT_NV12, DRM_FORMAT_MOD_NONE, BO_USE_RENDERING}, - {DRM_FORMAT_XRGB8888, DRM_FORMAT_MOD_NONE, BO_USE_CURSOR | BO_USE_LINEAR}, - {DRM_FORMAT_XRGB8888, DRM_FORMAT_MOD_NONE, BO_USE_RENDERING}, -}; +static const uint32_t render_target_formats[] = { DRM_FORMAT_ARGB8888, DRM_FORMAT_XRGB8888 }; + +static const uint32_t texture_source_formats[] = { DRM_FORMAT_NV12 }; static int exynos_init(struct driver *drv) { - drv_insert_combinations(drv, combos, ARRAY_SIZE(combos)); - return drv_add_kms_flags(drv); + int ret; + ret = drv_add_combinations(drv, render_target_formats, ARRAY_SIZE(render_target_formats), + &LINEAR_METADATA, BO_USE_RENDER_MASK); + if (ret) + return ret; + + ret = drv_add_combinations(drv, texture_source_formats, ARRAY_SIZE(texture_source_formats), + &LINEAR_METADATA, BO_USE_TEXTURE_MASK); + if (ret) + return ret; + + return drv_modify_linear_combinations(drv); } -static int exynos_bo_create(struct bo *bo, uint32_t width, uint32_t height, - uint32_t format, uint32_t flags) +static int exynos_bo_create(struct bo *bo, uint32_t width, uint32_t height, uint32_t format, + uint32_t flags) { size_t plane; @@ -69,8 +77,8 @@ static int exynos_bo_create(struct bo *bo, uint32_t width, uint32_t height, ret = drmIoctl(bo->drv->fd, DRM_IOCTL_EXYNOS_GEM_CREATE, &gem_create); if (ret) { - fprintf(stderr, "drv: DRM_IOCTL_EXYNOS_GEM_CREATE failed " - "(size=%zu)\n", size); + fprintf(stderr, "drv: DRM_IOCTL_EXYNOS_GEM_CREATE failed (size=%zu)\n", + size); goto cleanup_planes; } @@ -80,16 +88,13 @@ static int exynos_bo_create(struct bo *bo, uint32_t width, uint32_t height, return 0; cleanup_planes: - for ( ; plane != 0; plane--) { + for (; plane != 0; plane--) { struct drm_gem_close gem_close; memset(&gem_close, 0, sizeof(gem_close)); gem_close.handle = bo->handles[plane - 1].u32; - int gem_close_ret = drmIoctl(bo->drv->fd, DRM_IOCTL_GEM_CLOSE, - &gem_close); + int gem_close_ret = drmIoctl(bo->drv->fd, DRM_IOCTL_GEM_CLOSE, &gem_close); if (gem_close_ret) { - fprintf(stderr, - "drv: DRM_IOCTL_GEM_CLOSE failed: %d\n", - gem_close_ret); + fprintf(stderr, "drv: DRM_IOCTL_GEM_CLOSE failed: %d\n", gem_close_ret); } } @@ -100,12 +105,12 @@ cleanup_planes: * Use dumb mapping with exynos even though a GEM buffer is created. * libdrm does the same thing in exynos_drm.c */ -struct backend backend_exynos = -{ +struct backend backend_exynos = { .name = "exynos", .init = exynos_init, .bo_create = exynos_bo_create, .bo_destroy = drv_gem_bo_destroy, + .bo_import = drv_prime_bo_import, .bo_map = drv_dumb_bo_map, };