#ifndef _QPTESTLOG_H
#define _QPTESTLOG_H
/*-------------------------------------------------------------------------
* drawElements Quality Program Helper Library
* -------------------------------------------
*
* Copyright 2014 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*//*!
* \defgroup TestLog
* \ingroup TestLog
* \{
* \file
* \brief Test log library
*
* qpTestLog Conventions:
*
* Each function takes qpTestLog pointer. Operations are done on that log
* instance.
*
* When function takes a 'name' parameter, that name is exepected to
* be a unique identifier within the scope of one test case. Test case
* begins with a call to qpTestLog_startCase and ends with a call to
* qpTestLog_endCase or qpTestLog_terminateCase. The human readable
* "name" for a piece of information is given with the parameter
* called 'description'.
*
* All functions writing to the log return a boolean value. False
* means that the current write operation failed and the current log
* instance should be abandoned.
*
*//*--------------------------------------------------------------------*/
#include "deDefs.h"
typedef struct qpTestLog_s qpTestLog;
/* Test results supported by current report version */
/* \note Keep in sync with TestCaseStatus in Candy project. */
typedef enum qpTestResult_e
{
QP_TEST_RESULT_PASS = 0, /*!< Test case passed. */
QP_TEST_RESULT_FAIL, /*!< Implementation produced incorrect results */
QP_TEST_RESULT_QUALITY_WARNING, /*!< Result is within specification, but is not of high quality */
QP_TEST_RESULT_COMPATIBILITY_WARNING, /*!< Result is within specification, but likely to cause fragmentation in the market */
QP_TEST_RESULT_PENDING, /*!< The test is still running. Not a valid end result */
QP_TEST_RESULT_NOT_SUPPORTED, /*!< Implementation does not support functionality needed by this test case */
QP_TEST_RESULT_RESOURCE_ERROR, /*!< Implementation fails to pass the test due to lack of resources */
QP_TEST_RESULT_INTERNAL_ERROR, /*!< Error occurred within Tester Core */
QP_TEST_RESULT_CRASH, /*!< Crash occurred in test execution. */
QP_TEST_RESULT_TIMEOUT, /*!< Timeout occurred in test execution. */
QP_TEST_RESULT_LAST
} qpTestResult;
/* Test case types. */
typedef enum qpTestCaseType_e
{
QP_TEST_CASE_TYPE_SELF_VALIDATE = 0, /*!< Self-validating test case */
QP_TEST_CASE_TYPE_PERFORMANCE, /*!< Performace test case */
QP_TEST_CASE_TYPE_CAPABILITY, /*!< Capability score case */
QP_TEST_CASE_TYPE_ACCURACY, /*!< Accuracy test case */
QP_TEST_CASE_TYPE_LAST
} qpTestCaseType;
/*--------------------------------------------------------------------*//*!
* \brief Tag key-value pairs to give cues on proper visualization in GUI
*//*--------------------------------------------------------------------*/
typedef enum qpKeyValueTag_e
{
QP_KEY_TAG_NONE = 0,
QP_KEY_TAG_PERFORMANCE,
QP_KEY_TAG_QUALITY,
QP_KEY_TAG_PRECISION,
QP_KEY_TAG_TIME,
/* Add new values here if needed, remember to update relevant code in qpTestLog.c and change format revision */
QP_KEY_TAG_LAST /* Do not remove */
} qpKeyValueTag;
/*--------------------------------------------------------------------*//*!
* \brief Sample value tag for giving hints for analysis
*//*--------------------------------------------------------------------*/
typedef enum qpSampleValueTag_e
{
QP_SAMPLE_VALUE_TAG_PREDICTOR = 0, /*!< Predictor for sample, such as number of operations. */
QP_SAMPLE_VALUE_TAG_RESPONSE, /*!< Response, i.e. measured value, such as render time. */
/* Add new values here if needed, remember to update relevant code in qpTestLog.c and change format revision */
QP_SAMPLE_VALUE_TAG_LAST /* Do not remove */
} qpSampleValueTag;
/* Image compression type. */
typedef enum qpImageCompressionMode_e
{
QP_IMAGE_COMPRESSION_MODE_NONE = 0, /*!< Do not compress images. */
QP_IMAGE_COMPRESSION_MODE_PNG, /*!< Compress images using lossless libpng. */
QP_IMAGE_COMPRESSION_MODE_BEST, /*!< Choose the best image compression mode. */
QP_IMAGE_COMPRESSION_MODE_LAST
} qpImageCompressionMode;
/*--------------------------------------------------------------------*//*!
* \brief Image formats.
*
* Pixels are handled as a byte stream, i.e., endianess does not
* affect component ordering.
*//*--------------------------------------------------------------------*/
typedef enum qpImageFormat_e
{
QP_IMAGE_FORMAT_RGB888 = 0,
QP_IMAGE_FORMAT_RGBA8888,
QP_IMAGE_FORMAT_LAST
} qpImageFormat;
/* Test log flags. */
typedef enum qpTestLogFlag_e
{
QP_TEST_LOG_EXCLUDE_IMAGES = (1<<0), /*!< Do not log images. This reduces log size considerably. */
QP_TEST_LOG_EXCLUDE_SHADER_SOURCES = (1<<1), /*!< Do not log shader sources. Helps to reduce log size further. */
QP_TEST_LOG_NO_FLUSH = (1<<2) /*!< Do not do a fflush after writing the log. */
} qpTestLogFlag;
/* Shader type. */
typedef enum qpShaderType_e
{
QP_SHADER_TYPE_VERTEX = 0,
QP_SHADER_TYPE_FRAGMENT,
QP_SHADER_TYPE_GEOMETRY,
QP_SHADER_TYPE_TESS_CONTROL,
QP_SHADER_TYPE_TESS_EVALUATION,
QP_SHADER_TYPE_COMPUTE,
QP_SHADER_TYPE_LAST
} qpShaderType;
DE_BEGIN_EXTERN_C
/* \todo [2013-04-13 pyry] Clean up & document. Do we actually want this? */
typedef struct qpEglConfigInfo_s
{
int bufferSize;
int redSize;
int greenSize;
int blueSize;
int luminanceSize;
int alphaSize;
int alphaMaskSize;
deBool bindToTextureRGB;
deBool bindToTextureRGBA;
const char* colorBufferType;
const char* configCaveat;
int configID;
const char* conformant;
int depthSize;
int level;
int maxPBufferWidth;
int maxPBufferHeight;
int maxPBufferPixels;
int maxSwapInterval;
int minSwapInterval;
deBool nativeRenderable;
const char* renderableType;
int sampleBuffers;
int samples;
int stencilSize;
const char* surfaceTypes;
const char* transparentType;
int transparentRedValue;
int transparentGreenValue;
int transparentBlueValue;
} qpEglConfigInfo;
qpTestLog* qpTestLog_createFileLog (const char* fileName, deUint32 flags);
void qpTestLog_destroy (qpTestLog* log);
deBool qpTestLog_startCase (qpTestLog* log, const char* testCasePath, qpTestCaseType testCaseType);
deBool qpTestLog_endCase (qpTestLog* log, qpTestResult result, const char* description);
deBool qpTestLog_terminateCase (qpTestLog* log, qpTestResult result);
deBool qpTestLog_writeMessage (qpTestLog* log, const char* format, ...) DE_PRINTF_FUNC_ATTR(2,3);
deBool qpTestLog_startSection (qpTestLog* log, const char* name, const char* description);
deBool qpTestLog_endSection (qpTestLog* log);
deBool qpTestLog_writeText (qpTestLog* log, const char* name, const char* description, qpKeyValueTag tag, const char* value);
deBool qpTestLog_writeInteger (qpTestLog* log, const char* name, const char* description, const char* unit, qpKeyValueTag tag, deInt64 value);
deBool qpTestLog_writeFloat (qpTestLog* log, const char* name, const char* description, const char* unit, qpKeyValueTag tag, float value);
deBool qpTestLog_startImageSet (qpTestLog* log, const char* name, const char* description);
deBool qpTestLog_endImageSet (qpTestLog* log);
deBool qpTestLog_writeImage (qpTestLog* log, const char* name, const char* description, qpImageCompressionMode compressionMode, qpImageFormat format, int width, int height, int stride, const void* data);
deBool qpTestLog_startEglConfigSet (qpTestLog* log, const char* key, const char* description);
deBool qpTestLog_writeEglConfig (qpTestLog* log, const qpEglConfigInfo* config);
deBool qpTestLog_endEglConfigSet (qpTestLog* log);
/* \todo [2013-08-26 pyry] Unify ShaderProgram & KernelSource & CompileInfo. */
deBool qpTestLog_startShaderProgram (qpTestLog* log, deBool linkOk, const char* linkInfoLog);
deBool qpTestLog_endShaderProgram (qpTestLog* log);
deBool qpTestLog_writeShader (qpTestLog* log, qpShaderType type, const char* source, deBool compileOk, const char* infoLog);
deBool qpTestLog_writeKernelSource (qpTestLog* log, const char* source);
deBool qpTestLog_writeSpirVAssemblySource (qpTestLog* log, const char* source);
deBool qpTestLog_writeCompileInfo (qpTestLog* log, const char* name, const char* description, deBool compileOk, const char* infoLog);
deBool qpTestLog_startSampleList (qpTestLog* log, const char* name, const char* description);
deBool qpTestLog_startSampleInfo (qpTestLog* log);
deBool qpTestLog_writeValueInfo (qpTestLog* log, const char* name, const char* description, const char* unit, qpSampleValueTag tag);
deBool qpTestLog_endSampleInfo (qpTestLog* log);
deBool qpTestLog_startSample (qpTestLog* log);
deBool qpTestLog_writeValueFloat (qpTestLog* log, double value);
deBool qpTestLog_writeValueInteger (qpTestLog* log, deInt64 value);
deBool qpTestLog_endSample (qpTestLog* log);
deBool qpTestLog_endSampleList (qpTestLog* log);
deUint32 qpTestLog_getLogFlags (const qpTestLog* log);
const char* qpGetTestResultName (qpTestResult result);
DE_END_EXTERN_C
/*! \} */
#endif /* _QPTESTLOG_H */