/* * 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 "GlWrapper.h" #include #include #include #include #include #include #include namespace aidl::android::hardware::automotive::evs::implementation { class EvsGlDisplay final : public BnEvsDisplay { public: // Methods from ::aidl::android::hardware::automotive::evs::IEvsDisplay // follow. ndk::ScopedAStatus getDisplayInfo(evs::DisplayDesc* _aidl_return) override; ndk::ScopedAStatus getDisplayState(evs::DisplayState* _aidl_return) override; ndk::ScopedAStatus getTargetBuffer(evs::BufferDesc* _aidl_return) override; ndk::ScopedAStatus returnTargetBufferForDisplay(const evs::BufferDesc& buffer) override; ndk::ScopedAStatus setDisplayState(evs::DisplayState state) override; // Implementation details EvsGlDisplay(const std::shared_ptr& service, uint64_t displayId); virtual ~EvsGlDisplay() override; // This gets called if another caller "steals" ownership of the display void forceShutdown(); private: // A graphics buffer into which we'll store images. This member variable // will be protected by semaphores. struct BufferRecord { ::aidl::android::hardware::graphics::common::HardwareBufferDescription description; buffer_handle_t handle; int fingerprint; } mBuffer; // State of a rendering thread enum RenderThreadStates { STOPPED = 0, STOPPING = 1, RUN = 2, }; uint64_t mDisplayId; evs::DisplayDesc mInfo; evs::DisplayState mRequestedState GUARDED_BY(mLock) = evs::DisplayState::NOT_VISIBLE; std::shared_ptr mDisplayProxy; GlWrapper mGlWrapper; mutable std::mutex mLock; // This tells us whether or not our buffer is in use. Protected by // semaphores. bool mBufferBusy = false; // Variables to synchronize a rendering thread w/ main and binder threads std::thread mRenderThread; RenderThreadStates mState GUARDED_BY(mLock) = STOPPED; bool mBufferReady = false; void renderFrames(); bool initializeGlContextLocked() REQUIRES(mLock); std::condition_variable mBufferReadyToUse; std::condition_variable mBufferReadyToRender; std::condition_variable mBufferDone; }; } // namespace aidl::android::hardware::automotive::evs::implementation