1*4d7e907cSAndroid Build Coastguard Worker /** 2*4d7e907cSAndroid Build Coastguard Worker * Copyright (c) 2021, The Android Open Source Project 3*4d7e907cSAndroid Build Coastguard Worker * 4*4d7e907cSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*4d7e907cSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*4d7e907cSAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*4d7e907cSAndroid Build Coastguard Worker * 8*4d7e907cSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*4d7e907cSAndroid Build Coastguard Worker * 10*4d7e907cSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*4d7e907cSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*4d7e907cSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*4d7e907cSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*4d7e907cSAndroid Build Coastguard Worker * limitations under the License. 15*4d7e907cSAndroid Build Coastguard Worker */ 16*4d7e907cSAndroid Build Coastguard Worker 17*4d7e907cSAndroid Build Coastguard Worker #pragma once 18*4d7e907cSAndroid Build Coastguard Worker 19*4d7e907cSAndroid Build Coastguard Worker #include <aidl/android/hardware/graphics/composer3/IComposerClient.h> 20*4d7e907cSAndroid Build Coastguard Worker #include <android-base/unique_fd.h> 21*4d7e907cSAndroid Build Coastguard Worker #include <android/hardware/graphics/composer3/ComposerClientReader.h> 22*4d7e907cSAndroid Build Coastguard Worker #include <android/hardware/graphics/composer3/ComposerClientWriter.h> 23*4d7e907cSAndroid Build Coastguard Worker #include <renderengine/RenderEngine.h> 24*4d7e907cSAndroid Build Coastguard Worker #include <ui/GraphicBuffer.h> 25*4d7e907cSAndroid Build Coastguard Worker #include <memory> 26*4d7e907cSAndroid Build Coastguard Worker #include "GraphicsComposerCallback.h" 27*4d7e907cSAndroid Build Coastguard Worker #include "VtsComposerClient.h" 28*4d7e907cSAndroid Build Coastguard Worker 29*4d7e907cSAndroid Build Coastguard Worker namespace aidl::android::hardware::graphics::composer3::vts { 30*4d7e907cSAndroid Build Coastguard Worker 31*4d7e907cSAndroid Build Coastguard Worker using ::android::renderengine::LayerSettings; 32*4d7e907cSAndroid Build Coastguard Worker using common::Dataspace; 33*4d7e907cSAndroid Build Coastguard Worker using common::PixelFormat; 34*4d7e907cSAndroid Build Coastguard Worker 35*4d7e907cSAndroid Build Coastguard Worker static const Color BLACK = {0.0f, 0.0f, 0.0f, 1.0f}; 36*4d7e907cSAndroid Build Coastguard Worker static const Color RED = {1.0f, 0.0f, 0.0f, 1.0f}; 37*4d7e907cSAndroid Build Coastguard Worker // DIM_RED is 90% dimmed from RED in linear space 38*4d7e907cSAndroid Build Coastguard Worker // hard-code as value 243 in 8-bit space here, as calculating it requires 39*4d7e907cSAndroid Build Coastguard Worker // oetf(eotf(value) * .9), which is a complex non-linear transformation 40*4d7e907cSAndroid Build Coastguard Worker static const Color DIM_RED = {243.f / 255.f, 0.0f, 0.0f, 1.0f}; 41*4d7e907cSAndroid Build Coastguard Worker static const Color TRANSLUCENT_RED = {1.0f, 0.0f, 0.0f, 0.3f}; 42*4d7e907cSAndroid Build Coastguard Worker static const Color GREEN = {0.0f, 1.0f, 0.0f, 1.0f}; 43*4d7e907cSAndroid Build Coastguard Worker static const Color BLUE = {0.0f, 0.0f, 1.0f, 1.0f}; 44*4d7e907cSAndroid Build Coastguard Worker static const Color WHITE = {1.0f, 1.0f, 1.0f, 1.0f}; 45*4d7e907cSAndroid Build Coastguard Worker static const Color LIGHT_RED = {0.5f, 0.0f, 0.0f, 1.0f}; 46*4d7e907cSAndroid Build Coastguard Worker static const Color LIGHT_GREEN = {0.0f, 0.5f, 0.0f, 1.0f}; 47*4d7e907cSAndroid Build Coastguard Worker static const Color LIGHT_BLUE = {0.0f, 0.0f, 0.5f, 1.0f}; 48*4d7e907cSAndroid Build Coastguard Worker 49*4d7e907cSAndroid Build Coastguard Worker class TestRenderEngine; 50*4d7e907cSAndroid Build Coastguard Worker 51*4d7e907cSAndroid Build Coastguard Worker class TestLayer { 52*4d7e907cSAndroid Build Coastguard Worker public: TestLayer(const std::shared_ptr<VtsComposerClient> & client,int64_t display,ComposerClientWriter & writer)53*4d7e907cSAndroid Build Coastguard Worker TestLayer(const std::shared_ptr<VtsComposerClient>& client, int64_t display, 54*4d7e907cSAndroid Build Coastguard Worker ComposerClientWriter& writer) 55*4d7e907cSAndroid Build Coastguard Worker : mDisplay(display) { 56*4d7e907cSAndroid Build Coastguard Worker const auto& [status, layer] = client->createLayer(display, kBufferSlotCount, &writer); 57*4d7e907cSAndroid Build Coastguard Worker EXPECT_TRUE(status.isOk()); 58*4d7e907cSAndroid Build Coastguard Worker mLayer = layer; 59*4d7e907cSAndroid Build Coastguard Worker } 60*4d7e907cSAndroid Build Coastguard Worker 61*4d7e907cSAndroid Build Coastguard Worker // ComposerClient will take care of destroying layers, no need to explicitly 62*4d7e907cSAndroid Build Coastguard Worker // call destroyLayers here ~TestLayer()63*4d7e907cSAndroid Build Coastguard Worker virtual ~TestLayer(){}; 64*4d7e907cSAndroid Build Coastguard Worker 65*4d7e907cSAndroid Build Coastguard Worker virtual void write(ComposerClientWriter& writer); 66*4d7e907cSAndroid Build Coastguard Worker virtual LayerSettings toRenderEngineLayerSettings(); 67*4d7e907cSAndroid Build Coastguard Worker setDisplayFrame(Rect frame)68*4d7e907cSAndroid Build Coastguard Worker void setDisplayFrame(Rect frame) { mDisplayFrame = frame; } setSourceCrop(FRect crop)69*4d7e907cSAndroid Build Coastguard Worker void setSourceCrop(FRect crop) { mSourceCrop = crop; } setZOrder(uint32_t z)70*4d7e907cSAndroid Build Coastguard Worker void setZOrder(uint32_t z) { mZOrder = z; } setWhitePointNits(float whitePointNits)71*4d7e907cSAndroid Build Coastguard Worker void setWhitePointNits(float whitePointNits) { mWhitePointNits = whitePointNits; } setBrightness(float brightness)72*4d7e907cSAndroid Build Coastguard Worker void setBrightness(float brightness) { mBrightness = brightness; } 73*4d7e907cSAndroid Build Coastguard Worker setSurfaceDamage(std::vector<Rect> surfaceDamage)74*4d7e907cSAndroid Build Coastguard Worker void setSurfaceDamage(std::vector<Rect> surfaceDamage) { 75*4d7e907cSAndroid Build Coastguard Worker mSurfaceDamage = std::move(surfaceDamage); 76*4d7e907cSAndroid Build Coastguard Worker } 77*4d7e907cSAndroid Build Coastguard Worker setDataspace(Dataspace dataspace)78*4d7e907cSAndroid Build Coastguard Worker void setDataspace(Dataspace dataspace) { mDataspace = dataspace; } 79*4d7e907cSAndroid Build Coastguard Worker setTransform(Transform transform)80*4d7e907cSAndroid Build Coastguard Worker void setTransform(Transform transform) { mTransform = transform; } setAlpha(float alpha)81*4d7e907cSAndroid Build Coastguard Worker void setAlpha(float alpha) { mAlpha = alpha; } setBlendMode(BlendMode blendMode)82*4d7e907cSAndroid Build Coastguard Worker void setBlendMode(BlendMode blendMode) { mBlendMode = blendMode; } 83*4d7e907cSAndroid Build Coastguard Worker getBlendMode()84*4d7e907cSAndroid Build Coastguard Worker BlendMode getBlendMode() const { return mBlendMode; } 85*4d7e907cSAndroid Build Coastguard Worker getZOrder()86*4d7e907cSAndroid Build Coastguard Worker uint32_t getZOrder() const { return mZOrder; } 87*4d7e907cSAndroid Build Coastguard Worker getAlpha()88*4d7e907cSAndroid Build Coastguard Worker float getAlpha() const { return mAlpha; } 89*4d7e907cSAndroid Build Coastguard Worker getLayer()90*4d7e907cSAndroid Build Coastguard Worker int64_t getLayer() const { return mLayer; } 91*4d7e907cSAndroid Build Coastguard Worker getBrightness()92*4d7e907cSAndroid Build Coastguard Worker float getBrightness() const { return mBrightness; } 93*4d7e907cSAndroid Build Coastguard Worker 94*4d7e907cSAndroid Build Coastguard Worker protected: 95*4d7e907cSAndroid Build Coastguard Worker int64_t mDisplay; 96*4d7e907cSAndroid Build Coastguard Worker int64_t mLayer; 97*4d7e907cSAndroid Build Coastguard Worker Rect mDisplayFrame = {0, 0, 0, 0}; 98*4d7e907cSAndroid Build Coastguard Worker float mBrightness = 1.f; 99*4d7e907cSAndroid Build Coastguard Worker float mWhitePointNits = -1.f; 100*4d7e907cSAndroid Build Coastguard Worker std::vector<Rect> mSurfaceDamage; 101*4d7e907cSAndroid Build Coastguard Worker Transform mTransform = static_cast<Transform>(0); 102*4d7e907cSAndroid Build Coastguard Worker FRect mSourceCrop = {0, 0, 0, 0}; 103*4d7e907cSAndroid Build Coastguard Worker static constexpr uint32_t kBufferSlotCount = 64; 104*4d7e907cSAndroid Build Coastguard Worker float mAlpha = 1.0; 105*4d7e907cSAndroid Build Coastguard Worker BlendMode mBlendMode = BlendMode::NONE; 106*4d7e907cSAndroid Build Coastguard Worker uint32_t mZOrder = 0; 107*4d7e907cSAndroid Build Coastguard Worker Dataspace mDataspace = Dataspace::UNKNOWN; 108*4d7e907cSAndroid Build Coastguard Worker }; 109*4d7e907cSAndroid Build Coastguard Worker 110*4d7e907cSAndroid Build Coastguard Worker class TestColorLayer : public TestLayer { 111*4d7e907cSAndroid Build Coastguard Worker public: TestColorLayer(const std::shared_ptr<VtsComposerClient> & client,int64_t display,ComposerClientWriter & writer)112*4d7e907cSAndroid Build Coastguard Worker TestColorLayer(const std::shared_ptr<VtsComposerClient>& client, int64_t display, 113*4d7e907cSAndroid Build Coastguard Worker ComposerClientWriter& writer) 114*4d7e907cSAndroid Build Coastguard Worker : TestLayer{client, display, writer} {} 115*4d7e907cSAndroid Build Coastguard Worker 116*4d7e907cSAndroid Build Coastguard Worker void write(ComposerClientWriter& writer) override; 117*4d7e907cSAndroid Build Coastguard Worker 118*4d7e907cSAndroid Build Coastguard Worker LayerSettings toRenderEngineLayerSettings() override; 119*4d7e907cSAndroid Build Coastguard Worker setColor(Color color)120*4d7e907cSAndroid Build Coastguard Worker void setColor(Color color) { mColor = color; } 121*4d7e907cSAndroid Build Coastguard Worker 122*4d7e907cSAndroid Build Coastguard Worker private: 123*4d7e907cSAndroid Build Coastguard Worker Color mColor = WHITE; 124*4d7e907cSAndroid Build Coastguard Worker }; 125*4d7e907cSAndroid Build Coastguard Worker 126*4d7e907cSAndroid Build Coastguard Worker class TestBufferLayer : public TestLayer { 127*4d7e907cSAndroid Build Coastguard Worker public: 128*4d7e907cSAndroid Build Coastguard Worker TestBufferLayer(const std::shared_ptr<VtsComposerClient>& client, 129*4d7e907cSAndroid Build Coastguard Worker TestRenderEngine& renderEngine, int64_t display, uint32_t width, 130*4d7e907cSAndroid Build Coastguard Worker uint32_t height, common::PixelFormat format, ComposerClientWriter& writer, 131*4d7e907cSAndroid Build Coastguard Worker Composition composition = Composition::DEVICE); 132*4d7e907cSAndroid Build Coastguard Worker 133*4d7e907cSAndroid Build Coastguard Worker void write(ComposerClientWriter& writer) override; 134*4d7e907cSAndroid Build Coastguard Worker 135*4d7e907cSAndroid Build Coastguard Worker LayerSettings toRenderEngineLayerSettings() override; 136*4d7e907cSAndroid Build Coastguard Worker 137*4d7e907cSAndroid Build Coastguard Worker void fillBuffer(std::vector<Color>& expectedColors); 138*4d7e907cSAndroid Build Coastguard Worker 139*4d7e907cSAndroid Build Coastguard Worker void setBuffer(std::vector<Color> colors); 140*4d7e907cSAndroid Build Coastguard Worker 141*4d7e907cSAndroid Build Coastguard Worker void setToClientComposition(ComposerClientWriter& writer); 142*4d7e907cSAndroid Build Coastguard Worker getWidth()143*4d7e907cSAndroid Build Coastguard Worker uint32_t getWidth() const { return mWidth; } 144*4d7e907cSAndroid Build Coastguard Worker getHeight()145*4d7e907cSAndroid Build Coastguard Worker uint32_t getHeight() const { return mHeight; } 146*4d7e907cSAndroid Build Coastguard Worker getAccessRegion()147*4d7e907cSAndroid Build Coastguard Worker ::android::Rect getAccessRegion() const { return mAccessRegion; } 148*4d7e907cSAndroid Build Coastguard Worker getLayerCount()149*4d7e907cSAndroid Build Coastguard Worker uint32_t getLayerCount() const { return mLayerCount; } 150*4d7e907cSAndroid Build Coastguard Worker 151*4d7e907cSAndroid Build Coastguard Worker protected: 152*4d7e907cSAndroid Build Coastguard Worker Composition mComposition; 153*4d7e907cSAndroid Build Coastguard Worker ::android::sp<::android::GraphicBuffer> mGraphicBuffer; 154*4d7e907cSAndroid Build Coastguard Worker TestRenderEngine& mRenderEngine; 155*4d7e907cSAndroid Build Coastguard Worker int32_t mFillFence; 156*4d7e907cSAndroid Build Coastguard Worker uint32_t mWidth; 157*4d7e907cSAndroid Build Coastguard Worker uint32_t mHeight; 158*4d7e907cSAndroid Build Coastguard Worker uint32_t mLayerCount; 159*4d7e907cSAndroid Build Coastguard Worker PixelFormat mPixelFormat; 160*4d7e907cSAndroid Build Coastguard Worker uint32_t mUsage; 161*4d7e907cSAndroid Build Coastguard Worker ::android::Rect mAccessRegion; 162*4d7e907cSAndroid Build Coastguard Worker 163*4d7e907cSAndroid Build Coastguard Worker private: 164*4d7e907cSAndroid Build Coastguard Worker ::android::sp<::android::GraphicBuffer> allocateBuffer(); 165*4d7e907cSAndroid Build Coastguard Worker }; 166*4d7e907cSAndroid Build Coastguard Worker 167*4d7e907cSAndroid Build Coastguard Worker class ReadbackHelper { 168*4d7e907cSAndroid Build Coastguard Worker public: 169*4d7e907cSAndroid Build Coastguard Worker static std::string getColorModeString(ColorMode mode); 170*4d7e907cSAndroid Build Coastguard Worker 171*4d7e907cSAndroid Build Coastguard Worker static std::string getDataspaceString(Dataspace dataspace); 172*4d7e907cSAndroid Build Coastguard Worker 173*4d7e907cSAndroid Build Coastguard Worker static Dataspace getDataspaceForColorMode(ColorMode mode); 174*4d7e907cSAndroid Build Coastguard Worker 175*4d7e907cSAndroid Build Coastguard Worker static int32_t GetBitsPerChannel(PixelFormat pixelFormat); 176*4d7e907cSAndroid Build Coastguard Worker static int32_t GetAlphaBits(PixelFormat pixelFormat); 177*4d7e907cSAndroid Build Coastguard Worker 178*4d7e907cSAndroid Build Coastguard Worker static void fillBuffer(uint32_t width, uint32_t height, uint32_t stride, int32_t bytesPerPixel, 179*4d7e907cSAndroid Build Coastguard Worker void* bufferData, PixelFormat pixelFormat, 180*4d7e907cSAndroid Build Coastguard Worker std::vector<Color> desiredPixelColors); 181*4d7e907cSAndroid Build Coastguard Worker 182*4d7e907cSAndroid Build Coastguard Worker static void clearColors(std::vector<Color>& expectedColors, int32_t width, int32_t height, 183*4d7e907cSAndroid Build Coastguard Worker int32_t displayWidth); 184*4d7e907cSAndroid Build Coastguard Worker 185*4d7e907cSAndroid Build Coastguard Worker static void fillColorsArea(std::vector<Color>& expectedColors, int32_t stride, Rect area, 186*4d7e907cSAndroid Build Coastguard Worker Color color); 187*4d7e907cSAndroid Build Coastguard Worker 188*4d7e907cSAndroid Build Coastguard Worker static bool readbackSupported(const PixelFormat& pixelFormat, const Dataspace& dataspace); 189*4d7e907cSAndroid Build Coastguard Worker 190*4d7e907cSAndroid Build Coastguard Worker static const std::vector<ColorMode> colorModes; 191*4d7e907cSAndroid Build Coastguard Worker static const std::vector<Dataspace> dataspaces; 192*4d7e907cSAndroid Build Coastguard Worker 193*4d7e907cSAndroid Build Coastguard Worker static void compareColorBuffers(const std::vector<Color>& expectedColors, void* bufferData, 194*4d7e907cSAndroid Build Coastguard Worker const uint32_t stride, int32_t bytesPerPixel, 195*4d7e907cSAndroid Build Coastguard Worker const uint32_t width, const uint32_t height, 196*4d7e907cSAndroid Build Coastguard Worker PixelFormat pixelFormat); 197*4d7e907cSAndroid Build Coastguard Worker static void compareColorBuffers(void* expectedBuffer, void* actualBuffer, const uint32_t stride, 198*4d7e907cSAndroid Build Coastguard Worker int32_t bytesPerPixel, const uint32_t width, 199*4d7e907cSAndroid Build Coastguard Worker const uint32_t height, PixelFormat pixelFormat); 200*4d7e907cSAndroid Build Coastguard Worker }; 201*4d7e907cSAndroid Build Coastguard Worker 202*4d7e907cSAndroid Build Coastguard Worker class ReadbackBuffer { 203*4d7e907cSAndroid Build Coastguard Worker public: 204*4d7e907cSAndroid Build Coastguard Worker ReadbackBuffer(int64_t display, const std::shared_ptr<VtsComposerClient>& client, int32_t width, 205*4d7e907cSAndroid Build Coastguard Worker int32_t height, common::PixelFormat pixelFormat, common::Dataspace dataspace); 206*4d7e907cSAndroid Build Coastguard Worker 207*4d7e907cSAndroid Build Coastguard Worker void setReadbackBuffer(); 208*4d7e907cSAndroid Build Coastguard Worker 209*4d7e907cSAndroid Build Coastguard Worker void checkReadbackBuffer(const std::vector<Color>& expectedColors); 210*4d7e907cSAndroid Build Coastguard Worker 211*4d7e907cSAndroid Build Coastguard Worker ::android::sp<::android::GraphicBuffer> getBuffer(); 212*4d7e907cSAndroid Build Coastguard Worker 213*4d7e907cSAndroid Build Coastguard Worker protected: 214*4d7e907cSAndroid Build Coastguard Worker uint32_t mWidth; 215*4d7e907cSAndroid Build Coastguard Worker uint32_t mHeight; 216*4d7e907cSAndroid Build Coastguard Worker uint32_t mLayerCount; 217*4d7e907cSAndroid Build Coastguard Worker uint32_t mUsage; 218*4d7e907cSAndroid Build Coastguard Worker PixelFormat mPixelFormat; 219*4d7e907cSAndroid Build Coastguard Worker Dataspace mDataspace; 220*4d7e907cSAndroid Build Coastguard Worker int64_t mDisplay; 221*4d7e907cSAndroid Build Coastguard Worker ::android::sp<::android::GraphicBuffer> mGraphicBuffer; 222*4d7e907cSAndroid Build Coastguard Worker std::shared_ptr<VtsComposerClient> mComposerClient; 223*4d7e907cSAndroid Build Coastguard Worker ::android::Rect mAccessRegion; 224*4d7e907cSAndroid Build Coastguard Worker native_handle_t mBufferHandle; 225*4d7e907cSAndroid Build Coastguard Worker 226*4d7e907cSAndroid Build Coastguard Worker private: 227*4d7e907cSAndroid Build Coastguard Worker ::android::sp<::android::GraphicBuffer> allocateBuffer(); 228*4d7e907cSAndroid Build Coastguard Worker }; 229*4d7e907cSAndroid Build Coastguard Worker 230*4d7e907cSAndroid Build Coastguard Worker } // namespace aidl::android::hardware::graphics::composer3::vts 231