blob: 05a889bb321c56136ed0651689238cac3b233309 [file] [log] [blame]
#ifndef VR_WINDOW_MANAGER_HWC_CALLBACK_H_
#define VR_WINDOW_MANAGER_HWC_CALLBACK_H_
#include <deque>
#include <functional>
#include <mutex>
#include <vector>
#include <android/dvr/composer/1.0/IVrComposerCallback.h>
#include <android/dvr/composer/1.0/IVrComposerView.h>
#include <impl/vr_hwc.h>
namespace android {
class Fence;
class GraphicBuffer;
namespace dvr {
using Recti = ComposerView::ComposerLayer::Recti;
using Rectf = ComposerView::ComposerLayer::Rectf;
using composer::V1_0::IVrComposerCallback;
using composer::V1_0::IVrComposerView;
class HwcCallback : public IVrComposerCallback {
public:
struct HwcLayer {
enum LayerType : uint32_t {
// These are from frameworks/base/core/java/android/view/WindowManager.java
kUndefinedWindow = 0,
kFirstApplicationWindow = 1,
kLastApplicationWindow = 99,
kFirstSubWindow = 1000,
kLastSubWindow = 1999,
kFirstSystemWindow = 2000,
kStatusBar = kFirstSystemWindow,
kInputMethod = kFirstSystemWindow + 11,
kNavigationBar = kFirstSystemWindow + 19,
kLastSystemWindow = 2999,
};
bool should_skip_layer() const {
switch (type) {
// Always skip the following layer types
case kNavigationBar:
case kStatusBar:
case kUndefinedWindow:
return true;
default:
return false;
}
}
sp<Fence> fence;
sp<GraphicBuffer> buffer;
Rectf crop;
Recti display_frame;
int32_t blending;
uint32_t appid;
LayerType type;
float alpha;
};
enum class FrameStatus {
kUnfinished,
kFinished,
kError
};
class Frame {
public:
Frame(std::vector<HwcLayer>&& layers);
FrameStatus Finish();
const std::vector<HwcLayer>& layers() const { return layers_; }
private:
std::vector<HwcLayer> layers_;
FrameStatus status_ = FrameStatus::kUnfinished;
};
class Client {
public:
virtual ~Client() {}
virtual void OnFrame(std::unique_ptr<Frame>) = 0;
};
explicit HwcCallback(IVrComposerView* composer_view, Client* client);
~HwcCallback() override;
private:
// This is the only method called on the binder thread. Everything else is
// called on the render thread.
Return<void> onNewFrame(const hidl_vec<IVrComposerCallback::Layer>& frame)
override;
IVrComposerView* composer_view_;
Client *client_;
std::mutex mutex_;
HwcCallback(const HwcCallback&) = delete;
void operator=(const HwcCallback&) = delete;
};
} // namespace dvr
} // namespace android
#endif // VR_WINDOW_MANAGER_HWC_CALLBACK_H_