blob: 4729cbaf67d18b3b0c4a951200fbc526f82094d2 [file] [log] [blame]
/*
* Copyright 2019 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef ANDROID_UI_GRALLOC4_H
#define ANDROID_UI_GRALLOC4_H
#include <android/hardware/graphics/allocator/4.0/IAllocator.h>
#include <android/hardware/graphics/common/1.1/types.h>
#include <android/hardware/graphics/mapper/4.0/IMapper.h>
#include <gralloctypes/Gralloc4.h>
#include <ui/Gralloc.h>
#include <ui/GraphicTypes.h>
#include <ui/Rect.h>
#include <utils/StrongPointer.h>
#include <string>
namespace android {
class Gralloc4Mapper : public GrallocMapper {
public:
static void preload();
Gralloc4Mapper();
bool isLoaded() const override;
std::string dumpBuffer(buffer_handle_t bufferHandle, bool less = true) const override;
std::string dumpBuffers(bool less = true) const;
status_t createDescriptor(void* bufferDescriptorInfo, void* outBufferDescriptor) const override;
status_t importBuffer(const hardware::hidl_handle& rawHandle,
buffer_handle_t* outBufferHandle) const override;
void freeBuffer(buffer_handle_t bufferHandle) const override;
status_t validateBufferSize(buffer_handle_t bufferHandle, uint32_t width, uint32_t height,
PixelFormat format, uint32_t layerCount, uint64_t usage,
uint32_t stride) const override;
void getTransportSize(buffer_handle_t bufferHandle, uint32_t* outNumFds,
uint32_t* outNumInts) const override;
status_t lock(buffer_handle_t bufferHandle, uint64_t usage, const Rect& bounds,
int acquireFence, void** outData, int32_t* outBytesPerPixel,
int32_t* outBytesPerStride) const override;
status_t lock(buffer_handle_t bufferHandle, uint64_t usage, const Rect& bounds,
int acquireFence, android_ycbcr* ycbcr) const override;
int unlock(buffer_handle_t bufferHandle) const override;
status_t isSupported(uint32_t width, uint32_t height, PixelFormat format, uint32_t layerCount,
uint64_t usage, bool* outSupported) const override;
status_t getBufferId(buffer_handle_t bufferHandle, uint64_t* outBufferId) const override;
status_t getName(buffer_handle_t bufferHandle, std::string* outName) const override;
status_t getWidth(buffer_handle_t bufferHandle, uint64_t* outWidth) const override;
status_t getHeight(buffer_handle_t bufferHandle, uint64_t* outHeight) const override;
status_t getLayerCount(buffer_handle_t bufferHandle, uint64_t* outLayerCount) const override;
status_t getPixelFormatRequested(buffer_handle_t bufferHandle,
ui::PixelFormat* outPixelFormatRequested) const override;
status_t getPixelFormatFourCC(buffer_handle_t bufferHandle,
uint32_t* outPixelFormatFourCC) const override;
status_t getPixelFormatModifier(buffer_handle_t bufferHandle,
uint64_t* outPixelFormatModifier) const override;
status_t getUsage(buffer_handle_t bufferHandle, uint64_t* outUsage) const override;
status_t getAllocationSize(buffer_handle_t bufferHandle,
uint64_t* outAllocationSize) const override;
status_t getProtectedContent(buffer_handle_t bufferHandle,
uint64_t* outProtectedContent) const override;
status_t getCompression(buffer_handle_t bufferHandle,
aidl::android::hardware::graphics::common::ExtendableType*
outCompression) const override;
status_t getCompression(buffer_handle_t bufferHandle,
ui::Compression* outCompression) const override;
status_t getInterlaced(buffer_handle_t bufferHandle,
aidl::android::hardware::graphics::common::ExtendableType* outInterlaced)
const override;
status_t getInterlaced(buffer_handle_t bufferHandle,
ui::Interlaced* outInterlaced) const override;
status_t getChromaSiting(buffer_handle_t bufferHandle,
aidl::android::hardware::graphics::common::ExtendableType*
outChromaSiting) const override;
status_t getChromaSiting(buffer_handle_t bufferHandle,
ui::ChromaSiting* outChromaSiting) const override;
status_t getPlaneLayouts(buffer_handle_t bufferHandle,
std::vector<ui::PlaneLayout>* outPlaneLayouts) const override;
status_t getDataspace(buffer_handle_t bufferHandle, ui::Dataspace* outDataspace) const override;
status_t getBlendMode(buffer_handle_t bufferHandle, ui::BlendMode* outBlendMode) const override;
status_t getSmpte2086(buffer_handle_t bufferHandle,
std::optional<ui::Smpte2086>* outSmpte2086) const override;
status_t getCta861_3(buffer_handle_t bufferHandle,
std::optional<ui::Cta861_3>* outCta861_3) const override;
status_t getSmpte2094_40(buffer_handle_t bufferHandle,
std::optional<std::vector<uint8_t>>* outSmpte2094_40) const override;
status_t getDefaultPixelFormatFourCC(uint32_t width, uint32_t height, PixelFormat format,
uint32_t layerCount, uint64_t usage,
uint32_t* outPixelFormatFourCC) const override;
status_t getDefaultPixelFormatModifier(uint32_t width, uint32_t height, PixelFormat format,
uint32_t layerCount, uint64_t usage,
uint64_t* outPixelFormatModifier) const override;
status_t getDefaultAllocationSize(uint32_t width, uint32_t height, PixelFormat format,
uint32_t layerCount, uint64_t usage,
uint64_t* outAllocationSize) const override;
status_t getDefaultProtectedContent(uint32_t width, uint32_t height, PixelFormat format,
uint32_t layerCount, uint64_t usage,
uint64_t* outProtectedContent) const override;
status_t getDefaultCompression(uint32_t width, uint32_t height, PixelFormat format,
uint32_t layerCount, uint64_t usage,
aidl::android::hardware::graphics::common::ExtendableType*
outCompression) const override;
status_t getDefaultCompression(uint32_t width, uint32_t height, PixelFormat format,
uint32_t layerCount, uint64_t usage,
ui::Compression* outCompression) const override;
status_t getDefaultInterlaced(uint32_t width, uint32_t height, PixelFormat format,
uint32_t layerCount, uint64_t usage,
aidl::android::hardware::graphics::common::ExtendableType*
outInterlaced) const override;
status_t getDefaultInterlaced(uint32_t width, uint32_t height, PixelFormat format,
uint32_t layerCount, uint64_t usage,
ui::Interlaced* outInterlaced) const override;
status_t getDefaultChromaSiting(uint32_t width, uint32_t height, PixelFormat format,
uint32_t layerCount, uint64_t usage,
aidl::android::hardware::graphics::common::ExtendableType*
outChromaSiting) const override;
status_t getDefaultChromaSiting(uint32_t width, uint32_t height, PixelFormat format,
uint32_t layerCount, uint64_t usage,
ui::ChromaSiting* outChromaSiting) const override;
status_t getDefaultPlaneLayouts(uint32_t width, uint32_t height, PixelFormat format,
uint32_t layerCount, uint64_t usage,
std::vector<ui::PlaneLayout>* outPlaneLayouts) const override;
std::vector<android::hardware::graphics::mapper::V4_0::IMapper::MetadataTypeDescription>
listSupportedMetadataTypes() const;
private:
friend class GraphicBufferAllocator;
// Determines whether the passed info is compatible with the mapper.
status_t validateBufferDescriptorInfo(
hardware::graphics::mapper::V4_0::IMapper::BufferDescriptorInfo* descriptorInfo) const;
template <class T>
using DecodeFunction = status_t (*)(const hardware::hidl_vec<uint8_t>& input, T* output);
template <class T>
status_t get(
buffer_handle_t bufferHandle,
const android::hardware::graphics::mapper::V4_0::IMapper::MetadataType& metadataType,
DecodeFunction<T> decodeFunction, T* outMetadata) const;
template <class T>
status_t getDefault(
uint32_t width, uint32_t height, PixelFormat format, uint32_t layerCount,
uint64_t usage,
const android::hardware::graphics::mapper::V4_0::IMapper::MetadataType& metadataType,
DecodeFunction<T> decodeFunction, T* outMetadata) const;
template <class T>
status_t metadataDumpHelper(
const android::hardware::graphics::mapper::V4_0::IMapper::BufferDump& bufferDump,
aidl::android::hardware::graphics::common::StandardMetadataType metadataType,
DecodeFunction<T> decodeFunction, T* outT) const;
status_t bufferDumpHelper(
const android::hardware::graphics::mapper::V4_0::IMapper::BufferDump& bufferDump,
std::ostringstream* outDump, uint64_t* outAllocationSize, bool less) const;
sp<hardware::graphics::mapper::V4_0::IMapper> mMapper;
};
class Gralloc4Allocator : public GrallocAllocator {
public:
// An allocator relies on a mapper, and that mapper must be alive at all
// time.
Gralloc4Allocator(const Gralloc4Mapper& mapper);
bool isLoaded() const override;
std::string dumpDebugInfo(bool less = true) const override;
status_t allocate(std::string requestorName, uint32_t width, uint32_t height,
PixelFormat format, uint32_t layerCount, uint64_t usage, uint32_t bufferCount,
uint32_t* outStride, buffer_handle_t* outBufferHandles,
bool importBuffers = true) const override;
private:
const Gralloc4Mapper& mMapper;
sp<hardware::graphics::allocator::V4_0::IAllocator> mAllocator;
};
} // namespace android
#endif // ANDROID_UI_GRALLOC4_H