1e5c31af7Sopenharmony_ci/*-------------------------------------------------------------------------
2e5c31af7Sopenharmony_ci * OpenGL Conformance Test Suite
3e5c31af7Sopenharmony_ci * -----------------------------
4e5c31af7Sopenharmony_ci *
5e5c31af7Sopenharmony_ci * Copyright (c) 2016 Google Inc.
6e5c31af7Sopenharmony_ci * Copyright (c) 2016 The Khronos Group Inc.
7e5c31af7Sopenharmony_ci *
8e5c31af7Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
9e5c31af7Sopenharmony_ci * you may not use this file except in compliance with the License.
10e5c31af7Sopenharmony_ci * You may obtain a copy of the License at
11e5c31af7Sopenharmony_ci *
12e5c31af7Sopenharmony_ci *      http://www.apache.org/licenses/LICENSE-2.0
13e5c31af7Sopenharmony_ci *
14e5c31af7Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
15e5c31af7Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
16e5c31af7Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17e5c31af7Sopenharmony_ci * See the License for the specific language governing permissions and
18e5c31af7Sopenharmony_ci * limitations under the License.
19e5c31af7Sopenharmony_ci *
20e5c31af7Sopenharmony_ci */ /*!
21e5c31af7Sopenharmony_ci * \file
22e5c31af7Sopenharmony_ci * \brief CTS runner main().
23e5c31af7Sopenharmony_ci */ /*-------------------------------------------------------------------*/
24e5c31af7Sopenharmony_ci
25e5c31af7Sopenharmony_ci#include "deString.h"
26e5c31af7Sopenharmony_ci#include "deUniquePtr.hpp"
27e5c31af7Sopenharmony_ci#include "glcTestRunner.hpp"
28e5c31af7Sopenharmony_ci#include "tcuPlatform.hpp"
29e5c31af7Sopenharmony_ci#include "tcuResource.hpp"
30e5c31af7Sopenharmony_ci
31e5c31af7Sopenharmony_ci#include <cstdio>
32e5c31af7Sopenharmony_ci#include <cstdlib>
33e5c31af7Sopenharmony_ci
34e5c31af7Sopenharmony_ci// See tcuMain.cpp
35e5c31af7Sopenharmony_citcu::Platform* createPlatform(void);
36e5c31af7Sopenharmony_ci
37e5c31af7Sopenharmony_cistruct CommandLine
38e5c31af7Sopenharmony_ci{
39e5c31af7Sopenharmony_ci	CommandLine(void) : runType(glu::ApiType::es(2, 0)), flags(0)
40e5c31af7Sopenharmony_ci	{
41e5c31af7Sopenharmony_ci	}
42e5c31af7Sopenharmony_ci
43e5c31af7Sopenharmony_ci	glu::ApiType runType;
44e5c31af7Sopenharmony_ci	std::string  waiverPath;
45e5c31af7Sopenharmony_ci	std::string  dstLogDir;
46e5c31af7Sopenharmony_ci	deUint32	 flags;
47e5c31af7Sopenharmony_ci};
48e5c31af7Sopenharmony_ci
49e5c31af7Sopenharmony_cistatic bool parseCommandLine(CommandLine& cmdLine, int argc, const char* const* argv)
50e5c31af7Sopenharmony_ci{
51e5c31af7Sopenharmony_ci	for (int argNdx = 1; argNdx < argc; argNdx++)
52e5c31af7Sopenharmony_ci	{
53e5c31af7Sopenharmony_ci		const char* arg = argv[argNdx];
54e5c31af7Sopenharmony_ci
55e5c31af7Sopenharmony_ci		if (deStringBeginsWith(arg, "--type="))
56e5c31af7Sopenharmony_ci		{
57e5c31af7Sopenharmony_ci			static const struct
58e5c31af7Sopenharmony_ci			{
59e5c31af7Sopenharmony_ci				const char*  name;
60e5c31af7Sopenharmony_ci				glu::ApiType runType;
61e5c31af7Sopenharmony_ci			} runTypes[] = { { "es2", glu::ApiType::es(2, 0) },	{ "es3", glu::ApiType::es(3, 0) },
62e5c31af7Sopenharmony_ci							 { "es31", glu::ApiType::es(3, 1) },   { "es32", glu::ApiType::es(3, 2) },
63e5c31af7Sopenharmony_ci							 { "gl30", glu::ApiType::core(3, 0) }, { "gl31", glu::ApiType::core(3, 1) },
64e5c31af7Sopenharmony_ci							 { "gl32", glu::ApiType::core(3, 2) }, { "gl33", glu::ApiType::core(3, 3) },
65e5c31af7Sopenharmony_ci							 { "gl40", glu::ApiType::core(4, 0) }, { "gl41", glu::ApiType::core(4, 1) },
66e5c31af7Sopenharmony_ci							 { "gl42", glu::ApiType::core(4, 2) }, { "gl43", glu::ApiType::core(4, 3) },
67e5c31af7Sopenharmony_ci							 { "gl44", glu::ApiType::core(4, 4) }, { "gl45", glu::ApiType::core(4, 5) },
68e5c31af7Sopenharmony_ci							 { "gl46", glu::ApiType::core(4, 6) } };
69e5c31af7Sopenharmony_ci
70e5c31af7Sopenharmony_ci			const char* value = arg + 7;
71e5c31af7Sopenharmony_ci			int			ndx   = 0;
72e5c31af7Sopenharmony_ci
73e5c31af7Sopenharmony_ci			for (; ndx < DE_LENGTH_OF_ARRAY(runTypes); ndx++)
74e5c31af7Sopenharmony_ci			{
75e5c31af7Sopenharmony_ci				if (deStringEqual(runTypes[ndx].name, value))
76e5c31af7Sopenharmony_ci				{
77e5c31af7Sopenharmony_ci					cmdLine.runType = runTypes[ndx].runType;
78e5c31af7Sopenharmony_ci					break;
79e5c31af7Sopenharmony_ci				}
80e5c31af7Sopenharmony_ci			}
81e5c31af7Sopenharmony_ci
82e5c31af7Sopenharmony_ci			if (ndx >= DE_LENGTH_OF_ARRAY(runTypes))
83e5c31af7Sopenharmony_ci				return false;
84e5c31af7Sopenharmony_ci		}
85e5c31af7Sopenharmony_ci		else if (deStringBeginsWith(arg, "--waivers="))
86e5c31af7Sopenharmony_ci		{
87e5c31af7Sopenharmony_ci			const char* value = arg + 10;
88e5c31af7Sopenharmony_ci			cmdLine.waiverPath = value;
89e5c31af7Sopenharmony_ci		}
90e5c31af7Sopenharmony_ci		else if (deStringBeginsWith(arg, "--logdir="))
91e5c31af7Sopenharmony_ci		{
92e5c31af7Sopenharmony_ci			const char* value = arg + 9;
93e5c31af7Sopenharmony_ci			cmdLine.dstLogDir = value;
94e5c31af7Sopenharmony_ci		}
95e5c31af7Sopenharmony_ci		else if (deStringBeginsWith(arg, "--summary"))
96e5c31af7Sopenharmony_ci		{
97e5c31af7Sopenharmony_ci			cmdLine.flags = glcts::TestRunner::PRINT_SUMMARY;
98e5c31af7Sopenharmony_ci		}
99e5c31af7Sopenharmony_ci		else if (deStringEqual(arg, "--verbose"))
100e5c31af7Sopenharmony_ci			cmdLine.flags = glcts::TestRunner::VERBOSE_ALL;
101e5c31af7Sopenharmony_ci		else
102e5c31af7Sopenharmony_ci			return false;
103e5c31af7Sopenharmony_ci	}
104e5c31af7Sopenharmony_ci
105e5c31af7Sopenharmony_ci	return true;
106e5c31af7Sopenharmony_ci}
107e5c31af7Sopenharmony_ci
108e5c31af7Sopenharmony_cistatic void printHelp(const char* binName)
109e5c31af7Sopenharmony_ci{
110e5c31af7Sopenharmony_ci	printf("%s:\n", binName);
111e5c31af7Sopenharmony_ci	printf("  --type=[esN[M]|glNM] Conformance test run type. Choose from\n");
112e5c31af7Sopenharmony_ci	printf("                       ES: es2, es3, es31, es32\n");
113e5c31af7Sopenharmony_ci	printf("                       GL: gl30, gl31, gl32, gl33, gl40, gl41, gl42, gl43, gl44, gl45, gl46\n");
114e5c31af7Sopenharmony_ci	printf("  --waivers=[path]     Path to xml file containing waived tests\n");
115e5c31af7Sopenharmony_ci	printf("  --logdir=[path]      Destination directory for log files\n");
116e5c31af7Sopenharmony_ci	printf("  --summary            Print summary without running the tests\n");
117e5c31af7Sopenharmony_ci	printf("  --verbose            Print out and log more information\n");
118e5c31af7Sopenharmony_ci}
119e5c31af7Sopenharmony_ci
120e5c31af7Sopenharmony_ciint main(int argc, char** argv)
121e5c31af7Sopenharmony_ci{
122e5c31af7Sopenharmony_ci	CommandLine cmdLine;
123e5c31af7Sopenharmony_ci	int exitStatus = EXIT_SUCCESS;
124e5c31af7Sopenharmony_ci
125e5c31af7Sopenharmony_ci	if (!parseCommandLine(cmdLine, argc, argv))
126e5c31af7Sopenharmony_ci	{
127e5c31af7Sopenharmony_ci		printHelp(argv[0]);
128e5c31af7Sopenharmony_ci		return -1;
129e5c31af7Sopenharmony_ci	}
130e5c31af7Sopenharmony_ci
131e5c31af7Sopenharmony_ci	try
132e5c31af7Sopenharmony_ci	{
133e5c31af7Sopenharmony_ci		de::UniquePtr<tcu::Platform> platform(createPlatform());
134e5c31af7Sopenharmony_ci		tcu::DirArchive				 archive(".");
135e5c31af7Sopenharmony_ci		glcts::TestRunner runner(static_cast<tcu::Platform&>(*platform.get()), archive, cmdLine.waiverPath.c_str(),
136e5c31af7Sopenharmony_ci								 cmdLine.dstLogDir.c_str(), cmdLine.runType, cmdLine.flags);
137e5c31af7Sopenharmony_ci
138e5c31af7Sopenharmony_ci		for (;;)
139e5c31af7Sopenharmony_ci		{
140e5c31af7Sopenharmony_ci			if (!runner.iterate())
141e5c31af7Sopenharmony_ci			{
142e5c31af7Sopenharmony_ci				if (!runner.isConformant())
143e5c31af7Sopenharmony_ci				{
144e5c31af7Sopenharmony_ci					exitStatus = EXIT_FAILURE;
145e5c31af7Sopenharmony_ci				}
146e5c31af7Sopenharmony_ci
147e5c31af7Sopenharmony_ci				break;
148e5c31af7Sopenharmony_ci			}
149e5c31af7Sopenharmony_ci		}
150e5c31af7Sopenharmony_ci	}
151e5c31af7Sopenharmony_ci	catch (const std::exception& e)
152e5c31af7Sopenharmony_ci	{
153e5c31af7Sopenharmony_ci		printf("ERROR: %s\n", e.what());
154e5c31af7Sopenharmony_ci		return -1;
155e5c31af7Sopenharmony_ci	}
156e5c31af7Sopenharmony_ci
157e5c31af7Sopenharmony_ci	return exitStatus;
158e5c31af7Sopenharmony_ci}
159