1*d95af8dfSAndroid Build Coastguard Worker /* 2*d95af8dfSAndroid Build Coastguard Worker * Copyright 2016 The Chromium OS Authors. All rights reserved. 3*d95af8dfSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be 4*d95af8dfSAndroid Build Coastguard Worker * found in the LICENSE file. 5*d95af8dfSAndroid Build Coastguard Worker */ 6*d95af8dfSAndroid Build Coastguard Worker 7*d95af8dfSAndroid Build Coastguard Worker #ifndef DRV_PRIV_H 8*d95af8dfSAndroid Build Coastguard Worker #define DRV_PRIV_H 9*d95af8dfSAndroid Build Coastguard Worker 10*d95af8dfSAndroid Build Coastguard Worker #include <pthread.h> 11*d95af8dfSAndroid Build Coastguard Worker #include <stdbool.h> 12*d95af8dfSAndroid Build Coastguard Worker #include <stdint.h> 13*d95af8dfSAndroid Build Coastguard Worker #include <stdlib.h> 14*d95af8dfSAndroid Build Coastguard Worker #include <sys/types.h> 15*d95af8dfSAndroid Build Coastguard Worker 16*d95af8dfSAndroid Build Coastguard Worker #include "drv.h" 17*d95af8dfSAndroid Build Coastguard Worker 18*d95af8dfSAndroid Build Coastguard Worker struct bo_metadata { 19*d95af8dfSAndroid Build Coastguard Worker uint32_t width; 20*d95af8dfSAndroid Build Coastguard Worker uint32_t height; 21*d95af8dfSAndroid Build Coastguard Worker uint32_t format; 22*d95af8dfSAndroid Build Coastguard Worker uint32_t tiling; 23*d95af8dfSAndroid Build Coastguard Worker size_t num_planes; 24*d95af8dfSAndroid Build Coastguard Worker uint32_t offsets[DRV_MAX_PLANES]; 25*d95af8dfSAndroid Build Coastguard Worker uint32_t sizes[DRV_MAX_PLANES]; 26*d95af8dfSAndroid Build Coastguard Worker uint32_t strides[DRV_MAX_PLANES]; 27*d95af8dfSAndroid Build Coastguard Worker uint64_t format_modifier; 28*d95af8dfSAndroid Build Coastguard Worker uint64_t use_flags; 29*d95af8dfSAndroid Build Coastguard Worker size_t total_size; 30*d95af8dfSAndroid Build Coastguard Worker bool cached; 31*d95af8dfSAndroid Build Coastguard Worker 32*d95af8dfSAndroid Build Coastguard Worker /* 33*d95af8dfSAndroid Build Coastguard Worker * Most of the following metadata is virtgpu cross_domain specific. However, that backend 34*d95af8dfSAndroid Build Coastguard Worker * needs to know traditional metadata (strides, offsets) in addition to this backend 35*d95af8dfSAndroid Build Coastguard Worker * specific metadata. It's easiest just to stuff all the metadata here rather than 36*d95af8dfSAndroid Build Coastguard Worker * having two metadata structs. 37*d95af8dfSAndroid Build Coastguard Worker */ 38*d95af8dfSAndroid Build Coastguard Worker uint32_t blob_id; 39*d95af8dfSAndroid Build Coastguard Worker uint32_t map_info; 40*d95af8dfSAndroid Build Coastguard Worker int32_t memory_idx; 41*d95af8dfSAndroid Build Coastguard Worker int32_t physical_device_idx; 42*d95af8dfSAndroid Build Coastguard Worker }; 43*d95af8dfSAndroid Build Coastguard Worker 44*d95af8dfSAndroid Build Coastguard Worker struct bo { 45*d95af8dfSAndroid Build Coastguard Worker struct driver *drv; 46*d95af8dfSAndroid Build Coastguard Worker struct bo_metadata meta; 47*d95af8dfSAndroid Build Coastguard Worker bool is_test_buffer; 48*d95af8dfSAndroid Build Coastguard Worker union bo_handle handle; 49*d95af8dfSAndroid Build Coastguard Worker void *priv; 50*d95af8dfSAndroid Build Coastguard Worker }; 51*d95af8dfSAndroid Build Coastguard Worker 52*d95af8dfSAndroid Build Coastguard Worker struct format_metadata { 53*d95af8dfSAndroid Build Coastguard Worker uint32_t priority; 54*d95af8dfSAndroid Build Coastguard Worker uint32_t tiling; 55*d95af8dfSAndroid Build Coastguard Worker uint64_t modifier; 56*d95af8dfSAndroid Build Coastguard Worker }; 57*d95af8dfSAndroid Build Coastguard Worker 58*d95af8dfSAndroid Build Coastguard Worker struct combination { 59*d95af8dfSAndroid Build Coastguard Worker uint32_t format; 60*d95af8dfSAndroid Build Coastguard Worker struct format_metadata metadata; 61*d95af8dfSAndroid Build Coastguard Worker uint64_t use_flags; 62*d95af8dfSAndroid Build Coastguard Worker }; 63*d95af8dfSAndroid Build Coastguard Worker 64*d95af8dfSAndroid Build Coastguard Worker struct driver { 65*d95af8dfSAndroid Build Coastguard Worker int fd; 66*d95af8dfSAndroid Build Coastguard Worker const struct backend *backend; 67*d95af8dfSAndroid Build Coastguard Worker void *priv; 68*d95af8dfSAndroid Build Coastguard Worker pthread_mutex_t buffer_table_lock; 69*d95af8dfSAndroid Build Coastguard Worker void *buffer_table; 70*d95af8dfSAndroid Build Coastguard Worker pthread_mutex_t mappings_lock; 71*d95af8dfSAndroid Build Coastguard Worker struct drv_array *mappings; 72*d95af8dfSAndroid Build Coastguard Worker struct drv_array *combos; 73*d95af8dfSAndroid Build Coastguard Worker bool compression; 74*d95af8dfSAndroid Build Coastguard Worker bool log_bos; 75*d95af8dfSAndroid Build Coastguard Worker }; 76*d95af8dfSAndroid Build Coastguard Worker 77*d95af8dfSAndroid Build Coastguard Worker struct backend { 78*d95af8dfSAndroid Build Coastguard Worker char *name; 79*d95af8dfSAndroid Build Coastguard Worker void (*preload)(bool load); 80*d95af8dfSAndroid Build Coastguard Worker int (*init)(struct driver *drv); 81*d95af8dfSAndroid Build Coastguard Worker void (*close)(struct driver *drv); 82*d95af8dfSAndroid Build Coastguard Worker int (*bo_create)(struct bo *bo, uint32_t width, uint32_t height, uint32_t format, 83*d95af8dfSAndroid Build Coastguard Worker uint64_t use_flags); 84*d95af8dfSAndroid Build Coastguard Worker int (*bo_create_with_modifiers)(struct bo *bo, uint32_t width, uint32_t height, 85*d95af8dfSAndroid Build Coastguard Worker uint32_t format, const uint64_t *modifiers, uint32_t count); 86*d95af8dfSAndroid Build Coastguard Worker // Either both or neither _metadata functions must be implemented. 87*d95af8dfSAndroid Build Coastguard Worker // If the functions are implemented, bo_create and bo_create_with_modifiers must not be. 88*d95af8dfSAndroid Build Coastguard Worker int (*bo_compute_metadata)(struct bo *bo, uint32_t width, uint32_t height, uint32_t format, 89*d95af8dfSAndroid Build Coastguard Worker uint64_t use_flags, const uint64_t *modifiers, uint32_t count); 90*d95af8dfSAndroid Build Coastguard Worker int (*bo_create_from_metadata)(struct bo *bo); 91*d95af8dfSAndroid Build Coastguard Worker /* Called for every non-test-buffer BO on free */ 92*d95af8dfSAndroid Build Coastguard Worker int (*bo_release)(struct bo *bo); 93*d95af8dfSAndroid Build Coastguard Worker /* Called on free if this bo is the last object referencing the contained GEM BOs */ 94*d95af8dfSAndroid Build Coastguard Worker int (*bo_destroy)(struct bo *bo); 95*d95af8dfSAndroid Build Coastguard Worker int (*bo_import)(struct bo *bo, struct drv_import_fd_data *data); 96*d95af8dfSAndroid Build Coastguard Worker void *(*bo_map)(struct bo *bo, struct vma *vma, uint32_t map_flags); 97*d95af8dfSAndroid Build Coastguard Worker int (*bo_unmap)(struct bo *bo, struct vma *vma); 98*d95af8dfSAndroid Build Coastguard Worker int (*bo_invalidate)(struct bo *bo, struct mapping *mapping); 99*d95af8dfSAndroid Build Coastguard Worker int (*bo_flush)(struct bo *bo, struct mapping *mapping); 100*d95af8dfSAndroid Build Coastguard Worker void (*resolve_format_and_use_flags)(struct driver *drv, uint32_t format, 101*d95af8dfSAndroid Build Coastguard Worker uint64_t use_flags, uint32_t *out_format, 102*d95af8dfSAndroid Build Coastguard Worker uint64_t *out_use_flags); 103*d95af8dfSAndroid Build Coastguard Worker size_t (*num_planes_from_modifier)(struct driver *drv, uint32_t format, uint64_t modifier); 104*d95af8dfSAndroid Build Coastguard Worker int (*resource_info)(struct bo *bo, uint32_t strides[DRV_MAX_PLANES], 105*d95af8dfSAndroid Build Coastguard Worker uint32_t offsets[DRV_MAX_PLANES], uint64_t *format_modifier); 106*d95af8dfSAndroid Build Coastguard Worker uint32_t (*get_max_texture_2d_size)(struct driver *drv); 107*d95af8dfSAndroid Build Coastguard Worker }; 108*d95af8dfSAndroid Build Coastguard Worker 109*d95af8dfSAndroid Build Coastguard Worker // clang-format off 110*d95af8dfSAndroid Build Coastguard Worker #define BO_USE_RENDER_MASK (BO_USE_LINEAR | BO_USE_RENDERING | BO_USE_RENDERSCRIPT | \ 111*d95af8dfSAndroid Build Coastguard Worker BO_USE_SW_READ_OFTEN | BO_USE_SW_WRITE_OFTEN | BO_USE_SW_READ_RARELY | \ 112*d95af8dfSAndroid Build Coastguard Worker BO_USE_SW_WRITE_RARELY | BO_USE_TEXTURE | BO_USE_FRONT_RENDERING) 113*d95af8dfSAndroid Build Coastguard Worker 114*d95af8dfSAndroid Build Coastguard Worker #define BO_USE_TEXTURE_MASK (BO_USE_LINEAR | BO_USE_RENDERSCRIPT | BO_USE_SW_READ_OFTEN | \ 115*d95af8dfSAndroid Build Coastguard Worker BO_USE_SW_WRITE_OFTEN | BO_USE_SW_READ_RARELY | \ 116*d95af8dfSAndroid Build Coastguard Worker BO_USE_SW_WRITE_RARELY | BO_USE_TEXTURE | BO_USE_FRONT_RENDERING) 117*d95af8dfSAndroid Build Coastguard Worker 118*d95af8dfSAndroid Build Coastguard Worker #define BO_USE_SW_MASK (BO_USE_SW_READ_OFTEN | BO_USE_SW_WRITE_OFTEN | \ 119*d95af8dfSAndroid Build Coastguard Worker BO_USE_SW_READ_RARELY | BO_USE_SW_WRITE_RARELY | BO_USE_FRONT_RENDERING) 120*d95af8dfSAndroid Build Coastguard Worker 121*d95af8dfSAndroid Build Coastguard Worker #define BO_USE_GPU_HW (BO_USE_RENDERING | BO_USE_TEXTURE | BO_USE_GPU_DATA_BUFFER) 122*d95af8dfSAndroid Build Coastguard Worker 123*d95af8dfSAndroid Build Coastguard Worker #define BO_USE_NON_GPU_HW (BO_USE_SCANOUT | BO_USE_CAMERA_WRITE | BO_USE_CAMERA_READ | \ 124*d95af8dfSAndroid Build Coastguard Worker BO_USE_HW_VIDEO_ENCODER | BO_USE_HW_VIDEO_DECODER | BO_USE_SENSOR_DIRECT_DATA) 125*d95af8dfSAndroid Build Coastguard Worker 126*d95af8dfSAndroid Build Coastguard Worker #define BO_USE_HW_MASK (BO_USE_GPU_HW | BO_USE_NON_GPU_HW) 127*d95af8dfSAndroid Build Coastguard Worker 128*d95af8dfSAndroid Build Coastguard Worker #ifndef DRM_FORMAT_MOD_LINEAR 129*d95af8dfSAndroid Build Coastguard Worker #define DRM_FORMAT_MOD_LINEAR DRM_FORMAT_MOD_NONE 130*d95af8dfSAndroid Build Coastguard Worker #endif 131*d95af8dfSAndroid Build Coastguard Worker 132*d95af8dfSAndroid Build Coastguard Worker #define LINEAR_METADATA (struct format_metadata) { 1, 0, DRM_FORMAT_MOD_LINEAR } 133*d95af8dfSAndroid Build Coastguard Worker 134*d95af8dfSAndroid Build Coastguard Worker #define MESA_LLVMPIPE_MAX_TEXTURE_2D_LEVELS 15 135*d95af8dfSAndroid Build Coastguard Worker #define MESA_LLVMPIPE_MAX_TEXTURE_2D_SIZE (1 << (MESA_LLVMPIPE_MAX_TEXTURE_2D_LEVELS - 1)) 136*d95af8dfSAndroid Build Coastguard Worker #define MESA_LLVMPIPE_TILE_ORDER 6 137*d95af8dfSAndroid Build Coastguard Worker #define MESA_LLVMPIPE_TILE_SIZE (1 << MESA_LLVMPIPE_TILE_ORDER) 138*d95af8dfSAndroid Build Coastguard Worker 139*d95af8dfSAndroid Build Coastguard Worker // clang-format on 140*d95af8dfSAndroid Build Coastguard Worker 141*d95af8dfSAndroid Build Coastguard Worker #endif 142