13c827367444ee418f129b2c238299f49d3264554Jarkko Poyry/*------------------------------------------------------------------------- 23c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * drawElements Quality Program OpenGL ES 3.0 Module 33c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * ------------------------------------------------- 43c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * 53c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * Copyright 2014 The Android Open Source Project 63c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * 73c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * Licensed under the Apache License, Version 2.0 (the "License"); 83c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * you may not use this file except in compliance with the License. 93c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * You may obtain a copy of the License at 103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * 113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * http://www.apache.org/licenses/LICENSE-2.0 123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * 133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * Unless required by applicable law or agreed to in writing, software 143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * distributed under the License is distributed on an "AS IS" BASIS, 153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * See the License for the specific language governing permissions and 173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * limitations under the License. 183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * 193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*! 203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \file 213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \brief Vertex array object tests 223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*--------------------------------------------------------------------*/ 233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "es3fVertexArrayObjectTests.hpp" 243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "gluShaderProgram.hpp" 263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "gluPixelTransfer.hpp" 273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "gluRenderContext.hpp" 283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "tcuTestLog.hpp" 303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "tcuImageCompare.hpp" 313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "tcuSurface.hpp" 323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "tcuRenderTarget.hpp" 333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "deRandom.hpp" 353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "deString.h" 363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "deMemory.h" 373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include <vector> 393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include <string> 403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include <memory> 413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "glw.h" 433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 443c827367444ee418f129b2c238299f49d3264554Jarkko Poyryusing std::vector; 453c827367444ee418f129b2c238299f49d3264554Jarkko Poyryusing std::string; 463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 473c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace deqp 483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 493c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace gles3 503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 513c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace Functional 523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 543c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace 553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 563c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystruct Attribute 573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry Attribute (void); 593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GLboolean enabled; 603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GLint size; 613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GLint stride; 623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GLenum type; 633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GLboolean integer; 643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GLint divisor; 653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GLint offset; 663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GLboolean normalized; 673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry int bufferNdx; 693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}; 703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 713c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystruct VertexArrayState 723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry VertexArrayState (void); 743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry vector<Attribute> attributes; 763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry int elementArrayBuffer; 773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}; 783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 793c827367444ee418f129b2c238299f49d3264554Jarkko PoyryVertexArrayState::VertexArrayState (void) 803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry : elementArrayBuffer(-1) 813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 843c827367444ee418f129b2c238299f49d3264554Jarkko PoyryAttribute::Attribute (void) 853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry : enabled (GL_FALSE) 863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry , size (1) 873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry , stride (0) 883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry , type (GL_FLOAT) 893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry , integer (GL_FALSE) 903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry , divisor (0) 913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry , offset (0) 923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry , normalized (GL_FALSE) 933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry , bufferNdx (0) 943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 973c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystruct BufferSpec 983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry int count; 1003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry int size; 1013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry int componentCount; 1023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry int stride; 1033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry int offset; 1043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GLenum type; 1063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry int intRangeMin; 1083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry int intRangeMax; 1093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry float floatRangeMin; 1113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry float floatRangeMax; 1123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}; 1133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1143c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystruct Spec 1153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 1163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry Spec (void); 1173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry int count; 1193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry int instances; 1203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry bool useDrawElements; 1213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GLenum indexType; 1223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry int indexOffset; 1233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry int indexRangeMin; 1243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry int indexRangeMax; 1253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry int indexCount; 1263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry VertexArrayState state; 1273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry VertexArrayState vao; 1283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry vector<BufferSpec> buffers; 1293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}; 1303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1313c827367444ee418f129b2c238299f49d3264554Jarkko PoyrySpec::Spec (void) 1323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry : count (-1) 1333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry , instances (-1) 1343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry , useDrawElements (false) 1353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry , indexType (GL_NONE) 1363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry , indexOffset (-1) 1373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry , indexRangeMin (-1) 1383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry , indexRangeMax (-1) 1393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry , indexCount (-1) 1403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 1413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 1423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // anonymous 1443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1453c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass VertexArrayObjectTest : public TestCase 1463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 1473c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic: 1483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry VertexArrayObjectTest (Context& context, const Spec& spec, const char* name, const char* description); 1503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry ~VertexArrayObjectTest (void); 1513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry virtual void init (void); 1523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry virtual void deinit (void); 1533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry virtual IterateResult iterate (void); 1543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1553c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate: 1563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry Spec m_spec; 1573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry tcu::TestLog& m_log; 1583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry vector<GLuint> m_buffers; 1593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry glu::ShaderProgram* m_vaoProgram; 1603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry glu::ShaderProgram* m_stateProgram; 1613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry de::Random m_random; 1623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry deUint8* m_indices; 1633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry void logVertexArrayState (tcu::TestLog& log, const VertexArrayState& state, const std::string& msg); 1653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry deUint8* createRandomBufferData (const BufferSpec& buffer); 1663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry deUint8* generateIndices (void); 1673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry glu::ShaderProgram* createProgram (const VertexArrayState& state); 1683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry void setState (const VertexArrayState& state); 1693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry void render (tcu::Surface& vaoResult, tcu::Surface& defaultResult); 1703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry void makeDrawCall (const VertexArrayState& state); 1713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry void genReferences (tcu::Surface& vaoRef, tcu::Surface& defaultRef); 1723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry VertexArrayObjectTest (const VertexArrayObjectTest&); 1743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry VertexArrayObjectTest& operator= (const VertexArrayObjectTest&); 1753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}; 1763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1773c827367444ee418f129b2c238299f49d3264554Jarkko PoyryVertexArrayObjectTest::VertexArrayObjectTest (Context& context, const Spec& spec, const char* name, const char* description) 1783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry : TestCase (context, name, description) 1793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry , m_spec (spec) 1803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry , m_log (context.getTestContext().getLog()) 1813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry , m_vaoProgram (NULL) 1823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry , m_stateProgram (NULL) 1833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry , m_random (deStringHash(name)) 1843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry , m_indices (NULL) 1853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 1863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // Makes zero to zero mapping for buffers 1873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_buffers.push_back(0); 1883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 1893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1903c827367444ee418f129b2c238299f49d3264554Jarkko PoyryVertexArrayObjectTest::~VertexArrayObjectTest (void) 1913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 1923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 1933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1943c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid VertexArrayObjectTest::logVertexArrayState (tcu::TestLog& log, const VertexArrayState& state, const std::string& msg) 1953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 1963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry std::stringstream message; 1973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry message << msg << "\n"; 1993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry message << "GL_ELEMENT_ARRAY_BUFFER : " << state.elementArrayBuffer << "\n"; 2003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry for (int attribNdx = 0; attribNdx < (int)state.attributes.size(); attribNdx++) 2023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 2033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry message 2043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "attribute : " << attribNdx << "\n" 2053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "\tGL_VERTEX_ATTRIB_ARRAY_ENABLED : " << (state.attributes[attribNdx].enabled ? "GL_TRUE" : "GL_FALSE") << "\n" 2063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "\tGL_VERTEX_ATTRIB_ARRAY_SIZE : " << state.attributes[attribNdx].size << "\n" 2073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "\tGL_VERTEX_ATTRIB_ARRAY_STRIDE : " << state.attributes[attribNdx].stride << "\n" 2083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "\tGL_VERTEX_ATTRIB_ARRAY_TYPE : " << state.attributes[attribNdx].type << "\n" 2093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "\tGL_VERTEX_ATTRIB_ARRAY_NORMALIZED : " << (state.attributes[attribNdx].normalized ? "GL_TRUE" : "GL_FALSE") << "\n" 2103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "\tGL_VERTEX_ATTRIB_ARRAY_INTEGER : " << (state.attributes[attribNdx].integer ? "GL_TRUE" : "GL_FALSE") << "\n" 2113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "\tGL_VERTEX_ATTRIB_ARRAY_DIVISOR : " << state.attributes[attribNdx].divisor << "\n" 2123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "\tGL_VERTEX_ATTRIB_ARRAY_POINTER : " << state.attributes[attribNdx].offset << "\n" 2133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "\tGL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING : " << m_buffers[state.attributes[attribNdx].bufferNdx] << "\n"; 2143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 2153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry log << tcu::TestLog::Message << message.str() << tcu::TestLog::EndMessage; 2163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 2173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2193c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid VertexArrayObjectTest::init (void) 2203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 2213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // \note [mika] Index 0 is reserved for 0 buffer 2223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry for (int bufferNdx = 0; bufferNdx < (int)m_spec.buffers.size(); bufferNdx++) 2233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 2243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry deUint8* data = createRandomBufferData(m_spec.buffers[bufferNdx]); 2253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry try 2273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 2283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GLuint buffer; 2293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GLU_CHECK_CALL(glGenBuffers(1, &buffer)); 2303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_buffers.push_back(buffer); 2313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GLU_CHECK_CALL(glBindBuffer(GL_ARRAY_BUFFER, buffer)); 2333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GLU_CHECK_CALL(glBufferData(GL_ARRAY_BUFFER, m_spec.buffers[bufferNdx].size, data, GL_DYNAMIC_DRAW)); 2343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GLU_CHECK_CALL(glBindBuffer(GL_ARRAY_BUFFER, 0)); 2353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } catch (...) { 2373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry delete[] data; 2383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry throw; 2393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 2403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry delete[] data; 2423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 2433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_vaoProgram = createProgram(m_spec.vao); 2453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_log << tcu::TestLog::Message << "Program used with Vertex Array Object" << tcu::TestLog::EndMessage; 2463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_log << *m_vaoProgram; 2473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_stateProgram = createProgram(m_spec.state); 2483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_log << tcu::TestLog::Message << "Program used with Vertex Array State" << tcu::TestLog::EndMessage; 2493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_log << *m_stateProgram; 2503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (!m_vaoProgram->isOk() || !m_stateProgram->isOk()) 2523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry TCU_FAIL("Failed to compile shaders"); 2533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (m_spec.useDrawElements && (m_spec.vao.elementArrayBuffer == 0 || m_spec.state.elementArrayBuffer == 0)) 2553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_indices = generateIndices(); 2563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 2573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2583c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid VertexArrayObjectTest::deinit (void) 2593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 2603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GLU_CHECK_CALL(glDeleteBuffers((GLsizei)m_buffers.size(), &(m_buffers[0]))); 2613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_buffers.clear(); 2623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry delete m_vaoProgram; 2633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry delete m_stateProgram; 2643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry delete[] m_indices; 2653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 2663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2673c827367444ee418f129b2c238299f49d3264554Jarkko PoyrydeUint8* VertexArrayObjectTest::generateIndices (void) 2683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 2693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry int typeSize = 0; 2703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry switch (m_spec.indexType) 2713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 2723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry case GL_UNSIGNED_INT: typeSize = sizeof(GLuint); break; 2733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry case GL_UNSIGNED_SHORT: typeSize = sizeof(GLushort); break; 2743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry case GL_UNSIGNED_BYTE: typeSize = sizeof(GLubyte); break; 2753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry default: 2763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry DE_ASSERT(false); 2773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 2783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry deUint8* indices = new deUint8[m_spec.indexCount * typeSize]; 2803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry for (int i = 0; i < m_spec.indexCount; i++) 2823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 2833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry deUint8* pos = indices + typeSize * i; 2843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry switch (m_spec.indexType) 2863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 2873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry case GL_UNSIGNED_INT: 2883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 2893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GLuint v = (GLuint)m_random.getInt(m_spec.indexRangeMin, m_spec.indexRangeMax); 2903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry deMemcpy(pos, &v, sizeof(v)); 2913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry break; 2923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 2933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 2943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry case GL_UNSIGNED_SHORT: 2953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 2963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GLushort v = (GLushort)m_random.getInt(m_spec.indexRangeMin, m_spec.indexRangeMax); 2973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry deMemcpy(pos, &v, sizeof(v)); 2983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry break; 2993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 3003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry case GL_UNSIGNED_BYTE: 3023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 3033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GLubyte v = (GLubyte)m_random.getInt(m_spec.indexRangeMin, m_spec.indexRangeMax); 3043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry deMemcpy(pos, &v, sizeof(v)); 3053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry break; 3063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 3073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry default: 3093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry DE_ASSERT(false); 3103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 3113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 3123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry return indices; 3143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 3153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3163c827367444ee418f129b2c238299f49d3264554Jarkko PoyrydeUint8* VertexArrayObjectTest::createRandomBufferData (const BufferSpec& buffer) 3173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 3183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry deUint8* data = new deUint8[buffer.size]; 3193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry int stride; 3213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (buffer.stride != 0) 3233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 3243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry stride = buffer.stride; 3253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 3263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry else 3273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 3283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry switch (buffer.type) 3293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 330b5e3a7c20f061a8b781eaa1f2c856374806ad378Jarkko Pöyry case GL_FLOAT: stride = buffer.componentCount * (int)sizeof(GLfloat); break; 331b5e3a7c20f061a8b781eaa1f2c856374806ad378Jarkko Pöyry case GL_INT: stride = buffer.componentCount * (int)sizeof(GLint); break; 332b5e3a7c20f061a8b781eaa1f2c856374806ad378Jarkko Pöyry case GL_UNSIGNED_INT: stride = buffer.componentCount * (int)sizeof(GLuint); break; 333b5e3a7c20f061a8b781eaa1f2c856374806ad378Jarkko Pöyry case GL_SHORT: stride = buffer.componentCount * (int)sizeof(GLshort); break; 334b5e3a7c20f061a8b781eaa1f2c856374806ad378Jarkko Pöyry case GL_UNSIGNED_SHORT: stride = buffer.componentCount * (int)sizeof(GLushort); break; 335b5e3a7c20f061a8b781eaa1f2c856374806ad378Jarkko Pöyry case GL_BYTE: stride = buffer.componentCount * (int)sizeof(GLbyte); break; 336b5e3a7c20f061a8b781eaa1f2c856374806ad378Jarkko Pöyry case GL_UNSIGNED_BYTE: stride = buffer.componentCount * (int)sizeof(GLubyte); break; 3373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry default: 3393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry stride = 0; 3403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry DE_ASSERT(DE_FALSE); 3413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 3423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 3433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry deUint8* itr = data; 3453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry for (int pos = 0; pos < buffer.count; pos++) 3473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 3483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry deUint8* componentItr = itr; 3493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry for (int componentNdx = 0; componentNdx < buffer.componentCount; componentNdx++) 3503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 3513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry switch (buffer.type) 3523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 3533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry case GL_FLOAT: 3543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 3553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry float v = buffer.floatRangeMin + (buffer.floatRangeMax - buffer.floatRangeMin) * m_random.getFloat(); 3563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry deMemcpy(componentItr, &v, sizeof(v)); 3573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry componentItr += sizeof(v); 3583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry break; 3593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 3603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry case GL_INT: 3623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 3633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GLint v = m_random.getInt(buffer.intRangeMin, buffer.intRangeMax); 3643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry deMemcpy(componentItr, &v, sizeof(v)); 3653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry componentItr += sizeof(v); 3663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry break; 3673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 3683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry case GL_UNSIGNED_INT: 3703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 3713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GLuint v = m_random.getInt(buffer.intRangeMin, buffer.intRangeMax); 3723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry deMemcpy(componentItr, &v, sizeof(v)); 3733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry componentItr += sizeof(v); 3743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry break; 3753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 3763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry case GL_SHORT: 3783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 379b5e3a7c20f061a8b781eaa1f2c856374806ad378Jarkko Pöyry GLshort v = (GLshort)m_random.getInt(buffer.intRangeMin, buffer.intRangeMax); 3803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry deMemcpy(componentItr, &v, sizeof(v)); 3813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry componentItr += sizeof(v); 3823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry break; 3833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 3843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry case GL_UNSIGNED_SHORT: 3863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 387b5e3a7c20f061a8b781eaa1f2c856374806ad378Jarkko Pöyry GLushort v = (GLushort)m_random.getInt(buffer.intRangeMin, buffer.intRangeMax); 3883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry deMemcpy(componentItr, &v, sizeof(v)); 3893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry componentItr += sizeof(v); 3903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry break; 3913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 3923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 3933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry case GL_BYTE: 3943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 395b5e3a7c20f061a8b781eaa1f2c856374806ad378Jarkko Pöyry GLbyte v = (GLbyte)m_random.getInt(buffer.intRangeMin, buffer.intRangeMax); 3963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry deMemcpy(componentItr, &v, sizeof(v)); 3973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry componentItr += sizeof(v); 3983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry break; 3993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 4003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 4013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry case GL_UNSIGNED_BYTE: 4023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 403b5e3a7c20f061a8b781eaa1f2c856374806ad378Jarkko Pöyry GLubyte v = (GLubyte)m_random.getInt(buffer.intRangeMin, buffer.intRangeMax); 4043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry deMemcpy(componentItr, &v, sizeof(v)); 4053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry componentItr += sizeof(v); 4063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry break; 4073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 4083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 4093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry default: 4103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry DE_ASSERT(false); 4113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry }; 4123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 4133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 4143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry itr += stride; 4153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 4163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 4173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry return data; 4183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 4193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 4203c827367444ee418f129b2c238299f49d3264554Jarkko Poyryglu::ShaderProgram* VertexArrayObjectTest::createProgram (const VertexArrayState& state) 4213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 4223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry std::stringstream vertexShaderStream; 4233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry std::stringstream value; 4243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 4253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry vertexShaderStream << "#version 300 es\n"; 4263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 4273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry for (int attribNdx = 0; attribNdx < (int)state.attributes.size(); attribNdx++) 4283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 4293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (state.attributes[attribNdx].integer) 4303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry vertexShaderStream << "layout(location = " << attribNdx << ") in mediump ivec4 a_attrib" << attribNdx << ";\n"; 4313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry else 4323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry vertexShaderStream << "layout(location = " << attribNdx << ") in mediump vec4 a_attrib" << attribNdx << ";\n"; 4333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 4343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (state.attributes[attribNdx].integer) 4353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 4363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry float scale = 0.0f; 4373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 4383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry switch (state.attributes[0].type) 4393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 440b5e3a7c20f061a8b781eaa1f2c856374806ad378Jarkko Pöyry case GL_SHORT: scale = (1.0f/float((1u<<14)-1u)); break; 441b5e3a7c20f061a8b781eaa1f2c856374806ad378Jarkko Pöyry case GL_UNSIGNED_SHORT: scale = (1.0f/float((1u<<15)-1u)); break; 442b5e3a7c20f061a8b781eaa1f2c856374806ad378Jarkko Pöyry case GL_INT: scale = (1.0f/float((1u<<30)-1u)); break; 443b5e3a7c20f061a8b781eaa1f2c856374806ad378Jarkko Pöyry case GL_UNSIGNED_INT: scale = (1.0f/float((1u<<31)-1u)); break; 444b5e3a7c20f061a8b781eaa1f2c856374806ad378Jarkko Pöyry case GL_BYTE: scale = (1.0f/float((1u<<6)-1u)); break; 445b5e3a7c20f061a8b781eaa1f2c856374806ad378Jarkko Pöyry case GL_UNSIGNED_BYTE: scale = (1.0f/float((1u<<7)-1u)); break; 4463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 4473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry default: 4483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry DE_ASSERT(DE_FALSE); 4493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 4503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry value << (attribNdx != 0 ? " + " : "" ) << scale << " * vec4(a_attrib" << attribNdx << ")"; 4513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 4523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry else if (state.attributes[attribNdx].type != GL_FLOAT && !state.attributes[attribNdx].normalized) 4533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 4543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry float scale = 0.0f; 4553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 4563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry switch (state.attributes[0].type) 4573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 458b5e3a7c20f061a8b781eaa1f2c856374806ad378Jarkko Pöyry case GL_SHORT: scale = (0.5f/float((1u<<14)-1u)); break; 459b5e3a7c20f061a8b781eaa1f2c856374806ad378Jarkko Pöyry case GL_UNSIGNED_SHORT: scale = (0.5f/float((1u<<15)-1u)); break; 460b5e3a7c20f061a8b781eaa1f2c856374806ad378Jarkko Pöyry case GL_INT: scale = (0.5f/float((1u<<30)-1u)); break; 461b5e3a7c20f061a8b781eaa1f2c856374806ad378Jarkko Pöyry case GL_UNSIGNED_INT: scale = (0.5f/float((1u<<31)-1u)); break; 462b5e3a7c20f061a8b781eaa1f2c856374806ad378Jarkko Pöyry case GL_BYTE: scale = (0.5f/float((1u<<6)-1u)); break; 463b5e3a7c20f061a8b781eaa1f2c856374806ad378Jarkko Pöyry case GL_UNSIGNED_BYTE: scale = (0.5f/float((1u<<7)-1u)); break; 4643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 4653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry default: 4663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry DE_ASSERT(DE_FALSE); 4673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 4683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry value << (attribNdx != 0 ? " + " : "" ) << scale << " * a_attrib" << attribNdx; 4693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 4703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry else 4713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry value << (attribNdx != 0 ? " + " : "" ) << "a_attrib" << attribNdx; 4723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 4733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 4743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry vertexShaderStream 4753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "out mediump vec4 v_value;\n" 4763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "void main (void)\n" 4773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "{\n" 4783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "\tv_value = " << value.str() << ";\n"; 4793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 4803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (state.attributes[0].integer) 4813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 4823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry float scale = 0.0f; 4833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 4843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry switch (state.attributes[0].type) 4853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 486b5e3a7c20f061a8b781eaa1f2c856374806ad378Jarkko Pöyry case GL_SHORT: scale = (1.0f/float((1u<<14)-1u)); break; 487b5e3a7c20f061a8b781eaa1f2c856374806ad378Jarkko Pöyry case GL_UNSIGNED_SHORT: scale = (1.0f/float((1u<<15)-1u)); break; 488b5e3a7c20f061a8b781eaa1f2c856374806ad378Jarkko Pöyry case GL_INT: scale = (1.0f/float((1u<<30)-1u)); break; 489b5e3a7c20f061a8b781eaa1f2c856374806ad378Jarkko Pöyry case GL_UNSIGNED_INT: scale = (1.0f/float((1u<<31)-1u)); break; 490b5e3a7c20f061a8b781eaa1f2c856374806ad378Jarkko Pöyry case GL_BYTE: scale = (1.0f/float((1u<<6)-1u)); break; 491b5e3a7c20f061a8b781eaa1f2c856374806ad378Jarkko Pöyry case GL_UNSIGNED_BYTE: scale = (1.0f/float((1u<<7)-1u)); break; 4923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 4933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry default: 4943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry DE_ASSERT(DE_FALSE); 4953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 4963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 4973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry vertexShaderStream 4983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "\tgl_Position = vec4(" << scale << " * " << "vec3(a_attrib0.xyz), 1.0);\n" 4993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "}"; 5003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 5013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry else 5023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 5033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (state.attributes[0].normalized || state.attributes[0].type == GL_FLOAT) 5043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 5053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry vertexShaderStream 5063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "\tgl_Position = vec4(a_attrib0.xyz, 1.0);\n" 5073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "}"; 5083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 5093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry else 5103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 5113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry float scale = 0.0f; 5123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 5133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry switch (state.attributes[0].type) 5143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 515b5e3a7c20f061a8b781eaa1f2c856374806ad378Jarkko Pöyry case GL_SHORT: scale = (1.0f/float((1u<<14)-1u)); break; 516b5e3a7c20f061a8b781eaa1f2c856374806ad378Jarkko Pöyry case GL_UNSIGNED_SHORT: scale = (1.0f/float((1u<<15)-1u)); break; 517b5e3a7c20f061a8b781eaa1f2c856374806ad378Jarkko Pöyry case GL_INT: scale = (1.0f/float((1u<<30)-1u)); break; 518b5e3a7c20f061a8b781eaa1f2c856374806ad378Jarkko Pöyry case GL_UNSIGNED_INT: scale = (1.0f/float((1u<<31)-1u)); break; 519b5e3a7c20f061a8b781eaa1f2c856374806ad378Jarkko Pöyry case GL_BYTE: scale = (1.0f/float((1u<<6)-1u)); break; 520b5e3a7c20f061a8b781eaa1f2c856374806ad378Jarkko Pöyry case GL_UNSIGNED_BYTE: scale = (1.0f/float((1u<<7)-1u)); break; 5213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 5223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry default: 5233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry DE_ASSERT(DE_FALSE); 5243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 5253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 526b5e3a7c20f061a8b781eaa1f2c856374806ad378Jarkko Pöyry scale *= 0.5f; 5273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 5283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry vertexShaderStream 5293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "\tgl_Position = vec4(" << scale << " * " << "a_attrib0.xyz, 1.0);\n" 5303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "}"; 5313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 5323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 5333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 5343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const char* fragmentShader = 5353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "#version 300 es\n" 5363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "in mediump vec4 v_value;\n" 5373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "layout(location = 0) out mediump vec4 fragColor;\n" 5383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "void main (void)\n" 5393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "{\n" 5403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "\tfragColor = vec4(v_value.xyz, 1.0);\n" 5413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "}"; 5423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 5433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry return new glu::ShaderProgram(m_context.getRenderContext(), glu::makeVtxFragSources(vertexShaderStream.str(), fragmentShader)); 5443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 5453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 5463c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid VertexArrayObjectTest::setState (const VertexArrayState& state) 5473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 5483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GLU_CHECK_CALL(glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_buffers[state.elementArrayBuffer])); 5493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 5503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry for (int attribNdx = 0; attribNdx < (int)state.attributes.size(); attribNdx++) 5513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 5523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GLU_CHECK_CALL(glBindBuffer(GL_ARRAY_BUFFER, m_buffers[state.attributes[attribNdx].bufferNdx])); 5533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (state.attributes[attribNdx].enabled) 5543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GLU_CHECK_CALL(glEnableVertexAttribArray(attribNdx)); 5553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry else 5563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GLU_CHECK_CALL(glDisableVertexAttribArray(attribNdx)); 5573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 5583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (state.attributes[attribNdx].integer) 5593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GLU_CHECK_CALL(glVertexAttribIPointer(attribNdx, state.attributes[attribNdx].size, state.attributes[attribNdx].type, state.attributes[attribNdx].stride, (const GLvoid*)((GLintptr)state.attributes[attribNdx].offset))); 5603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry else 5613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GLU_CHECK_CALL(glVertexAttribPointer(attribNdx, state.attributes[attribNdx].size, state.attributes[attribNdx].type, state.attributes[attribNdx].normalized, state.attributes[attribNdx].stride, (const GLvoid*)((GLintptr)state.attributes[attribNdx].offset))); 5623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 5633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GLU_CHECK_CALL(glVertexAttribDivisor(attribNdx, state.attributes[attribNdx].divisor)); 5643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 5653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 5663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 5673c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid VertexArrayObjectTest::makeDrawCall (const VertexArrayState& state) 5683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 5693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GLU_CHECK_CALL(glClearColor(0.7f, 0.7f, 0.7f, 1.0f)); 5703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GLU_CHECK_CALL(glClear(GL_COLOR_BUFFER_BIT)); 5713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 5723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (m_spec.useDrawElements) 5733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 5743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (state.elementArrayBuffer == 0) 5753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 5763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (m_spec.instances == 0) 5773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GLU_CHECK_CALL(glDrawElements(GL_TRIANGLES, m_spec.count, m_spec.indexType, m_indices)); 5783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry else 5793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GLU_CHECK_CALL(glDrawElementsInstanced(GL_TRIANGLES, m_spec.count, m_spec.indexType, m_indices, m_spec.instances)); 5803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 5813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry else 5823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 5833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (m_spec.instances == 0) 5843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GLU_CHECK_CALL(glDrawElements(GL_TRIANGLES, m_spec.count, m_spec.indexType, (GLvoid*)((GLintptr)m_spec.indexOffset))); 5853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry else 5863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GLU_CHECK_CALL(glDrawElementsInstanced(GL_TRIANGLES, m_spec.count, m_spec.indexType, (GLvoid*)((GLintptr)m_spec.indexOffset), m_spec.instances)); 5873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 5883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 5893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry else 5903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 5913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (m_spec.instances == 0) 5923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GLU_CHECK_CALL(glDrawArrays(GL_TRIANGLES, 0, m_spec.count)); 5933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry else 5943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GLU_CHECK_CALL(glDrawArraysInstanced(GL_TRIANGLES, 0, m_spec.count, m_spec.instances)); 5953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 5963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 5973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 5983c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid VertexArrayObjectTest::render (tcu::Surface& vaoResult, tcu::Surface& defaultResult) 5993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 6003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GLuint vao = 0; 6013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 6023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GLU_CHECK_CALL(glGenVertexArrays(1, &vao)); 6033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GLU_CHECK_CALL(glBindVertexArray(vao)); 6043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry setState(m_spec.vao); 6053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GLU_CHECK_CALL(glBindVertexArray(0)); 6063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 6073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry setState(m_spec.state); 6083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 6093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GLU_CHECK_CALL(glBindVertexArray(vao)); 6103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GLU_CHECK_CALL(glUseProgram(m_vaoProgram->getProgram())); 6113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry makeDrawCall(m_spec.vao); 6123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry glu::readPixels(m_context.getRenderContext(), 0, 0, vaoResult.getAccess()); 6133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry setState(m_spec.vao); 6143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GLU_CHECK_CALL(glBindVertexArray(0)); 6153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 6163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GLU_CHECK_CALL(glUseProgram(m_stateProgram->getProgram())); 6173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry makeDrawCall(m_spec.state); 6183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry glu::readPixels(m_context.getRenderContext(), 0, 0, defaultResult.getAccess()); 6193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 6203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 6213c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid VertexArrayObjectTest::genReferences (tcu::Surface& vaoRef, tcu::Surface& defaultRef) 6223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 6233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry setState(m_spec.vao); 6243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GLU_CHECK_CALL(glUseProgram(m_vaoProgram->getProgram())); 6253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry makeDrawCall(m_spec.vao); 6263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry glu::readPixels(m_context.getRenderContext(), 0, 0, vaoRef.getAccess()); 6273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 6283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry setState(m_spec.state); 6293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GLU_CHECK_CALL(glUseProgram(m_stateProgram->getProgram())); 6303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry makeDrawCall(m_spec.state); 6313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry glu::readPixels(m_context.getRenderContext(), 0, 0, defaultRef.getAccess()); 6323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 6333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 6343c827367444ee418f129b2c238299f49d3264554Jarkko PoyryTestCase::IterateResult VertexArrayObjectTest::iterate (void) 6353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 6363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry tcu::Surface vaoReference (m_context.getRenderContext().getRenderTarget().getWidth(), m_context.getRenderContext().getRenderTarget().getHeight()); 6373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry tcu::Surface stateReference (m_context.getRenderContext().getRenderTarget().getWidth(), m_context.getRenderContext().getRenderTarget().getHeight()); 6383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 6393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry tcu::Surface vaoResult (m_context.getRenderContext().getRenderTarget().getWidth(), m_context.getRenderContext().getRenderTarget().getHeight()); 6403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry tcu::Surface stateResult (m_context.getRenderContext().getRenderTarget().getWidth(), m_context.getRenderContext().getRenderTarget().getHeight()); 6413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 6423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry bool isOk; 6433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 6443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry logVertexArrayState(m_log, m_spec.vao, "Vertex Array Object State"); 6453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry logVertexArrayState(m_log, m_spec.state, "OpenGL Vertex Array State"); 6463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry genReferences(stateReference, vaoReference); 6473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry render(stateResult, vaoResult); 6483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 6493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry isOk = tcu::pixelThresholdCompare (m_log, "Results", "Comparison result from rendering with Vertex Array State", stateReference, stateResult, tcu::RGBA(0,0,0,0), tcu::COMPARE_LOG_RESULT); 6503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry isOk = isOk && tcu::pixelThresholdCompare (m_log, "Results", "Comparison result from rendering with Vertex Array Object", vaoReference, vaoResult, tcu::RGBA(0,0,0,0), tcu::COMPARE_LOG_RESULT); 6513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 6523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (isOk) 6533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 6543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass"); 6553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry return STOP; 6563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 6573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry else 6583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 6593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Fail"); 6603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry return STOP; 6613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 6623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 6633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 6643c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass MultiVertexArrayObjectTest : public TestCase 6653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 6663c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic: 6673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 6683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry MultiVertexArrayObjectTest (Context& context, const char* name, const char* description); 6693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry ~MultiVertexArrayObjectTest (void); 6703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry virtual void init (void); 6713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry virtual void deinit (void); 6723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry virtual IterateResult iterate (void); 6733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 6743c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate: 6753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry Spec m_spec; 6763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry tcu::TestLog& m_log; 6773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry vector<GLuint> m_buffers; 6783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry glu::ShaderProgram* m_vaoProgram; 6793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry glu::ShaderProgram* m_stateProgram; 6803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry de::Random m_random; 6813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry deUint8* m_indices; 6823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 6833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry void logVertexArrayState (tcu::TestLog& log, const VertexArrayState& state, const std::string& msg); 6843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry deUint8* createRandomBufferData (const BufferSpec& buffer); 6853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry deUint8* generateIndices (void); 6863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry glu::ShaderProgram* createProgram (const VertexArrayState& state); 6873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry void setState (const VertexArrayState& state); 6883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry void render (tcu::Surface& vaoResult, tcu::Surface& defaultResult); 6893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry void makeDrawCall (const VertexArrayState& state); 6903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry void genReferences (tcu::Surface& vaoRef, tcu::Surface& defaultRef); 6913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 6923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry MultiVertexArrayObjectTest (const MultiVertexArrayObjectTest&); 6933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry MultiVertexArrayObjectTest& operator= (const MultiVertexArrayObjectTest&); 6943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}; 6953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 6963c827367444ee418f129b2c238299f49d3264554Jarkko PoyryMultiVertexArrayObjectTest::MultiVertexArrayObjectTest (Context& context, const char* name, const char* description) 6973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry : TestCase (context, name, description) 6983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry , m_log (context.getTestContext().getLog()) 6993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry , m_vaoProgram (NULL) 7003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry , m_stateProgram (NULL) 7013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry , m_random (deStringHash(name)) 7023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry , m_indices (NULL) 7033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 7043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // Makes zero to zero mapping for buffers 7053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_buffers.push_back(0); 7063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 7073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 7083c827367444ee418f129b2c238299f49d3264554Jarkko PoyryMultiVertexArrayObjectTest::~MultiVertexArrayObjectTest (void) 7093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 7103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 7113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 7123c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid MultiVertexArrayObjectTest::logVertexArrayState (tcu::TestLog& log, const VertexArrayState& state, const std::string& msg) 7133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 7143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry std::stringstream message; 7153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 7163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry message << msg << "\n"; 7173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry message << "GL_ELEMENT_ARRAY_BUFFER : " << state.elementArrayBuffer << "\n"; 7183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 7193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry for (int attribNdx = 0; attribNdx < (int)state.attributes.size(); attribNdx++) 7203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 7213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry message 7223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "attribute : " << attribNdx << "\n" 7233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "\tGL_VERTEX_ATTRIB_ARRAY_ENABLED : " << (state.attributes[attribNdx].enabled ? "GL_TRUE" : "GL_FALSE") << "\n" 7243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "\tGL_VERTEX_ATTRIB_ARRAY_SIZE : " << state.attributes[attribNdx].size << "\n" 7253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "\tGL_VERTEX_ATTRIB_ARRAY_STRIDE : " << state.attributes[attribNdx].stride << "\n" 7263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "\tGL_VERTEX_ATTRIB_ARRAY_TYPE : " << state.attributes[attribNdx].type << "\n" 7273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "\tGL_VERTEX_ATTRIB_ARRAY_NORMALIZED : " << (state.attributes[attribNdx].normalized ? "GL_TRUE" : "GL_FALSE") << "\n" 7283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "\tGL_VERTEX_ATTRIB_ARRAY_INTEGER : " << (state.attributes[attribNdx].integer ? "GL_TRUE" : "GL_FALSE") << "\n" 7293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "\tGL_VERTEX_ATTRIB_ARRAY_DIVISOR : " << state.attributes[attribNdx].divisor << "\n" 7303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "\tGL_VERTEX_ATTRIB_ARRAY_POINTER : " << state.attributes[attribNdx].offset << "\n" 7313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "\t GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING : " << m_buffers[state.attributes[attribNdx].bufferNdx] << "\n"; 7323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 7333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry log << tcu::TestLog::Message << message.str() << tcu::TestLog::EndMessage; 7343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 7353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 7363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 7373c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid MultiVertexArrayObjectTest::init (void) 7383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 7393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GLint attribCount; 7403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 7413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GLU_CHECK_CALL(glGetIntegerv(GL_MAX_VERTEX_ATTRIBS, &attribCount)); 7423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 7433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_spec.useDrawElements = false; 7443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_spec.instances = 0; 7453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_spec.count = 24; 7463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_spec.indexOffset = 0; 7473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_spec.indexRangeMin = 0; 7483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_spec.indexRangeMax = 0; 7493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_spec.indexType = GL_NONE; 7503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_spec.indexCount = 0; 7513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_spec.vao.elementArrayBuffer = 0; 7523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_spec.state.elementArrayBuffer = 0; 7533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 7543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry for (int attribNdx = 0; attribNdx < attribCount; attribNdx++) 7553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 7563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry BufferSpec shortCoordBuffer48 = { 48, 2*384, 4, 0, 0, GL_SHORT, -32768, 32768, 0.0f, 0.0f }; 7573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_spec.buffers.push_back(shortCoordBuffer48); 7583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 7593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_spec.state.attributes.push_back(Attribute()); 7603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_spec.state.attributes[attribNdx].enabled = (m_random.getInt(0, 4) == 0) ? GL_FALSE : GL_TRUE; 7613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_spec.state.attributes[attribNdx].size = m_random.getInt(2,4); 7623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_spec.state.attributes[attribNdx].stride = 2*m_random.getInt(1, 3); 7633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_spec.state.attributes[attribNdx].type = GL_SHORT; 7643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_spec.state.attributes[attribNdx].integer = m_random.getBool(); 7653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_spec.state.attributes[attribNdx].divisor = m_random.getInt(0, 1); 7663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_spec.state.attributes[attribNdx].offset = 2*m_random.getInt(0, 2); 7673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_spec.state.attributes[attribNdx].normalized = m_random.getBool(); 7683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_spec.state.attributes[attribNdx].bufferNdx = attribNdx+1; 7693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 7703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (attribNdx == 0) 7713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 7723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_spec.state.attributes[attribNdx].divisor = 0; 7733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_spec.state.attributes[attribNdx].enabled = GL_TRUE; 7743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_spec.state.attributes[attribNdx].size = 2; 7753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 7763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 7773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_spec.vao.attributes.push_back(Attribute()); 7783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_spec.vao.attributes[attribNdx].enabled = (m_random.getInt(0, 4) == 0) ? GL_FALSE : GL_TRUE; 7793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_spec.vao.attributes[attribNdx].size = m_random.getInt(2,4); 7803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_spec.vao.attributes[attribNdx].stride = 2*m_random.getInt(1, 3); 7813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_spec.vao.attributes[attribNdx].type = GL_SHORT; 7823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_spec.vao.attributes[attribNdx].integer = m_random.getBool(); 7833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_spec.vao.attributes[attribNdx].divisor = m_random.getInt(0, 1); 7843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_spec.vao.attributes[attribNdx].offset = 2*m_random.getInt(0, 2); 7853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_spec.vao.attributes[attribNdx].normalized = m_random.getBool(); 7863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_spec.vao.attributes[attribNdx].bufferNdx = attribCount - attribNdx; 7873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 7883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (attribNdx == 0) 7893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 7903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_spec.vao.attributes[attribNdx].divisor = 0; 7913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_spec.vao.attributes[attribNdx].enabled = GL_TRUE; 7923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_spec.vao.attributes[attribNdx].size = 2; 7933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 7943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 7953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 7963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 7973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // \note [mika] Index 0 is reserved for 0 buffer 7983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry for (int bufferNdx = 0; bufferNdx < (int)m_spec.buffers.size(); bufferNdx++) 7993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 8003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry deUint8* data = createRandomBufferData(m_spec.buffers[bufferNdx]); 8013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 8023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry try 8033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 8043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GLuint buffer; 8053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GLU_CHECK_CALL(glGenBuffers(1, &buffer)); 8063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_buffers.push_back(buffer); 8073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 8083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GLU_CHECK_CALL(glBindBuffer(GL_ARRAY_BUFFER, buffer)); 8093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GLU_CHECK_CALL(glBufferData(GL_ARRAY_BUFFER, m_spec.buffers[bufferNdx].size, data, GL_DYNAMIC_DRAW)); 8103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GLU_CHECK_CALL(glBindBuffer(GL_ARRAY_BUFFER, 0)); 8113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 8123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } catch (...) { 8133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry delete[] data; 8143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry throw; 8153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 8163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 8173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry delete[] data; 8183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 8193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 8203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_vaoProgram = createProgram(m_spec.vao); 8213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_log << tcu::TestLog::Message << "Program used with Vertex Array Object" << tcu::TestLog::EndMessage; 8223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_log << *m_vaoProgram; 8233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_stateProgram = createProgram(m_spec.state); 8243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_log << tcu::TestLog::Message << "Program used with Vertex Array State" << tcu::TestLog::EndMessage; 8253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_log << *m_stateProgram; 8263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 8273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (!m_vaoProgram->isOk() || !m_stateProgram->isOk()) 8283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry TCU_FAIL("Failed to compile shaders"); 8293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 8303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (m_spec.useDrawElements && (m_spec.vao.elementArrayBuffer == 0 || m_spec.state.elementArrayBuffer == 0)) 8313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_indices = generateIndices(); 8323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 8333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 8343c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid MultiVertexArrayObjectTest::deinit (void) 8353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 8363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GLU_CHECK_CALL(glDeleteBuffers((GLsizei)m_buffers.size(), &(m_buffers[0]))); 8373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_buffers.clear(); 8383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry delete m_vaoProgram; 8393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry delete m_stateProgram; 8403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry delete[] m_indices; 8413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 8423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 8433c827367444ee418f129b2c238299f49d3264554Jarkko PoyrydeUint8* MultiVertexArrayObjectTest::generateIndices (void) 8443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 8453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry int typeSize = 0; 8463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry switch (m_spec.indexType) 8473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 8483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry case GL_UNSIGNED_INT: typeSize = sizeof(GLuint); break; 8493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry case GL_UNSIGNED_SHORT: typeSize = sizeof(GLushort); break; 8503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry case GL_UNSIGNED_BYTE: typeSize = sizeof(GLubyte); break; 8513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry default: 8523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry DE_ASSERT(false); 8533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 8543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 8553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry deUint8* indices = new deUint8[m_spec.indexCount * typeSize]; 8563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 8573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry for (int i = 0; i < m_spec.indexCount; i++) 8583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 8593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry deUint8* pos = indices + typeSize * i; 8603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 8613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry switch (m_spec.indexType) 8623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 8633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry case GL_UNSIGNED_INT: 8643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 8653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GLuint v = (GLuint)m_random.getInt(m_spec.indexRangeMin, m_spec.indexRangeMax); 8663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry deMemcpy(pos, &v, sizeof(v)); 8673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry break; 8683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 8693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 8703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry case GL_UNSIGNED_SHORT: 8713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 8723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GLushort v = (GLushort)m_random.getInt(m_spec.indexRangeMin, m_spec.indexRangeMax); 8733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry deMemcpy(pos, &v, sizeof(v)); 8743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry break; 8753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 8763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 8773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry case GL_UNSIGNED_BYTE: 8783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 8793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GLubyte v = (GLubyte)m_random.getInt(m_spec.indexRangeMin, m_spec.indexRangeMax); 8803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry deMemcpy(pos, &v, sizeof(v)); 8813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry break; 8823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 8833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 8843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry default: 8853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry DE_ASSERT(false); 8863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 8873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 8883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 8893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry return indices; 8903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 8913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 8923c827367444ee418f129b2c238299f49d3264554Jarkko PoyrydeUint8* MultiVertexArrayObjectTest::createRandomBufferData (const BufferSpec& buffer) 8933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 8943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry deUint8* data = new deUint8[buffer.size]; 8953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 8963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry int stride; 8973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 8983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (buffer.stride != 0) 8993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 9003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry stride = buffer.stride; 9013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 9023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry else 9033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 9043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry switch (buffer.type) 9053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 906b5e3a7c20f061a8b781eaa1f2c856374806ad378Jarkko Pöyry case GL_FLOAT: stride = buffer.componentCount * (int)sizeof(GLfloat); break; 907b5e3a7c20f061a8b781eaa1f2c856374806ad378Jarkko Pöyry case GL_INT: stride = buffer.componentCount * (int)sizeof(GLint); break; 908b5e3a7c20f061a8b781eaa1f2c856374806ad378Jarkko Pöyry case GL_UNSIGNED_INT: stride = buffer.componentCount * (int)sizeof(GLuint); break; 909b5e3a7c20f061a8b781eaa1f2c856374806ad378Jarkko Pöyry case GL_SHORT: stride = buffer.componentCount * (int)sizeof(GLshort); break; 910b5e3a7c20f061a8b781eaa1f2c856374806ad378Jarkko Pöyry case GL_UNSIGNED_SHORT: stride = buffer.componentCount * (int)sizeof(GLushort); break; 911b5e3a7c20f061a8b781eaa1f2c856374806ad378Jarkko Pöyry case GL_BYTE: stride = buffer.componentCount * (int)sizeof(GLbyte); break; 912b5e3a7c20f061a8b781eaa1f2c856374806ad378Jarkko Pöyry case GL_UNSIGNED_BYTE: stride = buffer.componentCount * (int)sizeof(GLubyte); break; 9133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 9143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry default: 9153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry stride = 0; 9163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry DE_ASSERT(DE_FALSE); 9173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 9183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 9193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 9203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry deUint8* itr = data; 9213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 9223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry for (int pos = 0; pos < buffer.count; pos++) 9233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 9243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry deUint8* componentItr = itr; 9253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry for (int componentNdx = 0; componentNdx < buffer.componentCount; componentNdx++) 9263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 9273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry switch (buffer.type) 9283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 9293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry case GL_FLOAT: 9303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 9313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry float v = buffer.floatRangeMin + (buffer.floatRangeMax - buffer.floatRangeMin) * m_random.getFloat(); 9323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry deMemcpy(componentItr, &v, sizeof(v)); 9333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry componentItr += sizeof(v); 9343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry break; 9353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 9363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 9373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry case GL_INT: 9383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 9393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GLint v = m_random.getInt(buffer.intRangeMin, buffer.intRangeMax); 9403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry deMemcpy(componentItr, &v, sizeof(v)); 9413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry componentItr += sizeof(v); 9423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry break; 9433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 9443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 9453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry case GL_UNSIGNED_INT: 9463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 947b5e3a7c20f061a8b781eaa1f2c856374806ad378Jarkko Pöyry GLuint v = (GLuint)m_random.getInt(buffer.intRangeMin, buffer.intRangeMax); 9483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry deMemcpy(componentItr, &v, sizeof(v)); 9493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry componentItr += sizeof(v); 9503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry break; 9513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 9523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 9533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry case GL_SHORT: 9543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 955b5e3a7c20f061a8b781eaa1f2c856374806ad378Jarkko Pöyry GLshort v = (GLshort)m_random.getInt(buffer.intRangeMin, buffer.intRangeMax); 9563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry deMemcpy(componentItr, &v, sizeof(v)); 9573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry componentItr += sizeof(v); 9583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry break; 9593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 9603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 9613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry case GL_UNSIGNED_SHORT: 9623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 963b5e3a7c20f061a8b781eaa1f2c856374806ad378Jarkko Pöyry GLushort v = (GLushort)m_random.getInt(buffer.intRangeMin, buffer.intRangeMax); 9643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry deMemcpy(componentItr, &v, sizeof(v)); 9653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry componentItr += sizeof(v); 9663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry break; 9673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 9683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 9693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry case GL_BYTE: 9703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 971b5e3a7c20f061a8b781eaa1f2c856374806ad378Jarkko Pöyry GLbyte v = (GLbyte)m_random.getInt(buffer.intRangeMin, buffer.intRangeMax); 9723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry deMemcpy(componentItr, &v, sizeof(v)); 9733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry componentItr += sizeof(v); 9743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry break; 9753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 9763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 9773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry case GL_UNSIGNED_BYTE: 9783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 979b5e3a7c20f061a8b781eaa1f2c856374806ad378Jarkko Pöyry GLubyte v = (GLubyte)m_random.getInt(buffer.intRangeMin, buffer.intRangeMax); 9803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry deMemcpy(componentItr, &v, sizeof(v)); 9813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry componentItr += sizeof(v); 9823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry break; 9833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 9843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 9853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry default: 9863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry DE_ASSERT(false); 9873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry }; 9883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 9893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 9903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry itr += stride; 9913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 9923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 9933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry return data; 9943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 9953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 9963c827367444ee418f129b2c238299f49d3264554Jarkko Poyryglu::ShaderProgram* MultiVertexArrayObjectTest::createProgram (const VertexArrayState& state) 9973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 9983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry std::stringstream vertexShaderStream; 9993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry std::stringstream value; 10003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 10013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry vertexShaderStream << "#version 300 es\n"; 10023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 10033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry for (int attribNdx = 0; attribNdx < (int)state.attributes.size(); attribNdx++) 10043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 10053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (state.attributes[attribNdx].integer) 10063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry vertexShaderStream << "layout(location = " << attribNdx << ") in mediump ivec4 a_attrib" << attribNdx << ";\n"; 10073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry else 10083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry vertexShaderStream << "layout(location = " << attribNdx << ") in mediump vec4 a_attrib" << attribNdx << ";\n"; 10093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 10103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (state.attributes[attribNdx].integer) 10113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 10123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry float scale = 0.0f; 10133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 10143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry switch (state.attributes[0].type) 10153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 1016b5e3a7c20f061a8b781eaa1f2c856374806ad378Jarkko Pöyry case GL_SHORT: scale = (1.0f/float((1u<<14)-1u)); break; 1017b5e3a7c20f061a8b781eaa1f2c856374806ad378Jarkko Pöyry case GL_UNSIGNED_SHORT: scale = (1.0f/float((1u<<15)-1u)); break; 1018b5e3a7c20f061a8b781eaa1f2c856374806ad378Jarkko Pöyry case GL_INT: scale = (1.0f/float((1u<<30)-1u)); break; 1019b5e3a7c20f061a8b781eaa1f2c856374806ad378Jarkko Pöyry case GL_UNSIGNED_INT: scale = (1.0f/float((1u<<31)-1u)); break; 1020b5e3a7c20f061a8b781eaa1f2c856374806ad378Jarkko Pöyry case GL_BYTE: scale = (1.0f/float((1u<<6)-1u)); break; 1021b5e3a7c20f061a8b781eaa1f2c856374806ad378Jarkko Pöyry case GL_UNSIGNED_BYTE: scale = (1.0f/float((1u<<7)-1u)); break; 10223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 10233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry default: 10243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry DE_ASSERT(DE_FALSE); 10253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 10263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry value << (attribNdx != 0 ? " + " : "" ) << scale << " * vec4(a_attrib" << attribNdx << ")"; 10273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 10283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry else if (state.attributes[attribNdx].type != GL_FLOAT && !state.attributes[attribNdx].normalized) 10293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 10303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry float scale = 0.0f; 10313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 10323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry switch (state.attributes[0].type) 10333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 1034b5e3a7c20f061a8b781eaa1f2c856374806ad378Jarkko Pöyry case GL_SHORT: scale = (0.5f/float((1u<<14)-1u)); break; 1035b5e3a7c20f061a8b781eaa1f2c856374806ad378Jarkko Pöyry case GL_UNSIGNED_SHORT: scale = (0.5f/float((1u<<15)-1u)); break; 1036b5e3a7c20f061a8b781eaa1f2c856374806ad378Jarkko Pöyry case GL_INT: scale = (0.5f/float((1u<<30)-1u)); break; 1037b5e3a7c20f061a8b781eaa1f2c856374806ad378Jarkko Pöyry case GL_UNSIGNED_INT: scale = (0.5f/float((1u<<31)-1u)); break; 1038b5e3a7c20f061a8b781eaa1f2c856374806ad378Jarkko Pöyry case GL_BYTE: scale = (0.5f/float((1u<<6)-1u)); break; 1039b5e3a7c20f061a8b781eaa1f2c856374806ad378Jarkko Pöyry case GL_UNSIGNED_BYTE: scale = (0.5f/float((1u<<7)-1u)); break; 10403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 10413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry default: 10423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry DE_ASSERT(DE_FALSE); 10433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 10443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry value << (attribNdx != 0 ? " + " : "" ) << scale << " * a_attrib" << attribNdx; 10453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 10463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry else 10473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry value << (attribNdx != 0 ? " + " : "" ) << "a_attrib" << attribNdx; 10483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 10493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 10503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry vertexShaderStream 10513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "out mediump vec4 v_value;\n" 10523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "void main (void)\n" 10533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "{\n" 10543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "\tv_value = " << value.str() << ";\n"; 10553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 10563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (state.attributes[0].integer) 10573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 10583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry float scale = 0.0f; 10593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 10603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry switch (state.attributes[0].type) 10613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 1062b5e3a7c20f061a8b781eaa1f2c856374806ad378Jarkko Pöyry case GL_SHORT: scale = (1.0f/float((1u<<14)-1u)); break; 1063b5e3a7c20f061a8b781eaa1f2c856374806ad378Jarkko Pöyry case GL_UNSIGNED_SHORT: scale = (1.0f/float((1u<<15)-1u)); break; 1064b5e3a7c20f061a8b781eaa1f2c856374806ad378Jarkko Pöyry case GL_INT: scale = (1.0f/float((1u<<30)-1u)); break; 1065b5e3a7c20f061a8b781eaa1f2c856374806ad378Jarkko Pöyry case GL_UNSIGNED_INT: scale = (1.0f/float((1u<<31)-1u)); break; 1066b5e3a7c20f061a8b781eaa1f2c856374806ad378Jarkko Pöyry case GL_BYTE: scale = (1.0f/float((1u<<6)-1u)); break; 1067b5e3a7c20f061a8b781eaa1f2c856374806ad378Jarkko Pöyry case GL_UNSIGNED_BYTE: scale = (1.0f/float((1u<<7)-1u)); break; 10683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 10693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 10703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry default: 10713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry DE_ASSERT(DE_FALSE); 10723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 10733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 10743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry vertexShaderStream 10753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "\tgl_Position = vec4(" << scale << " * " << "a_attrib0.xyz, 1.0);\n" 10763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "}"; 10773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 10783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry else 10793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 10803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (state.attributes[0].normalized || state.attributes[0].type == GL_FLOAT) 10813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 10823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry vertexShaderStream 10833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "\tgl_Position = vec4(a_attrib0.xyz, 1.0);\n" 10843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "}"; 10853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 10863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry else 10873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 10883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry float scale = 0.0f; 10893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 10903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry switch (state.attributes[0].type) 10913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 1092b5e3a7c20f061a8b781eaa1f2c856374806ad378Jarkko Pöyry case GL_SHORT: scale = (1.0f/float((1u<<14)-1u)); break; 1093b5e3a7c20f061a8b781eaa1f2c856374806ad378Jarkko Pöyry case GL_UNSIGNED_SHORT: scale = (1.0f/float((1u<<15)-1u)); break; 1094b5e3a7c20f061a8b781eaa1f2c856374806ad378Jarkko Pöyry case GL_INT: scale = (1.0f/float((1u<<30)-1u)); break; 1095b5e3a7c20f061a8b781eaa1f2c856374806ad378Jarkko Pöyry case GL_UNSIGNED_INT: scale = (1.0f/float((1u<<31)-1u)); break; 1096b5e3a7c20f061a8b781eaa1f2c856374806ad378Jarkko Pöyry case GL_BYTE: scale = (1.0f/float((1u<<6)-1u)); break; 1097b5e3a7c20f061a8b781eaa1f2c856374806ad378Jarkko Pöyry case GL_UNSIGNED_BYTE: scale = (1.0f/float((1u<<7)-1u)); break; 10983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 10993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry default: 11003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry DE_ASSERT(DE_FALSE); 11013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 11023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1103b5e3a7c20f061a8b781eaa1f2c856374806ad378Jarkko Pöyry scale *= 0.5f; 11043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 11053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry vertexShaderStream 11063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "\tgl_Position = vec4(" << scale << " * " << "vec3(a_attrib0.xyz), 1.0);\n" 11073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry << "}"; 11083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 11093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 11103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 11113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const char* fragmentShader = 11123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "#version 300 es\n" 11133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "in mediump vec4 v_value;\n" 11143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "layout(location = 0) out mediump vec4 fragColor;\n" 11153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "void main (void)\n" 11163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "{\n" 11173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "\tfragColor = vec4(v_value.xyz, 1.0);\n" 11183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry "}"; 11193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 11203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry return new glu::ShaderProgram(m_context.getRenderContext(), glu::makeVtxFragSources(vertexShaderStream.str(), fragmentShader)); 11213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 11223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 11233c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid MultiVertexArrayObjectTest::setState (const VertexArrayState& state) 11243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 11253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GLU_CHECK_CALL(glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_buffers[state.elementArrayBuffer])); 11263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 11273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry for (int attribNdx = 0; attribNdx < (int)state.attributes.size(); attribNdx++) 11283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 11293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GLU_CHECK_CALL(glBindBuffer(GL_ARRAY_BUFFER, m_buffers[state.attributes[attribNdx].bufferNdx])); 11303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (state.attributes[attribNdx].enabled) 11313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GLU_CHECK_CALL(glEnableVertexAttribArray(attribNdx)); 11323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry else 11333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GLU_CHECK_CALL(glDisableVertexAttribArray(attribNdx)); 11343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 11353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (state.attributes[attribNdx].integer) 11363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GLU_CHECK_CALL(glVertexAttribIPointer(attribNdx, state.attributes[attribNdx].size, state.attributes[attribNdx].type, state.attributes[attribNdx].stride, (const GLvoid*)((GLintptr)state.attributes[attribNdx].offset))); 11373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry else 11383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GLU_CHECK_CALL(glVertexAttribPointer(attribNdx, state.attributes[attribNdx].size, state.attributes[attribNdx].type, state.attributes[attribNdx].normalized, state.attributes[attribNdx].stride, (const GLvoid*)((GLintptr)state.attributes[attribNdx].offset))); 11393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 11403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GLU_CHECK_CALL(glVertexAttribDivisor(attribNdx, state.attributes[attribNdx].divisor)); 11413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 11423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 11433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 11443c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid MultiVertexArrayObjectTest::makeDrawCall (const VertexArrayState& state) 11453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 11463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GLU_CHECK_CALL(glClearColor(0.7f, 0.7f, 0.7f, 1.0f)); 11473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GLU_CHECK_CALL(glClear(GL_COLOR_BUFFER_BIT)); 11483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 11493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (m_spec.useDrawElements) 11503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 11513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (state.elementArrayBuffer == 0) 11523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 11533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (m_spec.instances == 0) 11543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GLU_CHECK_CALL(glDrawElements(GL_TRIANGLES, m_spec.count, m_spec.indexType, m_indices)); 11553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry else 11563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GLU_CHECK_CALL(glDrawElementsInstanced(GL_TRIANGLES, m_spec.count, m_spec.indexType, m_indices, m_spec.instances)); 11573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 11583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry else 11593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 11603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (m_spec.instances == 0) 11613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GLU_CHECK_CALL(glDrawElements(GL_TRIANGLES, m_spec.count, m_spec.indexType, (GLvoid*)((GLintptr)m_spec.indexOffset))); 11623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry else 11633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GLU_CHECK_CALL(glDrawElementsInstanced(GL_TRIANGLES, m_spec.count, m_spec.indexType, (GLvoid*)((GLintptr)m_spec.indexOffset), m_spec.instances)); 11643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 11653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 11663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry else 11673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 11683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (m_spec.instances == 0) 11693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GLU_CHECK_CALL(glDrawArrays(GL_TRIANGLES, 0, m_spec.count)); 11703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry else 11713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GLU_CHECK_CALL(glDrawArraysInstanced(GL_TRIANGLES, 0, m_spec.count, m_spec.instances)); 11723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 11733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 11743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 11753c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid MultiVertexArrayObjectTest::render (tcu::Surface& vaoResult, tcu::Surface& defaultResult) 11763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 11773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GLuint vao = 0; 11783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 11793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GLU_CHECK_CALL(glGenVertexArrays(1, &vao)); 11803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GLU_CHECK_CALL(glBindVertexArray(vao)); 11813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry setState(m_spec.vao); 11823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GLU_CHECK_CALL(glBindVertexArray(0)); 11833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 11843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry setState(m_spec.state); 11853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 11863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GLU_CHECK_CALL(glBindVertexArray(vao)); 11873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GLU_CHECK_CALL(glUseProgram(m_vaoProgram->getProgram())); 11883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry makeDrawCall(m_spec.vao); 11893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry glu::readPixels(m_context.getRenderContext(), 0, 0, vaoResult.getAccess()); 11903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry setState(m_spec.vao); 11913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GLU_CHECK_CALL(glBindVertexArray(0)); 11923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 11933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GLU_CHECK_CALL(glUseProgram(m_stateProgram->getProgram())); 11943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry makeDrawCall(m_spec.state); 11953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry glu::readPixels(m_context.getRenderContext(), 0, 0, defaultResult.getAccess()); 11963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 11973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 11983c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid MultiVertexArrayObjectTest::genReferences (tcu::Surface& vaoRef, tcu::Surface& defaultRef) 11993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 12003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry setState(m_spec.vao); 12013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GLU_CHECK_CALL(glUseProgram(m_vaoProgram->getProgram())); 12023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry makeDrawCall(m_spec.vao); 12033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry glu::readPixels(m_context.getRenderContext(), 0, 0, vaoRef.getAccess()); 12043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 12053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry setState(m_spec.state); 12063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry GLU_CHECK_CALL(glUseProgram(m_stateProgram->getProgram())); 12073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry makeDrawCall(m_spec.state); 12083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry glu::readPixels(m_context.getRenderContext(), 0, 0, defaultRef.getAccess()); 12093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 12103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 12113c827367444ee418f129b2c238299f49d3264554Jarkko PoyryTestCase::IterateResult MultiVertexArrayObjectTest::iterate (void) 12123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 12133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry tcu::Surface vaoReference (m_context.getRenderContext().getRenderTarget().getWidth(), m_context.getRenderContext().getRenderTarget().getHeight()); 12143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry tcu::Surface stateReference (m_context.getRenderContext().getRenderTarget().getWidth(), m_context.getRenderContext().getRenderTarget().getHeight()); 12153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 12163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry tcu::Surface vaoResult (m_context.getRenderContext().getRenderTarget().getWidth(), m_context.getRenderContext().getRenderTarget().getHeight()); 12173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry tcu::Surface stateResult (m_context.getRenderContext().getRenderTarget().getWidth(), m_context.getRenderContext().getRenderTarget().getHeight()); 12183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 12193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry bool isOk; 12203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 12213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry logVertexArrayState(m_log, m_spec.vao, "Vertex Array Object State"); 12223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry logVertexArrayState(m_log, m_spec.state, "OpenGL Vertex Array State"); 12233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry genReferences(stateReference, vaoReference); 12243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry render(stateResult, vaoResult); 12253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 12263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry isOk = tcu::pixelThresholdCompare (m_log, "Results", "Comparison result from rendering with Vertex Array State", stateReference, stateResult, tcu::RGBA(0,0,0,0), tcu::COMPARE_LOG_RESULT); 12273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry isOk = isOk && tcu::pixelThresholdCompare (m_log, "Results", "Comparison result from rendering with Vertex Array Object", vaoReference, vaoResult, tcu::RGBA(0,0,0,0), tcu::COMPARE_LOG_RESULT); 12283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 12293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (isOk) 12303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 12313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass"); 12323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry return STOP; 12333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 12343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry else 12353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 12363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Fail"); 12373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry return STOP; 12383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 12393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 12403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 12413c827367444ee418f129b2c238299f49d3264554Jarkko PoyryVertexArrayObjectTestGroup::VertexArrayObjectTestGroup (Context& context) 12423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry : TestCaseGroup(context, "vertex_array_objects", "Vertex array object test cases") 12433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 12443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 12453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 12463c827367444ee418f129b2c238299f49d3264554Jarkko PoyryVertexArrayObjectTestGroup::~VertexArrayObjectTestGroup (void) 12473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 12483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 12493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 12503c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid VertexArrayObjectTestGroup::init (void) 12513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 12523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry BufferSpec floatCoordBuffer48_1 = { 48, 384, 2, 0, 0, GL_FLOAT, 0, 0, -1.0f, 1.0f }; 12533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry BufferSpec floatCoordBuffer48_2 = { 48, 384, 2, 0, 0, GL_FLOAT, 0, 0, -1.0f, 1.0f }; 12543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 12553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry BufferSpec shortCoordBuffer48 = { 48, 192, 2, 0, 0, GL_SHORT, -32768, 32768, 0.0f, 0.0f }; 12563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 12573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // Different buffer 12583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 12593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry Spec spec; 12603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 12613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry VertexArrayState state; 12623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 12633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry state.attributes.push_back(Attribute()); 12643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 12653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry state.attributes[0].enabled = true; 12663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry state.attributes[0].size = 2; 12673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry state.attributes[0].stride = 0; 12683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry state.attributes[0].type = GL_FLOAT; 12693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry state.attributes[0].integer = GL_FALSE; 12703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry state.attributes[0].divisor = 0; 12713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry state.attributes[0].offset = 0; 12723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry state.attributes[0].normalized = GL_FALSE; 12733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 12743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry state.elementArrayBuffer = 0; 12753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 12763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry spec.buffers.push_back(floatCoordBuffer48_1); 12773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry spec.buffers.push_back(floatCoordBuffer48_2); 12783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 12793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry spec.useDrawElements = false; 12803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry spec.instances = 0; 12813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry spec.count = 48; 12823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry spec.vao = state; 12833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry spec.state = state; 12843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry spec.indexOffset = 0; 12853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry spec.indexRangeMin = 0; 12863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry spec.indexRangeMax = 0; 12873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry spec.indexType = GL_NONE; 12883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry spec.indexCount = 0; 12893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 12903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry spec.state.attributes[0].bufferNdx = 1; 12913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry spec.vao.attributes[0].bufferNdx = 2; 12923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry addChild(new VertexArrayObjectTest(m_context, spec, "diff_buffer", "diff_buffer")); 12933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 12943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // Different size 12953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 12963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry Spec spec; 12973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 12983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry VertexArrayState state; 12993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 13003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry state.attributes.push_back(Attribute()); 13013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 13023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry state.attributes[0].enabled = true; 13033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry state.attributes[0].size = 2; 13043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry state.attributes[0].stride = 0; 13053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry state.attributes[0].type = GL_FLOAT; 13063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry state.attributes[0].integer = GL_FALSE; 13073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry state.attributes[0].divisor = 0; 13083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry state.attributes[0].offset = 0; 13093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry state.attributes[0].normalized = GL_FALSE; 13103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry state.attributes[0].bufferNdx = 1; 13113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 13123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry state.elementArrayBuffer = 0; 13133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 13143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry spec.buffers.push_back(floatCoordBuffer48_1); 13153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 13163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry spec.useDrawElements = false; 13173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry spec.instances = 0; 13183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry spec.count = 24; 13193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry spec.vao = state; 13203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry spec.state = state; 13213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry spec.indexOffset = 0; 13223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry spec.indexRangeMin = 0; 13233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry spec.indexRangeMax = 0; 13243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry spec.indexType = GL_NONE; 13253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry spec.indexCount = 0; 13263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 13273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry spec.state.attributes[0].size = 2; 13283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry spec.vao.attributes[0].size = 3; 13293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry addChild(new VertexArrayObjectTest(m_context, spec, "diff_size", "diff_size")); 13303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 13313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 13323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // Different stride 13333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 13343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry Spec spec; 13353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 13363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry VertexArrayState state; 13373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 13383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry state.attributes.push_back(Attribute()); 13393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 13403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry state.attributes[0].enabled = true; 13413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry state.attributes[0].size = 2; 13423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry state.attributes[0].stride = 0; 13433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry state.attributes[0].type = GL_SHORT; 13443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry state.attributes[0].integer = GL_FALSE; 13453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry state.attributes[0].divisor = 0; 13463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry state.attributes[0].offset = 0; 13473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry state.attributes[0].normalized = GL_TRUE; 13483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry state.attributes[0].bufferNdx = 1; 13493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 13503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry state.elementArrayBuffer = 0; 13513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 13523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry spec.buffers.push_back(shortCoordBuffer48); 13533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 13543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry spec.useDrawElements = false; 13553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry spec.instances = 0; 13563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry spec.count = 24; 13573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry spec.vao = state; 13583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry spec.state = state; 13593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry spec.indexOffset = 0; 13603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry spec.indexRangeMin = 0; 13613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry spec.indexRangeMax = 0; 13623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry spec.indexType = GL_NONE; 13633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry spec.indexCount = 0; 13643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 13653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry spec.vao.attributes[0].stride = 2; 13663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry spec.state.attributes[0].stride = 4; 13673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry addChild(new VertexArrayObjectTest(m_context, spec, "diff_stride", "diff_stride")); 13683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 13693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 13703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // Different types 13713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 13723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry Spec spec; 13733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 13743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry VertexArrayState state; 13753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 13763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry state.attributes.push_back(Attribute()); 13773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 13783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry state.attributes[0].enabled = true; 13793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry state.attributes[0].size = 2; 13803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry state.attributes[0].stride = 0; 13813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry state.attributes[0].type = GL_SHORT; 13823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry state.attributes[0].integer = GL_FALSE; 13833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry state.attributes[0].divisor = 0; 13843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry state.attributes[0].offset = 0; 13853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry state.attributes[0].normalized = GL_TRUE; 13863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry state.attributes[0].bufferNdx = 1; 13873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 13883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry state.elementArrayBuffer = 0; 13893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 13903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry spec.buffers.push_back(shortCoordBuffer48); 13913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 13923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry spec.useDrawElements = false; 13933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry spec.instances = 0; 13943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry spec.count = 24; 13953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry spec.vao = state; 13963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry spec.state = state; 13973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry spec.indexOffset = 0; 13983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry spec.indexRangeMin = 0; 13993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry spec.indexRangeMax = 0; 14003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry spec.indexType = GL_NONE; 14013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry spec.indexCount = 0; 14023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 14033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry spec.vao.attributes[0].type = GL_SHORT; 14043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry spec.state.attributes[0].type = GL_BYTE; 14053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry addChild(new VertexArrayObjectTest(m_context, spec, "diff_type", "diff_type")); 14063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 14073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // Different "integer" 14083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 14093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry Spec spec; 14103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 14113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry VertexArrayState state; 14123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 14133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry state.attributes.push_back(Attribute()); 14143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 14153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry state.attributes[0].enabled = true; 14163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry state.attributes[0].size = 2; 14173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry state.attributes[0].stride = 0; 14183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry state.attributes[0].type = GL_BYTE; 14193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry state.attributes[0].integer = GL_TRUE; 14203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry state.attributes[0].divisor = 0; 14213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry state.attributes[0].offset = 0; 14223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry state.attributes[0].normalized = GL_FALSE; 14233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry state.attributes[0].bufferNdx = 1; 14243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 14253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry state.elementArrayBuffer = 0; 14263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 14273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry spec.buffers.push_back(shortCoordBuffer48); 14283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 14293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry spec.useDrawElements = false; 14303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry spec.count = 24; 14313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry spec.vao = state; 14323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry spec.state = state; 14333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry spec.instances = 0; 14343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry spec.indexOffset = 0; 14353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry spec.indexRangeMin = 0; 14363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry spec.indexRangeMax = 0; 14373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry spec.indexType = GL_NONE; 14383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry spec.indexCount = 0; 14393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 14403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry spec.state.attributes[0].integer = GL_FALSE; 14413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry spec.vao.attributes[0].integer = GL_TRUE; 14423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry addChild(new VertexArrayObjectTest(m_context, spec, "diff_integer", "diff_integer")); 14433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 14443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // Different divisor 14453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 14463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry Spec spec; 14473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 14483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry VertexArrayState state; 14493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 14503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry state.attributes.push_back(Attribute()); 14513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry state.attributes.push_back(Attribute()); 14523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 14533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry state.attributes[0].enabled = true; 14543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry state.attributes[0].size = 2; 14553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry state.attributes[0].stride = 0; 14563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry state.attributes[0].type = GL_SHORT; 14573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry state.attributes[0].integer = GL_FALSE; 14583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry state.attributes[0].divisor = 0; 14593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry state.attributes[0].offset = 0; 14603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry state.attributes[0].normalized = GL_TRUE; 14613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry state.attributes[0].bufferNdx = 1; 14623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 14633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry state.attributes[1].enabled = true; 14643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry state.attributes[1].size = 4; 14653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry state.attributes[1].stride = 0; 14663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry state.attributes[1].type = GL_FLOAT; 14673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry state.attributes[1].integer = GL_FALSE; 14683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry state.attributes[1].divisor = 0; 14693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry state.attributes[1].offset = 0; 14703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry state.attributes[1].normalized = GL_FALSE; 14713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry state.attributes[1].bufferNdx = 2; 14723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 14733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry state.elementArrayBuffer = 0; 14743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 14753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry spec.buffers.push_back(shortCoordBuffer48); 14763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry spec.buffers.push_back(floatCoordBuffer48_1); 14773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 14783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry spec.useDrawElements = false; 14793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry spec.instances = 10; 14803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry spec.count = 12; 14813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry spec.vao = state; 14823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry spec.state = state; 14833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry spec.indexOffset = 0; 14843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry spec.indexRangeMin = 0; 14853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry spec.indexRangeMax = 0; 14863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry spec.indexType = GL_NONE; 14873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry spec.indexCount = 0; 14883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 14893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry spec.vao.attributes[1].divisor = 3; 14903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry spec.state.attributes[1].divisor = 2; 14913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 14923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry addChild(new VertexArrayObjectTest(m_context, spec, "diff_divisor", "diff_divisor")); 14933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 14943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // Different offset 14953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 14963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry Spec spec; 14973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 14983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry VertexArrayState state; 14993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 15003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry state.attributes.push_back(Attribute()); 15013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 15023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry state.attributes[0].enabled = true; 15033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry state.attributes[0].size = 2; 15043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry state.attributes[0].stride = 0; 15053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry state.attributes[0].type = GL_SHORT; 15063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry state.attributes[0].integer = GL_FALSE; 15073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry state.attributes[0].divisor = 0; 15083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry state.attributes[0].offset = 0; 15093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry state.attributes[0].normalized = GL_TRUE; 15103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry state.attributes[0].bufferNdx = 1; 15113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 15123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry state.elementArrayBuffer = 0; 15133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 15143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry spec.buffers.push_back(shortCoordBuffer48); 15153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 15163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry spec.useDrawElements = false; 15173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry spec.instances = 0; 15183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry spec.count = 24; 15193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry spec.vao = state; 15203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry spec.state = state; 15213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry spec.indexOffset = 0; 15223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry spec.indexRangeMin = 0; 15233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry spec.indexRangeMax = 0; 15243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry spec.indexType = GL_NONE; 15253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry spec.indexCount = 0; 15263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 15273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry spec.vao.attributes[0].offset = 2; 15283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry spec.state.attributes[0].offset = 4; 15293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry addChild(new VertexArrayObjectTest(m_context, spec, "diff_offset", "diff_offset")); 15303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 15313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // Different normalize 15323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 15333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry Spec spec; 15343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 15353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry VertexArrayState state; 15363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 15373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry state.attributes.push_back(Attribute()); 15383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 15393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry state.attributes[0].enabled = true; 15403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry state.attributes[0].size = 2; 15413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry state.attributes[0].stride = 0; 15423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry state.attributes[0].type = GL_SHORT; 15433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry state.attributes[0].integer = GL_FALSE; 15443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry state.attributes[0].divisor = 0; 15453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry state.attributes[0].offset = 0; 15463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry state.attributes[0].normalized = GL_TRUE; 15473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry state.attributes[0].bufferNdx = 1; 15483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 15493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry state.elementArrayBuffer = 0; 15503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 15513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry spec.buffers.push_back(shortCoordBuffer48); 15523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 15533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry spec.useDrawElements = false; 15543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry spec.instances = 0; 15553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry spec.count = 48; 15563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry spec.vao = state; 15573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry spec.state = state; 15583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry spec.indexOffset = 0; 15593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry spec.indexRangeMin = 0; 15603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry spec.indexRangeMax = 0; 15613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry spec.indexType = GL_NONE; 15623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry spec.indexCount = 0; 15633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 15643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry spec.vao.attributes[0].normalized = GL_TRUE; 15653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry spec.state.attributes[0].normalized = GL_FALSE;; 15663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry addChild(new VertexArrayObjectTest(m_context, spec, "diff_normalize", "diff_normalize")); 15673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 15683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // DrawElements with buffer / Pointer 15693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 15703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry Spec spec; 15713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 15723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry VertexArrayState state; 15733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 15743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry state.attributes.push_back(Attribute()); 15753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 15763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry state.attributes[0].enabled = true; 15773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry state.attributes[0].size = 2; 15783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry state.attributes[0].stride = 0; 15793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry state.attributes[0].type = GL_FLOAT; 15803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry state.attributes[0].integer = GL_FALSE; 15813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry state.attributes[0].divisor = 0; 15823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry state.attributes[0].offset = 0; 15833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry state.attributes[0].normalized = GL_TRUE; 15843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry state.attributes[0].bufferNdx = 1; 15853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 15863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry state.elementArrayBuffer = 0; 15873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 15883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry spec.buffers.push_back(floatCoordBuffer48_1); 15893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 15903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry BufferSpec indexBuffer = { 24, 192, 1, 0, 0, GL_UNSIGNED_SHORT, 0, 48, 0.0f, 0.0f }; 15913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry spec.buffers.push_back(indexBuffer); 15923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 15933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry spec.useDrawElements = true; 15943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry spec.count = 24; 15953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry spec.vao = state; 15963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry spec.state = state; 15973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry spec.instances = 0; 15983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry spec.indexOffset = 0; 15993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry spec.indexRangeMin = 0; 16003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry spec.indexRangeMax = 48; 16013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry spec.indexType = GL_UNSIGNED_SHORT; 16023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry spec.indexCount = 24; 16033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 16043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry spec.state.elementArrayBuffer = 0; 16053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry spec.vao.elementArrayBuffer = 2; 16063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry addChild(new VertexArrayObjectTest(m_context, spec, "diff_indices", "diff_indices")); 16073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 16083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // Use all attributes 16093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 16103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry addChild(new MultiVertexArrayObjectTest(m_context, "all_attributes", "all_attributes")); 16113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 16123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 16133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // Functional 16143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // gles3 16153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // deqp 1616