xref: /test/xts/acts/graphic/vkgl/src/ActsApp.cpp (revision f6603c60)
1/*
2 * Copyright (c) 2022 Shenzhen Kaihong Digital Industry Development Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 *     http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15#include <iostream>
16#include "tcuPlatform.hpp"
17#include "tcuTestContext.hpp"
18#include "tcuTestSessionExecutor.hpp"
19#include "tcuTestHierarchyUtil.hpp"
20#include "tcuCommandLine.hpp"
21#include "tcuTestLog.hpp"
22#include "qpInfo.h"
23#include "qpDebugOut.h"
24#include "deMath.h"
25#include "ActsApp.h"
26namespace tcu {
27using std::string;
28
29/*
30 * \brief Construct test application
31 *
32 * If a fatal error occurs during initialization constructor will call
33 * die() with debug information.
34 *
35 * \param platform Reference to platform implementation.
36 */
37ActsApp::ActsApp (Platform& platform, Archive& archive, TestLog& log, const CommandLine& cmdLine)
38    : m_platform(platform),
39    m_watchDog(DE_NULL),
40    m_crashHandler(DE_NULL),
41    m_crashed(false),
42    m_testCtx(DE_NULL),
43    m_testRoot(DE_NULL),
44    m_sessionExecutor(DE_NULL)
45{
46    print("dEQP Core %s (0x%08x) starting..\n", qpGetReleaseName(), qpGetReleaseId());
47    print("  target implementation = '%s'\n", qpGetTargetName());
48
49    if (!deSetRoundingMode(DE_ROUNDINGMODE_TO_NEAREST_EVEN)) {
50        qpPrintf("WARNING: Failed to set floating-point rounding mode!\n");
51    }
52    try {
53        const RunMode    runMode    = cmdLine.getRunMode();
54
55        // Create test context
56        m_testCtx = new TestContext(m_platform, archive, log, cmdLine, m_watchDog);
57
58        // Create root from registry
59        m_testRoot = new TestPackageRoot(*m_testCtx, TestPackageRegistry::getSingleton());
60
61        // \note No executor is created if runmode is not EXECUTE
62        if (runMode == RUNMODE_EXECUTE) {
63            m_sessionExecutor = new TestSessionExecutor(*m_testRoot, *m_testCtx);
64        } else {
65            DE_ASSERT(false);
66        }
67    } catch (const std::exception& e) {
68        cleanup();
69        die("Failed to initialize dEQP: %s", e.what());
70    }
71}
72
73ActsApp::~ActsApp (void)
74{
75    cleanup();
76}
77
78void ActsApp::cleanup (void)
79{
80    delete m_sessionExecutor;
81    delete m_testRoot;
82    delete m_testCtx;
83
84    m_sessionExecutor = DE_NULL;
85    m_testRoot = DE_NULL;
86    m_testCtx = DE_NULL;
87
88    if (m_crashHandler) {
89        qpCrashHandler_destroy(m_crashHandler);
90    }
91
92    if (m_watchDog) {
93        qpWatchDog_destroy(m_watchDog);
94    }
95}
96
97/*
98 * \brief Step forward test execution
99 * \return true if application should call iterate() again and false
100 *         if test execution session is complete.
101 */
102bool ActsApp::iterate (void)
103{
104    if (!m_sessionExecutor) {
105        DE_ASSERT(m_testCtx->getCommandLine().getRunMode() != RUNMODE_EXECUTE);
106        return false;
107    }
108
109    // Poll platform events
110    const bool platformOk = m_platform.processEvents();
111
112    // Iterate a step.
113    bool testExecOk = false;
114    if (platformOk) {
115        try {
116            testExecOk = m_sessionExecutor->iterate();
117        } catch (const std::exception& e) {
118            die("%s", e.what());
119        }
120    }
121
122    return platformOk && testExecOk;
123}
124
125const TestRunStatus& ActsApp::getResult (void) const
126{
127    return m_sessionExecutor->getStatus();
128}
129} // tcu
130