1 /* 2 * Copyright (c) 2016-2017, The Linux Foundation. All rights reserved. 3 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions are 6 * met: 7 * * Redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer. 9 * * Redistributions in binary form must reproduce the above 10 * copyright notice, this list of conditions and the following 11 * disclaimer in the documentation and/or other materials provided 12 * with the distribution. 13 * * Neither the name of The Linux Foundation nor the names of its 14 * contributors may be used to endorse or promote products derived 15 * from this software without specific prior written permission. 16 * 17 * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED 18 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 19 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT 20 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS 21 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 22 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 23 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 24 * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 25 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 26 * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 27 * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28 */ 29 30 #ifndef __GR_DEVICE_IMPL_H__ 31 #define __GR_DEVICE_IMPL_H__ 32 33 #include <hardware/hardware.h> 34 #include <hardware/gralloc1.h> 35 #include "gr_buf_mgr.h" 36 37 struct private_module_t { 38 hw_module_t base; 39 }; 40 41 #define GRALLOC_IMPL(exp) reinterpret_cast<GrallocImpl const *>(exp) 42 43 namespace gralloc1 { 44 45 class GrallocImpl : public gralloc1_device_t { 46 public: 47 static int CloseDevice(hw_device_t *device); 48 static void GetCapabilities(struct gralloc1_device *device, uint32_t *out_count, 49 int32_t * /*gralloc1_capability_t*/ out_capabilities); 50 static gralloc1_function_pointer_t GetFunction( 51 struct gralloc1_device *device, int32_t /*gralloc1_function_descriptor_t*/ descriptor); 52 GetInstance(const struct hw_module_t * module)53 static GrallocImpl* GetInstance(const struct hw_module_t *module) { 54 static GrallocImpl *instance = new GrallocImpl(module); 55 if (instance->IsInitialized()) { 56 return instance; 57 } else { 58 return nullptr; 59 } 60 } 61 62 private: 63 static inline gralloc1_error_t Dump(gralloc1_device_t *device, uint32_t *out_size, 64 char *out_buffer); 65 static inline gralloc1_error_t CheckDeviceAndHandle(gralloc1_device_t *device, 66 buffer_handle_t buffer); 67 static gralloc1_error_t CreateBufferDescriptor(gralloc1_device_t *device, 68 gralloc1_buffer_descriptor_t *out_descriptor); 69 static gralloc1_error_t DestroyBufferDescriptor(gralloc1_device_t *device, 70 gralloc1_buffer_descriptor_t descriptor); 71 static gralloc1_error_t SetConsumerUsage(gralloc1_device_t *device, 72 gralloc1_buffer_descriptor_t descriptor, 73 gralloc1_consumer_usage_t usage); 74 static gralloc1_error_t SetBufferDimensions(gralloc1_device_t *device, 75 gralloc1_buffer_descriptor_t descriptor, 76 uint32_t width, uint32_t height); 77 static gralloc1_error_t SetColorFormat(gralloc1_device_t *device, 78 gralloc1_buffer_descriptor_t descriptor, int32_t format); 79 static gralloc1_error_t SetLayerCount(gralloc1_device_t *device, 80 gralloc1_buffer_descriptor_t descriptor, 81 uint32_t layer_count); 82 static gralloc1_error_t SetProducerUsage(gralloc1_device_t *device, 83 gralloc1_buffer_descriptor_t descriptor, 84 gralloc1_producer_usage_t usage); 85 static gralloc1_error_t GetBackingStore(gralloc1_device_t *device, buffer_handle_t buffer, 86 gralloc1_backing_store_t *out_store); 87 static gralloc1_error_t GetConsumerUsage(gralloc1_device_t *device, buffer_handle_t buffer, 88 gralloc1_consumer_usage_t *out_usage); 89 static gralloc1_error_t GetBufferDimensions(gralloc1_device_t *device, buffer_handle_t buffer, 90 uint32_t *out_width, uint32_t *out_height); 91 static gralloc1_error_t GetColorFormat(gralloc1_device_t *device, buffer_handle_t descriptor, 92 int32_t *outFormat); 93 static gralloc1_error_t GetLayerCount(gralloc1_device_t *device, buffer_handle_t buffer, 94 uint32_t *out_layer_count); 95 static gralloc1_error_t GetProducerUsage(gralloc1_device_t *device, buffer_handle_t buffer, 96 gralloc1_producer_usage_t *out_usage); 97 static gralloc1_error_t GetBufferStride(gralloc1_device_t *device, buffer_handle_t buffer, 98 uint32_t *out_stride); 99 static gralloc1_error_t AllocateBuffers(gralloc1_device_t *device, uint32_t num_dptors, 100 const gralloc1_buffer_descriptor_t *descriptors, 101 buffer_handle_t *out_buffers); 102 static gralloc1_error_t RetainBuffer(gralloc1_device_t *device, buffer_handle_t buffer); 103 static gralloc1_error_t ReleaseBuffer(gralloc1_device_t *device, buffer_handle_t buffer); 104 static gralloc1_error_t GetNumFlexPlanes(gralloc1_device_t *device, buffer_handle_t buffer, 105 uint32_t *out_num_planes); 106 static gralloc1_error_t LockBuffer(gralloc1_device_t *device, buffer_handle_t buffer, 107 gralloc1_producer_usage_t prod_usage, 108 gralloc1_consumer_usage_t cons_usage, 109 const gralloc1_rect_t *region, void **out_data, 110 int32_t acquire_fence); 111 static gralloc1_error_t LockFlex(gralloc1_device_t *device, buffer_handle_t buffer, 112 gralloc1_producer_usage_t prod_usage, 113 gralloc1_consumer_usage_t cons_usage, 114 const gralloc1_rect_t *region, 115 struct android_flex_layout *out_flex_layout, 116 int32_t acquire_fence); 117 118 static gralloc1_error_t UnlockBuffer(gralloc1_device_t *device, buffer_handle_t buffer, 119 int32_t *release_fence); 120 static gralloc1_error_t Gralloc1Perform(gralloc1_device_t *device, int operation, ...); 121 122 static gralloc1_error_t validateBufferSize(gralloc1_device_t *device, 123 buffer_handle_t bufferHandle, 124 const gralloc1_buffer_descriptor_info_t *info, 125 uint32_t stride); 126 static gralloc1_error_t getTransportSize(gralloc1_device_t* /*device*/, 127 buffer_handle_t buffer, uint32_t *outNumFds, 128 uint32_t *outNumInts); 129 static gralloc1_error_t importBuffer(gralloc1_device_t *device, buffer_handle_t raw_handle, 130 buffer_handle_t *outBufferHandle); 131 explicit GrallocImpl(const hw_module_t *module); 132 ~GrallocImpl(); 133 bool Init(); IsInitialized()134 bool IsInitialized() const { return initalized_; } 135 136 BufferManager *buf_mgr_ = NULL; 137 bool initalized_ = false; 138 }; 139 140 } // namespace gralloc1 141 142 #endif // __GR_DEVICE_IMPL_H__ 143