blob: 93a90a794544dec79d3450d8f445f2dc612160fb [file] [log] [blame]
#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 expected 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_WAIVER, /*!< Status code reported by waived test. */
QP_TEST_RESULT_DEVICE_LOST, /*!< Test caused a Device Lost error */
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. */
,
QP_TEST_LOG_EXCLUDE_EMPTY_LOGINFO = (1 << 3) /*!< Do not log empty shader compile or link loginfo. */
,
QP_TEST_LOG_NO_INITIAL_OUTPUT = (1 << 4) /*!< Do not push data to cout when initializing log. */
,
QP_TEST_LOG_COMPACT = (1 << 5) /*!< Only write test case status. */
} 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_RAYGEN,
QP_SHADER_TYPE_ANY_HIT,
QP_SHADER_TYPE_CLOSEST_HIT,
QP_SHADER_TYPE_MISS,
QP_SHADER_TYPE_INTERSECTION,
QP_SHADER_TYPE_CALLABLE,
QP_SHADER_TYPE_TASK,
QP_SHADER_TYPE_MESH,
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;
bool bindToTextureRGB;
bool 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;
bool nativeRenderable;
const char *renderableType;
int sampleBuffers;
int samples;
int stencilSize;
const char *surfaceTypes;
const char *transparentType;
int transparentRedValue;
int transparentGreenValue;
int transparentBlueValue;
bool recordableAndroid;
} qpEglConfigInfo;
qpTestLog *qpTestLog_createFileLog(const char *fileName, uint32_t flags);
bool qpTestLog_beginSession(qpTestLog *log, const char *additionalSessionInfo);
void qpTestLog_destroy(qpTestLog *log);
bool qpTestLog_isCompact(qpTestLog *log);
bool qpTestLog_startCase(qpTestLog *log, const char *testCasePath, qpTestCaseType testCaseType);
bool qpTestLog_endCase(qpTestLog *log, qpTestResult result, const char *description);
bool qpTestLog_startTestsCasesTime(qpTestLog *log);
bool qpTestLog_endTestsCasesTime(qpTestLog *log);
bool qpTestLog_terminateCase(qpTestLog *log, qpTestResult result);
bool qpTestLog_startSection(qpTestLog *log, const char *name, const char *description);
bool qpTestLog_endSection(qpTestLog *log);
bool qpTestLog_writeText(qpTestLog *log, const char *name, const char *description, qpKeyValueTag tag,
const char *value);
bool qpTestLog_writeInteger(qpTestLog *log, const char *name, const char *description, const char *unit,
qpKeyValueTag tag, int64_t value);
bool qpTestLog_writeFloat(qpTestLog *log, const char *name, const char *description, const char *unit,
qpKeyValueTag tag, float value);
bool qpTestLog_startImageSet(qpTestLog *log, const char *name, const char *description);
bool qpTestLog_endImageSet(qpTestLog *log);
bool qpTestLog_writeImage(qpTestLog *log, const char *name, const char *description,
qpImageCompressionMode compressionMode, qpImageFormat format, int width, int height,
int stride, const void *data);
bool qpTestLog_startEglConfigSet(qpTestLog *log, const char *key, const char *description);
bool qpTestLog_writeEglConfig(qpTestLog *log, const qpEglConfigInfo *config);
bool qpTestLog_endEglConfigSet(qpTestLog *log);
/* \todo [2013-08-26 pyry] Unify ShaderProgram & KernelSource & CompileInfo. */
bool qpTestLog_startShaderProgram(qpTestLog *log, bool linkOk, const char *linkInfoLog);
bool qpTestLog_endShaderProgram(qpTestLog *log);
bool qpTestLog_writeShader(qpTestLog *log, qpShaderType type, const char *source, bool compileOk, const char *infoLog);
bool qpTestLog_writeKernelSource(qpTestLog *log, const char *source);
bool qpTestLog_writeSpirVAssemblySource(qpTestLog *log, const char *source);
bool qpTestLog_writeCompileInfo(qpTestLog *log, const char *name, const char *description, bool compileOk,
const char *infoLog);
bool qpTestLog_startSampleList(qpTestLog *log, const char *name, const char *description);
bool qpTestLog_startSampleInfo(qpTestLog *log);
bool qpTestLog_writeValueInfo(qpTestLog *log, const char *name, const char *description, const char *unit,
qpSampleValueTag tag);
bool qpTestLog_endSampleInfo(qpTestLog *log);
bool qpTestLog_startSample(qpTestLog *log);
bool qpTestLog_writeValueFloat(qpTestLog *log, double value);
bool qpTestLog_writeValueInteger(qpTestLog *log, int64_t value);
bool qpTestLog_endSample(qpTestLog *log);
bool qpTestLog_endSampleList(qpTestLog *log);
bool qpTestLog_writeRaw(qpTestLog *log, const char *rawContents);
uint32_t qpTestLog_getLogFlags(const qpTestLog *log);
const char *qpGetTestResultName(qpTestResult result);
DE_END_EXTERN_C
/*! \} */
#endif /* _QPTESTLOG_H */