1731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu/*
2731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu * Copyright 2016 The Android Open Source Project
3731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu *
4731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu * Licensed under the Apache License, Version 2.0 (the "License");
5731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu * you may not use this file except in compliance with the License.
6731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu * You may obtain a copy of the License at
7731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu *
8731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu *      http://www.apache.org/licenses/LICENSE-2.0
9731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu *
10731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu * Unless required by applicable law or agreed to in writing, software
11731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu * distributed under the License is distributed on an "AS IS" BASIS,
12731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu * See the License for the specific language governing permissions and
14731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu * limitations under the License.
15731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu */
16731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu
17939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu#ifndef ANDROID_HARDWARE_GRALLOC_1_ON_0_ADAPTER_H
18939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu#define ANDROID_HARDWARE_GRALLOC_1_ON_0_ADAPTER_H
19731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu
20731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu#include <hardware/gralloc1.h>
21939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu#include <log/log.h>
22731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu
23939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu#include <atomic>
24939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu#include <memory>
25731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu#include <mutex>
26731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu#include <string>
27731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu#include <unordered_map>
28939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu#include <utility>
29731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu
30731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wustruct gralloc_module_t;
31939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wustruct alloc_device_t;
32731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu
33731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wunamespace android {
34939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wunamespace hardware {
35731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu
36731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wuclass Gralloc1On0Adapter : public gralloc1_device_t
37731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu{
38731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wupublic:
39731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu    Gralloc1On0Adapter(const hw_module_t* module);
40731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu    ~Gralloc1On0Adapter();
41731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu
42731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu    gralloc1_device_t* getDevice() {
43731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu        return static_cast<gralloc1_device_t*>(this);
44731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu    }
45731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu
46731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wuprivate:
47731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu    static inline Gralloc1On0Adapter* getAdapter(gralloc1_device_t* device) {
48731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu        return static_cast<Gralloc1On0Adapter*>(device);
49731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu    }
50731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu
51939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu    static int closeHook(struct hw_device_t* device) {
52939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu        delete getAdapter(reinterpret_cast<gralloc1_device_t*>(device));
53939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu        return 0;
54939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu    }
55939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu
56731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu    // getCapabilities
57731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu
58731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu    void doGetCapabilities(uint32_t* outCount,
59731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu            int32_t* /*gralloc1_capability_t*/ outCapabilities);
60731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu    static void getCapabilitiesHook(gralloc1_device_t* device,
61731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu            uint32_t* outCount,
62731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu            int32_t* /*gralloc1_capability_t*/ outCapabilities) {
63731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu        getAdapter(device)->doGetCapabilities(outCount, outCapabilities);
64731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu    }
65731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu
66731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu    // getFunction
67731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu
68731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu    gralloc1_function_pointer_t doGetFunction(
69731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu            int32_t /*gralloc1_function_descriptor_t*/ descriptor);
70731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu    static gralloc1_function_pointer_t getFunctionHook(
71731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu            gralloc1_device_t* device,
72731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu            int32_t /*gralloc1_function_descriptor_t*/ descriptor) {
73731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu        return getAdapter(device)->doGetFunction(descriptor);
74731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu    }
75731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu
76731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu    // dump
77731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu
78731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu    void dump(uint32_t* outSize, char* outBuffer);
79731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu    static void dumpHook(gralloc1_device_t* device, uint32_t* outSize,
80731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu            char* outBuffer) {
81731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu        return getAdapter(device)->dump(outSize, outBuffer);
82731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu    }
83731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu    std::string mCachedDump;
84731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu
85731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu    // Buffer descriptor lifecycle functions
86731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu
87731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu    struct Descriptor;
88731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu
89731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu    gralloc1_error_t createDescriptor(
90731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu            gralloc1_buffer_descriptor_t* outDescriptor);
91731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu    static int32_t createDescriptorHook(gralloc1_device_t* device,
92731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu            gralloc1_buffer_descriptor_t* outDescriptor) {
93731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu        auto error = getAdapter(device)->createDescriptor(outDescriptor);
94731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu        return static_cast<int32_t>(error);
95731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu    }
96731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu
97731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu    gralloc1_error_t destroyDescriptor(gralloc1_buffer_descriptor_t descriptor);
98731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu    static int32_t destroyDescriptorHook(gralloc1_device_t* device,
99731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu            gralloc1_buffer_descriptor_t descriptor) {
100731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu        auto error = getAdapter(device)->destroyDescriptor(descriptor);
101731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu        return static_cast<int32_t>(error);
102731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu    }
103731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu
104731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu    // Buffer descriptor modification functions
105731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu
106731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu    struct Descriptor : public std::enable_shared_from_this<Descriptor> {
107939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu        Descriptor()
108939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu          : width(0),
109731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu            height(0),
110731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu            format(HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED),
111731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu            layerCount(1),
112731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu            producerUsage(GRALLOC1_PRODUCER_USAGE_NONE),
113731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu            consumerUsage(GRALLOC1_CONSUMER_USAGE_NONE) {}
114731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu
115731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu        gralloc1_error_t setDimensions(uint32_t w, uint32_t h) {
116731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu            width = w;
117731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu            height = h;
118731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu            return GRALLOC1_ERROR_NONE;
119731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu        }
120731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu
121731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu        gralloc1_error_t setFormat(int32_t f) {
122731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu            format = f;
123731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu            return GRALLOC1_ERROR_NONE;
124731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu        }
125731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu
126731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu        gralloc1_error_t setLayerCount(uint32_t lc) {
127731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu            layerCount = lc;
128731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu            return GRALLOC1_ERROR_NONE;
129731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu        }
130731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu
131731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu        gralloc1_error_t setProducerUsage(gralloc1_producer_usage_t usage) {
132731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu            producerUsage = usage;
133731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu            return GRALLOC1_ERROR_NONE;
134731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu        }
135731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu
136731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu        gralloc1_error_t setConsumerUsage(gralloc1_consumer_usage_t usage) {
137731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu            consumerUsage = usage;
138731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu            return GRALLOC1_ERROR_NONE;
139731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu        }
140731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu
141731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu        uint32_t width;
142731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu        uint32_t height;
143731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu        int32_t format;
144731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu        uint32_t layerCount;
145731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu        gralloc1_producer_usage_t producerUsage;
146731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu        gralloc1_consumer_usage_t consumerUsage;
147731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu    };
148731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu
149731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu    template <typename ...Args>
150731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu    static int32_t callDescriptorFunction(gralloc1_device_t* device,
151731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu            gralloc1_buffer_descriptor_t descriptorId,
152731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu            gralloc1_error_t (Descriptor::*member)(Args...), Args... args) {
153731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu        auto descriptor = getAdapter(device)->getDescriptor(descriptorId);
154731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu        if (!descriptor) {
155731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu            return static_cast<int32_t>(GRALLOC1_ERROR_BAD_DESCRIPTOR);
156731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu        }
157731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu        auto error = ((*descriptor).*member)(std::forward<Args>(args)...);
158731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu        return static_cast<int32_t>(error);
159731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu    }
160731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu
161731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu    static int32_t setConsumerUsageHook(gralloc1_device_t* device,
162731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu            gralloc1_buffer_descriptor_t descriptorId, uint64_t intUsage) {
163731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu        auto usage = static_cast<gralloc1_consumer_usage_t>(intUsage);
164731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu        return callDescriptorFunction(device, descriptorId,
165731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu                &Descriptor::setConsumerUsage, usage);
166731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu    }
167731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu
168731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu    static int32_t setDimensionsHook(gralloc1_device_t* device,
169731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu            gralloc1_buffer_descriptor_t descriptorId, uint32_t width,
170731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu            uint32_t height) {
171731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu        return callDescriptorFunction(device, descriptorId,
172731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu                &Descriptor::setDimensions, width, height);
173731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu    }
174731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu
175731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu    static int32_t setFormatHook(gralloc1_device_t* device,
176731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu            gralloc1_buffer_descriptor_t descriptorId, int32_t format) {
177731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu        return callDescriptorFunction(device, descriptorId,
178731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu                &Descriptor::setFormat, format);
179731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu    }
180731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu
181731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu    static int32_t setLayerCountHook(gralloc1_device_t* device,
182731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu            gralloc1_buffer_descriptor_t descriptorId, uint32_t layerCount) {
183731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu        return callDescriptorFunction(device, descriptorId,
184731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu                &Descriptor::setLayerCount, layerCount);
185731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu    }
186731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu
187731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu    static int32_t setProducerUsageHook(gralloc1_device_t* device,
188731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu            gralloc1_buffer_descriptor_t descriptorId, uint64_t intUsage) {
189731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu        auto usage = static_cast<gralloc1_producer_usage_t>(intUsage);
190731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu        return callDescriptorFunction(device, descriptorId,
191731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu                &Descriptor::setProducerUsage, usage);
192731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu    }
193731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu
194731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu    // Buffer handle query functions
195731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu
196731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu    class Buffer {
197731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu    public:
198731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu        Buffer(buffer_handle_t handle, gralloc1_backing_store_t store,
199731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu                const Descriptor& descriptor, uint32_t stride,
200939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu                uint32_t numFlexPlanes, bool wasAllocated);
201731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu
202731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu        buffer_handle_t getHandle() const { return mHandle; }
203731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu
204731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu        void retain() { ++mReferenceCount; }
205731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu
206731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu        // Returns true if the reference count has dropped to 0, indicating that
207731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu        // the buffer needs to be released
208731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu        bool release() { return --mReferenceCount == 0; }
209731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu
210731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu        bool wasAllocated() const { return mWasAllocated; }
211731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu
212731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu        gralloc1_error_t getBackingStore(
213731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu                gralloc1_backing_store_t* outStore) const {
214731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu            *outStore = mStore;
215731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu            return GRALLOC1_ERROR_NONE;
216731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu        }
217731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu
218731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu        gralloc1_error_t getConsumerUsage(
219731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu                gralloc1_consumer_usage_t* outUsage) const {
220731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu            *outUsage = mDescriptor.consumerUsage;
221731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu            return GRALLOC1_ERROR_NONE;
222731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu        }
223731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu
224731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu        gralloc1_error_t getDimensions(uint32_t* outWidth,
225731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu                uint32_t* outHeight) const {
226731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu            *outWidth = mDescriptor.width;
227731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu            *outHeight = mDescriptor.height;
228731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu            return GRALLOC1_ERROR_NONE;
229731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu        }
230731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu
231731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu        gralloc1_error_t getFormat(int32_t* outFormat) const {
232731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu            *outFormat = mDescriptor.format;
233731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu            return GRALLOC1_ERROR_NONE;
234731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu        }
235731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu
236731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu        gralloc1_error_t getLayerCount(uint32_t* outLayerCount) const {
237731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu            *outLayerCount = mDescriptor.layerCount;
238731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu            return GRALLOC1_ERROR_NONE;
239731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu        }
240731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu
241731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu        gralloc1_error_t getNumFlexPlanes(uint32_t* outNumPlanes) const {
242939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu            *outNumPlanes = mNumFlexPlanes;
243731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu            return GRALLOC1_ERROR_NONE;
244731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu        }
245731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu
246731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu        gralloc1_error_t getProducerUsage(
247731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu                gralloc1_producer_usage_t* outUsage) const {
248731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu            *outUsage = mDescriptor.producerUsage;
249731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu            return GRALLOC1_ERROR_NONE;
250731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu        }
251731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu
252731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu        gralloc1_error_t getStride(uint32_t* outStride) const {
253731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu            *outStride = mStride;
254731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu            return GRALLOC1_ERROR_NONE;
255731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu        }
256731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu
257731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu    private:
258731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu
259731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu        const buffer_handle_t mHandle;
260731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu        size_t mReferenceCount;
261731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu
262731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu        const gralloc1_backing_store_t mStore;
263731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu        const Descriptor mDescriptor;
264731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu        const uint32_t mStride;
265939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu        const uint32_t mNumFlexPlanes;
266731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu
267731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu        // Whether this buffer allocated in this process (as opposed to just
268731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu        // being retained here), which determines whether to free or unregister
269731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu        // the buffer when this Buffer is released
270731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu        const bool mWasAllocated;
271731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu    };
272731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu
273731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu    template <typename ...Args>
274731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu    static int32_t callBufferFunction(gralloc1_device_t* device,
275731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu            buffer_handle_t bufferHandle,
276731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu            gralloc1_error_t (Buffer::*member)(Args...) const, Args... args) {
277731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu        auto buffer = getAdapter(device)->getBuffer(bufferHandle);
278731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu        if (!buffer) {
279731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu            return static_cast<int32_t>(GRALLOC1_ERROR_BAD_HANDLE);
280731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu        }
281731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu        auto error = ((*buffer).*member)(std::forward<Args>(args)...);
282731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu        return static_cast<int32_t>(error);
283731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu    }
284731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu
285731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu    template <typename MF, MF memFunc, typename ...Args>
286731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu    static int32_t bufferHook(gralloc1_device_t* device,
287731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu            buffer_handle_t bufferHandle, Args... args) {
288731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu        return Gralloc1On0Adapter::callBufferFunction(device, bufferHandle,
289731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu                memFunc, std::forward<Args>(args)...);
290731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu    }
291731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu
292731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu    static int32_t getConsumerUsageHook(gralloc1_device_t* device,
293731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu            buffer_handle_t bufferHandle, uint64_t* outUsage) {
294731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu        auto usage = GRALLOC1_CONSUMER_USAGE_NONE;
295731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu        auto error = callBufferFunction(device, bufferHandle,
296731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu                &Buffer::getConsumerUsage, &usage);
297939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu        if (error == GRALLOC1_ERROR_NONE) {
298731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu            *outUsage = static_cast<uint64_t>(usage);
299731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu        }
300731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu        return error;
301731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu    }
302731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu
303731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu    static int32_t getProducerUsageHook(gralloc1_device_t* device,
304731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu            buffer_handle_t bufferHandle, uint64_t* outUsage) {
305731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu        auto usage = GRALLOC1_PRODUCER_USAGE_NONE;
306731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu        auto error = callBufferFunction(device, bufferHandle,
307731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu                &Buffer::getProducerUsage, &usage);
308939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu        if (error == GRALLOC1_ERROR_NONE) {
309731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu            *outUsage = static_cast<uint64_t>(usage);
310731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu        }
311731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu        return error;
312731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu    }
313731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu
314731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu    // Buffer management functions
315731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu
316731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu    gralloc1_error_t allocate(
317939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu            gralloc1_buffer_descriptor_t id,
318731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu            const std::shared_ptr<Descriptor>& descriptor,
319731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu            buffer_handle_t* outBufferHandle);
320939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu    static int32_t allocateHook(gralloc1_device* device,
321939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu            uint32_t numDescriptors,
322939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu            const gralloc1_buffer_descriptor_t* descriptors,
323939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu            buffer_handle_t* outBuffers);
324731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu
325731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu    gralloc1_error_t retain(const std::shared_ptr<Buffer>& buffer);
326939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu    gralloc1_error_t retain(buffer_handle_t bufferHandle);
327939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu    static int32_t retainHook(gralloc1_device_t* device,
328939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu            buffer_handle_t bufferHandle)
329939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu    {
330939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu        auto adapter = getAdapter(device);
331939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu        return adapter->retain(bufferHandle);
332939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu    }
333731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu
334939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu    gralloc1_error_t release(const std::shared_ptr<Buffer>& buffer);
335939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu    static int32_t releaseHook(gralloc1_device_t* device,
336731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu            buffer_handle_t bufferHandle) {
337731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu        auto adapter = getAdapter(device);
338731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu
339731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu        auto buffer = adapter->getBuffer(bufferHandle);
340731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu        if (!buffer) {
341731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu            return static_cast<int32_t>(GRALLOC1_ERROR_BAD_HANDLE);
342731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu        }
343731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu
344939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu        auto error = adapter->release(buffer);
345731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu        return static_cast<int32_t>(error);
346731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu    }
347731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu
348731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu    // Buffer access functions
349731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu
350731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu    gralloc1_error_t lock(const std::shared_ptr<Buffer>& buffer,
351731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu            gralloc1_producer_usage_t producerUsage,
352731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu            gralloc1_consumer_usage_t consumerUsage,
353731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu            const gralloc1_rect_t& accessRegion, void** outData,
354939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu            int acquireFence);
355731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu    gralloc1_error_t lockFlex(const std::shared_ptr<Buffer>& buffer,
356731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu            gralloc1_producer_usage_t producerUsage,
357731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu            gralloc1_consumer_usage_t consumerUsage,
358731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu            const gralloc1_rect_t& accessRegion,
359731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu            struct android_flex_layout* outFlex,
360939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu            int acquireFence);
361731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu
362731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu    template <typename OUT, gralloc1_error_t (Gralloc1On0Adapter::*member)(
363731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu            const std::shared_ptr<Buffer>&, gralloc1_producer_usage_t,
364731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu            gralloc1_consumer_usage_t, const gralloc1_rect_t&, OUT*,
365939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu            int)>
366731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu    static int32_t lockHook(gralloc1_device_t* device,
367731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu            buffer_handle_t bufferHandle,
368731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu            uint64_t /*gralloc1_producer_usage_t*/ uintProducerUsage,
369731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu            uint64_t /*gralloc1_consumer_usage_t*/ uintConsumerUsage,
370731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu            const gralloc1_rect_t* accessRegion, OUT* outData,
371731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu            int32_t acquireFenceFd) {
372731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu        auto adapter = getAdapter(device);
373731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu
374731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu        // Exactly one of producer and consumer usage must be *_USAGE_NONE,
375731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu        // but we can't check this until the upper levels of the framework
376731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu        // correctly distinguish between producer and consumer usage
377731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu        /*
378731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu        bool hasProducerUsage =
379731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu                uintProducerUsage != GRALLOC1_PRODUCER_USAGE_NONE;
380731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu        bool hasConsumerUsage =
381731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu                uintConsumerUsage != GRALLOC1_CONSUMER_USAGE_NONE;
382731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu        if (hasProducerUsage && hasConsumerUsage ||
383731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu                !hasProducerUsage && !hasConsumerUsage) {
384731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu            return static_cast<int32_t>(GRALLOC1_ERROR_BAD_VALUE);
385731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu        }
386731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu        */
387731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu
388731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu        auto producerUsage =
389731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu                static_cast<gralloc1_producer_usage_t>(uintProducerUsage);
390731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu        auto consumerUsage =
391731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu                static_cast<gralloc1_consumer_usage_t>(uintConsumerUsage);
392731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu
393731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu        if (!outData) {
394731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu            const auto producerCpuUsage = GRALLOC1_PRODUCER_USAGE_CPU_READ |
395731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu                    GRALLOC1_PRODUCER_USAGE_CPU_WRITE;
396731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu            if ((producerUsage & producerCpuUsage) != 0) {
397731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu                return static_cast<int32_t>(GRALLOC1_ERROR_BAD_VALUE);
398731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu            }
399731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu            if ((consumerUsage & GRALLOC1_CONSUMER_USAGE_CPU_READ) != 0) {
400731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu                return static_cast<int32_t>(GRALLOC1_ERROR_BAD_VALUE);
401731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu            }
402731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu        }
403731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu
404731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu        auto buffer = adapter->getBuffer(bufferHandle);
405731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu        if (!buffer) {
406731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu            return static_cast<int32_t>(GRALLOC1_ERROR_BAD_HANDLE);
407731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu        }
408731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu
409731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu        if (!accessRegion) {
410731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu            ALOGE("accessRegion is null");
411731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu            return static_cast<int32_t>(GRALLOC1_ERROR_BAD_VALUE);
412731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu        }
413731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu
414731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu        auto error = ((*adapter).*member)(buffer, producerUsage, consumerUsage,
415939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu                *accessRegion, outData, acquireFenceFd);
416731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu        return static_cast<int32_t>(error);
417731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu    }
418731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu
419731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu    gralloc1_error_t unlock(const std::shared_ptr<Buffer>& buffer,
420939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu            int* outReleaseFence);
421731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu    static int32_t unlockHook(gralloc1_device_t* device,
422731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu            buffer_handle_t bufferHandle, int32_t* outReleaseFenceFd) {
423731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu        auto adapter = getAdapter(device);
424731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu
425731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu        auto buffer = adapter->getBuffer(bufferHandle);
426731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu        if (!buffer) {
427731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu            return static_cast<int32_t>(GRALLOC1_ERROR_BAD_HANDLE);
428731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu        }
429731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu
430939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu        int releaseFence = -1;
431731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu        auto error = adapter->unlock(buffer, &releaseFence);
432731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu        if (error == GRALLOC1_ERROR_NONE) {
433939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu            *outReleaseFenceFd = releaseFence;
434731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu        }
435731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu        return static_cast<int32_t>(error);
436731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu    }
437731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu
438731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu    // Adapter internals
439731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu    const gralloc_module_t* mModule;
440731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu    uint8_t mMinorVersion;
441731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu    alloc_device_t* mDevice;
442731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu
443731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu    std::shared_ptr<Descriptor> getDescriptor(
444731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu            gralloc1_buffer_descriptor_t descriptorId);
445731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu    std::shared_ptr<Buffer> getBuffer(buffer_handle_t bufferHandle);
446731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu
447731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu    static std::atomic<gralloc1_buffer_descriptor_t> sNextBufferDescriptorId;
448731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu    std::mutex mDescriptorMutex;
449731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu    std::unordered_map<gralloc1_buffer_descriptor_t,
450731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu            std::shared_ptr<Descriptor>> mDescriptors;
451731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu    std::mutex mBufferMutex;
452731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu    std::unordered_map<buffer_handle_t, std::shared_ptr<Buffer>> mBuffers;
453731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu};
454731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu
455939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu} // namespace hardware
456731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu} // namespace android
457731eb3d51412ba88b9fef231e0228913ee7b1935Chia-I Wu
458939e4018c2717c33990f8d1e348cf9a48ddff1d7Chia-I Wu#endif // ANDROID_HARDWARE_GRALLOC_1_ON_0_ADAPTER_H
459