1*d95af8dfSAndroid Build Coastguard Worker /* 2*d95af8dfSAndroid Build Coastguard Worker * Copyright 2017 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 CROS_GRALLOC_DRIVER_H 8*d95af8dfSAndroid Build Coastguard Worker #define CROS_GRALLOC_DRIVER_H 9*d95af8dfSAndroid Build Coastguard Worker 10*d95af8dfSAndroid Build Coastguard Worker #include "cros_gralloc_buffer.h" 11*d95af8dfSAndroid Build Coastguard Worker 12*d95af8dfSAndroid Build Coastguard Worker #include <functional> 13*d95af8dfSAndroid Build Coastguard Worker #include <memory> 14*d95af8dfSAndroid Build Coastguard Worker #include <mutex> 15*d95af8dfSAndroid Build Coastguard Worker #include <string> 16*d95af8dfSAndroid Build Coastguard Worker #include <unordered_map> 17*d95af8dfSAndroid Build Coastguard Worker 18*d95af8dfSAndroid Build Coastguard Worker #if ANDROID_API_LEVEL >= 31 && defined(HAS_DMABUF_SYSTEM_HEAP) 19*d95af8dfSAndroid Build Coastguard Worker #include <BufferAllocator/BufferAllocator.h> 20*d95af8dfSAndroid Build Coastguard Worker #endif 21*d95af8dfSAndroid Build Coastguard Worker 22*d95af8dfSAndroid Build Coastguard Worker class cros_gralloc_driver 23*d95af8dfSAndroid Build Coastguard Worker { 24*d95af8dfSAndroid Build Coastguard Worker public: 25*d95af8dfSAndroid Build Coastguard Worker ~cros_gralloc_driver(); 26*d95af8dfSAndroid Build Coastguard Worker 27*d95af8dfSAndroid Build Coastguard Worker static std::shared_ptr<cros_gralloc_driver> get_instance(); 28*d95af8dfSAndroid Build Coastguard Worker bool is_supported(const struct cros_gralloc_buffer_descriptor *descriptor); 29*d95af8dfSAndroid Build Coastguard Worker int32_t allocate(const struct cros_gralloc_buffer_descriptor *descriptor, 30*d95af8dfSAndroid Build Coastguard Worker native_handle_t **out_handle); 31*d95af8dfSAndroid Build Coastguard Worker 32*d95af8dfSAndroid Build Coastguard Worker int32_t retain(buffer_handle_t handle); 33*d95af8dfSAndroid Build Coastguard Worker int32_t release(buffer_handle_t handle); 34*d95af8dfSAndroid Build Coastguard Worker 35*d95af8dfSAndroid Build Coastguard Worker int32_t lock(buffer_handle_t handle, int32_t acquire_fence, bool close_acquire_fence, 36*d95af8dfSAndroid Build Coastguard Worker const struct rectangle *rect, uint32_t map_flags, 37*d95af8dfSAndroid Build Coastguard Worker uint8_t *addr[DRV_MAX_PLANES]); 38*d95af8dfSAndroid Build Coastguard Worker int32_t unlock(buffer_handle_t handle, int32_t *release_fence); 39*d95af8dfSAndroid Build Coastguard Worker 40*d95af8dfSAndroid Build Coastguard Worker int32_t invalidate(buffer_handle_t handle); 41*d95af8dfSAndroid Build Coastguard Worker int32_t flush(buffer_handle_t handle); 42*d95af8dfSAndroid Build Coastguard Worker 43*d95af8dfSAndroid Build Coastguard Worker int32_t get_backing_store(buffer_handle_t handle, uint64_t *out_store); 44*d95af8dfSAndroid Build Coastguard Worker int32_t resource_info(buffer_handle_t handle, uint32_t strides[DRV_MAX_PLANES], 45*d95af8dfSAndroid Build Coastguard Worker uint32_t offsets[DRV_MAX_PLANES], uint64_t *format_modifier); 46*d95af8dfSAndroid Build Coastguard Worker 47*d95af8dfSAndroid Build Coastguard Worker uint32_t get_resolved_drm_format(uint32_t drm_format, uint64_t use_flags); 48*d95af8dfSAndroid Build Coastguard Worker 49*d95af8dfSAndroid Build Coastguard Worker void with_buffer(cros_gralloc_handle_t hnd, 50*d95af8dfSAndroid Build Coastguard Worker const std::function<void(cros_gralloc_buffer *)> &function); 51*d95af8dfSAndroid Build Coastguard Worker void with_each_buffer(const std::function<void(cros_gralloc_buffer *)> &function); 52*d95af8dfSAndroid Build Coastguard Worker 53*d95af8dfSAndroid Build Coastguard Worker private: 54*d95af8dfSAndroid Build Coastguard Worker cros_gralloc_driver(); 55*d95af8dfSAndroid Build Coastguard Worker bool is_initialized(); 56*d95af8dfSAndroid Build Coastguard Worker cros_gralloc_buffer *get_buffer(cros_gralloc_handle_t hnd); 57*d95af8dfSAndroid Build Coastguard Worker bool 58*d95af8dfSAndroid Build Coastguard Worker get_resolved_format_and_use_flags(const struct cros_gralloc_buffer_descriptor *descriptor, 59*d95af8dfSAndroid Build Coastguard Worker uint32_t *out_format, uint64_t *out_use_flags); 60*d95af8dfSAndroid Build Coastguard Worker 61*d95af8dfSAndroid Build Coastguard Worker int create_reserved_region(const std::string &buffer_name, uint64_t reserved_region_size); 62*d95af8dfSAndroid Build Coastguard Worker 63*d95af8dfSAndroid Build Coastguard Worker #if ANDROID_API_LEVEL >= 31 && defined(HAS_DMABUF_SYSTEM_HEAP) 64*d95af8dfSAndroid Build Coastguard Worker /* For allocating cros_gralloc_buffer reserved regions for metadata. */ 65*d95af8dfSAndroid Build Coastguard Worker BufferAllocator allocator_; 66*d95af8dfSAndroid Build Coastguard Worker #endif 67*d95af8dfSAndroid Build Coastguard Worker 68*d95af8dfSAndroid Build Coastguard Worker std::unique_ptr<struct driver, void (*)(struct driver *)> drv_; 69*d95af8dfSAndroid Build Coastguard Worker 70*d95af8dfSAndroid Build Coastguard Worker struct cros_gralloc_imported_handle_info { 71*d95af8dfSAndroid Build Coastguard Worker /* 72*d95af8dfSAndroid Build Coastguard Worker * The underlying buffer for referred to by this handle (as multiple handles can 73*d95af8dfSAndroid Build Coastguard Worker * refer to the same buffer). 74*d95af8dfSAndroid Build Coastguard Worker */ 75*d95af8dfSAndroid Build Coastguard Worker cros_gralloc_buffer *buffer = nullptr; 76*d95af8dfSAndroid Build Coastguard Worker 77*d95af8dfSAndroid Build Coastguard Worker /* The handle's refcount as a handle can be imported multiple times.*/ 78*d95af8dfSAndroid Build Coastguard Worker int32_t refcount = 1; 79*d95af8dfSAndroid Build Coastguard Worker }; 80*d95af8dfSAndroid Build Coastguard Worker 81*d95af8dfSAndroid Build Coastguard Worker std::mutex mutex_; 82*d95af8dfSAndroid Build Coastguard Worker std::unordered_map<uint32_t, std::unique_ptr<cros_gralloc_buffer>> buffers_; 83*d95af8dfSAndroid Build Coastguard Worker std::unordered_map<cros_gralloc_handle_t, cros_gralloc_imported_handle_info> handles_; 84*d95af8dfSAndroid Build Coastguard Worker 85*d95af8dfSAndroid Build Coastguard Worker /* TODO(b/242184599): remove after SwiftShader is moved to the host. */ 86*d95af8dfSAndroid Build Coastguard Worker const bool is_running_with_software_rendering_ = false; 87*d95af8dfSAndroid Build Coastguard Worker }; 88*d95af8dfSAndroid Build Coastguard Worker 89*d95af8dfSAndroid Build Coastguard Worker #endif 90