11e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza/*
21e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza * Copyright 2016 The Android Open Source Project
31e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza *
41e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza * Licensed under the Apache License, Version 2.0 (the "License");
51e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza * you may not use this file except in compliance with the License.
61e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza * You may obtain a copy of the License at
71e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza *
81e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza *      http://www.apache.org/licenses/LICENSE-2.0
91e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza *
101e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza * Unless required by applicable law or agreed to in writing, software
111e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza * distributed under the License is distributed on an "AS IS" BASIS,
121e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
131e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza * See the License for the specific language governing permissions and
141e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza * limitations under the License.
151e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza */
161e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza
171e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza#ifndef ANDROID_UI_GRALLOC_1_ON_0_ADAPTER_H
181e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza#define ANDROID_UI_GRALLOC_1_ON_0_ADAPTER_H
191e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza
201e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza#include <ui/Fence.h>
211e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza#include <ui/GraphicBuffer.h>
221e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza
231e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza#include <hardware/gralloc1.h>
241e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza
25923c0668eb2427bb148a56bd1ac7834cc371d5a0Dan Stoza#include <mutex>
261e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza#include <string>
271e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza#include <unordered_map>
281e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza#include <vector>
291e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza
301e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stozastruct gralloc_module_t;
311e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza
321e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza// This is not an "official" capability (i.e., it is not found in gralloc1.h),
331e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza// but we will use it to detect that we are running through the adapter, which
341e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza// is capable of collaborating with GraphicBuffer such that queries on a
351e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza// buffer_handle_t succeed
361e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stozastatic const auto GRALLOC1_CAPABILITY_ON_ADAPTER =
371e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza        static_cast<gralloc1_capability_t>(GRALLOC1_LAST_CAPABILITY + 1);
381e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza
391e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stozastatic const auto GRALLOC1_FUNCTION_RETAIN_GRAPHIC_BUFFER =
401e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza        static_cast<gralloc1_function_descriptor_t>(GRALLOC1_LAST_FUNCTION + 1);
411e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stozastatic const auto GRALLOC1_FUNCTION_ALLOCATE_WITH_ID =
421e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza        static_cast<gralloc1_function_descriptor_t>(GRALLOC1_LAST_FUNCTION + 2);
431e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stozastatic const auto GRALLOC1_FUNCTION_LOCK_YCBCR =
441e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza        static_cast<gralloc1_function_descriptor_t>(GRALLOC1_LAST_FUNCTION + 3);
451e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stozastatic const auto GRALLOC1_LAST_ADAPTER_FUNCTION = GRALLOC1_FUNCTION_LOCK_YCBCR;
461e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza
471e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stozatypedef gralloc1_error_t (*GRALLOC1_PFN_RETAIN_GRAPHIC_BUFFER)(
481e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza        gralloc1_device_t* device, const android::GraphicBuffer* buffer);
491e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stozatypedef gralloc1_error_t (*GRALLOC1_PFN_ALLOCATE_WITH_ID)(
501e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza        gralloc1_device_t* device, gralloc1_buffer_descriptor_t descriptor,
511e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza        gralloc1_backing_store_t id, buffer_handle_t* outBuffer);
521e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stozatypedef int32_t /*gralloc1_error_t*/ (*GRALLOC1_PFN_LOCK_YCBCR)(
531e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza        gralloc1_device_t* device, buffer_handle_t buffer,
541e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza        uint64_t /*gralloc1_producer_usage_t*/ producerUsage,
551e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza        uint64_t /*gralloc1_consumer_usage_t*/ consumerUsage,
561e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza        const gralloc1_rect_t* accessRegion, struct android_ycbcr* outYCbCr,
571e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza        int32_t acquireFence);
581e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza
591e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stozanamespace android {
601e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza
611e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stozaclass Gralloc1On0Adapter : public gralloc1_device_t
621e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza{
631e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stozapublic:
641e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza    Gralloc1On0Adapter(const hw_module_t* module);
651e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza    ~Gralloc1On0Adapter();
661e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza
671e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza    gralloc1_device_t* getDevice() {
681e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza        return static_cast<gralloc1_device_t*>(this);
691e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza    }
701e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza
711e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stozaprivate:
721e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza    static inline Gralloc1On0Adapter* getAdapter(gralloc1_device_t* device) {
731e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza        return static_cast<Gralloc1On0Adapter*>(device);
741e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza    }
751e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza
761e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza    // getCapabilities
771e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza
781e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza    void doGetCapabilities(uint32_t* outCount,
791e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza            int32_t* /*gralloc1_capability_t*/ outCapabilities);
801e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza    static void getCapabilitiesHook(gralloc1_device_t* device,
811e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza            uint32_t* outCount,
821e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza            int32_t* /*gralloc1_capability_t*/ outCapabilities) {
831e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza        getAdapter(device)->doGetCapabilities(outCount, outCapabilities);
841e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza    };
851e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza
861e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza    // getFunction
871e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza
881e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza    gralloc1_function_pointer_t doGetFunction(
891e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza            int32_t /*gralloc1_function_descriptor_t*/ descriptor);
901e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza    static gralloc1_function_pointer_t getFunctionHook(
911e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza            gralloc1_device_t* device,
921e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza            int32_t /*gralloc1_function_descriptor_t*/ descriptor) {
931e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza        return getAdapter(device)->doGetFunction(descriptor);
941e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza    }
951e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza
961e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza    // dump
971e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza
981e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza    void dump(uint32_t* outSize, char* outBuffer);
991e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza    static void dumpHook(gralloc1_device_t* device, uint32_t* outSize,
1001e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza            char* outBuffer) {
1011e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza        return getAdapter(device)->dump(outSize, outBuffer);
1021e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza    }
1031e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza    std::string mCachedDump;
1041e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza
1051e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza    // Buffer descriptor lifecycle functions
1061e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza
1071e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza    class Descriptor;
1081e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza
1091e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza    gralloc1_error_t createDescriptor(
1101e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza            gralloc1_buffer_descriptor_t* outDescriptor);
1111e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza    static int32_t createDescriptorHook(gralloc1_device_t* device,
1121e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza            gralloc1_buffer_descriptor_t* outDescriptor) {
1131e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza        auto error = getAdapter(device)->createDescriptor(outDescriptor);
1141e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza        return static_cast<int32_t>(error);
1151e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza    }
1161e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza
1171e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza    gralloc1_error_t destroyDescriptor(gralloc1_buffer_descriptor_t descriptor);
1181e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza    static int32_t destroyDescriptorHook(gralloc1_device_t* device,
1191e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza            gralloc1_buffer_descriptor_t descriptor) {
1201e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza        auto error = getAdapter(device)->destroyDescriptor(descriptor);
1211e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza        return static_cast<int32_t>(error);
1221e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza    }
1231e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza
1241e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza    // Buffer descriptor modification functions
1251e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza
1261e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza    struct Descriptor : public std::enable_shared_from_this<Descriptor> {
1271e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza        Descriptor(Gralloc1On0Adapter* adapter,
1281e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza                gralloc1_buffer_descriptor_t id)
1291e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza          : adapter(adapter),
1301e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza            id(id),
1311e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza            width(0),
1321e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza            height(0),
1331e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza            format(HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED),
1341e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza            producerUsage(GRALLOC1_PRODUCER_USAGE_NONE),
1351e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza            consumerUsage(GRALLOC1_CONSUMER_USAGE_NONE) {}
1361e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza
1371e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza        gralloc1_error_t setDimensions(uint32_t w, uint32_t h) {
1381e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza            width = w;
1391e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza            height = h;
1401e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza            return GRALLOC1_ERROR_NONE;
1411e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza        }
1421e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza
1431e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza        gralloc1_error_t setFormat(int32_t f) {
1441e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza            format = f;
1451e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza            return GRALLOC1_ERROR_NONE;
1461e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza        }
1471e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza
1481e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza        gralloc1_error_t setProducerUsage(gralloc1_producer_usage_t usage) {
1491e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza            producerUsage = usage;
1501e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza            return GRALLOC1_ERROR_NONE;
1511e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza        }
1521e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza
1531e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza        gralloc1_error_t setConsumerUsage(gralloc1_consumer_usage_t usage) {
1541e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza            consumerUsage = usage;
1551e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza            return GRALLOC1_ERROR_NONE;
1561e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza        }
1571e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza
1581e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza        Gralloc1On0Adapter* const adapter;
1591e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza        const gralloc1_buffer_descriptor_t id;
1601e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza
1611e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza        uint32_t width;
1621e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza        uint32_t height;
1631e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza        int32_t format;
1641e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza        gralloc1_producer_usage_t producerUsage;
1651e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza        gralloc1_consumer_usage_t consumerUsage;
1661e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza    };
1671e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza
1681e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza    template <typename ...Args>
1691e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza    static int32_t callDescriptorFunction(gralloc1_device_t* device,
1701e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza            gralloc1_buffer_descriptor_t descriptorId,
1711e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza            gralloc1_error_t (Descriptor::*member)(Args...), Args... args) {
1721e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza        auto descriptor = getAdapter(device)->getDescriptor(descriptorId);
1731e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza        if (!descriptor) {
1741e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza            return static_cast<int32_t>(GRALLOC1_ERROR_BAD_DESCRIPTOR);
1751e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza        }
1761e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza        auto error = ((*descriptor).*member)(std::forward<Args>(args)...);
1771e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza        return static_cast<int32_t>(error);
1781e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza    }
1791e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza
1801e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza    static int32_t setConsumerUsageHook(gralloc1_device_t* device,
1811e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza            gralloc1_buffer_descriptor_t descriptorId, uint64_t intUsage) {
1821e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza        auto usage = static_cast<gralloc1_consumer_usage_t>(intUsage);
1831e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza        return callDescriptorFunction(device, descriptorId,
1841e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza                &Descriptor::setConsumerUsage, usage);
1851e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza    }
1861e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza
1871e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza    static int32_t setDimensionsHook(gralloc1_device_t* device,
1881e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza            gralloc1_buffer_descriptor_t descriptorId, uint32_t width,
1891e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza            uint32_t height) {
1901e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza        return callDescriptorFunction(device, descriptorId,
1911e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza                &Descriptor::setDimensions, width, height);
1921e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza    }
1931e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza
1941e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza    static int32_t setFormatHook(gralloc1_device_t* device,
1951e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza            gralloc1_buffer_descriptor_t descriptorId, int32_t format) {
1961e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza        return callDescriptorFunction(device, descriptorId,
1971e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza                &Descriptor::setFormat, format);
1981e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza    }
1991e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza
2001e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza    static int32_t setProducerUsageHook(gralloc1_device_t* device,
2011e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza            gralloc1_buffer_descriptor_t descriptorId, uint64_t intUsage) {
2021e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza        auto usage = static_cast<gralloc1_producer_usage_t>(intUsage);
2031e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza        return callDescriptorFunction(device, descriptorId,
2041e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza                &Descriptor::setProducerUsage, usage);
2051e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza    }
2061e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza
2071e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza    // Buffer handle query functions
2081e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza
2091e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza    class Buffer {
2101e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza    public:
2111e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza        Buffer(buffer_handle_t handle, gralloc1_backing_store_t store,
2121e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza                const Descriptor& descriptor, uint32_t stride,
2131e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza                bool wasAllocated);
2141e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza
2151e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza        buffer_handle_t getHandle() const { return mHandle; }
2161e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza
2171e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza        void retain() { ++mReferenceCount; }
2181e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza
2191e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza        // Returns true if the reference count has dropped to 0, indicating that
2201e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza        // the buffer needs to be released
2211e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza        bool release() { return --mReferenceCount == 0; }
2221e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza
2231e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza        bool wasAllocated() const { return mWasAllocated; }
2241e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza
2251e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza        gralloc1_error_t getBackingStore(
2261e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza                gralloc1_backing_store_t* outStore) const {
2271e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza            *outStore = mStore;
2281e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza            return GRALLOC1_ERROR_NONE;
2291e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza        }
2301e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza
2311e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza        gralloc1_error_t getConsumerUsage(
2321e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza                gralloc1_consumer_usage_t* outUsage) const {
2331e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza            *outUsage = mDescriptor.consumerUsage;
2341e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza            return GRALLOC1_ERROR_NONE;
2351e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza        }
2361e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza
2371e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza        gralloc1_error_t getDimensions(uint32_t* outWidth,
2381e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza                uint32_t* outHeight) const {
2391e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza            *outWidth = mDescriptor.width;
2401e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza            *outHeight = mDescriptor.height;
2411e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza            return GRALLOC1_ERROR_NONE;
2421e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza        }
2431e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza
2441e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza        gralloc1_error_t getFormat(int32_t* outFormat) const {
2451e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza            *outFormat = mDescriptor.format;
2461e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza            return GRALLOC1_ERROR_NONE;
2471e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza        }
2481e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza
2491e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza        gralloc1_error_t getNumFlexPlanes(uint32_t* outNumPlanes) const {
2501e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza            // TODO: This is conservative, and we could do better by examining
2511e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza            // the format, but it won't hurt anything for now
2521e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza            *outNumPlanes = 4;
2531e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza            return GRALLOC1_ERROR_NONE;
2541e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza        }
2551e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza
2561e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza        gralloc1_error_t getProducerUsage(
2571e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza                gralloc1_producer_usage_t* outUsage) const {
2581e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza            *outUsage = mDescriptor.producerUsage;
2591e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza            return GRALLOC1_ERROR_NONE;
2601e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza        }
2611e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza
2621e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza        gralloc1_error_t getStride(uint32_t* outStride) const {
2631e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza            *outStride = mStride;
2641e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza            return GRALLOC1_ERROR_NONE;
2651e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza        }
2661e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza
2671e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza    private:
2681e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza
2691e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza        const buffer_handle_t mHandle;
2701e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza        size_t mReferenceCount;
2711e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza
2721e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza        // Since we're adapting to gralloc0, there will always be a 1:1
2731e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza        // correspondence between buffer handles and backing stores, and the
2741e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza        // backing store ID will be the same as the GraphicBuffer unique ID
2751e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza        const gralloc1_backing_store_t mStore;
2761e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza
2771e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza        const Descriptor mDescriptor;
2781e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza        const uint32_t mStride;
2791e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza
2801e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza        // Whether this buffer allocated in this process (as opposed to just
2811e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza        // being retained here), which determines whether to free or unregister
2821e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza        // the buffer when this Buffer is released
2831e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza        const bool mWasAllocated;
2841e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza    };
2851e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza
2861e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza    template <typename ...Args>
2871e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza    static int32_t callBufferFunction(gralloc1_device_t* device,
2881e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza            buffer_handle_t bufferHandle,
2891e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza            gralloc1_error_t (Buffer::*member)(Args...) const, Args... args) {
2901e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza        auto buffer = getAdapter(device)->getBuffer(bufferHandle);
2911e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza        if (!buffer) {
2921e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza            return static_cast<int32_t>(GRALLOC1_ERROR_BAD_HANDLE);
2931e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza        }
2941e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza        auto error = ((*buffer).*member)(std::forward<Args>(args)...);
2951e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza        return static_cast<int32_t>(error);
2961e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza    }
2971e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza
2981e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza    template <typename MF, MF memFunc, typename ...Args>
2991e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza    static int32_t bufferHook(gralloc1_device_t* device,
3001e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza            buffer_handle_t bufferHandle, Args... args) {
3011e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza        return Gralloc1On0Adapter::callBufferFunction(device, bufferHandle,
3021e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza                memFunc, std::forward<Args>(args)...);
3031e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza    }
3041e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza
3051e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza    static int32_t getConsumerUsageHook(gralloc1_device_t* device,
3061e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza            buffer_handle_t bufferHandle, uint64_t* outUsage) {
3071e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza        auto usage = GRALLOC1_CONSUMER_USAGE_NONE;
3081e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza        auto error = callBufferFunction(device, bufferHandle,
3091e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza                &Buffer::getConsumerUsage, &usage);
3101e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza        if (error != GRALLOC1_ERROR_NONE) {
3111e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza            *outUsage = static_cast<uint64_t>(usage);
3121e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza        }
3131e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza        return error;
3141e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza    }
3151e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza
3161e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza    static int32_t getProducerUsageHook(gralloc1_device_t* device,
3171e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza            buffer_handle_t bufferHandle, uint64_t* outUsage) {
3181e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza        auto usage = GRALLOC1_PRODUCER_USAGE_NONE;
3191e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza        auto error = callBufferFunction(device, bufferHandle,
3201e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza                &Buffer::getProducerUsage, &usage);
3211e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza        if (error != GRALLOC1_ERROR_NONE) {
3221e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza            *outUsage = static_cast<uint64_t>(usage);
3231e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza        }
3241e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza        return error;
3251e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza    }
3261e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza
3271e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza    // Buffer management functions
3281e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza
3291e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza    // We don't provide GRALLOC1_FUNCTION_ALLOCATE, since this should always be
3301e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza    // called through GRALLOC1_FUNCTION_ALLOCATE_WITH_ID
3311e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza    gralloc1_error_t allocate(
3321e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza            const std::shared_ptr<Descriptor>& descriptor,
3331e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza            gralloc1_backing_store_t id,
3341e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza            buffer_handle_t* outBufferHandle);
3351e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza    static gralloc1_error_t allocateWithIdHook(gralloc1_device_t* device,
3361e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza            gralloc1_buffer_descriptor_t descriptors,
3371e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza            gralloc1_backing_store_t id, buffer_handle_t* outBuffer);
3381e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza
3391e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza    gralloc1_error_t retain(const std::shared_ptr<Buffer>& buffer);
3401e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza    gralloc1_error_t release(const std::shared_ptr<Buffer>& buffer);
3411e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza
3421e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza    // Member function pointer 'member' will either be retain or release
3431e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza    template <gralloc1_error_t (Gralloc1On0Adapter::*member)(
3441e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza            const std::shared_ptr<Buffer>& buffer)>
3451e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza    static int32_t managementHook(gralloc1_device_t* device,
3461e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza            buffer_handle_t bufferHandle) {
3471e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza        auto adapter = getAdapter(device);
3481e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza
3491e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza        auto buffer = adapter->getBuffer(bufferHandle);
3501e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza        if (!buffer) {
3511e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza            return static_cast<int32_t>(GRALLOC1_ERROR_BAD_HANDLE);
3521e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza        }
3531e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza
3541e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza        auto error = ((*adapter).*member)(buffer);
3551e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza        return static_cast<int32_t>(error);
3561e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza    }
3571e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza
3581e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza    gralloc1_error_t retain(const GraphicBuffer* buffer);
3591e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza    static gralloc1_error_t retainGraphicBufferHook(gralloc1_device_t* device,
3601e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza            const GraphicBuffer* buffer) {
3611e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza        auto adapter = getAdapter(device);
3621e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza        return adapter->retain(buffer);
3631e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza    }
3641e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza
3651e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza    // Buffer access functions
3661e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza
3671e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza    gralloc1_error_t lock(const std::shared_ptr<Buffer>& buffer,
3681e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza            gralloc1_producer_usage_t producerUsage,
3691e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza            gralloc1_consumer_usage_t consumerUsage,
3701e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza            const gralloc1_rect_t& accessRegion, void** outData,
3711e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza            const sp<Fence>& acquireFence);
3721e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza    gralloc1_error_t lockFlex(const std::shared_ptr<Buffer>& buffer,
3731e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza            gralloc1_producer_usage_t producerUsage,
3741e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza            gralloc1_consumer_usage_t consumerUsage,
3751e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza            const gralloc1_rect_t& accessRegion,
3761e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza            struct android_flex_layout* outFlex,
3771e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza            const sp<Fence>& acquireFence);
3781e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza    gralloc1_error_t lockYCbCr(const std::shared_ptr<Buffer>& buffer,
3791e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza            gralloc1_producer_usage_t producerUsage,
3801e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza            gralloc1_consumer_usage_t consumerUsage,
3811e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza            const gralloc1_rect_t& accessRegion,
3821e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza            struct android_ycbcr* outFlex,
3831e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza            const sp<Fence>& acquireFence);
3841e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza
3851e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza    template <typename OUT, gralloc1_error_t (Gralloc1On0Adapter::*member)(
3861e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza            const std::shared_ptr<Buffer>&, gralloc1_producer_usage_t,
3871e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza            gralloc1_consumer_usage_t, const gralloc1_rect_t&, OUT*,
3881e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza            const sp<Fence>&)>
3891e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza    static int32_t lockHook(gralloc1_device_t* device,
3901e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza            buffer_handle_t bufferHandle,
3911e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza            uint64_t /*gralloc1_producer_usage_t*/ uintProducerUsage,
3921e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza            uint64_t /*gralloc1_consumer_usage_t*/ uintConsumerUsage,
3931e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza            const gralloc1_rect_t* accessRegion, OUT* outData,
3941e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza            int32_t acquireFenceFd) {
3951e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza        auto adapter = getAdapter(device);
3961e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza
3971e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza        // Exactly one of producer and consumer usage must be *_USAGE_NONE,
3981e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza        // but we can't check this until the upper levels of the framework
3991e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza        // correctly distinguish between producer and consumer usage
4001e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza        /*
4011e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza        bool hasProducerUsage =
4021e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza                uintProducerUsage != GRALLOC1_PRODUCER_USAGE_NONE;
4031e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza        bool hasConsumerUsage =
4041e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza                uintConsumerUsage != GRALLOC1_CONSUMER_USAGE_NONE;
4051e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza        if (hasProducerUsage && hasConsumerUsage ||
4061e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza                !hasProducerUsage && !hasConsumerUsage) {
4071e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza            return static_cast<int32_t>(GRALLOC1_ERROR_BAD_VALUE);
4081e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza        }
4091e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza        */
4101e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza
4111e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza        auto producerUsage =
4121e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza                static_cast<gralloc1_producer_usage_t>(uintProducerUsage);
4131e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza        auto consumerUsage =
4141e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza                static_cast<gralloc1_consumer_usage_t>(uintConsumerUsage);
4151e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza
4161e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza        if (!outData) {
4171e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza            const auto producerCpuUsage = GRALLOC1_PRODUCER_USAGE_CPU_READ |
4181e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza                    GRALLOC1_PRODUCER_USAGE_CPU_WRITE;
4191e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza            if (producerUsage & producerCpuUsage != 0) {
4201e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza                return static_cast<int32_t>(GRALLOC1_ERROR_BAD_VALUE);
4211e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza            }
4221e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza            if (consumerUsage & GRALLOC1_CONSUMER_USAGE_CPU_READ != 0) {
4231e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza                return static_cast<int32_t>(GRALLOC1_ERROR_BAD_VALUE);
4241e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza            }
4251e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza        }
4261e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza
4271e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza        auto buffer = adapter->getBuffer(bufferHandle);
4281e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza        if (!buffer) {
4291e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza            return static_cast<int32_t>(GRALLOC1_ERROR_BAD_HANDLE);
4301e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza        }
4311e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza
4321e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza        if (!accessRegion) {
4331e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza            ALOGE("accessRegion is null");
4341e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza            return static_cast<int32_t>(GRALLOC1_ERROR_BAD_VALUE);
4351e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza        }
4361e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza
4371e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza        sp<Fence> acquireFence{new Fence(acquireFenceFd)};
4381e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza        auto error = ((*adapter).*member)(buffer, producerUsage, consumerUsage,
4391e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza                *accessRegion, outData, acquireFence);
4401e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza        return static_cast<int32_t>(error);
4411e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza    }
4421e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza
4431e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza    gralloc1_error_t unlock(const std::shared_ptr<Buffer>& buffer,
4441e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza            sp<Fence>* outReleaseFence);
4451e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza    static int32_t unlockHook(gralloc1_device_t* device,
4461e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza            buffer_handle_t bufferHandle, int32_t* outReleaseFenceFd) {
4471e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza        auto adapter = getAdapter(device);
4481e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza
4491e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza        auto buffer = adapter->getBuffer(bufferHandle);
4501e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza        if (!buffer) {
4511e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza            return static_cast<int32_t>(GRALLOC1_ERROR_BAD_HANDLE);
4521e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza        }
4531e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza
4541e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza        sp<Fence> releaseFence = Fence::NO_FENCE;
4551e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza        auto error = adapter->unlock(buffer, &releaseFence);
4561e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza        if (error == GRALLOC1_ERROR_NONE) {
4571e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza            *outReleaseFenceFd = releaseFence->dup();
4581e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza        }
4591e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza        return static_cast<int32_t>(error);
4601e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza    }
4611e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza
4621e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza    // Adapter internals
4631e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza    const gralloc_module_t* mModule;
4641e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza    uint8_t mMinorVersion;
4651e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza    alloc_device_t* mDevice;
4661e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza
4671e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza    std::shared_ptr<Descriptor> getDescriptor(
4681e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza            gralloc1_buffer_descriptor_t descriptorId);
4691e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza    std::shared_ptr<Buffer> getBuffer(buffer_handle_t bufferHandle);
4701e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza
4711e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza    static std::atomic<gralloc1_buffer_descriptor_t> sNextBufferDescriptorId;
472923c0668eb2427bb148a56bd1ac7834cc371d5a0Dan Stoza    std::mutex mDescriptorMutex;
4731e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza    std::unordered_map<gralloc1_buffer_descriptor_t,
4741e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza            std::shared_ptr<Descriptor>> mDescriptors;
475923c0668eb2427bb148a56bd1ac7834cc371d5a0Dan Stoza    std::mutex mBufferMutex;
4761e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza    std::unordered_map<buffer_handle_t, std::shared_ptr<Buffer>> mBuffers;
4771e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza};
4781e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza
4791e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza} // namespace android
4801e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza
4811e2a2a0ee81401072d9fc0f842c7ec1a915c5a07Dan Stoza#endif
482