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
37struct private_module_t {
38  hw_module_t base;
39};
40
41#define GRALLOC_IMPL(exp) reinterpret_cast<GrallocImpl const *>(exp)
42
43namespace gralloc1 {
44
45class 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
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  explicit GrallocImpl(const hw_module_t *module);
123  ~GrallocImpl();
124  bool Init();
125  bool IsInitialized() const { return initalized_; }
126
127  BufferManager *buf_mgr_ = NULL;
128  bool initalized_ = false;
129};
130
131}  // namespace gralloc1
132
133#endif  // __GR_DEVICE_IMPL_H__
134