#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 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 m_specs; std::vector m_iteration_descriptions; int m_iteration; tcu::ResultCollector m_result; }; } // namespace gls } // namespace deqp #endif // _GLSDRAWTEST_HPP