1a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita/* 2a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita * Copyright 2017 The Android Open Source Project 3a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita * 4a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita * Licensed under the Apache License, Version 2.0 (the "License"); 5a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita * you may not use this file except in compliance with the License. 6a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita * You may obtain a copy of the License at 7a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita * 8a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita * http://www.apache.org/licenses/LICENSE-2.0 9a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita * 10a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita * Unless required by applicable law or agreed to in writing, software 11a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita * distributed under the License is distributed on an "AS IS" BASIS, 12a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita * See the License for the specific language governing permissions and 14a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita * limitations under the License. 15a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita */ 16a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita 17a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita#pragma once 18a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita 1983ce7c162855742a2d9eeebc0cd70fe48d2cd125Chia-I Wu#define HWC2_USE_CPP11 2083ce7c162855742a2d9eeebc0cd70fe48d2cd125Chia-I Wu#define HWC2_INCLUDE_STRINGIFICATION 2129e146b284b74ae65670a3a4f3698cd9ee155f1dChia-I Wu#include <composer-hal/2.1/ComposerClient.h> 2283ce7c162855742a2d9eeebc0cd70fe48d2cd125Chia-I Wu#undef HWC2_USE_CPP11 2383ce7c162855742a2d9eeebc0cd70fe48d2cd125Chia-I Wu#undef HWC2_INCLUDE_STRINGIFICATION 24a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita#include "RenderState.h" 25a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita 26a7de594782a5a7fcfd0300117f362f173631e1afKalle Raita// Needed for display type/ID enums 27a7de594782a5a7fcfd0300117f362f173631e1afKalle Raita#include <hardware/hwcomposer_defs.h> 28a7de594782a5a7fcfd0300117f362f173631e1afKalle Raita 29a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita#include <utils/Condition.h> 30a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita 31a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita#include <chrono> 32a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita 33a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raitausing namespace android::hardware::graphics::composer::V2_1; 34d15d2d2ee3a3f990412c26cfb82d9cce1cac6aeeChia-I Wuusing namespace android::hardware::graphics::composer::V2_1::hal; 35a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raitausing namespace android::hardware; 36a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raitausing namespace std::chrono_literals; 37a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita 38a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raitanamespace { 39a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raitaclass LayerImpl; 40a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raitaclass Frame; 41a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raitaclass DelayedEventGenerator; 42a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita} // namespace 43a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita 44a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raitanamespace android { 45a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raitaclass SurfaceComposerClient; 46a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita} // namespace android 47a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita 48a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raitanamespace sftest { 49a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita 50a7de594782a5a7fcfd0300117f362f173631e1afKalle Raita// NOTE: The ID's need to be exactly these. VR composer and parts of 51a7de594782a5a7fcfd0300117f362f173631e1afKalle Raita// the SurfaceFlinger assume the display IDs to have these values 52a7de594782a5a7fcfd0300117f362f173631e1afKalle Raita// despite the enum being documented as a display type. 53a7de594782a5a7fcfd0300117f362f173631e1afKalle Raita// TODO: Reference to actual documentation 54a7de594782a5a7fcfd0300117f362f173631e1afKalle Raitaconstexpr Display PRIMARY_DISPLAY = static_cast<Display>(HWC_DISPLAY_PRIMARY); 55a7de594782a5a7fcfd0300117f362f173631e1afKalle Raitaconstexpr Display EXTERNAL_DISPLAY = static_cast<Display>(HWC_DISPLAY_EXTERNAL); 56a7de594782a5a7fcfd0300117f362f173631e1afKalle Raita 57d15d2d2ee3a3f990412c26cfb82d9cce1cac6aeeChia-I Wuclass FakeComposerClient : public ComposerHal { 58a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raitapublic: 59a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita FakeComposerClient(); 60a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita virtual ~FakeComposerClient(); 61a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita 6241b98d41f9f4e94a1a9a31960a317649cbec3b09Chia-I Wu bool hasCapability(hwc2_capability_t capability) override; 6341b98d41f9f4e94a1a9a31960a317649cbec3b09Chia-I Wu 64513476ab1802bf315d70a854512f4940a035fcf9Chia-I Wu std::string dumpDebugInfo() override; 65513476ab1802bf315d70a854512f4940a035fcf9Chia-I Wu void registerEventCallback(EventCallback* callback) override; 66513476ab1802bf315d70a854512f4940a035fcf9Chia-I Wu void unregisterEventCallback() override; 67513476ab1802bf315d70a854512f4940a035fcf9Chia-I Wu 68a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita uint32_t getMaxVirtualDisplayCount() override; 69a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita Error createVirtualDisplay(uint32_t width, uint32_t height, PixelFormat* format, 70a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita Display* outDisplay) override; 71a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita Error destroyVirtualDisplay(Display display) override; 72a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita Error createLayer(Display display, Layer* outLayer) override; 73a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita Error destroyLayer(Display display, Layer layer) override; 74a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita 75a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita Error getActiveConfig(Display display, Config* outConfig) override; 76a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita Error getClientTargetSupport(Display display, uint32_t width, uint32_t height, 77a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita PixelFormat format, Dataspace dataspace) override; 78a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita Error getColorModes(Display display, hidl_vec<ColorMode>* outModes) override; 79a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita Error getDisplayAttribute(Display display, Config config, IComposerClient::Attribute attribute, 80a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita int32_t* outValue) override; 81a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita Error getDisplayConfigs(Display display, hidl_vec<Config>* outConfigs) override; 82a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita Error getDisplayName(Display display, hidl_string* outName) override; 83a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita Error getDisplayType(Display display, IComposerClient::DisplayType* outType) override; 84a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita Error getDozeSupport(Display display, bool* outSupport) override; 85a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita Error getHdrCapabilities(Display display, hidl_vec<Hdr>* outTypes, float* outMaxLuminance, 86a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita float* outMaxAverageLuminance, float* outMinLuminance) override; 87a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita 88a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita Error setActiveConfig(Display display, Config config) override; 89a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita Error setColorMode(Display display, ColorMode mode) override; 90a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita Error setPowerMode(Display display, IComposerClient::PowerMode mode) override; 91a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita Error setVsyncEnabled(Display display, IComposerClient::Vsync enabled) override; 92a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita 93a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita Error setColorTransform(Display display, const float* matrix, int32_t hint) override; 94a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita Error setClientTarget(Display display, buffer_handle_t target, int32_t acquireFence, 95a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita int32_t dataspace, const std::vector<hwc_rect_t>& damage) override; 96a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita Error setOutputBuffer(Display display, buffer_handle_t buffer, int32_t releaseFence) override; 97a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita Error validateDisplay(Display display, std::vector<Layer>* outChangedLayers, 98a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita std::vector<IComposerClient::Composition>* outCompositionTypes, 99a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita uint32_t* outDisplayRequestMask, std::vector<Layer>* outRequestedLayers, 100a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita std::vector<uint32_t>* outRequestMasks) override; 101a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita Error acceptDisplayChanges(Display display) override; 102a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita Error presentDisplay(Display display, int32_t* outPresentFence, std::vector<Layer>* outLayers, 103a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita std::vector<int32_t>* outReleaseFences) override; 104a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita 105a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita Error setLayerCursorPosition(Display display, Layer layer, int32_t x, int32_t y) override; 106a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita Error setLayerBuffer(Display display, Layer layer, buffer_handle_t buffer, 107a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita int32_t acquireFence) override; 108a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita Error setLayerSurfaceDamage(Display display, Layer layer, 109a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita const std::vector<hwc_rect_t>& damage) override; 110a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita Error setLayerBlendMode(Display display, Layer layer, int32_t mode) override; 111a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita Error setLayerColor(Display display, Layer layer, IComposerClient::Color color) override; 112a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita Error setLayerCompositionType(Display display, Layer layer, int32_t type) override; 113a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita Error setLayerDataspace(Display display, Layer layer, int32_t dataspace) override; 114a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita Error setLayerDisplayFrame(Display display, Layer layer, const hwc_rect_t& frame) override; 115a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita Error setLayerPlaneAlpha(Display display, Layer layer, float alpha) override; 116a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita Error setLayerSidebandStream(Display display, Layer layer, buffer_handle_t stream) override; 117a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita Error setLayerSourceCrop(Display display, Layer layer, const hwc_frect_t& crop) override; 118a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita Error setLayerTransform(Display display, Layer layer, int32_t transform) override; 119a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita Error setLayerVisibleRegion(Display display, Layer layer, 120a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita const std::vector<hwc_rect_t>& visible) override; 121a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita Error setLayerZOrder(Display display, Layer layer, uint32_t z) override; 122a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita 123a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita void setClient(ComposerClient* client); 124a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita 125a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita void requestVSync(uint64_t vsyncTime = 0); 126a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita // We don't want tests hanging, so always use a timeout. Remember 127a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita // to always check the number of frames with test ASSERT_! 128a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita // Wait until next frame is rendered after requesting vsync. 129a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita void runVSyncAndWait(std::chrono::nanoseconds maxWait = 100ms); 130a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita void runVSyncAfter(std::chrono::nanoseconds wait); 131a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita 132a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita int getFrameCount() const; 133a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita // We don't want tests hanging, so always use a timeout. Remember 134a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita // to always check the number of frames with test ASSERT_! 135a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita void waitUntilFrame(int targetFrame, std::chrono::nanoseconds maxWait = 100ms) const; 136a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita std::vector<RenderState> getFrameRects(int frame) const; 137a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita std::vector<RenderState> getLatestFrame() const; 138a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita void clearFrames(); 139a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita 140a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita void onSurfaceFlingerStart(); 141a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita void onSurfaceFlingerStop(); 142a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita 143a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita int getLayerCount() const; 144a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita Layer getLayer(size_t index) const; 145a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita 146a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita void hotplugDisplay(Display display, IComposerCallback::Connection state); 1472ae2b3bd5bfbacc3b52f222441bfbbeb9bd54dc7Lloyd Pique void refreshDisplay(Display display); 148a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita 149a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raitaprivate: 150a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita LayerImpl& getLayerImpl(Layer handle); 151a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita 152513476ab1802bf315d70a854512f4940a035fcf9Chia-I Wu EventCallback* mEventCallback; 153a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita Config mCurrentConfig; 154a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita bool mVsyncEnabled; 155a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita std::vector<std::unique_ptr<LayerImpl>> mLayers; 156a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita std::vector<std::unique_ptr<Frame>> mFrames; 157a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita // Using a pointer to hide the implementation into the CPP file. 158a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita std::unique_ptr<DelayedEventGenerator> mDelayedEventGenerator; 159a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita android::sp<android::SurfaceComposerClient> mSurfaceComposer; // For VSync injections 160a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita mutable android::Mutex mStateMutex; 161a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita mutable android::Condition mFramesAvailable; 162a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita}; 163a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita 164a099a24c93bfa599fc5c36a647e946c26f68514fKalle Raita} // namespace sftest 165