1c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju/* 2c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju * Copyright 2016 The Android Open Source Project 3c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju * 4c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju * Licensed under the Apache License, Version 2.0 (the "License"); 5c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju * you may not use this file except in compliance with the License. 6c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju * You may obtain a copy of the License at 7c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju * 8c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju * http://www.apache.org/licenses/LICENSE-2.0 9c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju * 10c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju * Unless required by applicable law or agreed to in writing, software 11c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju * distributed under the License is distributed on an "AS IS" BASIS, 12c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju * See the License for the specific language governing permissions and 14c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju * limitations under the License. 15c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju */ 16c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 17c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju#ifndef ANDROID_SURFACEREPLAYER_BUFFERQUEUESCHEDULER_H 18c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju#define ANDROID_SURFACEREPLAYER_BUFFERQUEUESCHEDULER_H 19c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 20c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju#include "Color.h" 21c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju#include "Event.h" 22c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 23c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju#include <gui/SurfaceControl.h> 24c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 25c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju#include <utils/StrongPointer.h> 26c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 27c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju#include <atomic> 28c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju#include <condition_variable> 29c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju#include <mutex> 30c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju#include <queue> 31c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju#include <utility> 32c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 33c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanjunamespace android { 34c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 35c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanjuauto constexpr LAYER_ALPHA = 190; 36c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 37c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanjustruct Dimensions { 38c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju Dimensions() = default; 39c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju Dimensions(int w, int h) : width(w), height(h) {} 40c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 41c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju int width = 0; 42c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju int height = 0; 43c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju}; 44c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 45c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanjustruct BufferEvent { 46c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju BufferEvent() = default; 47c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju BufferEvent(std::shared_ptr<Event> e, Dimensions d) : event(e), dimensions(d) {} 48c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 49c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju std::shared_ptr<Event> event; 50c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju Dimensions dimensions; 51c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju}; 52c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 53c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanjuclass BufferQueueScheduler { 54c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju public: 5501041fe22aead67520962b534134b3e3291b1622Sahil Dhanju BufferQueueScheduler(const sp<SurfaceControl>& surfaceControl, const HSV& color, int id); 56c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 57c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju void startScheduling(); 58c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju void addEvent(const BufferEvent&); 59c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju void stopScheduling(); 60c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 6101041fe22aead67520962b534134b3e3291b1622Sahil Dhanju void setSurfaceControl(const sp<SurfaceControl>& surfaceControl, const HSV& color); 62c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 63c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju private: 64c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju void bufferUpdate(const Dimensions& dimensions); 65c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 66c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju // Lock and fill the surface, block until the event is signaled by the main loop, 67c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju // then unlock and post the buffer. 6801041fe22aead67520962b534134b3e3291b1622Sahil Dhanju void fillSurface(const std::shared_ptr<Event>& event); 69c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 70c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju sp<SurfaceControl> mSurfaceControl; 7101041fe22aead67520962b534134b3e3291b1622Sahil Dhanju HSV mColor; 72c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju const int mSurfaceId; 73c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 74c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju bool mContinueScheduling; 75c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 76c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju std::queue<BufferEvent> mBufferEvents; 77c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju std::mutex mMutex; 78c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju std::condition_variable mCondition; 79c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju}; 80c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju 81c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju} // namespace android 82c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju#endif 83