blob: 8c04ef508f104b42821f7dbdcb7005f1fa8e5b85 [file] [log] [blame]
#ifndef _GLSDRAWTEST_HPP
#define _GLSDRAWTEST_HPP
/*-------------------------------------------------------------------------
* drawElements Quality Program OpenGL (ES) Module
* -----------------------------------------------
*
* 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.
*
*//*!
* \file
* \brief Draw tests
*//*--------------------------------------------------------------------*/
#include "tcuTestCase.hpp"
#include "tcuResultCollector.hpp"
#include "gluRenderContext.hpp"
namespace glu
{
class ContextInfo;
}
namespace sglr
{
class ReferenceContextBuffers;
class ReferenceContext;
class Context;
} // sglr
namespace deqp
{
namespace gls
{
class AttributePack;
struct DrawTestSpec
{
enum Target
{
TARGET_ELEMENT_ARRAY = 0,
TARGET_ARRAY,
TARGET_LAST
};
enum InputType
{
INPUTTYPE_FLOAT = 0,
INPUTTYPE_FIXED,
INPUTTYPE_DOUBLE,
INPUTTYPE_BYTE,
INPUTTYPE_SHORT,
INPUTTYPE_UNSIGNED_BYTE,
INPUTTYPE_UNSIGNED_SHORT,
INPUTTYPE_INT,
INPUTTYPE_UNSIGNED_INT,
INPUTTYPE_HALF,
INPUTTYPE_UNSIGNED_INT_2_10_10_10,
INPUTTYPE_INT_2_10_10_10,
INPUTTYPE_LAST
};
enum OutputType
{
OUTPUTTYPE_FLOAT = 0,
OUTPUTTYPE_VEC2,
OUTPUTTYPE_VEC3,
OUTPUTTYPE_VEC4,
OUTPUTTYPE_INT,
OUTPUTTYPE_UINT,
OUTPUTTYPE_IVEC2,
OUTPUTTYPE_IVEC3,
OUTPUTTYPE_IVEC4,
OUTPUTTYPE_UVEC2,
OUTPUTTYPE_UVEC3,
OUTPUTTYPE_UVEC4,
OUTPUTTYPE_LAST
};
enum Usage
{
USAGE_DYNAMIC_DRAW = 0,
USAGE_STATIC_DRAW,
USAGE_STREAM_DRAW,
USAGE_STREAM_READ,
USAGE_STREAM_COPY,
USAGE_STATIC_READ,
USAGE_STATIC_COPY,
USAGE_DYNAMIC_READ,
USAGE_DYNAMIC_COPY,
USAGE_LAST
};
enum Storage
{
STORAGE_USER = 0,
STORAGE_BUFFER,
STORAGE_LAST
};
enum Primitive
{
PRIMITIVE_POINTS = 0,
PRIMITIVE_TRIANGLES,
PRIMITIVE_TRIANGLE_FAN,
PRIMITIVE_TRIANGLE_STRIP,
PRIMITIVE_LINES,
PRIMITIVE_LINE_STRIP,
PRIMITIVE_LINE_LOOP,
PRIMITIVE_LINES_ADJACENCY,
PRIMITIVE_LINE_STRIP_ADJACENCY,
PRIMITIVE_TRIANGLES_ADJACENCY,
PRIMITIVE_TRIANGLE_STRIP_ADJACENCY,
PRIMITIVE_LAST
};
enum IndexType
{
INDEXTYPE_BYTE = 0,
INDEXTYPE_SHORT,
INDEXTYPE_INT,
INDEXTYPE_LAST
};
enum DrawMethod
{
DRAWMETHOD_DRAWARRAYS = 0,
DRAWMETHOD_DRAWARRAYS_INSTANCED,
DRAWMETHOD_DRAWARRAYS_INDIRECT,
DRAWMETHOD_DRAWELEMENTS,
DRAWMETHOD_DRAWELEMENTS_RANGED,
DRAWMETHOD_DRAWELEMENTS_INSTANCED,
DRAWMETHOD_DRAWELEMENTS_INDIRECT,
DRAWMETHOD_DRAWELEMENTS_BASEVERTEX,
DRAWMETHOD_DRAWELEMENTS_INSTANCED_BASEVERTEX,
DRAWMETHOD_DRAWELEMENTS_RANGED_BASEVERTEX,
DRAWMETHOD_LAST
};
enum CompatibilityTestType
{
COMPATIBILITY_NONE = 0,
COMPATIBILITY_UNALIGNED_OFFSET,
COMPATIBILITY_UNALIGNED_STRIDE,
COMPATIBILITY_LAST
};
static std::string targetToString (Target target);
static std::string inputTypeToString (InputType type);
static std::string outputTypeToString (OutputType type);
static std::string usageTypeToString (Usage usage);
static std::string storageToString (Storage storage);
static std::string primitiveToString (Primitive primitive);
static std::string indexTypeToString (IndexType type);
static std::string drawMethodToString (DrawMethod method);
static int inputTypeSize (InputType type);
static int indexTypeSize (IndexType type);
struct AttributeSpec
{
static AttributeSpec createAttributeArray (InputType inputType, OutputType outputType, Storage storage, Usage usage, int componentCount, int offset, int stride, bool normalize, int instanceDivisor);
static AttributeSpec createDefaultAttribute (InputType inputType, OutputType outputType, int componentCount); //!< allowed inputType values: INPUTTYPE_INT, INPUTTYPE_UNSIGNED_INT, INPUTTYPE_FLOAT
InputType inputType;
OutputType outputType;
Storage storage;
Usage usage;
int componentCount;
int offset;
int stride;
bool normalize;
int instanceDivisor; //!< used only if drawMethod = Draw*Instanced
bool useDefaultAttribute;
bool additionalPositionAttribute; //!< treat this attribute as position attribute. Attribute at index 0 is alway treated as such. False by default
bool bgraComponentOrder; //!< component order of this attribute is bgra, valid only for 4-component targets. False by default.
AttributeSpec (void);
int hash (void) const;
bool valid (glu::ApiType apiType) const;
bool isBufferAligned (void) const;
bool isBufferStrideAligned (void) const;
};
std::string getName (void) const;
std::string getDesc (void) const;
std::string getMultilineDesc (void) const;
glu::ApiType apiType; //!< needed in spec validation
Primitive primitive;
int primitiveCount; //!< number of primitives to draw (per instance)
DrawMethod drawMethod;
IndexType indexType; //!< used only if drawMethod = DrawElements*
int indexPointerOffset; //!< used only if drawMethod = DrawElements*
Storage indexStorage; //!< used only if drawMethod = DrawElements*
int first; //!< used only if drawMethod = DrawArrays*
int indexMin; //!< used only if drawMethod = Draw*Ranged
int indexMax; //!< used only if drawMethod = Draw*Ranged
int instanceCount; //!< used only if drawMethod = Draw*Instanced or Draw*Indirect
int indirectOffset; //!< used only if drawMethod = Draw*Indirect
int baseVertex; //!< used only if drawMethod = DrawElementsIndirect or *BaseVertex
std::vector<AttributeSpec> attribs;
DrawTestSpec (void);
int hash (void) const;
bool valid (void) const;
CompatibilityTestType isCompatibilityTest (void) const;
};
class DrawTest : public tcu::TestCase
{
public:
DrawTest (tcu::TestContext& testCtx, glu::RenderContext& renderCtx, const DrawTestSpec& spec, const char* name, const char* desc);
DrawTest (tcu::TestContext& testCtx, glu::RenderContext& renderCtx, const char* name, const char* desc);
virtual ~DrawTest (void);
void addIteration (const DrawTestSpec& spec, const char* description = DE_NULL);
private:
void init (void);
void deinit (void);
IterateResult iterate (void);
bool compare (gls::DrawTestSpec::Primitive primitiveType);
float getCoordScale (const DrawTestSpec& spec) const;
float getColorScale (const DrawTestSpec& spec) const;
glu::RenderContext& m_renderCtx;
glu::ContextInfo* m_contextInfo;
sglr::ReferenceContextBuffers* m_refBuffers;
sglr::ReferenceContext* m_refContext;
sglr::Context* m_glesContext;
AttributePack* m_glArrayPack;
AttributePack* m_rrArrayPack;
int m_maxDiffRed;
int m_maxDiffGreen;
int m_maxDiffBlue;
std::vector<DrawTestSpec> m_specs;
std::vector<std::string> m_iteration_descriptions;
int m_iteration;
tcu::ResultCollector m_result;
};
} // gls
} // deqp
#endif // _GLSDRAWTEST_HPP