1#ifndef _QPTESTLOG_H
2#define _QPTESTLOG_H
3/*-------------------------------------------------------------------------
4 * drawElements Quality Program Helper Library
5 * -------------------------------------------
6 *
7 * Copyright 2014 The Android Open Source Project
8 *
9 * Licensed under the Apache License, Version 2.0 (the "License");
10 * you may not use this file except in compliance with the License.
11 * You may obtain a copy of the License at
12 *
13 *      http://www.apache.org/licenses/LICENSE-2.0
14 *
15 * Unless required by applicable law or agreed to in writing, software
16 * distributed under the License is distributed on an "AS IS" BASIS,
17 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18 * See the License for the specific language governing permissions and
19 * limitations under the License.
20 *
21 *//*!
22 * \defgroup TestLog
23 * \ingroup TestLog
24 * \{
25 * \file
26 * \brief Test log library
27 *
28 * qpTestLog Conventions:
29 *
30 * Each function takes qpTestLog pointer. Operations are done on that log
31 * instance.
32 *
33 * When function takes a 'name' parameter, that name is expected to
34 * be a unique identifier within the scope of one test case. Test case
35 * begins with a call to qpTestLog_startCase and ends with a call to
36 * qpTestLog_endCase or qpTestLog_terminateCase. The human readable
37 * "name" for a piece of information is given with the parameter
38 * called 'description'.
39 *
40 * All functions writing to the log return a boolean value. False
41 * means that the current write operation failed and the current log
42 * instance should be abandoned.
43 *
44 *//*--------------------------------------------------------------------*/
45
46#include "deDefs.h"
47
48typedef struct qpTestLog_s	qpTestLog;
49
50/* Test results supported by current report version */
51/* \note Keep in sync with TestCaseStatus in Candy project. */
52typedef enum qpTestResult_e
53{
54	QP_TEST_RESULT_PASS = 0,				/*!< Test case passed.																	*/
55	QP_TEST_RESULT_FAIL,					/*!< Implementation produced incorrect results											*/
56	QP_TEST_RESULT_QUALITY_WARNING,			/*!< Result is within specification, but is not of high quality							*/
57	QP_TEST_RESULT_COMPATIBILITY_WARNING,	/*!< Result is within specification, but likely to cause fragmentation in the market	*/
58	QP_TEST_RESULT_PENDING,					/*!< The test is still running. Not a valid end result									*/
59	QP_TEST_RESULT_NOT_SUPPORTED,			/*!< Implementation does not support functionality needed by this test case				*/
60	QP_TEST_RESULT_RESOURCE_ERROR,			/*!< Implementation fails to pass the test due to lack of resources						*/
61	QP_TEST_RESULT_INTERNAL_ERROR,			/*!< Error occurred within Tester Core													*/
62	QP_TEST_RESULT_CRASH,					/*!< Crash occurred in test execution.													*/
63	QP_TEST_RESULT_TIMEOUT,					/*!< Timeout occurred in test execution.												*/
64
65	QP_TEST_RESULT_LAST
66} qpTestResult;
67
68/* Test case types. */
69typedef enum qpTestCaseType_e
70{
71	QP_TEST_CASE_TYPE_SELF_VALIDATE = 0,	/*!< Self-validating test case			*/
72	QP_TEST_CASE_TYPE_PERFORMANCE,			/*!< Performace test case				*/
73	QP_TEST_CASE_TYPE_CAPABILITY,			/*!< Capability score case				*/
74	QP_TEST_CASE_TYPE_ACCURACY,				/*!< Accuracy test case					*/
75
76	QP_TEST_CASE_TYPE_LAST
77} qpTestCaseType;
78
79/*--------------------------------------------------------------------*//*!
80 * \brief Tag key-value pairs to give cues on proper visualization in GUI
81 *//*--------------------------------------------------------------------*/
82typedef enum qpKeyValueTag_e
83{
84	QP_KEY_TAG_NONE = 0,
85	QP_KEY_TAG_PERFORMANCE,
86	QP_KEY_TAG_QUALITY,
87	QP_KEY_TAG_PRECISION,
88	QP_KEY_TAG_TIME,
89
90	/* Add new values here if needed, remember to update relevant code in qpTestLog.c and change format revision */
91
92	QP_KEY_TAG_LAST	/* Do not remove */
93} qpKeyValueTag;
94
95/*--------------------------------------------------------------------*//*!
96 * \brief Sample value tag for giving hints for analysis
97 *//*--------------------------------------------------------------------*/
98typedef enum qpSampleValueTag_e
99{
100	QP_SAMPLE_VALUE_TAG_PREDICTOR = 0,		/*!< Predictor for sample, such as number of operations.	*/
101	QP_SAMPLE_VALUE_TAG_RESPONSE,			/*!< Response, i.e. measured value, such as render time.	*/
102
103	/* Add new values here if needed, remember to update relevant code in qpTestLog.c and change format revision */
104
105	QP_SAMPLE_VALUE_TAG_LAST	/* Do not remove */
106} qpSampleValueTag;
107
108/* Image compression type. */
109typedef enum qpImageCompressionMode_e
110{
111	QP_IMAGE_COMPRESSION_MODE_NONE	= 0,	/*!< Do not compress images.					*/
112	QP_IMAGE_COMPRESSION_MODE_PNG,			/*!< Compress images using lossless libpng.		*/
113	QP_IMAGE_COMPRESSION_MODE_BEST,			/*!< Choose the best image compression mode.	*/
114
115	QP_IMAGE_COMPRESSION_MODE_LAST
116} qpImageCompressionMode;
117
118/*--------------------------------------------------------------------*//*!
119 * \brief Image formats.
120 *
121 * Pixels are handled as a byte stream, i.e., endianess does not
122 * affect component ordering.
123 *//*--------------------------------------------------------------------*/
124typedef enum qpImageFormat_e
125{
126	QP_IMAGE_FORMAT_RGB888 = 0,
127	QP_IMAGE_FORMAT_RGBA8888,
128
129	QP_IMAGE_FORMAT_LAST
130} qpImageFormat;
131
132/* Test log flags. */
133typedef enum qpTestLogFlag_e
134{
135	QP_TEST_LOG_EXCLUDE_IMAGES			= (1<<0),		/*!< Do not log images. This reduces log size considerably.			*/
136	QP_TEST_LOG_EXCLUDE_SHADER_SOURCES	= (1<<1),		/*!< Do not log shader sources. Helps to reduce log size further.	*/
137	QP_TEST_LOG_NO_FLUSH				= (1<<2)		/*!< Do not do a fflush after writing the log.						*/
138} qpTestLogFlag;
139
140/* Shader type. */
141typedef enum qpShaderType_e
142{
143	QP_SHADER_TYPE_VERTEX = 0,
144	QP_SHADER_TYPE_FRAGMENT,
145	QP_SHADER_TYPE_GEOMETRY,
146	QP_SHADER_TYPE_TESS_CONTROL,
147	QP_SHADER_TYPE_TESS_EVALUATION,
148	QP_SHADER_TYPE_COMPUTE,
149
150	QP_SHADER_TYPE_LAST
151} qpShaderType;
152
153DE_BEGIN_EXTERN_C
154
155/* \todo [2013-04-13 pyry] Clean up & document. Do we actually want this? */
156typedef struct qpEglConfigInfo_s
157{
158	int							bufferSize;
159	int							redSize;
160	int							greenSize;
161	int							blueSize;
162	int							luminanceSize;
163	int							alphaSize;
164	int							alphaMaskSize;
165	deBool						bindToTextureRGB;
166	deBool						bindToTextureRGBA;
167	const char*					colorBufferType;
168	const char*					configCaveat;
169	int							configID;
170	const char*					conformant;
171	int							depthSize;
172	int							level;
173	int							maxPBufferWidth;
174	int							maxPBufferHeight;
175	int							maxPBufferPixels;
176	int							maxSwapInterval;
177	int							minSwapInterval;
178	deBool						nativeRenderable;
179	const char*					renderableType;
180	int							sampleBuffers;
181	int							samples;
182	int							stencilSize;
183	const char*					surfaceTypes;
184	const char*					transparentType;
185	int							transparentRedValue;
186	int							transparentGreenValue;
187	int							transparentBlueValue;
188} qpEglConfigInfo;
189
190
191qpTestLog*		qpTestLog_createFileLog			(const char* fileName, deUint32 flags);
192void			qpTestLog_destroy				(qpTestLog* log);
193
194deBool			qpTestLog_startCase				(qpTestLog* log, const char* testCasePath, qpTestCaseType testCaseType);
195deBool			qpTestLog_endCase				(qpTestLog* log, qpTestResult result, const char* description);
196deBool			qpTestLog_terminateCase			(qpTestLog* log, qpTestResult result);
197
198deBool			qpTestLog_startSection			(qpTestLog* log, const char* name, const char* description);
199deBool			qpTestLog_endSection			(qpTestLog* log);
200deBool			qpTestLog_writeText				(qpTestLog* log, const char* name, const char* description, qpKeyValueTag tag, const char* value);
201deBool			qpTestLog_writeInteger			(qpTestLog* log, const char* name, const char* description, const char* unit, qpKeyValueTag tag, deInt64 value);
202deBool			qpTestLog_writeFloat			(qpTestLog* log, const char* name, const char* description, const char* unit, qpKeyValueTag tag, float value);
203
204deBool			qpTestLog_startImageSet			(qpTestLog* log, const char* name, const char* description);
205deBool			qpTestLog_endImageSet			(qpTestLog* log);
206deBool			qpTestLog_writeImage			(qpTestLog* log, const char* name, const char* description, qpImageCompressionMode compressionMode, qpImageFormat format, int width, int height, int stride, const void* data);
207
208deBool			qpTestLog_startEglConfigSet		(qpTestLog* log, const char* key, const char* description);
209deBool			qpTestLog_writeEglConfig		(qpTestLog* log, const qpEglConfigInfo* config);
210deBool			qpTestLog_endEglConfigSet		(qpTestLog* log);
211
212/* \todo [2013-08-26 pyry] Unify ShaderProgram & KernelSource & CompileInfo. */
213
214deBool			qpTestLog_startShaderProgram	(qpTestLog* log, deBool linkOk, const char* linkInfoLog);
215deBool			qpTestLog_endShaderProgram		(qpTestLog* log);
216deBool			qpTestLog_writeShader			(qpTestLog* log, qpShaderType type, const char* source, deBool compileOk, const char* infoLog);
217
218deBool			qpTestLog_writeKernelSource		(qpTestLog* log, const char* source);
219deBool			qpTestLog_writeSpirVAssemblySource	(qpTestLog* log, const char* source);
220deBool			qpTestLog_writeCompileInfo		(qpTestLog* log, const char* name, const char* description, deBool compileOk, const char* infoLog);
221
222deBool			qpTestLog_startSampleList		(qpTestLog* log, const char* name, const char* description);
223deBool			qpTestLog_startSampleInfo		(qpTestLog* log);
224deBool			qpTestLog_writeValueInfo		(qpTestLog* log, const char* name, const char* description, const char* unit, qpSampleValueTag tag);
225deBool			qpTestLog_endSampleInfo			(qpTestLog* log);
226deBool			qpTestLog_startSample			(qpTestLog* log);
227deBool			qpTestLog_writeValueFloat		(qpTestLog* log, double value);
228deBool			qpTestLog_writeValueInteger		(qpTestLog* log, deInt64 value);
229deBool			qpTestLog_endSample				(qpTestLog* log);
230deBool			qpTestLog_endSampleList			(qpTestLog* log);
231
232deUint32		qpTestLog_getLogFlags			(const qpTestLog* log);
233
234const char*		qpGetTestResultName				(qpTestResult result);
235
236DE_END_EXTERN_C
237
238/*! \} */
239
240#endif /* _QPTESTLOG_H */
241