xref: /aosp_15_r20/hardware/interfaces/graphics/composer/aidl/vts/ReadbackVts.h (revision 4d7e907c777eeecc4c5bd7cf640a754fac206ff7)
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