blob: f9c8acafaa10fa33bc64301bf915d7cdf11bb70e [file] [log] [blame]
/*
* Copyright (C) 2023 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.
*/
#pragma once
#include <aidl/android/hardware/media/c2/BnGraphicBufferAllocator.h>
#include <android-base/unique_fd.h>
#include <gui/IGraphicBufferProducer.h>
#include <memory>
#include <C2Buffer.h>
namespace aidl::android::hardware::media::c2::implementation {
// forward declarations
class GraphicsTracker;
struct GraphicBufferAllocator : public BnGraphicBufferAllocator {
public:
// HAL interfaces
::ndk::ScopedAStatus allocate(const IGraphicBufferAllocator::Description& in_desc,
IGraphicBufferAllocator::Allocation* _aidl_return) override;
::ndk::ScopedAStatus deallocate(int64_t in_id, bool* _aidl_return) override;
::ndk::ScopedAStatus getWaitableFds(
IGraphicBufferAllocator::WaitableFds* _aidl_return) override;
/**
* Configuring Surface/BufferQueue for the interface.
*
* Configure Surface, generation # and max dequeueBuffer() count for
* allocate interface.
*
* @param igbp Surface where to allocate.
* @param generation Generation # for allocations.
* @param maxDequeueBufferCount
* Maximum # of pending allocations.
*/
bool configure(const ::android::sp<::android::IGraphicBufferProducer>& igbp,
uint32_t generation,
int maxDequeueBufferCount);
/**
* Update max dequeue buffer count of BufferQueue.
*
* BufferQueue does not update this value if count is smaller
* than the currently dequeued count.
* TODO: better to update the value inside this interface.
* for return value inspection from BQ, also for delayed updates.
*
* @param count the new value to update
*/
void updateMaxDequeueBufferCount(int count);
void reset();
/**
* Create a listener for buffer being released.
*
* Surface will register this listener and notify whenever the consumer
* releases a buffer.
*
* @param generation generation # for the BufferQueue.
* @return IProducerListener can be used when connect# to Surface.
*/
const ::android::sp<::android::IProducerListener> createReleaseListener(
uint32_t generation);
/**
* Notifies a buffer being released.
*
* @param generation generation # for the BufferQueue.
*/
void onBufferReleased(uint32_t generation);
/**
* Allocates a buffer.
*
* @param width width of the requested buffer.
* @param height height of the requested buffer.
* @param format format of the requested buffer.
* @param usage usage of the requested buffer.
* @param buf out param for created buffer.
* @param fence out param for a pending fence.
*
* @return OK When an allocation was created.
* C2_BAD_STATE Client is not in the state for allocating
* C2_BLOCKING operation is blocked. Waitable fds can be
* used to know when it unblocks.
* C2_CORRUPTED Failed with a serious reason.
*/
c2_status_t allocate(uint32_t width, uint32_t height,
::android::PixelFormat format, uint64_t usage,
AHardwareBuffer **buf, ::android::sp<::android::Fence> *fence);
/**
* De-allocate a buffer.
*
* @param id unique id for a buffer.
* @param fence write fence if it's deallocated due to
* cancellation of displaying
*/
bool deallocate(const uint64_t id, const ::android::sp<::android::Fence> &fence);
/**
* Display a graphic buffer to BufferQueue.
*
* @param block block to display to Surface.
* @param input input parameter for displaying.
* @param output out parameter from Surface.
*/
c2_status_t displayBuffer(
const C2ConstGraphicBlock& block,
const ::android::IGraphicBufferProducer::QueueBufferInput& input,
::android::IGraphicBufferProducer::QueueBufferOutput *output);
~GraphicBufferAllocator();
/**
* Create the interface.
*
* The interface and codec instance's relationship is 1 to 1.
* The interface will be cretaed in the beginning of Codec createion. And
* lives until the instance destroyed.
*
* @param maxDequeueCount Initial max allocatable count
*/
static std::shared_ptr<GraphicBufferAllocator> CreateGraphicBufferAllocator(
int maxDequeueCount);
private:
GraphicBufferAllocator(int maxDequeueCount);
std::shared_ptr<GraphicsTracker> mGraphicsTracker;
friend class ::ndk::SharedRefBase;
};
} // namespace aidl::android::hardware::media::c2::implementation