1bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall/*
2bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall * Copyright (C) 2016 The Android Open Source Project
3bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall *
4bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall * Licensed under the Apache License, Version 2.0 (the "License");
5bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall * you may not use this file except in compliance with the License.
6bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall * You may obtain a copy of the License at
7bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall *
8bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall *      http://www.apache.org/licenses/LICENSE-2.0
9bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall *
10bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall * Unless required by applicable law or agreed to in writing, software
11bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall * distributed under the License is distributed on an "AS IS" BASIS,
12bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall * See the License for the specific language governing permissions and
14bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall * limitations under the License.
15bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall */
16bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall
17bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall#include <sstream>
183f05602a8c33a4b66a47dc077eaba95f9f1e3977David Hanna Jr#include <sys/stat.h>
19bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall
20bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall#include "Hwc2TestVirtualDisplay.h"
21bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall
223f05602a8c33a4b66a47dc077eaba95f9f1e3977David Hanna Jr#define DIR_NAME "images"
233f05602a8c33a4b66a47dc077eaba95f9f1e3977David Hanna Jr
24bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa WallHwc2TestVirtualDisplay::Hwc2TestVirtualDisplay(
25bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall        Hwc2TestCoverage coverage)
26bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall    : mDisplayDimension(coverage)
27bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall{
283f05602a8c33a4b66a47dc077eaba95f9f1e3977David Hanna Jr    mDisplayDimension.setDependent(&mOutputBuffer);
293f05602a8c33a4b66a47dc077eaba95f9f1e3977David Hanna Jr    mDisplayDimension.setDependent(&mExpectedBuffer);
30bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall}
31bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall
32bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wallstd::string Hwc2TestVirtualDisplay::dump() const
33bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall{
34bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall    std::stringstream dmp;
35bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall
36bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall    dmp << "virtual display: \n";
37bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall
38bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall    mDisplayDimension.dump();
39bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall
40bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall    return dmp.str();
41bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall}
42bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall
433f05602a8c33a4b66a47dc077eaba95f9f1e3977David Hanna Jrint Hwc2TestVirtualDisplay::getOutputBuffer(buffer_handle_t* outHandle,
44bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall        android::base::unique_fd* outAcquireFence)
45bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall{
46bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall    int32_t acquireFence;
473f05602a8c33a4b66a47dc077eaba95f9f1e3977David Hanna Jr    int ret = mOutputBuffer.getOutputBuffer(outHandle, &acquireFence);
48bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall    outAcquireFence->reset(acquireFence);
49bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall    return ret;
50bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall}
51bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall
52bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wallvoid Hwc2TestVirtualDisplay::reset()
53bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall{
54bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall    return mDisplayDimension.reset();
55bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall}
56bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall
57bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wallbool Hwc2TestVirtualDisplay::advance()
58bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall{
59bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall    return mDisplayDimension.advance();
60bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall}
61bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall
62bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa WallUnsignedArea Hwc2TestVirtualDisplay::getDisplayDimension() const
63bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall{
64bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall    return mDisplayDimension.get();
65bad1bc78ef50648fadbe725a1fe1c28d62097351Marissa Wall}
663f05602a8c33a4b66a47dc077eaba95f9f1e3977David Hanna Jr
673f05602a8c33a4b66a47dc077eaba95f9f1e3977David Hanna Jrint Hwc2TestVirtualDisplay::verifyOutputBuffer(const Hwc2TestLayers* testLayers,
683f05602a8c33a4b66a47dc077eaba95f9f1e3977David Hanna Jr        const std::vector<hwc2_layer_t>* allLayers,
693f05602a8c33a4b66a47dc077eaba95f9f1e3977David Hanna Jr        const std::set<hwc2_layer_t>* clearLayers)
703f05602a8c33a4b66a47dc077eaba95f9f1e3977David Hanna Jr{
713f05602a8c33a4b66a47dc077eaba95f9f1e3977David Hanna Jr    int ret = mExpectedBuffer.generateExpectedBuffer(testLayers, allLayers,
723f05602a8c33a4b66a47dc077eaba95f9f1e3977David Hanna Jr            clearLayers);
733f05602a8c33a4b66a47dc077eaba95f9f1e3977David Hanna Jr    if (ret)
743f05602a8c33a4b66a47dc077eaba95f9f1e3977David Hanna Jr        return ret;
753f05602a8c33a4b66a47dc077eaba95f9f1e3977David Hanna Jr
763f05602a8c33a4b66a47dc077eaba95f9f1e3977David Hanna Jr    ComparatorResult::get().CompareBuffers(mOutputBuffer.graphicBuffer(),
773f05602a8c33a4b66a47dc077eaba95f9f1e3977David Hanna Jr        mExpectedBuffer.graphicBuffer());
783f05602a8c33a4b66a47dc077eaba95f9f1e3977David Hanna Jr
793f05602a8c33a4b66a47dc077eaba95f9f1e3977David Hanna Jr    return 0;
803f05602a8c33a4b66a47dc077eaba95f9f1e3977David Hanna Jr}
813f05602a8c33a4b66a47dc077eaba95f9f1e3977David Hanna Jr
823f05602a8c33a4b66a47dc077eaba95f9f1e3977David Hanna Jrint Hwc2TestVirtualDisplay::writeBuffersToFile(std::string name)
833f05602a8c33a4b66a47dc077eaba95f9f1e3977David Hanna Jr{
843f05602a8c33a4b66a47dc077eaba95f9f1e3977David Hanna Jr    std::ostringstream expectedPath;
853f05602a8c33a4b66a47dc077eaba95f9f1e3977David Hanna Jr    std::ostringstream resultPath;
863f05602a8c33a4b66a47dc077eaba95f9f1e3977David Hanna Jr    int ret = mkdir(DIR_NAME, DEFFILEMODE);
873f05602a8c33a4b66a47dc077eaba95f9f1e3977David Hanna Jr    if (ret && errno != EEXIST)
883f05602a8c33a4b66a47dc077eaba95f9f1e3977David Hanna Jr        return ret;
893f05602a8c33a4b66a47dc077eaba95f9f1e3977David Hanna Jr
903f05602a8c33a4b66a47dc077eaba95f9f1e3977David Hanna Jr    expectedPath << DIR_NAME << "/expected-" << name << ".png";
913f05602a8c33a4b66a47dc077eaba95f9f1e3977David Hanna Jr    resultPath << DIR_NAME << "/result-" << name << ".png";
923f05602a8c33a4b66a47dc077eaba95f9f1e3977David Hanna Jr
933f05602a8c33a4b66a47dc077eaba95f9f1e3977David Hanna Jr    if (!mExpectedBuffer.writeBufferToFile(expectedPath.str()) ||
943f05602a8c33a4b66a47dc077eaba95f9f1e3977David Hanna Jr            !mOutputBuffer.writeBufferToFile(resultPath.str()))
953f05602a8c33a4b66a47dc077eaba95f9f1e3977David Hanna Jr        return -1;
963f05602a8c33a4b66a47dc077eaba95f9f1e3977David Hanna Jr
973f05602a8c33a4b66a47dc077eaba95f9f1e3977David Hanna Jr    return 0;
983f05602a8c33a4b66a47dc077eaba95f9f1e3977David Hanna Jr}
99