blob: 1b5212e66bbce47f76be0a648c0266819f0e7550 [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;
} // namespace 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;
};
} // namespace gls
} // namespace deqp
#endif // _GLSDRAWTEST_HPP