blob: 9cb51539d474d2f20dc713107f6e3d17fc39a2e0 [file] [log] [blame]
/*
* Copyright (C) 2020 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_HWC_GRALLOC_H
#define ANDROID_HWC_GRALLOC_H
#include <aidl/android/hardware/graphics/common/PlaneLayout.h>
#include <android/hardware/graphics/mapper/4.0/IMapper.h>
#include <hardware/gralloc.h>
#include <system/graphics.h>
#include <utils/StrongPointer.h>
#include <memory>
#include <optional>
#include <vector>
namespace android {
class Gralloc;
class GrallocBuffer;
// An RAII object that will Unlock() a GrallocBuffer upon destruction.
class GrallocBufferView {
public:
virtual ~GrallocBufferView();
GrallocBufferView(const GrallocBufferView& rhs) = delete;
GrallocBufferView& operator=(const GrallocBufferView& rhs) = delete;
GrallocBufferView(GrallocBufferView&& rhs);
GrallocBufferView& operator=(GrallocBufferView&& rhs);
const std::optional<void*> Get() const;
const std::optional<android_ycbcr>& GetYCbCr() const;
private:
friend class GrallocBuffer;
GrallocBufferView(GrallocBuffer* buffer, void* raw);
GrallocBufferView(GrallocBuffer* buffer, android_ycbcr raw);
// The GrallocBuffer that should be unlocked upon destruction of this object.
GrallocBuffer* gralloc_buffer_ = nullptr;
std::optional<void*> locked_;
std::optional<android_ycbcr> locked_ycbcr_;
};
// A gralloc 4.0 buffer that has been imported in the current process and
// that will be released upon destruction. Users must ensure that the Gralloc
// instance that this buffer is created with out lives this buffer.
class GrallocBuffer {
public:
GrallocBuffer(Gralloc* gralloc, buffer_handle_t buffer);
virtual ~GrallocBuffer();
GrallocBuffer(const GrallocBuffer& rhs) = delete;
GrallocBuffer& operator=(const GrallocBuffer& rhs) = delete;
GrallocBuffer(GrallocBuffer&& rhs);
GrallocBuffer& operator=(GrallocBuffer&& rhs);
// Locks the buffer for reading and returns a view if successful.
std::optional<GrallocBufferView> Lock();
std::optional<uint32_t> GetWidth();
std::optional<uint32_t> GetHeight();
std::optional<uint32_t> GetDrmFormat();
// Returns the stride of the buffer if it is a single plane buffer or fails
// and returns nullopt if the buffer is for a multi plane buffer.
std::optional<uint32_t> GetMonoPlanarStrideBytes();
std::optional<
std::vector<aidl::android::hardware::graphics::common::PlaneLayout>>
GetPlaneLayouts();
private:
// Internal visibility for Unlock().
friend class GrallocBufferView;
// Unlocks the buffer from reading.
void Unlock();
void Release();
Gralloc* gralloc_ = nullptr;
buffer_handle_t buffer_ = nullptr;
};
class Gralloc {
public:
Gralloc();
virtual ~Gralloc() = default;
// Imports the given buffer handle into the current process and returns an
// imported buffer which can be used for reading. Users must ensure that the
// Gralloc instance outlives any GrallocBuffers.
std::optional<GrallocBuffer> Import(buffer_handle_t buffer);
private:
// The below functions are made avaialble only to GrallocBuffer so that
// users only call gralloc functions on *imported* buffers.
friend class GrallocBuffer;
// See GrallocBuffer::Release.
void Release(buffer_handle_t buffer);
// See GrallocBuffer::Lock.
std::optional<void*> Lock(buffer_handle_t buffer);
// See GrallocBuffer::LockYCbCr.
std::optional<android_ycbcr> LockYCbCr(buffer_handle_t buffer);
// See GrallocBuffer::Unlock.
void Unlock(buffer_handle_t buffer);
// See GrallocBuffer::GetWidth.
std::optional<uint32_t> GetWidth(buffer_handle_t buffer);
// See GrallocBuffer::GetHeight.
std::optional<uint32_t> GetHeight(buffer_handle_t buffer);
// See GrallocBuffer::GetDrmFormat.
std::optional<uint32_t> GetDrmFormat(buffer_handle_t buffer);
// See GrallocBuffer::GetPlaneLayouts.
std::optional<
std::vector<aidl::android::hardware::graphics::common::PlaneLayout>>
GetPlaneLayouts(buffer_handle_t buffer);
// Returns the stride of the buffer if it is a single plane buffer or fails
// and returns nullopt if the buffer is for a multi plane buffer.
std::optional<uint32_t> GetMonoPlanarStrideBytes(buffer_handle_t);
// See GrallocBuffer::GetMetadata.
android::hardware::graphics::mapper::V4_0::Error GetMetadata(
buffer_handle_t buffer,
android::hardware::graphics::mapper::V4_0::IMapper::MetadataType type,
android::hardware::hidl_vec<uint8_t>* metadata);
android::sp<android::hardware::graphics::mapper::V4_0::IMapper> gralloc4_;
};
} // namespace android
#endif