Handle has some limits and can't be used as unique buffer ID on systems where display controller can scanout from CMA but GPU can work with both CMA and VRAM. Such systems have DRM/KMS and DRM/GPU drivers separated. GBM frontend is always expecting handle for DRM/KMS driver. In such system any attempt of importing the buffer with more than 1 contiguous chunk into DRM/KMS driver will fail. Using dma-buf inode as unique buffer ID is a common practice for a last several years starting from [this kernel patch][1]. [1]: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=ed63bb1d1f8469586006a9ca63c42344401aa2ab Change-Id: Ic3a69010d5da2f866a2252fc7e9eb29d67f8e1ed Signed-off-by: Roman Stratiienko <r.stratiienko@gmail.com>
145 lines
4.8 KiB
C
145 lines
4.8 KiB
C
/*
|
|
* Copyright 2016 The Chromium OS Authors. All rights reserved.
|
|
* Use of this source code is governed by a BSD-style license that can be
|
|
* found in the LICENSE file.
|
|
*/
|
|
|
|
#ifndef DRV_PRIV_H
|
|
#define DRV_PRIV_H
|
|
|
|
#include <pthread.h>
|
|
#include <stdbool.h>
|
|
#include <stdint.h>
|
|
#include <stdlib.h>
|
|
#include <sys/types.h>
|
|
|
|
#include "drv.h"
|
|
|
|
struct bo_metadata {
|
|
uint32_t width;
|
|
uint32_t height;
|
|
uint32_t format;
|
|
uint32_t tiling;
|
|
size_t num_planes;
|
|
uint32_t offsets[DRV_MAX_PLANES];
|
|
uint32_t sizes[DRV_MAX_PLANES];
|
|
uint32_t strides[DRV_MAX_PLANES];
|
|
uint64_t format_modifier;
|
|
uint64_t use_flags;
|
|
size_t total_size;
|
|
bool cached;
|
|
|
|
/*
|
|
* Most of the following metadata is virtgpu cross_domain specific. However, that backend
|
|
* needs to know traditional metadata (strides, offsets) in addition to this backend
|
|
* specific metadata. It's easiest just to stuff all the metadata here rather than
|
|
* having two metadata structs.
|
|
*/
|
|
uint32_t blob_id;
|
|
uint32_t map_info;
|
|
int32_t memory_idx;
|
|
int32_t physical_device_idx;
|
|
};
|
|
|
|
struct bo {
|
|
struct driver *drv;
|
|
struct bo_metadata meta;
|
|
bool is_test_buffer;
|
|
/* handle are mandatory only for SCANOUT buffers */
|
|
union bo_handle handle;
|
|
uint32_t inode;
|
|
void *priv;
|
|
};
|
|
|
|
struct format_metadata {
|
|
uint32_t priority;
|
|
uint32_t tiling;
|
|
uint64_t modifier;
|
|
};
|
|
|
|
struct combination {
|
|
uint32_t format;
|
|
struct format_metadata metadata;
|
|
uint64_t use_flags;
|
|
};
|
|
|
|
struct driver {
|
|
int fd;
|
|
const struct backend *backend;
|
|
void *priv;
|
|
pthread_mutex_t buffer_table_lock;
|
|
void *buffer_table;
|
|
pthread_mutex_t mappings_lock;
|
|
struct drv_array *mappings;
|
|
struct drv_array *combos;
|
|
bool compression;
|
|
bool log_bos;
|
|
};
|
|
|
|
struct backend {
|
|
const char *name;
|
|
void (*preload)(bool load);
|
|
int (*init)(struct driver *drv);
|
|
void (*close)(struct driver *drv);
|
|
int (*bo_create)(struct bo *bo, uint32_t width, uint32_t height, uint32_t format,
|
|
uint64_t use_flags);
|
|
int (*bo_create_with_modifiers)(struct bo *bo, uint32_t width, uint32_t height,
|
|
uint32_t format, const uint64_t *modifiers, uint32_t count);
|
|
// Either both or neither _metadata functions must be implemented.
|
|
// If the functions are implemented, bo_create and bo_create_with_modifiers must not be.
|
|
int (*bo_compute_metadata)(struct bo *bo, uint32_t width, uint32_t height, uint32_t format,
|
|
uint64_t use_flags, const uint64_t *modifiers, uint32_t count);
|
|
int (*bo_create_from_metadata)(struct bo *bo);
|
|
/* Called for every non-test-buffer BO on free */
|
|
int (*bo_release)(struct bo *bo);
|
|
/* Called on free if this bo is the last object referencing the contained GEM BOs */
|
|
int (*bo_destroy)(struct bo *bo);
|
|
int (*bo_import)(struct bo *bo, struct drv_import_fd_data *data);
|
|
void *(*bo_map)(struct bo *bo, struct vma *vma, uint32_t map_flags);
|
|
int (*bo_unmap)(struct bo *bo, struct vma *vma);
|
|
int (*bo_invalidate)(struct bo *bo, struct mapping *mapping);
|
|
int (*bo_flush)(struct bo *bo, struct mapping *mapping);
|
|
int (*bo_get_plane_fd)(struct bo *bo, size_t plane);
|
|
uint32_t (*bo_get_map_stride)(struct bo *bo);
|
|
void (*resolve_format_and_use_flags)(struct driver *drv, uint32_t format,
|
|
uint64_t use_flags, uint32_t *out_format,
|
|
uint64_t *out_use_flags);
|
|
size_t (*num_planes_from_modifier)(struct driver *drv, uint32_t format, uint64_t modifier);
|
|
int (*resource_info)(struct bo *bo, uint32_t strides[DRV_MAX_PLANES],
|
|
uint32_t offsets[DRV_MAX_PLANES], uint64_t *format_modifier);
|
|
uint32_t (*get_max_texture_2d_size)(struct driver *drv);
|
|
};
|
|
|
|
// clang-format off
|
|
#define BO_USE_RENDER_MASK (BO_USE_LINEAR | BO_USE_RENDERING | BO_USE_RENDERSCRIPT | \
|
|
BO_USE_SW_READ_OFTEN | BO_USE_SW_WRITE_OFTEN | BO_USE_SW_READ_RARELY | \
|
|
BO_USE_SW_WRITE_RARELY | BO_USE_TEXTURE | BO_USE_FRONT_RENDERING)
|
|
|
|
#define BO_USE_TEXTURE_MASK (BO_USE_LINEAR | BO_USE_RENDERSCRIPT | BO_USE_SW_READ_OFTEN | \
|
|
BO_USE_SW_WRITE_OFTEN | BO_USE_SW_READ_RARELY | \
|
|
BO_USE_SW_WRITE_RARELY | BO_USE_TEXTURE | BO_USE_FRONT_RENDERING)
|
|
|
|
#define BO_USE_SW_MASK (BO_USE_SW_READ_OFTEN | BO_USE_SW_WRITE_OFTEN | \
|
|
BO_USE_SW_READ_RARELY | BO_USE_SW_WRITE_RARELY | BO_USE_FRONT_RENDERING)
|
|
|
|
#define BO_USE_GPU_HW (BO_USE_RENDERING | BO_USE_TEXTURE | BO_USE_GPU_DATA_BUFFER)
|
|
|
|
#define BO_USE_NON_GPU_HW (BO_USE_SCANOUT | BO_USE_CAMERA_WRITE | BO_USE_CAMERA_READ | \
|
|
BO_USE_HW_VIDEO_ENCODER | BO_USE_HW_VIDEO_DECODER | BO_USE_SENSOR_DIRECT_DATA)
|
|
|
|
#define BO_USE_HW_MASK (BO_USE_GPU_HW | BO_USE_NON_GPU_HW)
|
|
|
|
#ifndef DRM_FORMAT_MOD_LINEAR
|
|
#define DRM_FORMAT_MOD_LINEAR DRM_FORMAT_MOD_NONE
|
|
#endif
|
|
|
|
#define LINEAR_METADATA (struct format_metadata) { 1, 0, DRM_FORMAT_MOD_LINEAR }
|
|
|
|
#define MESA_LLVMPIPE_MAX_TEXTURE_2D_LEVELS 15
|
|
#define MESA_LLVMPIPE_MAX_TEXTURE_2D_SIZE (1 << (MESA_LLVMPIPE_MAX_TEXTURE_2D_LEVELS - 1))
|
|
#define MESA_LLVMPIPE_TILE_ORDER 6
|
|
#define MESA_LLVMPIPE_TILE_SIZE (1 << MESA_LLVMPIPE_TILE_ORDER)
|
|
|
|
// clang-format on
|
|
|
|
#endif
|