Home | History | Annotate | Download | only in tests
      1 /*
      2  * Copyright 2019 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 #include <cstdarg>
     18 #include <cstdint>
     19 
     20 #include <compositionengine/RenderSurfaceCreationArgs.h>
     21 #include <compositionengine/impl/RenderSurface.h>
     22 #include <compositionengine/mock/CompositionEngine.h>
     23 #include <compositionengine/mock/Display.h>
     24 #include <compositionengine/mock/DisplaySurface.h>
     25 #include <compositionengine/mock/NativeWindow.h>
     26 #include <compositionengine/mock/OutputLayer.h>
     27 #include <gtest/gtest.h>
     28 #include <renderengine/mock/RenderEngine.h>
     29 
     30 #include "MockHWComposer.h"
     31 
     32 namespace android::compositionengine {
     33 namespace {
     34 
     35 /* ------------------------------------------------------------------------
     36  * RenderSurfaceTest
     37  */
     38 
     39 constexpr int32_t DEFAULT_DISPLAY_WIDTH = 1920;
     40 constexpr int32_t DEFAULT_DISPLAY_HEIGHT = 1080;
     41 constexpr std::optional<DisplayId> DEFAULT_DISPLAY_ID = std::make_optional(DisplayId{123u});
     42 const std::string DEFAULT_DISPLAY_NAME = "Mock Display";
     43 
     44 using testing::_;
     45 using testing::ByMove;
     46 using testing::DoAll;
     47 using testing::Ref;
     48 using testing::Return;
     49 using testing::ReturnRef;
     50 using testing::SetArgPointee;
     51 using testing::StrictMock;
     52 
     53 class RenderSurfaceTest : public testing::Test {
     54 public:
     55     RenderSurfaceTest() {
     56         EXPECT_CALL(mDisplay, getId()).WillRepeatedly(ReturnRef(DEFAULT_DISPLAY_ID));
     57         EXPECT_CALL(mDisplay, getName()).WillRepeatedly(ReturnRef(DEFAULT_DISPLAY_NAME));
     58         EXPECT_CALL(mCompositionEngine, getHwComposer).WillRepeatedly(ReturnRef(mHwComposer));
     59         EXPECT_CALL(mCompositionEngine, getRenderEngine).WillRepeatedly(ReturnRef(mRenderEngine));
     60         EXPECT_CALL(*mNativeWindow, disconnect(NATIVE_WINDOW_API_EGL))
     61                 .WillRepeatedly(Return(NO_ERROR));
     62     }
     63     ~RenderSurfaceTest() override = default;
     64 
     65     StrictMock<android::mock::HWComposer> mHwComposer;
     66     StrictMock<renderengine::mock::RenderEngine> mRenderEngine;
     67     StrictMock<mock::CompositionEngine> mCompositionEngine;
     68     StrictMock<mock::Display> mDisplay;
     69     sp<mock::NativeWindow> mNativeWindow = new StrictMock<mock::NativeWindow>();
     70     sp<mock::DisplaySurface> mDisplaySurface = new StrictMock<mock::DisplaySurface>();
     71     impl::RenderSurface mSurface{mCompositionEngine, mDisplay,
     72                                  RenderSurfaceCreationArgs{DEFAULT_DISPLAY_WIDTH,
     73                                                            DEFAULT_DISPLAY_HEIGHT, mNativeWindow,
     74                                                            mDisplaySurface}};
     75 };
     76 
     77 /* ------------------------------------------------------------------------
     78  * Basic construction
     79  */
     80 
     81 TEST_F(RenderSurfaceTest, canInstantiate) {
     82     EXPECT_TRUE(mSurface.isValid());
     83 }
     84 
     85 /* ------------------------------------------------------------------------
     86  * RenderSurface::initialize()
     87  */
     88 
     89 TEST_F(RenderSurfaceTest, initializeConfiguresNativeWindow) {
     90     EXPECT_CALL(*mNativeWindow, connect(NATIVE_WINDOW_API_EGL)).WillOnce(Return(NO_ERROR));
     91     EXPECT_CALL(*mNativeWindow, setBuffersFormat(HAL_PIXEL_FORMAT_RGBA_8888))
     92             .WillOnce(Return(NO_ERROR));
     93     EXPECT_CALL(*mNativeWindow, setUsage(GRALLOC_USAGE_HW_RENDER)).WillOnce(Return(NO_ERROR));
     94 
     95     mSurface.initialize();
     96 }
     97 
     98 /* ------------------------------------------------------------------------
     99  * RenderSurface::getSize()
    100  */
    101 
    102 TEST_F(RenderSurfaceTest, sizeReturnsConstructedSize) {
    103     const ui::Size expected{DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT};
    104 
    105     EXPECT_EQ(expected, mSurface.getSize());
    106 }
    107 
    108 /* ------------------------------------------------------------------------
    109  * RenderSurface::getClientTargetAcquireFence()
    110  */
    111 
    112 TEST_F(RenderSurfaceTest, getClientTargetAcquireFenceForwardsCall) {
    113     sp<Fence> fence = new Fence();
    114 
    115     EXPECT_CALL(*mDisplaySurface, getClientTargetAcquireFence()).WillOnce(ReturnRef(fence));
    116 
    117     EXPECT_EQ(fence.get(), mSurface.getClientTargetAcquireFence().get());
    118 }
    119 
    120 /* ------------------------------------------------------------------------
    121  * RenderSurface::setDisplaySize()
    122  */
    123 
    124 TEST_F(RenderSurfaceTest, setDisplaySizeAppliesChange) {
    125     EXPECT_CALL(*mDisplaySurface, resizeBuffers(640, 480)).Times(1);
    126 
    127     mSurface.setDisplaySize(ui::Size(640, 480));
    128 }
    129 
    130 /* ------------------------------------------------------------------------
    131  * RenderSurface::setBufferDataspace()
    132  */
    133 
    134 TEST_F(RenderSurfaceTest, setBufferDataspaceAppliesChange) {
    135     EXPECT_CALL(*mNativeWindow, setBuffersDataSpace(ui::Dataspace::DISPLAY_P3))
    136             .WillOnce(Return(NO_ERROR));
    137 
    138     mSurface.setBufferDataspace(ui::Dataspace::DISPLAY_P3);
    139 }
    140 
    141 /* ------------------------------------------------------------------------
    142  * RenderSurface::setProtected()
    143  */
    144 
    145 TEST_F(RenderSurfaceTest, setProtectedTrueEnablesProtection) {
    146     EXPECT_FALSE(mSurface.isProtected());
    147     EXPECT_CALL(*mNativeWindow, setUsage(GRALLOC_USAGE_HW_RENDER | GRALLOC_USAGE_PROTECTED))
    148             .WillOnce(Return(NO_ERROR));
    149 
    150     mSurface.setProtected(true);
    151     EXPECT_TRUE(mSurface.isProtected());
    152 }
    153 
    154 TEST_F(RenderSurfaceTest, setProtectedFalseDisablesProtection) {
    155     EXPECT_FALSE(mSurface.isProtected());
    156     EXPECT_CALL(*mNativeWindow, setUsage(GRALLOC_USAGE_HW_RENDER)).WillOnce(Return(NO_ERROR));
    157 
    158     mSurface.setProtected(false);
    159     EXPECT_FALSE(mSurface.isProtected());
    160 }
    161 
    162 TEST_F(RenderSurfaceTest, setProtectedEnableAndDisable) {
    163     EXPECT_FALSE(mSurface.isProtected());
    164     EXPECT_CALL(*mNativeWindow, setUsage(GRALLOC_USAGE_HW_RENDER | GRALLOC_USAGE_PROTECTED))
    165             .WillOnce(Return(NO_ERROR));
    166     EXPECT_CALL(*mNativeWindow, setUsage(GRALLOC_USAGE_HW_RENDER)).WillOnce(Return(NO_ERROR));
    167 
    168     mSurface.setProtected(true);
    169     EXPECT_TRUE(mSurface.isProtected());
    170     mSurface.setProtected(false);
    171     EXPECT_FALSE(mSurface.isProtected());
    172 }
    173 
    174 TEST_F(RenderSurfaceTest, setProtectedEnableWithError) {
    175     EXPECT_FALSE(mSurface.isProtected());
    176     EXPECT_CALL(*mNativeWindow, setUsage(GRALLOC_USAGE_HW_RENDER | GRALLOC_USAGE_PROTECTED))
    177             .WillOnce(Return(INVALID_OPERATION));
    178     mSurface.setProtected(true);
    179     EXPECT_FALSE(mSurface.isProtected());
    180 }
    181 
    182 /* ------------------------------------------------------------------------
    183  * RenderSurface::beginFrame()
    184  */
    185 
    186 TEST_F(RenderSurfaceTest, beginFrameAppliesChange) {
    187     EXPECT_CALL(*mDisplaySurface, beginFrame(true)).WillOnce(Return(NO_ERROR));
    188 
    189     EXPECT_EQ(NO_ERROR, mSurface.beginFrame(true));
    190 }
    191 
    192 /* ------------------------------------------------------------------------
    193  * RenderSurface::prepareFrame()
    194  */
    195 
    196 TEST_F(RenderSurfaceTest, prepareFramePassesOutputLayersToHwc) {
    197     EXPECT_CALL(mHwComposer, prepare(*DEFAULT_DISPLAY_ID, Ref(mDisplay)))
    198             .WillOnce(Return(INVALID_OPERATION));
    199 
    200     EXPECT_EQ(INVALID_OPERATION, mSurface.prepareFrame());
    201 }
    202 
    203 TEST_F(RenderSurfaceTest, prepareFrameTakesEarlyOutOnHwcError) {
    204     EXPECT_CALL(mHwComposer, prepare(*DEFAULT_DISPLAY_ID, Ref(mDisplay)))
    205             .WillOnce(Return(INVALID_OPERATION));
    206 
    207     EXPECT_EQ(INVALID_OPERATION, mSurface.prepareFrame());
    208 }
    209 
    210 TEST_F(RenderSurfaceTest, prepareFrameHandlesMixedComposition) {
    211     EXPECT_CALL(mHwComposer, prepare(*DEFAULT_DISPLAY_ID, Ref(mDisplay)))
    212             .WillOnce(Return(NO_ERROR));
    213     EXPECT_CALL(mHwComposer, hasClientComposition(DEFAULT_DISPLAY_ID)).WillOnce(Return(true));
    214     EXPECT_CALL(mHwComposer, hasDeviceComposition(DEFAULT_DISPLAY_ID)).WillOnce(Return(true));
    215 
    216     EXPECT_CALL(*mDisplaySurface, prepareFrame(DisplaySurface::COMPOSITION_MIXED))
    217             .WillOnce(Return(INVALID_OPERATION));
    218 
    219     EXPECT_EQ(INVALID_OPERATION, mSurface.prepareFrame());
    220 }
    221 
    222 TEST_F(RenderSurfaceTest, prepareFrameHandlesOnlyGlesComposition) {
    223     EXPECT_CALL(mHwComposer, prepare(*DEFAULT_DISPLAY_ID, Ref(mDisplay)))
    224             .WillOnce(Return(NO_ERROR));
    225     EXPECT_CALL(mHwComposer, hasClientComposition(DEFAULT_DISPLAY_ID)).WillOnce(Return(true));
    226     EXPECT_CALL(mHwComposer, hasDeviceComposition(DEFAULT_DISPLAY_ID)).WillOnce(Return(false));
    227 
    228     EXPECT_CALL(*mDisplaySurface, prepareFrame(DisplaySurface::COMPOSITION_GLES))
    229             .WillOnce(Return(NO_ERROR));
    230 
    231     EXPECT_EQ(NO_ERROR, mSurface.prepareFrame());
    232 }
    233 
    234 TEST_F(RenderSurfaceTest, prepareFrameHandlesOnlyHwcComposition) {
    235     EXPECT_CALL(mHwComposer, prepare(*DEFAULT_DISPLAY_ID, Ref(mDisplay)))
    236             .WillOnce(Return(NO_ERROR));
    237     EXPECT_CALL(mHwComposer, hasClientComposition(DEFAULT_DISPLAY_ID)).WillOnce(Return(false));
    238     EXPECT_CALL(mHwComposer, hasDeviceComposition(DEFAULT_DISPLAY_ID)).WillOnce(Return(true));
    239 
    240     EXPECT_CALL(*mDisplaySurface, prepareFrame(DisplaySurface::COMPOSITION_HWC))
    241             .WillOnce(Return(NO_ERROR));
    242 
    243     EXPECT_EQ(NO_ERROR, mSurface.prepareFrame());
    244 }
    245 
    246 TEST_F(RenderSurfaceTest, prepareFrameHandlesNoComposition) {
    247     EXPECT_CALL(mHwComposer, prepare(*DEFAULT_DISPLAY_ID, Ref(mDisplay)))
    248             .WillOnce(Return(NO_ERROR));
    249     EXPECT_CALL(mHwComposer, hasClientComposition(DEFAULT_DISPLAY_ID)).WillOnce(Return(false));
    250     EXPECT_CALL(mHwComposer, hasDeviceComposition(DEFAULT_DISPLAY_ID)).WillOnce(Return(false));
    251 
    252     EXPECT_CALL(*mDisplaySurface, prepareFrame(DisplaySurface::COMPOSITION_HWC))
    253             .WillOnce(Return(NO_ERROR));
    254 
    255     EXPECT_EQ(NO_ERROR, mSurface.prepareFrame());
    256 }
    257 
    258 /* ------------------------------------------------------------------------
    259  * RenderSurface::dequeueBuffer()
    260  */
    261 
    262 TEST_F(RenderSurfaceTest, dequeueBufferObtainsABuffer) {
    263     sp<GraphicBuffer> buffer = new GraphicBuffer();
    264 
    265     EXPECT_CALL(*mNativeWindow, dequeueBuffer(_, _))
    266             .WillOnce(
    267                     DoAll(SetArgPointee<0>(buffer.get()), SetArgPointee<1>(-1), Return(NO_ERROR)));
    268 
    269     base::unique_fd fence;
    270     EXPECT_EQ(buffer.get(), mSurface.dequeueBuffer(&fence).get());
    271 
    272     EXPECT_EQ(buffer.get(), mSurface.mutableGraphicBufferForTest().get());
    273 }
    274 
    275 /* ------------------------------------------------------------------------
    276  * RenderSurface::queueBuffer()
    277  */
    278 
    279 TEST_F(RenderSurfaceTest, queueBufferHandlesNoClientComposition) {
    280     sp<GraphicBuffer> buffer = new GraphicBuffer();
    281     mSurface.mutableGraphicBufferForTest() = buffer;
    282 
    283     EXPECT_CALL(mHwComposer, hasClientComposition(DEFAULT_DISPLAY_ID)).WillOnce(Return(false));
    284     EXPECT_CALL(mHwComposer, hasFlipClientTargetRequest(DEFAULT_DISPLAY_ID))
    285             .WillOnce(Return(false));
    286     EXPECT_CALL(*mDisplaySurface, advanceFrame()).Times(1);
    287 
    288     mSurface.queueBuffer(base::unique_fd());
    289 
    290     EXPECT_EQ(buffer.get(), mSurface.mutableGraphicBufferForTest().get());
    291 }
    292 
    293 TEST_F(RenderSurfaceTest, queueBufferHandlesClientComposition) {
    294     sp<GraphicBuffer> buffer = new GraphicBuffer();
    295     mSurface.mutableGraphicBufferForTest() = buffer;
    296 
    297     EXPECT_CALL(mHwComposer, hasClientComposition(DEFAULT_DISPLAY_ID)).WillOnce(Return(true));
    298     EXPECT_CALL(*mNativeWindow, queueBuffer(buffer->getNativeBuffer(), -1))
    299             .WillOnce(Return(NO_ERROR));
    300     EXPECT_CALL(*mDisplaySurface, advanceFrame()).Times(1);
    301 
    302     mSurface.queueBuffer(base::unique_fd());
    303 
    304     EXPECT_EQ(nullptr, mSurface.mutableGraphicBufferForTest().get());
    305 }
    306 
    307 TEST_F(RenderSurfaceTest, queueBufferHandlesFlipClientTargetRequest) {
    308     sp<GraphicBuffer> buffer = new GraphicBuffer();
    309     mSurface.mutableGraphicBufferForTest() = buffer;
    310 
    311     EXPECT_CALL(mHwComposer, hasClientComposition(DEFAULT_DISPLAY_ID)).WillOnce(Return(false));
    312     EXPECT_CALL(mHwComposer, hasFlipClientTargetRequest(DEFAULT_DISPLAY_ID)).WillOnce(Return(true));
    313     EXPECT_CALL(*mNativeWindow, queueBuffer(buffer->getNativeBuffer(), -1))
    314             .WillOnce(Return(NO_ERROR));
    315     EXPECT_CALL(*mDisplaySurface, advanceFrame()).Times(1);
    316 
    317     mSurface.queueBuffer(base::unique_fd());
    318 
    319     EXPECT_EQ(nullptr, mSurface.mutableGraphicBufferForTest().get());
    320 }
    321 
    322 TEST_F(RenderSurfaceTest, queueBufferHandlesFlipClientTargetRequestWithNoBufferYetDequeued) {
    323     sp<GraphicBuffer> buffer = new GraphicBuffer();
    324 
    325     EXPECT_CALL(mHwComposer, hasClientComposition(DEFAULT_DISPLAY_ID)).WillOnce(Return(false));
    326     EXPECT_CALL(mHwComposer, hasFlipClientTargetRequest(DEFAULT_DISPLAY_ID)).WillOnce(Return(true));
    327     EXPECT_CALL(*mNativeWindow, dequeueBuffer(_, _))
    328             .WillOnce(
    329                     DoAll(SetArgPointee<0>(buffer.get()), SetArgPointee<1>(-1), Return(NO_ERROR)));
    330     EXPECT_CALL(*mNativeWindow, queueBuffer(buffer->getNativeBuffer(), -1))
    331             .WillOnce(Return(NO_ERROR));
    332     EXPECT_CALL(*mDisplaySurface, advanceFrame()).Times(1);
    333 
    334     mSurface.queueBuffer(base::unique_fd());
    335 
    336     EXPECT_EQ(nullptr, mSurface.mutableGraphicBufferForTest().get());
    337 }
    338 
    339 TEST_F(RenderSurfaceTest, queueBufferHandlesNativeWindowQueueBufferFailureOnVirtualDisplay) {
    340     sp<GraphicBuffer> buffer = new GraphicBuffer();
    341     mSurface.mutableGraphicBufferForTest() = buffer;
    342 
    343     EXPECT_CALL(mHwComposer, hasClientComposition(DEFAULT_DISPLAY_ID)).WillOnce(Return(true));
    344     EXPECT_CALL(*mNativeWindow, queueBuffer(buffer->getNativeBuffer(), -1))
    345             .WillOnce(Return(INVALID_OPERATION));
    346     EXPECT_CALL(mDisplay, isVirtual()).WillOnce(Return(true));
    347     EXPECT_CALL(*mNativeWindow, cancelBuffer(buffer->getNativeBuffer(), -1))
    348             .WillOnce(Return(NO_ERROR));
    349     EXPECT_CALL(*mDisplaySurface, advanceFrame()).Times(1);
    350 
    351     mSurface.queueBuffer(base::unique_fd());
    352 
    353     EXPECT_EQ(nullptr, mSurface.mutableGraphicBufferForTest().get());
    354 }
    355 
    356 /* ------------------------------------------------------------------------
    357  * RenderSurface::onPresentDisplayCompleted()
    358  */
    359 
    360 TEST_F(RenderSurfaceTest, onPresentDisplayCompletedForwardsSignal) {
    361     EXPECT_CALL(*mDisplaySurface, onFrameCommitted()).Times(1);
    362 
    363     mSurface.onPresentDisplayCompleted();
    364 }
    365 
    366 /* ------------------------------------------------------------------------
    367  * RenderSurface::setViewportAndProjection()
    368  */
    369 
    370 TEST_F(RenderSurfaceTest, setViewportAndProjectionAppliesChang) {
    371     mSurface.setSizeForTest(ui::Size(100, 200));
    372 
    373     EXPECT_CALL(mRenderEngine,
    374                 setViewportAndProjection(100, 200, Rect(100, 200), ui::Transform::ROT_0))
    375             .Times(1);
    376 
    377     mSurface.setViewportAndProjection();
    378 }
    379 
    380 /* ------------------------------------------------------------------------
    381  * RenderSurface::flip()
    382  */
    383 
    384 TEST_F(RenderSurfaceTest, flipForwardsSignal) {
    385     mSurface.setPageFlipCountForTest(500);
    386 
    387     mSurface.flip();
    388 
    389     EXPECT_EQ(501, mSurface.getPageFlipCount());
    390 }
    391 
    392 } // namespace
    393 } // namespace android::compositionengine
    394