#pragma once
/*
* Copyright (C) 2016 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.
*/
#include <functional>
#include <hardware/gralloc.h>
#include "hwcomposer_common.h"
namespace cvd {
using FbBroadcaster = std::function<void(int)>;
class BaseComposer {
public:
BaseComposer(int64_t vsync_base_timestamp, int32_t vsync_period_ns);
~BaseComposer();
// Sets the composition type of each layer and returns the number of layers
// to be composited by the hwcomposer.
int PrepareLayers(size_t num_layers, vsoc_hwc_layer* layers);
// Returns 0 if successful.
int SetLayers(size_t num_layers, vsoc_hwc_layer* layers);
// Changes the broadcaster, gives the ability to report more than just the
// offset by using a wrapper like the StatsKeepingComposer. Returns the old
// broadcaster. Passing a NULL pointer will cause the composer to not
// broadcast at all.
FbBroadcaster ReplaceFbBroadcaster(FbBroadcaster);
void Dump(char* buff, int buff_len);
protected:
void Broadcast(int32_t offset);
int NextScreenBuffer();
const gralloc_module_t* gralloc_module_;
int64_t vsync_base_timestamp_;
int32_t vsync_period_ns_;
int last_frame_buffer_ = -1; // The first index will be 0
private:
// Returns buffer offset or negative on error.
int PostFrameBufferTarget(buffer_handle_t handle);
FbBroadcaster fb_broadcaster_;
};
} // namespace cvd