1f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall/*
2f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall * Copyright (C) 2016 The Android Open Source Project
3f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall *
4f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall * Licensed under the Apache License, Version 2.0 (the "License");
5f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall * you may not use this file except in compliance with the License.
6f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall * You may obtain a copy of the License at
7f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall *
8f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall *      http://www.apache.org/licenses/LICENSE-2.0
9f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall *
10f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall * Unless required by applicable law or agreed to in writing, software
11f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall * distributed under the License is distributed on an "AS IS" BASIS,
12f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall * See the License for the specific language governing permissions and
14f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall * limitations under the License.
15f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall */
16f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
17f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall#include <sstream>
18f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
19f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall#include <ui/Rect.h>
20f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
21f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall#include "Hwc2TestClientTarget.h"
22f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
23f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wallint Hwc2TestClientTarget::getBuffer(const Hwc2TestLayers& testLayers,
24f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall        const std::set<hwc2_layer_t>& clientLayers,
25f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall        const std::set<hwc2_layer_t>& clearLayers, bool flipClientTarget,
26f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall        const Area& displayArea, buffer_handle_t* outHandle,
27f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall        int32_t* outAcquireFence)
28f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall{
29f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    if (!flipClientTarget) {
30f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall        bool needsClientTarget = false;
31f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
32f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall        for (auto clientLayer : clientLayers) {
33f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            if (testLayers.getVisibleRegion(clientLayer).numRects > 0) {
34f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                needsClientTarget = true;
35f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall                break;
36f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            }
37f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall        }
38f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
39f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall        if (!needsClientTarget) {
40f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall           *outHandle = nullptr;
41f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall           *outAcquireFence = -1;
42f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall           return 0;
43f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall        }
44f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    }
45f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
46f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    return mBuffer.get(outHandle, outAcquireFence, displayArea,
47f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            &testLayers, &clientLayers, &clearLayers);
48f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall}
49f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
50f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
51f18cfb0a780c69f12439457ccc3f5272db767fddMarissa WallHwc2TestClientTargetSupport::Hwc2TestClientTargetSupport(
52f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall        Hwc2TestCoverage coverage, const Area& displayArea)
53f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    : mBufferArea(coverage, displayArea),
54f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall      mDataspace(coverage),
55f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall      mSurfaceDamage(coverage)
56f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall{
57f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    mBufferArea.setDependent(&mSurfaceDamage);
58f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall}
59f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
60f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wallstd::string Hwc2TestClientTargetSupport::dump() const
61f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall{
62f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    std::stringstream dmp;
63f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
64f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    dmp << "client target: \n";
65f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
66f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    for (auto property : properties) {
67f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall        dmp << property->dump();
68f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    }
69f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
70f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    return dmp.str();
71f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall}
72f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
73f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wallvoid Hwc2TestClientTargetSupport::reset()
74f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall{
75f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    for (auto property : properties) {
76f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall        property->reset();
77f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    }
78f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall}
79f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
80f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wallbool Hwc2TestClientTargetSupport::advance()
81f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall{
82f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    for (auto property : properties) {
83f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall        if (property->advance())
84f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall            return true;
85f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    }
86f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    return false;
87f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall}
88f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
89f18cfb0a780c69f12439457ccc3f5272db767fddMarissa WallArea Hwc2TestClientTargetSupport::getBufferArea() const
90f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall{
91f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    return mBufferArea.get();
92f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall}
93f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
94f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wallandroid_dataspace_t Hwc2TestClientTargetSupport::getDataspace() const
95f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall{
96f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    return mDataspace.get();
97f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall}
98f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall
99f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wallconst hwc_region_t Hwc2TestClientTargetSupport::getSurfaceDamage() const
100f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall{
101f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall    return mSurfaceDamage.get();
102f18cfb0a780c69f12439457ccc3f5272db767fddMarissa Wall}
103