148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/*------------------------------------------------------------------------- 248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * OpenGL Conformance Test Suite 348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * ----------------------------- 448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * Copyright (c) 2014-2016 The Khronos Group Inc. 648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * Licensed under the Apache License, Version 2.0 (the "License"); 848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * you may not use this file except in compliance with the License. 948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * You may obtain a copy of the License at 1048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 1148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * http://www.apache.org/licenses/LICENSE-2.0 1248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 1348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * Unless required by applicable law or agreed to in writing, software 1448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * distributed under the License is distributed on an "AS IS" BASIS, 1548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * See the License for the specific language governing permissions and 1748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * limitations under the License. 1848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * 1984322c9402f810da3cd80b52e9f9ef72150a9004Alexander Galazin */ /*! 2048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * \file 2148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * \brief 2284322c9402f810da3cd80b52e9f9ef72150a9004Alexander Galazin */ /*-------------------------------------------------------------------*/ 2348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 2448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#include "es31cVertexAttribBindingTests.hpp" 2548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#include "glwEnums.hpp" 2648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#include "tcuMatrix.hpp" 2748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#include "tcuRenderTarget.hpp" 2848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#include <cstdarg> 2948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 3048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#include <cmath> 3148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 3248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosnamespace glcts 3348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 3448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosusing namespace glw; 3548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosusing tcu::Vec4; 3648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosusing tcu::IVec4; 3748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosusing tcu::UVec4; 3848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosusing tcu::Vec3; 3948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosusing tcu::IVec3; 4048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosusing tcu::UVec3; 4148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosusing tcu::Vec2; 4248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosusing tcu::IVec2; 4348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosusing tcu::UVec2; 4448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosusing tcu::Mat4; 4548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 4648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosnamespace 4748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 4848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 4948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosclass VertexAttribBindingBase : public glcts::SubcaseBase 5048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 5148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos virtual std::string Title() 5248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 5348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return NL ""; 5448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 5548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 5648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos virtual std::string Purpose() 5748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 5848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return NL ""; 5948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 6048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 6148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos virtual std::string Method() 6248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 6348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return NL ""; 6448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 6548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 6648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos virtual std::string PassCriteria() 6748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 6848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return NL ""; 6948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 7048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 7148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulospublic: 7248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos bool IsSSBOInVSFSAvailable(int required) 7348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 7448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLint blocksVS, blocksFS; 7548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glGetIntegerv(GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS, &blocksVS); 7648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glGetIntegerv(GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS, &blocksFS); 7748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (blocksVS >= required && blocksFS >= required) 7848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return true; 7948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos else 8048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 8148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos std::ostringstream reason; 8248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos reason << "Required " << required << " VS storage blocks but only " << blocksVS << " available." 8348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos << std::endl 8448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos << "Required " << required << " FS storage blocks but only " << blocksFS << " available." 8548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos << std::endl; 8648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos OutputNotSupported(reason.str()); 8748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return false; 8848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 8948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 9048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 9148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos int getWindowWidth() 9248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 9348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const tcu::RenderTarget& renderTarget = m_context.getRenderTarget(); 9448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return renderTarget.getWidth(); 9548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 9648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 9748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos int getWindowHeight() 9848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 9948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const tcu::RenderTarget& renderTarget = m_context.getRenderTarget(); 10048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return renderTarget.getHeight(); 10148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 10248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 10348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos inline bool ColorEqual(const Vec4& c0, const Vec4& c1, const Vec4& epsilon) 10448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 10548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (fabs(c0[0] - c1[0]) > epsilon[0]) 10648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return false; 10748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (fabs(c0[1] - c1[1]) > epsilon[1]) 10848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return false; 10948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (fabs(c0[2] - c1[2]) > epsilon[2]) 11048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return false; 11148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (fabs(c0[3] - c1[3]) > epsilon[3]) 11248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return false; 11348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return true; 11448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 11548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 11648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos bool CheckProgram(GLuint program) 11748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 11848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLint status; 11948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glGetProgramiv(program, GL_LINK_STATUS, &status); 12048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 12148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (status == GL_FALSE) 12248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 12348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLint attached_shaders; 12448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glGetProgramiv(program, GL_ATTACHED_SHADERS, &attached_shaders); 12548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 12648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (attached_shaders > 0) 12748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 12848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos std::vector<GLuint> shaders(attached_shaders); 12948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glGetAttachedShaders(program, attached_shaders, NULL, &shaders[0]); 13048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 13148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos for (GLint i = 0; i < attached_shaders; ++i) 13248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 13348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLenum type; 13448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glGetShaderiv(shaders[i], GL_SHADER_TYPE, reinterpret_cast<GLint*>(&type)); 13548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos switch (type) 13648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 13748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_VERTEX_SHADER: 1383890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski m_context.getTestContext().getLog() 1393890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski << tcu::TestLog::Message << "*** Vertex Shader ***" << tcu::TestLog::EndMessage; 14048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 14148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos case GL_FRAGMENT_SHADER: 1423890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski m_context.getTestContext().getLog() 1433890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski << tcu::TestLog::Message << "*** Fragment Shader ***" << tcu::TestLog::EndMessage; 14448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 14548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos default: 1463890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski m_context.getTestContext().getLog() 1473890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski << tcu::TestLog::Message << "*** Unknown Shader ***" << tcu::TestLog::EndMessage; 14848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 14948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 15048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLint length; 15148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glGetShaderiv(shaders[i], GL_SHADER_SOURCE_LENGTH, &length); 15248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (length > 0) 15348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 15448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos std::vector<GLchar> source(length); 15548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glGetShaderSource(shaders[i], length, NULL, &source[0]); 1563890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski m_context.getTestContext().getLog() 1573890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski << tcu::TestLog::Message << &source[0] << tcu::TestLog::EndMessage; 15848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 15948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glGetShaderiv(shaders[i], GL_INFO_LOG_LENGTH, &length); 16048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (length > 0) 16148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 16248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos std::vector<GLchar> log(length); 16348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glGetShaderInfoLog(shaders[i], length, NULL, &log[0]); 1643890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski m_context.getTestContext().getLog() 1653890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski << tcu::TestLog::Message << &log[0] << tcu::TestLog::EndMessage; 16648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 16748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 16848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 16948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLint length; 17048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glGetProgramiv(program, GL_INFO_LOG_LENGTH, &length); 17148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (length > 0) 17248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 17348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos std::vector<GLchar> log(length); 17448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glGetProgramInfoLog(program, length, NULL, &log[0]); 1753890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski m_context.getTestContext().getLog() << tcu::TestLog::Message << &log[0] << tcu::TestLog::EndMessage; 17648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 17748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 17848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return status == GL_TRUE ? true : false; 17948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 18048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 18148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos bool IsEqual(IVec4 a, IVec4 b) 18248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 18348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return (a[0] == b[0]) && (a[1] == b[1]) && (a[2] == b[2]) && (a[3] == b[3]); 18448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 18548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 18648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos bool IsEqual(UVec4 a, UVec4 b) 18748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 18848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return (a[0] == b[0]) && (a[1] == b[1]) && (a[2] == b[2]) && (a[3] == b[3]); 18948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 19048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 19148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos bool IsEqual(Vec2 a, Vec2 b) 19248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 19348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return (a[0] == b[0]) && (a[1] == b[1]); 19448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 19548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 19648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos bool IsEqual(IVec2 a, IVec2 b) 19748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 19848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return (a[0] == b[0]) && (a[1] == b[1]); 19948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 20048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 20148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos bool IsEqual(UVec2 a, UVec2 b) 20248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 20348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return (a[0] == b[0]) && (a[1] == b[1]); 20448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 20548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 20648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos bool CheckFB(Vec3 expected) 20748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 20848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const tcu::RenderTarget& renderTarget = m_context.getRenderContext().getRenderTarget(); 20948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const tcu::PixelFormat& pixelFormat = renderTarget.getPixelFormat(); 21048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos Vec3 g_color_eps = Vec3(1.f / static_cast<float>(1 << pixelFormat.redBits), 21148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 1.f / static_cast<float>(1 << pixelFormat.greenBits), 21248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 1.f / static_cast<float>(1 << pixelFormat.blueBits)); 21348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos Vec3 g_color_max = Vec3(255); 21448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos std::vector<GLubyte> fb(getWindowWidth() * getWindowHeight() * 4); 21548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos int fb_w = getWindowWidth(); 21648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos int fb_h = getWindowHeight(); 21748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glReadPixels(0, 0, fb_w, fb_h, GL_RGBA, GL_UNSIGNED_BYTE, &fb[0]); 21848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos for (GLint i = 0, y = 0; y < fb_h; ++y) 21948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos for (GLint x = 0; x < fb_w; ++x, i += 4) 22048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 22148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (fabs(fb[i + 0] / g_color_max[0] - expected[0]) > g_color_eps[0] || 22248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos fabs(fb[i + 1] / g_color_max[1] - expected[1]) > g_color_eps[1] || 22348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos fabs(fb[i + 2] / g_color_max[2] - expected[2]) > g_color_eps[2]) 22448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 2253890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski m_context.getTestContext().getLog() 2263890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski << tcu::TestLog::Message << "Incorrect framebuffer color at pixel (" << x << " " << y 2273890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski << "). Color is (" << fb[i + 0] / g_color_max[0] << " " << fb[i + 1] / g_color_max[1] << " " 2283890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski << fb[i + 2] / g_color_max[2] << ". Color should be (" << expected[0] << " " << expected[1] 2293890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski << " " << expected[2] << ")." << tcu::TestLog::EndMessage; 23048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return false; 23148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 23248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 23348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return true; 23448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 23548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 23648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLhalf FloatToHalf(float f) 23748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 23848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const unsigned int HALF_FLOAT_MIN_BIASED_EXP_AS_SINGLE_FP_EXP = 0x38000000; 23948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* max exponent value in single precision that will be converted */ 24048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* to Inf or Nan when stored as a half-float */ 24148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const unsigned int HALF_FLOAT_MAX_BIASED_EXP_AS_SINGLE_FP_EXP = 0x47800000; 24248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* 255 is the max exponent biased value */ 24348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const unsigned int FLOAT_MAX_BIASED_EXP = (0xFF << 23); 24448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const unsigned int HALF_FLOAT_MAX_BIASED_EXP = (0x1F << 10); 24548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos char* c = reinterpret_cast<char*>(&f); 24648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos unsigned int x = *reinterpret_cast<unsigned int*>(c); 24748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos unsigned int sign = (GLhalf)(x >> 31); 24848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos unsigned int mantissa; 24948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos unsigned int exp; 25048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLhalf hf; 25148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 25248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* get mantissa */ 25348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos mantissa = x & ((1 << 23) - 1); 25448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* get exponent bits */ 25548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos exp = x & FLOAT_MAX_BIASED_EXP; 25648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (exp >= HALF_FLOAT_MAX_BIASED_EXP_AS_SINGLE_FP_EXP) 25748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 25848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* check if the original single precision float number is a NaN */ 25948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (mantissa && (exp == FLOAT_MAX_BIASED_EXP)) 26048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 26148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* we have a single precision NaN */ 26248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos mantissa = (1 << 23) - 1; 26348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 26448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos else 26548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 26648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* 16-bit half-float representation stores number as Inf */ 26748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos mantissa = 0; 26848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 26948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos hf = (GLhalf)((((GLhalf)sign) << 15) | (GLhalf)(HALF_FLOAT_MAX_BIASED_EXP) | (GLhalf)(mantissa >> 13)); 27048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 27148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* check if exponent is <= -15 */ 27248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos else if (exp <= HALF_FLOAT_MIN_BIASED_EXP_AS_SINGLE_FP_EXP) 27348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 27448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* store a denorm half-float value or zero */ 27548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos exp = (HALF_FLOAT_MIN_BIASED_EXP_AS_SINGLE_FP_EXP - exp) >> 23; 27648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos mantissa |= (1 << 23); 27748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos mantissa >>= (14 + exp); 27848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos hf = (GLhalf)((((GLhalf)sign) << 15) | (GLhalf)(mantissa)); 27948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 28048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos else 28148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 28248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos hf = (GLhalf)((((GLhalf)sign) << 15) | (GLhalf)((exp - HALF_FLOAT_MIN_BIASED_EXP_AS_SINGLE_FP_EXP) >> 13) | 28348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos (GLhalf)(mantissa >> 13)); 28448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 28548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 28648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return hf; 28748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 28848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}; 28948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos//============================================================================= 29048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos// 1.1 BasicUsage 29148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos//----------------------------------------------------------------------------- 29248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosclass BasicUsage : public VertexAttribBindingBase 29348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 29448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos bool pipeline; 29548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 29648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLuint m_vsp, m_fsp, m_ppo, m_vao, m_vbo; 29748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 29848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos virtual long Setup() 29948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 30048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (pipeline) 30148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 30248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_vsp = m_fsp = 0; 30348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glGenProgramPipelines(1, &m_ppo); 30448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 30548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos else 30648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 30748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_ppo = 0; 30848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 30948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glGenVertexArrays(1, &m_vao); 31048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glGenBuffers(1, &m_vbo); 31148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return NO_ERROR; 31248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 31348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 31448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos virtual long Cleanup() 31548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 31648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (pipeline) 31748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 31848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glDeleteProgram(m_vsp); 31948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glDeleteProgram(m_fsp); 32048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glDeleteProgramPipelines(1, &m_ppo); 32148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 32248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos else 32348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 32448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glUseProgram(0); 32548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glDeleteProgram(m_ppo); 32648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 32748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glDeleteVertexArrays(1, &m_vao); 32848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glDeleteBuffers(1, &m_vbo); 32948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return NO_ERROR; 33048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 33148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 33248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos virtual long Run() 33348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 33448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const char* const glsl_vs = 33548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos "#version 310 es" NL "layout(location = 7) in vec4 vs_in_position;" NL 33648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos "layout(location = 1) in vec3 vs_in_color;" NL "out vec3 g_color;" NL "void main() {" NL 33748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos " gl_Position = vs_in_position;" NL " g_color = vs_in_color;" NL "}"; 33848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const char* const glsl_fs = 33948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos "#version 310 es" NL "precision highp float;" NL "in vec3 g_color;" NL "out vec4 fs_out_color;" NL 34048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos "void main() {" NL " fs_out_color = vec4(g_color, 1);" NL "}"; 34148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (pipeline) 34248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 34348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_vsp = glCreateShaderProgramv(GL_VERTEX_SHADER, 1, &glsl_vs); 34448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_fsp = glCreateShaderProgramv(GL_FRAGMENT_SHADER, 1, &glsl_fs); 34548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (!CheckProgram(m_vsp) || !CheckProgram(m_fsp)) 34648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return ERROR; 34748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glUseProgramStages(m_ppo, GL_VERTEX_SHADER_BIT, m_vsp); 34848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glUseProgramStages(m_ppo, GL_FRAGMENT_SHADER_BIT, m_fsp); 34948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 35048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos else 35148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 35248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_ppo = glCreateProgram(); 35348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLuint sh = glCreateShader(GL_VERTEX_SHADER); 35448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLuint fsh = glCreateShader(GL_FRAGMENT_SHADER); 35548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glShaderSource(sh, 1, &glsl_vs, NULL); 35648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glShaderSource(fsh, 1, &glsl_fs, NULL); 35748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glCompileShader(sh); 35848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glCompileShader(fsh); 35948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glAttachShader(m_ppo, sh); 36048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glAttachShader(m_ppo, fsh); 36148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glDeleteShader(sh); 36248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glDeleteShader(fsh); 36348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glLinkProgram(m_ppo); 36448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (!CheckProgram(m_ppo)) 36548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return ERROR; 36648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 36748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* vbo */ 36848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 36948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const float data[] = { 37048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos -1.0f, -1.0f, 0.0f, 1.0f, 0.0f, 1.0f, -1.0f, 0.0f, 1.0f, 0.0f, -1.0f, 1.0f, 0.0f, 1.0f, 37148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 0.0f, 1.0f, 1.0f, 0.0f, 1.0f, 0.0f, -1.0f, -1.0f, 1.0f, 1.0f, 0.0f, 1.0f, -1.0f, 1.0f, 37248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 1.0f, 0.0f, -1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 37348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos }; 37448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindBuffer(GL_ARRAY_BUFFER, m_vbo); 37548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBufferData(GL_ARRAY_BUFFER, sizeof(data), data, GL_STATIC_DRAW); 37648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindBuffer(GL_ARRAY_BUFFER, 0); 37748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 37848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindVertexArray(m_vao); 37948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribFormat(7, 2, GL_FLOAT, GL_FALSE, 0); 38048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribFormat(1, 3, GL_FLOAT, GL_FALSE, 8); 38148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribBinding(7, 0); 38248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribBinding(1, 0); 38348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindVertexBuffer(0, m_vbo, 0, 20); 38448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glEnableVertexAttribArray(7); 38548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glEnableVertexAttribArray(1); 38648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindVertexArray(0); 38748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 38848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glClear(GL_COLOR_BUFFER_BIT); 38948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindVertexArray(m_vao); 39048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (pipeline) 39148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindProgramPipeline(m_ppo); 39248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos else 39348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glUseProgram(m_ppo); 39448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 39548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); 39648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (!CheckFB(Vec3(0, 1, 0))) 39748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return ERROR; 39848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 39948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glDrawArrays(GL_TRIANGLE_STRIP, 4, 4); 40048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (!CheckFB(Vec3(1, 1, 0))) 40148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return ERROR; 40248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 40348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return NO_ERROR; 40448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 40548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 40648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulospublic: 40748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos BasicUsage() : pipeline(true) 40848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 40948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 41048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}; 41148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos//============================================================================= 41248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos// BasicInputBase 41348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos//----------------------------------------------------------------------------- 41448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosclass BasicInputBase : public VertexAttribBindingBase 41548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 41648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 41748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLuint m_po, m_xfbo; 41848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 41948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosprotected: 42048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos Vec4 expected_data[60]; 42148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLsizei instance_count; 42248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLint base_instance; 42348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 42448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos virtual long Setup() 42548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 42648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_po = 0; 42748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glGenBuffers(1, &m_xfbo); 42848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos for (int i = 0; i < 60; ++i) 42948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos expected_data[i] = Vec4(0.0f); 43048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos instance_count = 1; 43148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos base_instance = -1; 43248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return NO_ERROR; 43348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 43448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 43548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos virtual long Cleanup() 43648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 43748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glDisable(GL_RASTERIZER_DISCARD); 43848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glUseProgram(0); 43948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glDeleteProgram(m_po); 44048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glDeleteBuffers(1, &m_xfbo); 44148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return NO_ERROR; 44248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 44348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 44448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos virtual long Run() 44548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 44648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const char* const glsl_vs = 44748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos "#version 310 es" NL "layout(location = 0) in vec4 vs_in_attrib0;" NL 44848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos "layout(location = 1) in vec4 vs_in_attrib1;" NL "layout(location = 2) in vec4 vs_in_attrib2;" NL 44948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos "layout(location = 3) in vec4 vs_in_attrib3;" NL "layout(location = 4) in vec4 vs_in_attrib4;" NL 45048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos "layout(location = 5) in vec4 vs_in_attrib5;" NL "layout(location = 6) in vec4 vs_in_attrib6;" NL 45148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos "layout(location = 7) in vec4 vs_in_attrib7;" NL "layout(location = 8) in vec4 vs_in_attrib8;" NL 45248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos "layout(location = 9) in vec4 vs_in_attrib9;" NL "layout(location = 10) in vec4 vs_in_attrib10;" NL 45348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos "layout(location = 11) in vec4 vs_in_attrib11;" NL "layout(location = 12) in vec4 vs_in_attrib12;" NL 45448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos "layout(location = 13) in vec4 vs_in_attrib13;" NL "layout(location = 14) in vec4 vs_in_attrib14;" NL 45548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos "out vec4 attrib[15];" NL "void main() {" NL " attrib[0] = vs_in_attrib0;" NL 45648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos " attrib[1] = vs_in_attrib1;" NL " attrib[2] = vs_in_attrib2;" NL " attrib[3] = vs_in_attrib3;" NL 45748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos " attrib[4] = vs_in_attrib4;" NL " attrib[5] = vs_in_attrib5;" NL " attrib[6] = vs_in_attrib6;" NL 45848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos " attrib[7] = vs_in_attrib7;" NL " attrib[8] = vs_in_attrib8;" NL " attrib[9] = vs_in_attrib9;" NL 45948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos " attrib[10] = vs_in_attrib10;" NL " attrib[11] = vs_in_attrib11;" NL " attrib[12] = vs_in_attrib12;" NL 46048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos " attrib[13] = vs_in_attrib13;" NL " attrib[14] = vs_in_attrib14;" NL "}"; 46148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const char* const glsl_fs = "#version 310 es" NL "precision mediump float;" NL "in vec4 attrib[15];" NL 46248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos "out vec4 fs_out_color;" NL "void main() {" NL " fs_out_color = attrib[8];" NL "}"; 46348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_po = glCreateProgram(); 46448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* attach shader */ 46548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 46648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLuint sh = glCreateShader(GL_VERTEX_SHADER); 46748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLuint fsh = glCreateShader(GL_FRAGMENT_SHADER); 46848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glShaderSource(sh, 1, &glsl_vs, NULL); 46948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glShaderSource(fsh, 1, &glsl_fs, NULL); 47048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glCompileShader(sh); 47148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glCompileShader(fsh); 47248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glAttachShader(m_po, sh); 47348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glAttachShader(m_po, fsh); 47448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glDeleteShader(sh); 47548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glDeleteShader(fsh); 47648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 47748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* setup XFB */ 47848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 47948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLchar* const v[15] = { "attrib[0]", "attrib[1]", "attrib[2]", "attrib[3]", "attrib[4]", 48048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos "attrib[5]", "attrib[6]", "attrib[7]", "attrib[8]", "attrib[9]", 48148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos "attrib[10]", "attrib[11]", "attrib[12]", "attrib[13]", "attrib[14]" }; 48248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glTransformFeedbackVaryings(m_po, 15, v, GL_INTERLEAVED_ATTRIBS); 48348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 48448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glLinkProgram(m_po); 48548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (!CheckProgram(m_po)) 48648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return ERROR; 48748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 48848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* buffer data */ 48948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 49048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos std::vector<GLubyte> zero(sizeof(expected_data)); 49148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, m_xfbo); 49248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBufferData(GL_TRANSFORM_FEEDBACK_BUFFER, sizeof(expected_data), &zero[0], GL_DYNAMIC_DRAW); 49348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 49448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 49548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos // capture 49648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glEnable(GL_RASTERIZER_DISCARD); 49748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glUseProgram(m_po); 49848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBeginTransformFeedback(GL_POINTS); 49948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (base_instance != -1) 50048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 50148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glDrawArraysInstancedBaseInstance(GL_POINTS, 0, 2, instance_count, static_cast<GLuint>(base_instance)); 50248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 50348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos else 50448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 50548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glDrawArraysInstanced(GL_POINTS, 0, 2, instance_count); 50648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 50748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glEndTransformFeedback(); 50848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 50948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos Vec4* data = 51048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos static_cast<Vec4*>(glMapBufferRange(GL_TRANSFORM_FEEDBACK_BUFFER, 0, sizeof(Vec4) * 60, GL_MAP_READ_BIT)); 51148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 51248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos long status = NO_ERROR; 51348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos for (int i = 0; i < 60; ++i) 51448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 51548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (!ColorEqual(expected_data[i], data[i], Vec4(0.01f))) 51648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 5173890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski m_context.getTestContext().getLog() 5183890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski << tcu::TestLog::Message << "Data is: " << data[i][0] << " " << data[i][1] << " " << data[i][2] 5193890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski << " " << data[i][3] << ", data should be: " << expected_data[i][0] << " " << expected_data[i][1] 5203890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski << " " << expected_data[i][2] << " " << expected_data[i][3] << ", index is: " << i 5213890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski << tcu::TestLog::EndMessage; 52248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos status = ERROR; 52348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos break; 52448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 52548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 52648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return status; 52748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 52848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}; 52948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 53048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos//============================================================================= 53148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos// 1.2.1 BasicInputCase1 53248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos//----------------------------------------------------------------------------- 53348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosclass BasicInputCase1 : public BasicInputBase 53448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 53548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 53648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLuint m_vao, m_vbo; 53748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 53848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos virtual long Setup() 53948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 54048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos BasicInputBase::Setup(); 54148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glGenVertexArrays(1, &m_vao); 54248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glGenBuffers(1, &m_vbo); 54348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return NO_ERROR; 54448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 54548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 54648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos virtual long Cleanup() 54748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 54848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos BasicInputBase::Cleanup(); 54948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glDeleteVertexArrays(1, &m_vao); 55048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glDeleteBuffers(1, &m_vbo); 55148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return NO_ERROR; 55248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 55348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 55448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos virtual long Run() 55548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 55648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos for (GLuint i = 0; i < 16; ++i) 55748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 55848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttrib4f(i, 0.0f, 0.0f, 0.0f, 0.0f); 55948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 56048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindBuffer(GL_ARRAY_BUFFER, m_vbo); 56148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBufferData(GL_ARRAY_BUFFER, sizeof(Vec3) * 2, NULL, GL_STATIC_DRAW); 56248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(Vec3), &Vec3(1.0f, 2.0f, 3.0f)[0]); 56348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBufferSubData(GL_ARRAY_BUFFER, 12, sizeof(Vec3), &Vec3(4.0f, 5.0f, 6.0f)[0]); 56448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindBuffer(GL_ARRAY_BUFFER, 0); 56548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 56648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindVertexArray(m_vao); 56748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindVertexBuffer(0, m_vbo, 0, 12); 56848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribFormat(1, 3, GL_FLOAT, GL_FALSE, 0); 56948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribBinding(1, 0); 57048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glEnableVertexAttribArray(1); 57148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos expected_data[1] = Vec4(1.0f, 2.0f, 3.0f, 1.0f); 57248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos expected_data[16] = Vec4(4.0f, 5.0f, 6.0f, 1.0f); 57348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return BasicInputBase::Run(); 57448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 57548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}; 57648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos//============================================================================= 57748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos// 1.2.2 BasicInputCase2 57848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos//----------------------------------------------------------------------------- 57948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosclass BasicInputCase2 : public BasicInputBase 58048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 58148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 58248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLuint m_vao, m_vbo; 58348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 58448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos virtual long Setup() 58548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 58648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos BasicInputBase::Setup(); 58748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glGenVertexArrays(1, &m_vao); 58848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glGenBuffers(1, &m_vbo); 58948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return NO_ERROR; 59048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 59148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 59248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos virtual long Cleanup() 59348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 59448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos BasicInputBase::Cleanup(); 59548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glDeleteVertexArrays(1, &m_vao); 59648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glDeleteBuffers(1, &m_vbo); 59748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return NO_ERROR; 59848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 59948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 60048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos virtual long Run() 60148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 60248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos for (GLuint i = 0; i < 16; ++i) 60348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 60448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttrib4f(i, 0.0f, 0.0f, 0.0f, 0.0f); 60548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 60648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindBuffer(GL_ARRAY_BUFFER, m_vbo); 60748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBufferData(GL_ARRAY_BUFFER, sizeof(Vec3) * 2, NULL, GL_STATIC_DRAW); 60848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(Vec3), &Vec3(1.0f, 2.0f, 3.0f)[0]); 60948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBufferSubData(GL_ARRAY_BUFFER, 12, sizeof(Vec3), &Vec3(4.0f, 5.0f, 6.0f)[0]); 61048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindBuffer(GL_ARRAY_BUFFER, 0); 61148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 61248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindVertexArray(m_vao); 61348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribBinding(1, 0); 61448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribFormat(0, 2, GL_FLOAT, GL_FALSE, 0); 61548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribFormat(1, 3, GL_FLOAT, GL_FALSE, 0); 61648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribFormat(7, 1, GL_FLOAT, GL_FALSE, 8); 61748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribFormat(14, 2, GL_FLOAT, GL_FALSE, 4); 61848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribBinding(0, 0); 61948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribBinding(7, 0); 62048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribBinding(14, 0); 62148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindVertexBuffer(0, m_vbo, 0, 12); 62248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glEnableVertexAttribArray(0); 62348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glEnableVertexAttribArray(1); 62448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glEnableVertexAttribArray(7); 62548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glEnableVertexAttribArray(14); 62648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 62748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos expected_data[0] = Vec4(1.0f, 2.0f, 0.0f, 1.0f); 62848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos expected_data[1] = Vec4(1.0f, 2.0f, 3.0f, 1.0f); 62948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos expected_data[7] = Vec4(3.0f, 0.0f, 0.0f, 1.0f); 63048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos expected_data[14] = Vec4(2.0f, 3.0f, 0.0f, 1.0f); 63148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos expected_data[15] = Vec4(4.0f, 5.0f, 0.0f, 1.0f); 63248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos expected_data[16] = Vec4(4.0f, 5.0f, 6.0f, 1.0f); 63348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos expected_data[22] = Vec4(6.0f, 0.0f, 0.0f, 1.0f); 63448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos expected_data[29] = Vec4(5.0f, 6.0f, 0.0f, 1.0f); 63548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return BasicInputBase::Run(); 63648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 63748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}; 63848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos//============================================================================= 63948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos// 1.2.3 BasicInputCase3 64048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos//----------------------------------------------------------------------------- 64148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosclass BasicInputCase3 : public BasicInputBase 64248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 64348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 64448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLuint m_vao, m_vbo; 64548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 64648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos virtual long Setup() 64748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 64848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos BasicInputBase::Setup(); 64948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glGenVertexArrays(1, &m_vao); 65048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glGenBuffers(1, &m_vbo); 65148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return NO_ERROR; 65248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 65348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 65448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos virtual long Cleanup() 65548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 65648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos BasicInputBase::Cleanup(); 65748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glDeleteVertexArrays(1, &m_vao); 65848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glDeleteBuffers(1, &m_vbo); 65948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return NO_ERROR; 66048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 66148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 66248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos virtual long Run() 66348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 66448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos for (GLuint i = 0; i < 16; ++i) 66548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 66648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttrib4f(i, 0.0f, 0.0f, 0.0f, 0.0f); 66748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 66848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindBuffer(GL_ARRAY_BUFFER, m_vbo); 66948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBufferData(GL_ARRAY_BUFFER, 36 * 2, NULL, GL_STATIC_DRAW); 67048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* */ 67148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 67248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLubyte d[] = { 1, 2, 3, 4 }; 67348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(d), d); 67448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 67548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBufferSubData(GL_ARRAY_BUFFER, 16, sizeof(Vec3), &Vec3(5.0f, 6.0f, 7.0f)[0]); 67648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBufferSubData(GL_ARRAY_BUFFER, 28, sizeof(Vec2), &Vec2(8.0f, 9.0f)[0]); 67748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* */ 67848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 67948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLubyte d[] = { 10, 11, 12, 13 }; 68048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBufferSubData(GL_ARRAY_BUFFER, 0 + 36, sizeof(d), d); 68148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 68248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBufferSubData(GL_ARRAY_BUFFER, 16 + 36, sizeof(Vec3), &Vec3(14.0f, 15.0f, 16.0f)[0]); 68348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBufferSubData(GL_ARRAY_BUFFER, 28 + 36, sizeof(Vec2), &Vec2(17.0f, 18.0f)[0]); 68448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindBuffer(GL_ARRAY_BUFFER, 0); 68548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 68648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindVertexArray(m_vao); 68748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glEnableVertexAttribArray(1); 68848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribFormat(0, 4, GL_UNSIGNED_BYTE, GL_FALSE, 0); 68948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribBinding(1, 3); 69048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribFormat(1, 3, GL_FLOAT, GL_FALSE, 16); 69148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribBinding(2, 3); 69248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribFormat(2, 2, GL_FLOAT, GL_FALSE, 28); 69348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribBinding(0, 3); 69448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindVertexBuffer(3, m_vbo, 0, 36); 69548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glEnableVertexAttribArray(0); 69648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glEnableVertexAttribArray(2); 69748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 69848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos expected_data[0] = Vec4(1.0f, 2.0f, 3.0f, 4.0f); 69948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos expected_data[1] = Vec4(5.0f, 6.0f, 7.0f, 1.0f); 70048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos expected_data[2] = Vec4(8.0f, 9.0f, 0.0f, 1.0f); 70148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos expected_data[0 + 15] = Vec4(10.0f, 11.0f, 12.0f, 13.0f); 70248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos expected_data[1 + 15] = Vec4(14.0f, 15.0f, 16.0f, 1.0f); 70348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos expected_data[2 + 15] = Vec4(17.0f, 18.0f, 0.0f, 1.0f); 70448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return BasicInputBase::Run(); 70548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 70648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}; 70748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos//============================================================================= 70848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos// 1.2.4 BasicInputCase4 70948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos//----------------------------------------------------------------------------- 71048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosclass BasicInputCase4 : public BasicInputBase 71148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 71248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 71348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLuint m_vao, m_vbo[2]; 71448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 71548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos virtual long Setup() 71648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 71748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos BasicInputBase::Setup(); 71848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glGenVertexArrays(1, &m_vao); 71948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glGenBuffers(2, m_vbo); 72048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return NO_ERROR; 72148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 72248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 72348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos virtual long Cleanup() 72448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 72548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos BasicInputBase::Cleanup(); 72648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glDeleteVertexArrays(1, &m_vao); 72748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glDeleteBuffers(2, m_vbo); 72848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return NO_ERROR; 72948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 73048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 73148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos virtual long Run() 73248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 73348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos for (GLuint i = 0; i < 16; ++i) 73448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 73548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttrib4f(i, 0.0f, 0.0f, 0.0f, 0.0f); 73648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 73748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindBuffer(GL_ARRAY_BUFFER, m_vbo[0]); 73848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBufferData(GL_ARRAY_BUFFER, 20 * 2, NULL, GL_STATIC_DRAW); 73948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* */ 74048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 74148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLbyte d[] = { -127, 127, -127, 127 }; 74248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(d), d); 74348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 74448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* */ 74548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 74648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLushort d[] = { 1, 2, 3, 4 }; 74748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBufferSubData(GL_ARRAY_BUFFER, 4, sizeof(d), d); 74848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 74948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* */ 75048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 75148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLuint d[] = { 5, 6 }; 75248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBufferSubData(GL_ARRAY_BUFFER, 12, sizeof(d), d); 75348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 75448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* */ 75548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 75648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLbyte d[] = { 127, -127, 127, -127 }; 75748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBufferSubData(GL_ARRAY_BUFFER, 0 + 20, sizeof(d), d); 75848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 75948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* */ 76048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 76148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLushort d[] = { 7, 8, 9, 10 }; 76248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBufferSubData(GL_ARRAY_BUFFER, 4 + 20, sizeof(d), d); 76348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 76448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* */ 76548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 76648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLuint d[] = { 11, 12 }; 76748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBufferSubData(GL_ARRAY_BUFFER, 12 + 20, sizeof(d), d); 76848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 76948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindBuffer(GL_ARRAY_BUFFER, m_vbo[1]); 77048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBufferData(GL_ARRAY_BUFFER, 24 * 2 + 8, NULL, GL_STATIC_DRAW); 77148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* */ 77248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 77348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLhalf d[] = { FloatToHalf(0.0), FloatToHalf(100.0), FloatToHalf(200.0) }; 77448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(d), d); 77548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 77648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* */ 77748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 77848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLhalf d[] = { FloatToHalf(300.0), FloatToHalf(400.0) }; 77948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBufferSubData(GL_ARRAY_BUFFER, 26, sizeof(d), d); 78048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 78148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindBuffer(GL_ARRAY_BUFFER, 0); 78248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 78348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindVertexArray(m_vao); 78448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribFormat(0, 4, GL_BYTE, GL_TRUE, 0); 78548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribFormat(1, 4, GL_UNSIGNED_SHORT, GL_FALSE, 4); 78648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribFormat(2, 2, GL_UNSIGNED_INT, GL_FALSE, 12); 78748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribFormat(5, 2, GL_HALF_FLOAT, GL_FALSE, 0); 78848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribBinding(0, 0); 78948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribBinding(1, 0); 79048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribBinding(2, 0); 79148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribBinding(5, 6); 79248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindVertexBuffer(0, m_vbo[0], 0, 20); 79348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindVertexBuffer(6, m_vbo[1], 2, 24); 79448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glEnableVertexAttribArray(0); 79548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glEnableVertexAttribArray(1); 79648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glEnableVertexAttribArray(2); 79748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glEnableVertexAttribArray(5); 79848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 79948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos expected_data[0] = Vec4(-1.0f, 1.0f, -1.0f, 1.0f); 80048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos expected_data[1] = Vec4(1.0f, 2.0f, 3.0f, 4.0f); 80148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos expected_data[2] = Vec4(5.0f, 6.0f, 0.0f, 1.0f); 80248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos expected_data[5] = Vec4(100.0f, 200.0f, 0.0f, 1.0f); 80348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos expected_data[0 + 15] = Vec4(1.0f, -1.0f, 1.0f, -1.0f); 80448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos expected_data[1 + 15] = Vec4(7.0f, 8.0f, 9.0f, 10.0f); 80548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos expected_data[2 + 15] = Vec4(11.0f, 12.0f, 0.0f, 1.0f); 80648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos expected_data[5 + 15] = Vec4(300.0f, 400.0f, 0.0f, 1.0f); 80748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return BasicInputBase::Run(); 80848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 80948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}; 81048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos//============================================================================= 81148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos// 1.2.5 BasicInputCase5 81248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos//----------------------------------------------------------------------------- 81348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosclass BasicInputCase5 : public BasicInputBase 81448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 81548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 81648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLuint m_vao, m_vbo; 81748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 81848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos virtual long Setup() 81948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 82048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos BasicInputBase::Setup(); 82148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glGenVertexArrays(1, &m_vao); 82248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glGenBuffers(1, &m_vbo); 82348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return NO_ERROR; 82448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 82548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 82648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos virtual long Cleanup() 82748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 82848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos BasicInputBase::Cleanup(); 82948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glDeleteVertexArrays(1, &m_vao); 83048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glDeleteBuffers(1, &m_vbo); 83148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return NO_ERROR; 83248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 83348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 83448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos virtual long Run() 83548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 83648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos for (GLuint i = 0; i < 16; ++i) 83748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 83848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttrib4f(i, 0.0f, 0.0f, 0.0f, 0.0f); 83948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 84048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const int kStride = 116; 84148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindBuffer(GL_ARRAY_BUFFER, m_vbo); 84248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBufferData(GL_ARRAY_BUFFER, kStride * 2, NULL, GL_STATIC_DRAW); 84348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* */ 84448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 84548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLubyte d[] = { 0, 0xff, 0xff / 2, 0 }; 84648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(d), d); 84748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 84848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* */ 84948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 85048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLushort d[] = { 0, 0xffff, 0xffff / 2, 0 }; 85148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBufferSubData(GL_ARRAY_BUFFER, 4, sizeof(d), d); 85248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 85348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* */ 85448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 85548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLuint d[] = { 0, 0xffffffff, 0xffffffff / 2, 0 }; 85648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBufferSubData(GL_ARRAY_BUFFER, 12, sizeof(d), d); 85748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 85848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* */ 85948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 86048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLbyte d[] = { 0, -127, 127, 0 }; 86148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBufferSubData(GL_ARRAY_BUFFER, 28, sizeof(d), d); 86248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 86348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* */ 86448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 86548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLshort d[] = { 0, -32767, 32767, 0 }; 86648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBufferSubData(GL_ARRAY_BUFFER, 32, sizeof(d), d); 86748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 86848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* */ 86948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 87048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLint d[] = { 0, -2147483647, 2147483647, 0 }; 87148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBufferSubData(GL_ARRAY_BUFFER, 40, sizeof(d), d); 87248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 87348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* */ 87448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 87548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLfloat d[] = { 0, 1.0f, 2.0f, 0 }; 87648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBufferSubData(GL_ARRAY_BUFFER, 56, sizeof(d), d); 87748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 87848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* */ 87948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 88048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLhalf d[] = { FloatToHalf(0.0), FloatToHalf(10.0), FloatToHalf(20.0), FloatToHalf(0.0) }; 88148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBufferSubData(GL_ARRAY_BUFFER, 72, sizeof(d), d); 88248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 88348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* */ 88448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 88548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLubyte d[] = { 0, 0xff / 4, 0xff / 2, 0xff }; 88648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBufferSubData(GL_ARRAY_BUFFER, 104, sizeof(d), d); 88748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 88848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* */ 88948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 89048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLuint d = 0 | (1023 << 10) | (511 << 20) | (1 << 30); 89148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBufferSubData(GL_ARRAY_BUFFER, 108, sizeof(d), &d); 89248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 89348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* */ 89448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 89548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLint d = 0 | (511 << 10) | (255 << 20) | (0 << 30); 89648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBufferSubData(GL_ARRAY_BUFFER, 112, sizeof(d), &d); 89748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 89848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 89948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* */ 90048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 90148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLubyte d[] = { 0xff, 0xff, 0xff / 2, 0 }; 90248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBufferSubData(GL_ARRAY_BUFFER, 0 + kStride, sizeof(d), d); 90348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 90448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* */ 90548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 90648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLushort d[] = { 0xffff, 0xffff, 0xffff / 2, 0 }; 90748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBufferSubData(GL_ARRAY_BUFFER, 4 + kStride, sizeof(d), d); 90848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 90948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* */ 91048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 91148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLuint d[] = { 0xffffffff, 0xffffffff, 0xffffffff / 2, 0 }; 91248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBufferSubData(GL_ARRAY_BUFFER, 12 + kStride, sizeof(d), d); 91348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 91448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* */ 91548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 91648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLbyte d[] = { 127, -127, 127, 0 }; 91748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBufferSubData(GL_ARRAY_BUFFER, 28 + kStride, sizeof(d), d); 91848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 91948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* */ 92048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 92148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLshort d[] = { 32767, -32767, 32767, 0 }; 92248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBufferSubData(GL_ARRAY_BUFFER, 32 + kStride, sizeof(d), d); 92348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 92448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* */ 92548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 92648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLint d[] = { 2147483647, -2147483647, 2147483647, 0 }; 92748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBufferSubData(GL_ARRAY_BUFFER, 40 + kStride, sizeof(d), d); 92848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 92948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* */ 93048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 93148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLfloat d[] = { 0, 3.0f, 4.0f, 0 }; 93248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBufferSubData(GL_ARRAY_BUFFER, 56 + kStride, sizeof(d), d); 93348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 93448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* */ 93548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 93648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLhalf d[] = { FloatToHalf(0.0), FloatToHalf(30.0), FloatToHalf(40.0), FloatToHalf(0.0) }; 93748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBufferSubData(GL_ARRAY_BUFFER, 72 + kStride, sizeof(d), d); 93848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 93948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* */ 94048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 94148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLubyte d[] = { 0xff, 0xff / 2, 0xff / 4, 0 }; 94248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBufferSubData(GL_ARRAY_BUFFER, 104 + kStride, sizeof(d), d); 94348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 94448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* */ 94548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 94648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLuint d = 0 | (1023 << 10) | (511 << 20) | (2u << 30); 94748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBufferSubData(GL_ARRAY_BUFFER, 108 + kStride, sizeof(d), &d); 94848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 94948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* */ 95048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 95148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLint d = (-511 & 0x3ff) | (511 << 10) | (255 << 20) | 3 << 30; 95248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBufferSubData(GL_ARRAY_BUFFER, 112 + kStride, sizeof(d), &d); 95348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 95448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindBuffer(GL_ARRAY_BUFFER, 0); 95548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 95648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindVertexArray(m_vao); 95748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribFormat(0, 4, GL_UNSIGNED_BYTE, GL_TRUE, 0); 95848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribFormat(1, 4, GL_UNSIGNED_SHORT, GL_TRUE, 4); 95948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribFormat(2, 4, GL_UNSIGNED_INT, GL_TRUE, 12); 96048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribFormat(3, 4, GL_BYTE, GL_TRUE, 28); 96148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribFormat(4, 4, GL_SHORT, GL_TRUE, 32); 96248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribFormat(5, 4, GL_INT, GL_TRUE, 40); 96348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribFormat(6, 4, GL_FLOAT, GL_TRUE, 56); 96448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribFormat(7, 4, GL_HALF_FLOAT, GL_TRUE, 72); 96548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribFormat(8, 4, GL_UNSIGNED_BYTE, GL_TRUE, 104); 96648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribFormat(9, 4, GL_UNSIGNED_INT_2_10_10_10_REV, GL_TRUE, 108); 96748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribFormat(10, 4, GL_UNSIGNED_INT_2_10_10_10_REV, GL_TRUE, 108); 96848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribFormat(11, 4, GL_INT_2_10_10_10_REV, GL_TRUE, 112); 96948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribFormat(12, 4, GL_INT_2_10_10_10_REV, GL_TRUE, 112); 97048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos for (GLuint i = 0; i < 13; ++i) 97148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 97248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribBinding(i, 0); 97348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glEnableVertexAttribArray(i); 97448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 97548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindVertexBuffer(0, m_vbo, 0, kStride); 97648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 97748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos expected_data[0] = Vec4(0.0f, 1.0f, 0.5f, 0.0f); 97848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos expected_data[1] = Vec4(0.0f, 1.0f, 0.5f, 0.0f); 97948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos expected_data[2] = Vec4(0.0f, 1.0f, 0.5f, 0.0f); 98048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos expected_data[3] = Vec4(0.0f, -1.0f, 1.0f, 0.0f); 98148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos expected_data[4] = Vec4(0.0f, -1.0f, 1.0f, 0.0f); 98248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos expected_data[5] = Vec4(0.0f, -1.0f, 1.0f, 0.0f); 98348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos expected_data[6] = Vec4(0.0f, 1.0f, 2.0f, 0.0f); 98448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos expected_data[7] = Vec4(0.0f, 10.0f, 20.0f, 0.0f); 98548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos expected_data[8] = Vec4(0.0f, 0.25f, 0.5f, 1.0f); 98648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos expected_data[9] = Vec4(0.0f, 1.0f, 0.5f, 0.33f); 98748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos expected_data[10] = Vec4(0.0f, 1.0f, 0.5f, 0.33f); 98848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos expected_data[11] = Vec4(0.0f, 1.0f, 0.5f, 0.0f); 98948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos expected_data[12] = Vec4(0.0f, 1.0f, 0.5f, 0.0f); 99048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos expected_data[0 + 15] = Vec4(1.0f, 1.0f, 0.5f, 0.0f); 99148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos expected_data[1 + 15] = Vec4(1.0f, 1.0f, 0.5f, 0.0f); 99248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos expected_data[2 + 15] = Vec4(1.0f, 1.0f, 0.5f, 0.0f); 99348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos expected_data[3 + 15] = Vec4(1.0f, -1.0f, 1.0f, 0.0f); 99448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos expected_data[4 + 15] = Vec4(1.0f, -1.0f, 1.0f, 0.0f); 99548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos expected_data[5 + 15] = Vec4(1.0f, -1.0f, 1.0f, 0.0f); 99648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos expected_data[6 + 15] = Vec4(0.0f, 3.0f, 4.0f, 0.0f); 99748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos expected_data[7 + 15] = Vec4(0.0f, 30.0f, 40.0f, 0.0f); 99848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos expected_data[8 + 15] = Vec4(1.0f, 0.5f, 0.25f, 0.0f); 99948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos expected_data[9 + 15] = Vec4(0.0f, 1.0f, 0.5f, 0.66f); 100048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos expected_data[10 + 15] = Vec4(0.0f, 1.0f, 0.5f, 0.66f); 100148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos expected_data[11 + 15] = Vec4(-1.0f, 1.0f, 0.5f, -1.0f); 100248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos expected_data[12 + 15] = Vec4(-1.0f, 1.0f, 0.5f, -1.0f); 100348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return BasicInputBase::Run(); 100448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 100548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}; 100648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos//============================================================================= 100748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos// 1.2.6 BasicInputCase6 100848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos//----------------------------------------------------------------------------- 100948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosclass BasicInputCase6 : public BasicInputBase 101048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 101148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 101248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLuint m_vao, m_vbo; 101348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 101448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos virtual long Setup() 101548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 101648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos BasicInputBase::Setup(); 101748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glGenVertexArrays(1, &m_vao); 101848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glGenBuffers(1, &m_vbo); 101948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return NO_ERROR; 102048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 102148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 102248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos virtual long Cleanup() 102348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 102448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos BasicInputBase::Cleanup(); 102548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glDeleteVertexArrays(1, &m_vao); 102648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glDeleteBuffers(1, &m_vbo); 102748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return NO_ERROR; 102848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 102948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 103048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos virtual long Run() 103148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 103248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos for (GLuint i = 0; i < 16; ++i) 103348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 103448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttrib4f(i, 0.0f, 0.0f, 0.0f, 0.0f); 103548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 103648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const int kStride = 112; 103748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindBuffer(GL_ARRAY_BUFFER, m_vbo); 103848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBufferData(GL_ARRAY_BUFFER, kStride * 2, NULL, GL_STATIC_DRAW); 103948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* */ 104048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 104148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLubyte d[] = { 1, 2, 3, 4 }; 104248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(d), d); 104348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 104448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* */ 104548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 104648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLushort d[] = { 5, 6, 7, 8 }; 104748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBufferSubData(GL_ARRAY_BUFFER, 4, sizeof(d), d); 104848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 104948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* */ 105048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 105148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLuint d[] = { 9, 10, 11, 12 }; 105248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBufferSubData(GL_ARRAY_BUFFER, 12, sizeof(d), d); 105348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 105448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* */ 105548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 105648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLbyte d[] = { -1, 2, -3, 4 }; 105748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBufferSubData(GL_ARRAY_BUFFER, 28, sizeof(d), d); 105848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 105948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* */ 106048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 106148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLshort d[] = { -5, 6, -7, 8 }; 106248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBufferSubData(GL_ARRAY_BUFFER, 32, sizeof(d), d); 106348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 106448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* */ 106548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 106648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLint d[] = { -9, 10, -11, 12 }; 106748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBufferSubData(GL_ARRAY_BUFFER, 40, sizeof(d), d); 106848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 106948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* */ 107048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 107148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLfloat d[] = { -13.0f, 14.0f, -15.0f, 16.0f }; 107248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBufferSubData(GL_ARRAY_BUFFER, 56, sizeof(d), d); 107348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 107448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* */ 107548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 107648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLhalf d[] = { FloatToHalf(-18.0), FloatToHalf(19.0), FloatToHalf(-20.0), FloatToHalf(21.0) }; 107748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBufferSubData(GL_ARRAY_BUFFER, 72, sizeof(d), d); 107848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 107948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* */ 108048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 108148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLuint d = 0 | (11 << 10) | (12 << 20) | (2u << 30); 108248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBufferSubData(GL_ARRAY_BUFFER, 104, sizeof(d), &d); 108348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 108448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* */ 108548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 108648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLint d = 0 | ((0xFFFFFFF5 << 10) & (0x3ff << 10)) | (12 << 20) | (1 << 30); 108748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBufferSubData(GL_ARRAY_BUFFER, 108, sizeof(d), &d); 108848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 108948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 109048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* */ 109148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 109248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLubyte d[] = { 22, 23, 24, 25 }; 109348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBufferSubData(GL_ARRAY_BUFFER, 0 + kStride, sizeof(d), d); 109448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 109548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* */ 109648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 109748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLushort d[] = { 26, 27, 28, 29 }; 109848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBufferSubData(GL_ARRAY_BUFFER, 4 + kStride, sizeof(d), d); 109948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 110048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* */ 110148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 110248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLuint d[] = { 30, 31, 32, 33 }; 110348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBufferSubData(GL_ARRAY_BUFFER, 12 + kStride, sizeof(d), d); 110448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 110548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* */ 110648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 110748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLbyte d[] = { -34, 35, -36, 37 }; 110848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBufferSubData(GL_ARRAY_BUFFER, 28 + kStride, sizeof(d), d); 110948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 111048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* */ 111148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 111248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLshort d[] = { -38, 39, -40, 41 }; 111348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBufferSubData(GL_ARRAY_BUFFER, 32 + kStride, sizeof(d), d); 111448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 111548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* */ 111648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 111748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLint d[] = { -42, 43, -44, 45 }; 111848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBufferSubData(GL_ARRAY_BUFFER, 40 + kStride, sizeof(d), d); 111948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 112048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* */ 112148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 112248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLfloat d[] = { -46.0f, 47.0f, -48.0f, 49.0f }; 112348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBufferSubData(GL_ARRAY_BUFFER, 56 + kStride, sizeof(d), d); 112448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 112548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* */ 112648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 112748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLhalf d[] = { FloatToHalf(-50.0), FloatToHalf(51.0), FloatToHalf(-52.0), FloatToHalf(53.0) }; 112848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBufferSubData(GL_ARRAY_BUFFER, 72 + kStride, sizeof(d), d); 112948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 113048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* */ 113148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 113248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLuint d = 0 | (11 << 10) | (12 << 20) | (1 << 30); 113348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBufferSubData(GL_ARRAY_BUFFER, 104 + kStride, sizeof(d), &d); 113448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 113548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* */ 113648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 113748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLint d = 123 | ((0xFFFFFFFD << 10) & (0x3ff << 10)) | ((0xFFFFFE0C << 20) & (0x3ff << 20)) | 113848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos ((0xFFFFFFFF << 30) & (0x3 << 30)); 113948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBufferSubData(GL_ARRAY_BUFFER, 108 + kStride, sizeof(d), &d); 114048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 114148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindBuffer(GL_ARRAY_BUFFER, 0); 114248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 114348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindVertexArray(m_vao); 114448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribFormat(0, 4, GL_UNSIGNED_BYTE, GL_FALSE, 0); 114548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribFormat(1, 4, GL_UNSIGNED_SHORT, GL_FALSE, 4); 114648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribFormat(2, 4, GL_UNSIGNED_INT, GL_FALSE, 12); 114748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribFormat(3, 4, GL_BYTE, GL_FALSE, 28); 114848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribFormat(4, 4, GL_SHORT, GL_FALSE, 32); 114948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribFormat(5, 4, GL_INT, GL_FALSE, 40); 115048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribFormat(6, 4, GL_FLOAT, GL_FALSE, 56); 115148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribFormat(7, 4, GL_HALF_FLOAT, GL_FALSE, 72); 115248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribFormat(8, 4, GL_UNSIGNED_INT_2_10_10_10_REV, GL_FALSE, 104); 115348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribFormat(9, 4, GL_INT_2_10_10_10_REV, GL_FALSE, 108); 115448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos for (GLuint i = 0; i < 10; ++i) 115548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 115648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribBinding(i, 0); 115748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glEnableVertexAttribArray(i); 115848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 115948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindVertexBuffer(0, m_vbo, 0, kStride); 116048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 116148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos expected_data[0] = Vec4(1.0f, 2.0f, 3.0f, 4.0f); 116248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos expected_data[1] = Vec4(5.0f, 6.0f, 7.0f, 8.0f); 116348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos expected_data[2] = Vec4(9.0f, 10.0f, 11.0f, 12.0f); 116448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos expected_data[3] = Vec4(-1.0f, 2.0f, -3.0f, 4.0f); 116548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos expected_data[4] = Vec4(-5.0f, 6.0f, -7.0f, 8.0f); 116648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos expected_data[5] = Vec4(-9.0f, 10.0f, -11.0f, 12.0f); 116748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos expected_data[6] = Vec4(-13.0f, 14.0f, -15.0f, 16.0f); 116848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos expected_data[7] = Vec4(-18.0f, 19.0f, -20.0f, 21.0f); 116948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos expected_data[8] = Vec4(0.0f, 11.0f, 12.0f, 2.0f); 117048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos expected_data[9] = Vec4(0.0f, -11.0f, 12.0f, 1.0f); 117148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos expected_data[0 + 15] = Vec4(22.0f, 23.0f, 24.0f, 25.0f); 117248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos expected_data[1 + 15] = Vec4(26.0f, 27.0f, 28.0f, 29.0f); 117348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos expected_data[2 + 15] = Vec4(30.0f, 31.0f, 32.0f, 33.0f); 117448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos expected_data[3 + 15] = Vec4(-34.0f, 35.0f, -36.0f, 37.0f); 117548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos expected_data[4 + 15] = Vec4(-38.0f, 39.0f, -40.0f, 41.0f); 117648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos expected_data[5 + 15] = Vec4(-42.0f, 43.0f, -44.0f, 45.0f); 117748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos expected_data[6 + 15] = Vec4(-46.0f, 47.0f, -48.0f, 49.0f); 117848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos expected_data[7 + 15] = Vec4(-50.0f, 51.0f, -52.0f, 53.0f); 117948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos expected_data[8 + 15] = Vec4(0.0f, 11.0f, 12.0f, 1.0f); 118048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos expected_data[9 + 15] = Vec4(123.0f, -3.0f, -500.0f, -1.0f); 118148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return BasicInputBase::Run(); 118248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 118348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}; 118448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos//============================================================================= 118548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos// 1.2.8 BasicInputCase8 118648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos//----------------------------------------------------------------------------- 118748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosclass BasicInputCase8 : public BasicInputBase 118848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 118948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 119048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLuint m_vao, m_vbo[2]; 119148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 119248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos virtual long Setup() 119348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 119448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos BasicInputBase::Setup(); 119548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glGenVertexArrays(1, &m_vao); 119648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glGenBuffers(2, m_vbo); 119748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return NO_ERROR; 119848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 119948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 120048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos virtual long Cleanup() 120148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 120248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos BasicInputBase::Cleanup(); 120348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glDeleteVertexArrays(1, &m_vao); 120448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glDeleteBuffers(2, m_vbo); 120548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return NO_ERROR; 120648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 120748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 120848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos virtual long Run() 120948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 121048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos for (GLuint i = 0; i < 16; ++i) 121148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 121248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttrib4f(i, 0.0f, 0.0f, 0.0f, 0.0f); 121348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 121448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindBuffer(GL_ARRAY_BUFFER, m_vbo[0]); 121548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBufferData(GL_ARRAY_BUFFER, 6 * 4, NULL, GL_STATIC_DRAW); 121648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* */ 121748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 121848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLfloat d[] = { 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f }; 121948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(d), d); 122048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 122148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 122248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindBuffer(GL_ARRAY_BUFFER, m_vbo[1]); 122348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBufferData(GL_ARRAY_BUFFER, 10 * 4, NULL, GL_STATIC_DRAW); 122448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* */ 122548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 122648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLfloat d[] = { -1.0f, -2.0f, -3.0f, -4.0f, -5.0f, -6.0f, -7.0f, -8.0f, -9.0f, -10.0f }; 122748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(d), d); 122848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 122948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindBuffer(GL_ARRAY_BUFFER, 0); 123048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 123148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindVertexArray(m_vao); 123248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribFormat(0, 3, GL_FLOAT, GL_FALSE, 0); 123348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribFormat(1, 3, GL_FLOAT, GL_FALSE, 0); 123448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribFormat(2, 1, GL_FLOAT, GL_FALSE, 4); 123548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribFormat(5, 4, GL_FLOAT, GL_FALSE, 12); 123648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribFormat(14, 2, GL_FLOAT, GL_FALSE, 8); 123748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribBinding(0, 0); 123848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribBinding(1, 1); 123948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribBinding(2, 1); 124048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribBinding(5, 15); 124148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribBinding(14, 7); 124248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindVertexBuffer(0, m_vbo[0], 0, 12); 124348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindVertexBuffer(1, m_vbo[0], 4, 4); 124448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindVertexBuffer(7, m_vbo[1], 8, 16); 124548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindVertexBuffer(15, m_vbo[1], 12, 0); 124648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glEnableVertexAttribArray(0); 124748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glEnableVertexAttribArray(1); 124848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glEnableVertexAttribArray(2); 124948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glEnableVertexAttribArray(5); 125048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glEnableVertexAttribArray(14); 125148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 125248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos expected_data[0] = Vec4(1.0f, 2.0f, 3.0f, 1.0f); 125348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos expected_data[1] = Vec4(2.0f, 3.0f, 4.0f, 1.0f); 125448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos expected_data[2] = Vec4(3.0f, 0.0f, 0.0f, 1.0f); 125548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos expected_data[5] = Vec4(-7.0f, -8.0f, -9.0f, -10.0f); 125648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos expected_data[14] = Vec4(-5.0f, -6.0f, 0.0f, 1.0f); 125748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos expected_data[0 + 15] = Vec4(4.0f, 5.0f, 6.0f, 1.0f); 125848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos expected_data[1 + 15] = Vec4(3.0f, 4.0f, 5.0f, 1.0f); 125948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos expected_data[2 + 15] = Vec4(4.0f, 0.0f, 0.0f, 1.0f); 126048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos expected_data[5 + 15] = Vec4(-7.0f, -8.0f, -9.0f, -10.0f); 126148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos expected_data[14 + 15] = Vec4(-9.0f, -10.0f, 0.0f, 1.0f); 126248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return BasicInputBase::Run(); 126348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 126448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}; 126548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos//============================================================================= 126648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos// 1.2.9 BasicInputCase9 126748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos//----------------------------------------------------------------------------- 126848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosclass BasicInputCase9 : public BasicInputBase 126948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 127048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 127148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLuint m_vao, m_vbo[2]; 127248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 127348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos virtual long Setup() 127448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 127548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos BasicInputBase::Setup(); 127648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glGenVertexArrays(1, &m_vao); 127748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glGenBuffers(2, m_vbo); 127848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return NO_ERROR; 127948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 128048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 128148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos virtual long Cleanup() 128248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 128348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos BasicInputBase::Cleanup(); 128448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glDeleteVertexArrays(1, &m_vao); 128548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glDeleteBuffers(2, m_vbo); 128648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return NO_ERROR; 128748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 128848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 128948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos virtual long Run() 129048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 129148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos for (GLuint i = 0; i < 16; ++i) 129248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 129348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttrib4f(i, 0.0f, 0.0f, 0.0f, 0.0f); 129448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 129548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindBuffer(GL_ARRAY_BUFFER, m_vbo[0]); 129648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBufferData(GL_ARRAY_BUFFER, sizeof(Vec4) * 3, NULL, GL_STATIC_DRAW); 129748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(Vec4), &Vec4(1.0f, 2.0f, 3.0f, 4.0f)[0]); 129848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBufferSubData(GL_ARRAY_BUFFER, 16, sizeof(Vec4), &Vec4(5.0f, 6.0f, 7.0f, 8.0f)[0]); 129948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBufferSubData(GL_ARRAY_BUFFER, 32, sizeof(Vec4), &Vec4(9.0f, 10.0f, 11.0f, 12.0f)[0]); 130048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindBuffer(GL_ARRAY_BUFFER, m_vbo[1]); 130148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBufferData(GL_ARRAY_BUFFER, sizeof(Vec4) * 3, NULL, GL_STATIC_DRAW); 130248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(Vec4), &Vec4(10.0f, 20.0f, 30.0f, 40.0f)[0]); 130348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBufferSubData(GL_ARRAY_BUFFER, 16, sizeof(Vec4), &Vec4(50.0f, 60.0f, 70.0f, 80.0f)[0]); 130448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindBuffer(GL_ARRAY_BUFFER, 0); 130548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 130648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindVertexArray(m_vao); 130748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribFormat(0, 4, GL_FLOAT, GL_FALSE, 0); 130848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribFormat(2, 4, GL_FLOAT, GL_FALSE, 0); 130948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribFormat(4, 2, GL_FLOAT, GL_FALSE, 4); 131048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribBinding(0, 0); 131148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribBinding(2, 1); 131248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribBinding(4, 3); 131348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glEnableVertexAttribArray(0); 131448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glEnableVertexAttribArray(2); 131548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glEnableVertexAttribArray(4); 131648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindVertexBuffer(0, m_vbo[0], 0, 16); 131748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindVertexBuffer(1, m_vbo[0], 0, 16); 131848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindVertexBuffer(3, m_vbo[1], 4, 8); 131948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexBindingDivisor(1, 1); 132048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 132148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos instance_count = 2; 132248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos expected_data[0] = Vec4(1.0f, 2.0f, 3.0f, 4.0f); 132348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos expected_data[2] = Vec4(1.0f, 2.0f, 3.0f, 4.0f); 132448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos expected_data[4] = Vec4(30.0f, 40.0f, 0.0f, 1.0f); 132548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos expected_data[0 + 15] = Vec4(5.0f, 6.0f, 7.0f, 8.0f); 132648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos expected_data[2 + 15] = Vec4(1.0f, 2.0f, 3.0f, 4.0f); 132748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos expected_data[4 + 15] = Vec4(50.0f, 60.0f, 0.0f, 1.0f); 132848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 132948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos expected_data[0 + 30] = Vec4(1.0f, 2.0f, 3.0f, 4.0f); 133048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos expected_data[2 + 30] = Vec4(5.0f, 6.0f, 7.0f, 8.0f); 133148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos expected_data[4 + 30] = Vec4(30.0f, 40.0f, 0.0f, 1.0f); 133248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos expected_data[0 + 15 + 30] = Vec4(5.0f, 6.0f, 7.0f, 8.0f); 133348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos expected_data[2 + 15 + 30] = Vec4(5.0f, 6.0f, 7.0f, 8.0f); 133448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos expected_data[4 + 15 + 30] = Vec4(50.0f, 60.0f, 0.0f, 1.0f); 133548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return BasicInputBase::Run(); 133648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 133748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}; 133848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos//============================================================================= 133948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos// 1.2.11 BasicInputCase11 134048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos//----------------------------------------------------------------------------- 134148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosclass BasicInputCase11 : public BasicInputBase 134248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 134348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 134448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLuint m_vao, m_vbo[2]; 134548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 134648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos virtual long Setup() 134748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 134848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos BasicInputBase::Setup(); 134948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glGenVertexArrays(1, &m_vao); 135048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glGenBuffers(2, m_vbo); 135148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return NO_ERROR; 135248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 135348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 135448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos virtual long Cleanup() 135548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 135648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos BasicInputBase::Cleanup(); 135748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glDeleteVertexArrays(1, &m_vao); 135848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glDeleteBuffers(2, m_vbo); 135948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return NO_ERROR; 136048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 136148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 136248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos virtual long Run() 136348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 136448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos for (GLuint i = 0; i < 16; ++i) 136548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 136648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttrib4f(i, 0.0f, 0.0f, 0.0f, 0.0f); 136748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 136848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindBuffer(GL_ARRAY_BUFFER, m_vbo[0]); 136948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBufferData(GL_ARRAY_BUFFER, sizeof(Vec4) * 3, NULL, GL_STATIC_DRAW); 137048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(Vec4), &Vec4(1.0f, 2.0f, 3.0f, 4.0f)[0]); 137148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBufferSubData(GL_ARRAY_BUFFER, 16, sizeof(Vec4), &Vec4(5.0f, 6.0f, 7.0f, 8.0f)[0]); 137248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBufferSubData(GL_ARRAY_BUFFER, 32, sizeof(Vec4), &Vec4(9.0f, 10.0f, 11.0f, 12.0f)[0]); 137348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindBuffer(GL_ARRAY_BUFFER, m_vbo[1]); 137448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBufferData(GL_ARRAY_BUFFER, sizeof(Vec4) * 3, NULL, GL_STATIC_DRAW); 137548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(Vec4), &Vec4(10.0f, 20.0f, 30.0f, 40.0f)[0]); 137648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBufferSubData(GL_ARRAY_BUFFER, 16, sizeof(Vec4), &Vec4(50.0f, 60.0f, 70.0f, 80.0f)[0]); 137748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindBuffer(GL_ARRAY_BUFFER, 0); 137848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 137948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindVertexArray(m_vao); 138048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribFormat(0, 4, GL_FLOAT, GL_FALSE, 0); 138148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribFormat(2, 4, GL_FLOAT, GL_FALSE, 0); 138248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribFormat(4, 2, GL_FLOAT, GL_FALSE, 4); 138348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribBinding(0, 0); 138448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribBinding(2, 1); 138548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribBinding(4, 2); 138648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glEnableVertexAttribArray(0); 138748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glEnableVertexAttribArray(2); 138848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glEnableVertexAttribArray(4); 138948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindVertexBuffer(0, m_vbo[0], 0, 16); 139048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindVertexBuffer(1, m_vbo[0], 0, 16); 139148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindVertexBuffer(2, m_vbo[1], 4, 8); 139248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexBindingDivisor(1, 1); 139348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 139448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos instance_count = 2; 139548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos expected_data[0] = Vec4(1.0f, 2.0f, 3.0f, 4.0f); 139648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos expected_data[2] = Vec4(1.0f, 2.0f, 3.0f, 4.0f); 139748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos expected_data[4] = Vec4(30.0f, 40.0f, 0.0f, 1.0f); 139848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos expected_data[0 + 15] = Vec4(5.0f, 6.0f, 7.0f, 8.0f); 139948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos expected_data[2 + 15] = Vec4(1.0f, 2.0f, 3.0f, 4.0f); 140048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos expected_data[4 + 15] = Vec4(50.0f, 60.0f, 0.0f, 1.0f); 140148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 140248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos expected_data[0 + 30] = Vec4(1.0f, 2.0f, 3.0f, 4.0f); 140348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos expected_data[2 + 30] = Vec4(5.0f, 6.0f, 7.0f, 8.0f); 140448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos expected_data[4 + 30] = Vec4(30.0f, 40.0f, 0.0f, 1.0f); 140548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos expected_data[0 + 15 + 30] = Vec4(5.0f, 6.0f, 7.0f, 8.0f); 140648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos expected_data[2 + 15 + 30] = Vec4(5.0f, 6.0f, 7.0f, 8.0f); 140748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos expected_data[4 + 15 + 30] = Vec4(50.0f, 60.0f, 0.0f, 1.0f); 140848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return BasicInputBase::Run(); 140948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 141048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}; 141148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos//============================================================================= 141248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos// 1.2.12 BasicInputCase12 141348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos//----------------------------------------------------------------------------- 141448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosclass BasicInputCase12 : public BasicInputBase 141548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 141648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 141748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLuint m_vao, m_vbo; 141848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 141948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos virtual long Setup() 142048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 142148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos BasicInputBase::Setup(); 142248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glGenVertexArrays(1, &m_vao); 142348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glGenBuffers(1, &m_vbo); 142448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return NO_ERROR; 142548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 142648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 142748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos virtual long Cleanup() 142848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 142948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos BasicInputBase::Cleanup(); 143048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glDeleteVertexArrays(1, &m_vao); 143148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glDeleteBuffers(1, &m_vbo); 143248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return NO_ERROR; 143348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 143448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 143548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos virtual long Run() 143648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 143748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos for (GLuint i = 0; i < 16; ++i) 143848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 143948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttrib4f(i, 0.0f, 0.0f, 0.0f, 0.0f); 144048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 144148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindBuffer(GL_ARRAY_BUFFER, m_vbo); 144248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBufferData(GL_ARRAY_BUFFER, sizeof(Vec3) * 2, NULL, GL_STATIC_DRAW); 144348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(Vec3), &Vec3(1.0f, 2.0f, 3.0f)[0]); 144448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBufferSubData(GL_ARRAY_BUFFER, 12, sizeof(Vec3), &Vec3(4.0f, 5.0f, 6.0f)[0]); 144548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindBuffer(GL_ARRAY_BUFFER, 0); 144648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 144748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindVertexArray(m_vao); 144848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 144948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos //glVertexAttribFormat(1, 3, GL_FLOAT, GL_FALSE, 0); 145048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos //glVertexAttribBinding(1, 1); 145148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos //glBindVertexBuffer(1, m_vbo, 0, 12); 145248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindBuffer(GL_ARRAY_BUFFER, m_vbo); 145348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 12, 0); 145448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindBuffer(GL_ARRAY_BUFFER, 0); 145548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 145648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribFormat(0, 3, GL_FLOAT, GL_FALSE, 0); 145748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribBinding(0, 1); 145848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 145948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glEnableVertexAttribArray(0); 146048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glEnableVertexAttribArray(1); 146148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 146248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos expected_data[0] = Vec4(1.0f, 2.0f, 3.0f, 1.0f); 146348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos expected_data[1] = Vec4(1.0f, 2.0f, 3.0f, 1.0f); 146448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos expected_data[0 + 15] = Vec4(4.0f, 5.0f, 6.0f, 1.0f); 146548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos expected_data[1 + 15] = Vec4(4.0f, 5.0f, 6.0f, 1.0f); 146648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return BasicInputBase::Run(); 146748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 146848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}; 146948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos//============================================================================= 147048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos// BasicInputIBase 147148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos//----------------------------------------------------------------------------- 147248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosclass BasicInputIBase : public VertexAttribBindingBase 147348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 147448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 147548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLuint m_po, m_xfbo; 147648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 147748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosprotected: 147848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos IVec4 expected_datai[32]; 147948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos UVec4 expected_dataui[32]; 148048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLsizei instance_count; 148148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLuint base_instance; 148248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 148348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos virtual long Setup() 148448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 148548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_po = 0; 148648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glGenBuffers(1, &m_xfbo); 148748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos for (int i = 0; i < 32; ++i) 148848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 148948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos expected_datai[i] = IVec4(0); 149048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos expected_dataui[i] = UVec4(0); 149148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 149248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos instance_count = 1; 149348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return NO_ERROR; 149448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 149548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 149648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos virtual long Cleanup() 149748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 149848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glDisable(GL_RASTERIZER_DISCARD); 149948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glUseProgram(0); 150048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glDeleteProgram(m_po); 150148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glDeleteBuffers(1, &m_xfbo); 150248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return NO_ERROR; 150348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 150448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 150548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos virtual long Run() 150648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 150748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const char* const glsl_vs = 150848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos "#version 310 es" NL "layout(location = 0) in ivec4 vs_in_attribi0;" NL 150948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos "layout(location = 1) in ivec4 vs_in_attribi1;" NL "layout(location = 2) in ivec4 vs_in_attribi2;" NL 151048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos "layout(location = 3) in ivec4 vs_in_attribi3;" NL "layout(location = 4) in ivec4 vs_in_attribi4;" NL 151148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos "layout(location = 5) in ivec4 vs_in_attribi5;" NL "layout(location = 6) in ivec4 vs_in_attribi6;" NL 151248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos "layout(location = 7) in ivec4 vs_in_attribi7;" NL "layout(location = 8) in uvec4 vs_in_attribui8;" NL 151348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos "layout(location = 9) in uvec4 vs_in_attribui9;" NL "layout(location = 10) in uvec4 vs_in_attribui10;" NL 151448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos "layout(location = 11) in uvec4 vs_in_attribui11;" NL "layout(location = 12) in uvec4 vs_in_attribui12;" NL 151548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos "layout(location = 13) in uvec4 vs_in_attribui13;" NL "layout(location = 14) in uvec4 vs_in_attribui14;" NL 151648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos "layout(location = 15) in uvec4 vs_in_attribui15;" NL "flat out ivec4 attribi[8];" NL 151748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos "flat out uvec4 attribui[7];" NL "void main() {" NL " attribi[0] = vs_in_attribi0;" NL 151848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos " attribi[1] = vs_in_attribi1;" NL " attribi[2] = vs_in_attribi2;" NL " attribi[3] = vs_in_attribi3;" NL 151948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos " attribi[4] = vs_in_attribi4;" NL " attribi[5] = vs_in_attribi5;" NL " attribi[6] = vs_in_attribi6;" NL 152048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos " attribi[7] = vs_in_attribi7;" NL " attribui[0] = vs_in_attribui8;" NL 152148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos " attribui[1] = vs_in_attribui9;" NL " attribui[2] = vs_in_attribui10;" NL 152248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos " attribui[3] = vs_in_attribui11;" NL " attribui[4] = vs_in_attribui12;" NL 152348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos " attribui[5] = vs_in_attribui13;" NL " attribui[6] = vs_in_attribui14;" NL "}"; 152448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const char* const glsl_fs = "#version 310 es" NL "precision mediump float;" NL "flat in ivec4 attribi[8];" NL 152548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos "flat in uvec4 attribui[7];" NL "out vec4 fs_out_color;" NL "void main() {" NL 152648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos " fs_out_color = vec4(attribui[1]);" NL "}"; 152748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_po = glCreateProgram(); 152848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* attach shader */ 152948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 153048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLuint sh = glCreateShader(GL_VERTEX_SHADER); 153148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLuint fsh = glCreateShader(GL_FRAGMENT_SHADER); 153248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glShaderSource(sh, 1, &glsl_vs, NULL); 153348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glShaderSource(fsh, 1, &glsl_fs, NULL); 153448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glCompileShader(sh); 153548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glCompileShader(fsh); 153648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glAttachShader(m_po, sh); 153748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glAttachShader(m_po, fsh); 153848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glDeleteShader(sh); 153948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glDeleteShader(fsh); 154048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 154148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* setup XFB */ 154248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 154348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLchar* const v[15] = { "attribi[0]", "attribi[1]", "attribi[2]", "attribi[3]", "attribi[4]", 154448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos "attribi[5]", "attribi[6]", "attribi[7]", "attribui[0]", "attribui[1]", 154548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos "attribui[2]", "attribui[3]", "attribui[4]", "attribui[5]", "attribui[6]" }; 154648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glTransformFeedbackVaryings(m_po, 15, v, GL_INTERLEAVED_ATTRIBS); 154748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 154848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glLinkProgram(m_po); 154948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (!CheckProgram(m_po)) 155048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return ERROR; 155148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 155248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* buffer data */ 155348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 155448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos std::vector<GLubyte> zero(64 * 16); 155548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, m_xfbo); 155648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBufferData(GL_TRANSFORM_FEEDBACK_BUFFER, (GLsizeiptr)zero.size(), &zero[0], GL_DYNAMIC_COPY); 155748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 155848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 155948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glEnable(GL_RASTERIZER_DISCARD); 156048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glUseProgram(m_po); 156148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBeginTransformFeedback(GL_POINTS); 156248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glDrawArraysInstanced(GL_POINTS, 0, 2, instance_count); 156348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glEndTransformFeedback(); 156448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 156548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos void* data = glMapBufferRange(GL_TRANSFORM_FEEDBACK_BUFFER, 0, sizeof(UVec4) * 64, GL_MAP_READ_BIT); 156648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos IVec4* datai = static_cast<IVec4*>(data); 156748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos UVec4* dataui = (static_cast<UVec4*>(data)) + 8; 156848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 156948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos for (int i = 0; i < 4; ++i) 157048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos for (int j = 0; j < 8; ++j) 157148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 157248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (!IsEqual(expected_datai[i * 8 + j], datai[i * 15 + j])) 157348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 15743890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski m_context.getTestContext().getLog() 15753890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski << tcu::TestLog::Message << "Datai is: " << datai[i * 15 + j][0] << " " << datai[i * 15 + j][1] 15763890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski << " " << datai[i * 15 + j][2] << " " << datai[i * 15 + j][3] 15773890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski << ", data should be: " << expected_datai[i * 8 + j][0] << " " << expected_datai[i * 8 + j][1] 15783890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski << " " << expected_datai[i * 8 + j][2] << " " << expected_datai[i * 8 + j][3] 15793890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski << ", index is: " << i * 8 + j << tcu::TestLog::EndMessage; 158048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return ERROR; 158148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 158248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (j != 7 && !IsEqual(expected_dataui[i * 8 + j], dataui[i * 15 + j])) 158348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 15843890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski m_context.getTestContext().getLog() 15853890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski << tcu::TestLog::Message << "Dataui is: " << dataui[i * 15 + j][0] << " " 15863890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski << dataui[i * 15 + j][1] << " " << dataui[i * 15 + j][2] << " " << dataui[i * 15 + j][3] 15873890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski << ", data should be: " << expected_datai[i * 8 + j][0] << " " << expected_datai[i * 8 + j][1] 15883890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski << " " << expected_datai[i * 8 + j][2] << " " << expected_datai[i * 8 + j][3] 15893890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski << ", index is: " << i * 8 + j << tcu::TestLog::EndMessage; 159048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return ERROR; 159148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 159248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 159348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return NO_ERROR; 159448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 159548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}; 159648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos//============================================================================= 159748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos// 1.3.1 BasicInputICase1 159848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos//----------------------------------------------------------------------------- 159948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosclass BasicInputICase1 : public BasicInputIBase 160048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 160148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 160248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLuint m_vao, m_vbo; 160348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 160448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos virtual long Setup() 160548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 160648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos BasicInputIBase::Setup(); 160748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glGenVertexArrays(1, &m_vao); 160848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glGenBuffers(1, &m_vbo); 160948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return NO_ERROR; 161048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 161148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 161248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos virtual long Cleanup() 161348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 161448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos BasicInputIBase::Cleanup(); 161548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glDeleteVertexArrays(1, &m_vao); 161648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glDeleteBuffers(1, &m_vbo); 161748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return NO_ERROR; 161848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 161948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 162048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos virtual long Run() 162148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 162248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos for (GLuint i = 0; i < 8; ++i) 162348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 162448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribI4i(i, 0, 0, 0, 0); 162548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribI4ui(i + 8, 0, 0, 0, 0); 162648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 162748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const int kStride = 88; 162848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindBuffer(GL_ARRAY_BUFFER, m_vbo); 162948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBufferData(GL_ARRAY_BUFFER, kStride * 2, NULL, GL_STATIC_DRAW); 163048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* */ 163148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 163248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLbyte d[] = { 1, -2, 3, -4 }; 163348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(d), d); 163448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 163548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* */ 163648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 163748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLshort d[] = { 5, -6, 7, -8 }; 163848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBufferSubData(GL_ARRAY_BUFFER, 4, sizeof(d), d); 163948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 164048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* */ 164148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 164248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLint d[] = { 9, -10, 11, -12 }; 164348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBufferSubData(GL_ARRAY_BUFFER, 12, sizeof(d), d); 164448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 164548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* */ 164648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 164748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLubyte d[] = { 13, 14, 15, 16 }; 164848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBufferSubData(GL_ARRAY_BUFFER, 28, sizeof(d), d); 164948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 165048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* */ 165148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 165248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLushort d[] = { 17, 18, 19, 20 }; 165348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBufferSubData(GL_ARRAY_BUFFER, 32, sizeof(d), d); 165448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 165548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* */ 165648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 165748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLuint d[] = { 21, 22, 23, 24 }; 165848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBufferSubData(GL_ARRAY_BUFFER, 40, sizeof(d), d); 165948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 166048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* */ 166148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 166248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLint d[] = { 90, -91, 92, -93 }; 166348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBufferSubData(GL_ARRAY_BUFFER, 56, sizeof(d), d); 166448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 166548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* */ 166648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 166748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLuint d[] = { 94, 95, 96, 97 }; 166848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBufferSubData(GL_ARRAY_BUFFER, 72, sizeof(d), d); 166948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 167048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 167148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* */ 167248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 167348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLbyte d[] = { 25, -26, 27, -28 }; 167448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBufferSubData(GL_ARRAY_BUFFER, 0 + kStride, sizeof(d), d); 167548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 167648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* */ 167748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 167848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLshort d[] = { 29, -30, 31, -32 }; 167948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBufferSubData(GL_ARRAY_BUFFER, 4 + kStride, sizeof(d), d); 168048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 168148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* */ 168248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 168348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLint d[] = { 33, -34, 35, -36 }; 168448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBufferSubData(GL_ARRAY_BUFFER, 12 + kStride, sizeof(d), d); 168548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 168648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* */ 168748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 168848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLubyte d[] = { 37, 38, 39, 40 }; 168948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBufferSubData(GL_ARRAY_BUFFER, 28 + kStride, sizeof(d), d); 169048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 169148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* */ 169248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 169348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLushort d[] = { 41, 42, 43, 44 }; 169448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBufferSubData(GL_ARRAY_BUFFER, 32 + kStride, sizeof(d), d); 169548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 169648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* */ 169748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 169848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLuint d[] = { 45, 46, 47, 48 }; 169948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBufferSubData(GL_ARRAY_BUFFER, 40 + kStride, sizeof(d), d); 170048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 170148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* */ 170248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 170348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLint d[] = { 98, -99, 100, -101 }; 170448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBufferSubData(GL_ARRAY_BUFFER, 56 + kStride, sizeof(d), d); 170548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 170648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* */ 170748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 170848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLuint d[] = { 102, 103, 104, 105 }; 170948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBufferSubData(GL_ARRAY_BUFFER, 72 + kStride, sizeof(d), d); 171048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 171148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindBuffer(GL_ARRAY_BUFFER, 0); 171248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 171348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindVertexArray(m_vao); 171448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribIFormat(0, 1, GL_BYTE, 0); 171548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribIFormat(1, 2, GL_SHORT, 4); 171648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribIFormat(2, 3, GL_INT, 12); 171748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribIFormat(3, 4, GL_INT, 56); 171848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribIFormat(8, 3, GL_UNSIGNED_BYTE, 28); 171948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribIFormat(9, 2, GL_UNSIGNED_SHORT, 32); 172048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribIFormat(10, 1, GL_UNSIGNED_INT, 40); 172148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribIFormat(11, 4, GL_UNSIGNED_INT, 72); 172248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribBinding(0, 0); 172348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribBinding(1, 0); 172448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribBinding(2, 0); 172548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribBinding(3, 0); 172648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribBinding(8, 0); 172748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribBinding(9, 0); 172848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribBinding(10, 0); 172948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribBinding(11, 0); 173048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindVertexBuffer(0, m_vbo, 0, kStride); 173148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glEnableVertexAttribArray(0); 173248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glEnableVertexAttribArray(1); 173348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glEnableVertexAttribArray(2); 173448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glEnableVertexAttribArray(3); 173548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glEnableVertexAttribArray(8); 173648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glEnableVertexAttribArray(9); 173748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glEnableVertexAttribArray(10); 173848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glEnableVertexAttribArray(11); 173948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 174048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos expected_datai[0] = IVec4(1, 0, 0, 1); 174148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos expected_datai[1] = IVec4(5, -6, 0, 1); 174248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos expected_datai[2] = IVec4(9, -10, 11, 1); 174348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos expected_datai[3] = IVec4(90, -91, 92, -93); 174448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos expected_dataui[0] = UVec4(13, 14, 15, 1); 174548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos expected_dataui[1] = UVec4(17, 18, 0, 1); 174648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos expected_dataui[2] = UVec4(21, 0, 0, 1); 174748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos expected_dataui[3] = UVec4(94, 95, 96, 97); 174848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos expected_datai[8] = IVec4(25, 0, 0, 1); 174948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos expected_datai[9] = IVec4(29, -30, 0, 1); 175048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos expected_datai[10] = IVec4(33, -34, 35, 1); 175148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos expected_datai[11] = IVec4(98, -99, 100, -101); 175248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos expected_dataui[8] = UVec4(37, 38, 39, 1); 175348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos expected_dataui[9] = UVec4(41, 42, 0, 1); 175448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos expected_dataui[10] = UVec4(45, 0, 0, 1); 175548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos expected_dataui[11] = UVec4(102, 103, 104, 105); 175648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return BasicInputIBase::Run(); 175748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 175848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}; 175948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos//============================================================================= 176048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos// 1.3.2 BasicInputICase2 176148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos//----------------------------------------------------------------------------- 176248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosclass BasicInputICase2 : public BasicInputIBase 176348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 176448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 176548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLuint m_vao, m_vbo[2]; 176648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 176748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos virtual long Setup() 176848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 176948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos BasicInputIBase::Setup(); 177048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glGenVertexArrays(1, &m_vao); 177148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glGenBuffers(2, m_vbo); 177248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return NO_ERROR; 177348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 177448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 177548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos virtual long Cleanup() 177648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 177748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos BasicInputIBase::Cleanup(); 177848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glDeleteVertexArrays(1, &m_vao); 177948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glDeleteBuffers(2, m_vbo); 178048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return NO_ERROR; 178148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 178248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 178348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos virtual long Run() 178448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 178548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos for (GLuint i = 0; i < 8; ++i) 178648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 178748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribI4i(i, 0, 0, 0, 0); 178848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribI4ui(i + 8, 0, 0, 0, 0); 178948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 179048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindBuffer(GL_ARRAY_BUFFER, m_vbo[0]); 179148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBufferData(GL_ARRAY_BUFFER, sizeof(IVec3) * 2, NULL, GL_STATIC_DRAW); 179248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(IVec3), &IVec3(1, 2, 3)[0]); 179348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBufferSubData(GL_ARRAY_BUFFER, 12, sizeof(IVec3), &IVec3(4, 5, 6)[0]); 179448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 179548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindBuffer(GL_ARRAY_BUFFER, m_vbo[1]); 179648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBufferData(GL_ARRAY_BUFFER, sizeof(UVec4), NULL, GL_STATIC_DRAW); 179748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(UVec4), &UVec4(10, 20, 30, 40)[0]); 179848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindBuffer(GL_ARRAY_BUFFER, 0); 179948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 180048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindVertexArray(m_vao); 180148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribIFormat(0, 3, GL_INT, 0); 180248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribIFormat(2, 2, GL_INT, 4); 180348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribIFormat(14, 1, GL_UNSIGNED_INT, 0); 180448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribBinding(0, 2); 180548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribBinding(2, 0); 180648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribBinding(14, 7); 180748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glEnableVertexAttribArray(0); 180848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glEnableVertexAttribArray(2); 180948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glEnableVertexAttribArray(14); 181048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindVertexBuffer(0, m_vbo[0], 0, 8); 181148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindVertexBuffer(2, m_vbo[0], 0, 12); 181248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindVertexBuffer(7, m_vbo[1], 4, 16); 181348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexBindingDivisor(0, 1); 181448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexBindingDivisor(2, 0); 181548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexBindingDivisor(7, 2); 181648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 181748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos instance_count = 2; 181848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos expected_datai[0] = IVec4(1, 2, 3, 1); 181948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos expected_datai[2] = IVec4(2, 3, 0, 1); 182048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos expected_dataui[6] = UVec4(20, 0, 0, 1); 182148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos expected_datai[8] = IVec4(4, 5, 6, 1); 182248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos expected_datai[10] = IVec4(2, 3, 0, 1); 182348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos expected_dataui[14] = UVec4(20, 0, 0, 1); 182448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 182548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos expected_datai[16] = IVec4(1, 2, 3, 1); 182648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos expected_datai[18] = IVec4(4, 5, 0, 1); 182748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos expected_dataui[22] = UVec4(20, 0, 0, 1); 182848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos expected_datai[24] = IVec4(4, 5, 6, 1); 182948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos expected_datai[26] = IVec4(4, 5, 0, 1); 183048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos expected_dataui[30] = UVec4(20, 0, 0, 1); 183148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return BasicInputIBase::Run(); 183248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 183348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}; 183448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos//============================================================================= 183548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos// 1.3.3 BasicInputICase3 183648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos//----------------------------------------------------------------------------- 183748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosclass BasicInputICase3 : public BasicInputIBase 183848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 183948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 184048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLuint m_vao, m_vbo; 184148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 184248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos virtual long Setup() 184348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 184448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos BasicInputIBase::Setup(); 184548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glGenVertexArrays(1, &m_vao); 184648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glGenBuffers(1, &m_vbo); 184748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return NO_ERROR; 184848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 184948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 185048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos virtual long Cleanup() 185148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 185248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos BasicInputIBase::Cleanup(); 185348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glDeleteVertexArrays(1, &m_vao); 185448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glDeleteBuffers(1, &m_vbo); 185548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return NO_ERROR; 185648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 185748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 185848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos virtual long Run() 185948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 186048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos for (GLuint i = 0; i < 8; ++i) 186148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 186248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribI4i(i, 0, 0, 0, 0); 186348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribI4ui(i + 8, 0, 0, 0, 0); 186448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 186548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindBuffer(GL_ARRAY_BUFFER, m_vbo); 186648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBufferData(GL_ARRAY_BUFFER, sizeof(IVec3) * 2, NULL, GL_STATIC_DRAW); 186748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(IVec3), &IVec3(1, 2, 3)[0]); 186848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBufferSubData(GL_ARRAY_BUFFER, 12, sizeof(IVec3), &IVec3(4, 5, 6)[0]); 186948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindBuffer(GL_ARRAY_BUFFER, 0); 187048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 187148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindVertexArray(m_vao); 187248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 187348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindBuffer(GL_ARRAY_BUFFER, m_vbo); 187448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribIPointer(7, 3, GL_INT, 12, 0); 187548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindBuffer(GL_ARRAY_BUFFER, 0); 187648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 187748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribIFormat(0, 2, GL_INT, 4); 187848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribBinding(0, 7); 187948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 188048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glEnableVertexAttribArray(0); 188148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glEnableVertexAttribArray(7); 188248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 188348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos expected_datai[0] = IVec4(2, 3, 0, 1); 188448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos expected_datai[7] = IVec4(1, 2, 3, 1); 188548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos expected_datai[0 + 8] = IVec4(5, 6, 0, 1); 188648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos expected_datai[7 + 8] = IVec4(4, 5, 6, 1); 188748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return BasicInputIBase::Run(); 188848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 188948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}; 189048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 189148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosclass VertexAttribState : public glcts::GLWrapper 189248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 189348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulospublic: 189484322c9402f810da3cd80b52e9f9ef72150a9004Alexander Galazin int array_enabled; 189584322c9402f810da3cd80b52e9f9ef72150a9004Alexander Galazin int array_size; 189684322c9402f810da3cd80b52e9f9ef72150a9004Alexander Galazin int array_stride; 189784322c9402f810da3cd80b52e9f9ef72150a9004Alexander Galazin int array_type; 189884322c9402f810da3cd80b52e9f9ef72150a9004Alexander Galazin int array_normalized; 189984322c9402f810da3cd80b52e9f9ef72150a9004Alexander Galazin int array_integer; 190084322c9402f810da3cd80b52e9f9ef72150a9004Alexander Galazin int array_divisor; 190184322c9402f810da3cd80b52e9f9ef72150a9004Alexander Galazin deUintptr array_pointer; 190284322c9402f810da3cd80b52e9f9ef72150a9004Alexander Galazin int array_buffer_binding; 190384322c9402f810da3cd80b52e9f9ef72150a9004Alexander Galazin int binding; 190484322c9402f810da3cd80b52e9f9ef72150a9004Alexander Galazin int relative_offset; 190584322c9402f810da3cd80b52e9f9ef72150a9004Alexander Galazin int index; 190648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 190748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos VertexAttribState(int attribindex) 190848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos : array_enabled(0) 190948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos , array_size(4) 191048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos , array_stride(0) 191148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos , array_type(GL_FLOAT) 191248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos , array_normalized(0) 191348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos , array_integer(0) 191448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos , array_divisor(0) 191548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos , array_pointer(0) 191648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos , array_buffer_binding(0) 191748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos , binding(attribindex) 191848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos , relative_offset(0) 191948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos , index(attribindex) 192048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 192148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 192248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 192348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos bool stateVerify() 192448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 192548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLint p; 192648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos bool status = true; 192748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glGetVertexAttribiv(index, GL_VERTEX_ATTRIB_ARRAY_ENABLED, &p); 192848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (p != array_enabled) 192948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 19303890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski m_context.getTestContext().getLog() 19313890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski << tcu::TestLog::Message << "GL_VERTEX_ATTRIB_ARRAY_ENABLED(" << index << ") is " << p << " should be " 19323890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski << array_enabled << tcu::TestLog::EndMessage; 193348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos status = false; 193448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 193548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glGetVertexAttribiv(index, GL_VERTEX_ATTRIB_ARRAY_SIZE, &p); 193648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (p != array_size) 193748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 19383890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski m_context.getTestContext().getLog() 19393890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski << tcu::TestLog::Message << "GL_VERTEX_ATTRIB_ARRAY_SIZE(" << index << ") is " << p << " should be " 19403890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski << array_size << tcu::TestLog::EndMessage; 194148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos status = false; 194248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 194348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glGetVertexAttribiv(index, GL_VERTEX_ATTRIB_ARRAY_STRIDE, &p); 194448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (p != array_stride) 194548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 19463890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski m_context.getTestContext().getLog() 19473890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski << tcu::TestLog::Message << "GL_VERTEX_ATTRIB_ARRAY_STRIDE(" << index << ") is " << p << " should be " 19483890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski << array_stride << tcu::TestLog::EndMessage; 194948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos status = false; 195048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 195148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glGetVertexAttribiv(index, GL_VERTEX_ATTRIB_ARRAY_TYPE, &p); 195248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (p != array_type) 195348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 19543890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski m_context.getTestContext().getLog() 19553890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski << tcu::TestLog::Message << "GL_VERTEX_ATTRIB_ARRAY_TYPE(" << index << ") is " << tcu::toHex(p) 19563890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski << " should be " << tcu::toHex(array_type) << tcu::TestLog::EndMessage; 195748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos status = false; 195848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 195948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glGetVertexAttribiv(index, GL_VERTEX_ATTRIB_ARRAY_NORMALIZED, &p); 196048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (p != array_normalized) 196148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 19623890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski m_context.getTestContext().getLog() 19633890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski << tcu::TestLog::Message << "GL_VERTEX_ATTRIB_ARRAY_NORMALIZED(" << index << ") is " << p 19643890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski << " should be " << array_normalized << tcu::TestLog::EndMessage; 196548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos status = false; 196648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 196748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glGetVertexAttribiv(index, GL_VERTEX_ATTRIB_ARRAY_INTEGER, &p); 196848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (p != array_integer) 196948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 19703890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski m_context.getTestContext().getLog() 19713890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski << tcu::TestLog::Message << "GL_VERTEX_ATTRIB_ARRAY_INTEGER(" << index << ") is " << p << " should be " 19723890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski << array_integer << tcu::TestLog::EndMessage; 197348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos status = false; 197448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 197548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glGetVertexAttribiv(index, GL_VERTEX_ATTRIB_ARRAY_DIVISOR, &p); 197648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (p != array_divisor) 197748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 19783890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski m_context.getTestContext().getLog() 19793890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski << tcu::TestLog::Message << "GL_VERTEX_ATTRIB_ARRAY_DIVISOR(" << index << ") is " << p << " should be " 19803890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski << array_divisor << tcu::TestLog::EndMessage; 198148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos status = false; 198248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 198348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos void* pp; 198448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glGetVertexAttribPointerv(index, GL_VERTEX_ATTRIB_ARRAY_POINTER, &pp); 198548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (reinterpret_cast<deUintptr>(pp) != array_pointer) 198648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 19873890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski m_context.getTestContext().getLog() 19883890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski << tcu::TestLog::Message << "GL_VERTEX_ATTRIB_ARRAY_POINTER(" << index << ") is " << pp << " should be " 19893890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski << reinterpret_cast<void*>(array_pointer) << tcu::TestLog::EndMessage; 199048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos status = false; 199148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 199248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glGetVertexAttribiv(index, GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING, &p); 199348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (p != array_buffer_binding) 199448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 19953890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski m_context.getTestContext().getLog() 19963890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski << tcu::TestLog::Message << "GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING(" << index << ") is " << p 19973890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski << " should be " << array_buffer_binding << tcu::TestLog::EndMessage; 199848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos status = false; 199948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 200048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glGetVertexAttribiv(index, GL_VERTEX_ATTRIB_BINDING, &p); 200148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (static_cast<GLint>(binding) != p) 200248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 20033890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski m_context.getTestContext().getLog() << tcu::TestLog::Message << "GL_VERTEX_ATTRIB_BINDING(" << index 20043890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski << ") is " << p << " should be " << binding << tcu::TestLog::EndMessage; 200548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos status = false; 200648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 200748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glGetVertexAttribiv(index, GL_VERTEX_ATTRIB_RELATIVE_OFFSET, &p); 200848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (p != relative_offset) 200948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 20103890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski m_context.getTestContext().getLog() 20113890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski << tcu::TestLog::Message << "GL_VERTEX_ATTRIB_RELATIVE_OFFSET(" << index << ") is " << p 20123890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski << " should be " << relative_offset << tcu::TestLog::EndMessage; 201348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos status = false; 201448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 201548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return status; 201648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 201748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}; 201848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosclass VertexBindingState : public glcts::GLWrapper 201948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 202048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulospublic: 202148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos int buffer; 202248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos long int offset; 202348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos int stride; 202448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos int divisor; 202548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos int index; 202648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 202748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos VertexBindingState(int bindingindex) : buffer(0), offset(0), stride(16), divisor(0), index(bindingindex) 202848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 202948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 203048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos bool stateVerify() 203148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 203248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos bool status = true; 203348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLint p; 203448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glGetIntegeri_v(GL_VERTEX_BINDING_BUFFER, index, &p); 203548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (p != buffer) 203648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 20373890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski m_context.getTestContext().getLog() << tcu::TestLog::Message << "GL_VERTEX_BINDING_BUFFER(" << index 20383890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski << ") is " << p << " should be " << buffer << tcu::TestLog::EndMessage; 203948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos status = false; 204048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 204148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLint64 p64; 204248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glGetInteger64i_v(GL_VERTEX_BINDING_OFFSET, index, &p64); 204348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (p64 != offset) 204448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 20453890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski m_context.getTestContext().getLog() 20463890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski << tcu::TestLog::Message << "GL_VERTEX_BINDING_OFFSET(" << index << ") is " << p64 << " should be " 20473890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski << offset << tcu::TestLog::EndMessage; 204848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos status = false; 204948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 205048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glGetIntegeri_v(GL_VERTEX_BINDING_STRIDE, index, &p); 205148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (p != stride) 205248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 20533890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski m_context.getTestContext().getLog() << tcu::TestLog::Message << "GL_VERTEX_BINDING_STRIDE(" << index 20543890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski << ") is " << p << " should be " << stride << tcu::TestLog::EndMessage; 205548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos status = false; 205648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 205748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glGetIntegeri_v(GL_VERTEX_BINDING_DIVISOR, index, &p); 205848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (p != divisor) 205948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 20603890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski m_context.getTestContext().getLog() << tcu::TestLog::Message << "GL_VERTEX_BINDING_DIVISOR(" << index 20613890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski << ") is " << p << " should be " << divisor << tcu::TestLog::EndMessage; 206248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos status = false; 206348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 206448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return status; 206548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 206648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}; 206748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos//============================================================================= 206848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos// 1.5 BasicState1 206948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos//----------------------------------------------------------------------------- 207048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosclass BasicState1 : public VertexAttribBindingBase 207148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 207248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 207348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLuint m_vao, m_vbo[3]; 207448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 207548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos virtual long Setup() 207648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 207748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glGenVertexArrays(1, &m_vao); 207848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glGenBuffers(3, m_vbo); 207948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return NO_ERROR; 208048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 208148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 208248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos virtual long Cleanup() 208348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 208448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glDeleteVertexArrays(1, &m_vao); 208548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glDeleteBuffers(3, m_vbo); 208648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return NO_ERROR; 208748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 208848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 208948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos virtual long Run() 209048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 209148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos bool status = true; 209248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindBuffer(GL_ARRAY_BUFFER, m_vbo[0]); 209348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBufferData(GL_ARRAY_BUFFER, 10000, NULL, GL_DYNAMIC_COPY); 209448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindBuffer(GL_ARRAY_BUFFER, m_vbo[1]); 209548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBufferData(GL_ARRAY_BUFFER, 10000, NULL, GL_DYNAMIC_COPY); 209648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindBuffer(GL_ARRAY_BUFFER, m_vbo[2]); 209748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBufferData(GL_ARRAY_BUFFER, 10000, NULL, GL_DYNAMIC_COPY); 209848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindBuffer(GL_ARRAY_BUFFER, 0); 209948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 210048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLint p; 210148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glGetIntegerv(GL_MAX_VERTEX_ATTRIB_BINDINGS, &p); 210248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (p < 16) 210348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 21043890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski m_context.getTestContext().getLog() << tcu::TestLog::Message << "GL_MAX_VERTEX_ATTRIB_BINDINGS is" << p 21053890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski << "but must be at least 16." << tcu::TestLog::EndMessage; 210648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos status = false; 210748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 210848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glGetIntegerv(GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET, &p); 210948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (p < 2047) 211048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 21113890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski m_context.getTestContext().getLog() << tcu::TestLog::Message << "GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET is" 21123890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski << p << "but must be at least 2047." << tcu::TestLog::EndMessage; 211348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos status = false; 211448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 211548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glGetIntegerv(GL_MAX_VERTEX_ATTRIB_STRIDE, &p); 211648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (p < 2048) 211748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 21183890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski m_context.getTestContext().getLog() << tcu::TestLog::Message << "GL_MAX_VERTEX_ATTRIB_STRIDE is" << p 21193890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski << "but must be at least 2048." << tcu::TestLog::EndMessage; 212048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos status = false; 212148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 212248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 212348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindVertexArray(m_vao); 212448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos // check default state 212548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glGetIntegerv(GL_ELEMENT_ARRAY_BUFFER_BINDING, &p); 212648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (0 != p) 212748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 21283890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski m_context.getTestContext().getLog() << tcu::TestLog::Message << "GL_ELEMENT_ARRAY_BUFFER_BINDING is" << p 21293890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski << "should be 0." << tcu::TestLog::EndMessage; 213048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos status = false; 213148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 213248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos for (GLuint i = 0; i < 16; ++i) 213348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 213448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos VertexAttribState va(i); 213548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (!va.stateVerify()) 213648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos status = false; 213748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 213848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos for (GLuint i = 0; i < 16; ++i) 213948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 214048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos VertexBindingState vb(i); 214148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (!vb.stateVerify()) 214248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos status = false; 214348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 214448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (!status) 214548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 21463890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski m_context.getTestContext().getLog() 21473890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski << tcu::TestLog::Message << "Default state check failed." << tcu::TestLog::EndMessage; 214848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos status = false; 214948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 215048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 215148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos VertexAttribState va0(0); 215248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos va0.array_size = 2; 215348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos va0.array_type = GL_BYTE; 215448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos va0.array_normalized = 1; 215548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos va0.relative_offset = 16; 215648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos VertexBindingState vb0(0); 215748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribFormat(0, 2, GL_BYTE, GL_TRUE, 16); 215848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (!va0.stateVerify() || !vb0.stateVerify()) 215948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 21603890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski m_context.getTestContext().getLog() 21613890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski << tcu::TestLog::Message << "glVertexAttribFormat state change check failed." 21623890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski << tcu::TestLog::EndMessage; 216348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos status = false; 216448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 216548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 216648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos VertexAttribState va2(2); 216748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos va2.array_size = 3; 216848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos va2.array_type = GL_INT; 216948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos va2.array_integer = 1; 217048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos va2.relative_offset = 512; 217148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos VertexBindingState vb2(2); 217248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribIFormat(2, 3, GL_INT, 512); 217348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (!va2.stateVerify() || !vb2.stateVerify()) 217448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 21753890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski m_context.getTestContext().getLog() 21763890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski << tcu::TestLog::Message << "glVertexAttribIFormat state change check failed." 21773890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski << tcu::TestLog::EndMessage; 217848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos status = false; 217948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 218048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 218148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos va0.array_buffer_binding = m_vbo[0]; 218248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos vb0.buffer = m_vbo[0]; 218348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos vb0.offset = 2048; 218448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos vb0.stride = 128; 218548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindVertexBuffer(0, m_vbo[0], 2048, 128); 218648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (!va0.stateVerify() || !vb0.stateVerify()) 218748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 21883890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski m_context.getTestContext().getLog() 21893890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski << tcu::TestLog::Message << "glBindVertexBuffer state change check failed." << tcu::TestLog::EndMessage; 219048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos status = false; 219148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 219248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 219348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos va2.array_buffer_binding = m_vbo[2]; 219448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos vb2.buffer = m_vbo[2]; 219548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos vb2.offset = 64; 219648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos vb2.stride = 256; 219748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindVertexBuffer(2, m_vbo[2], 64, 256); 219848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (!va2.stateVerify() || !vb2.stateVerify()) 219948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 22003890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski m_context.getTestContext().getLog() 22013890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski << tcu::TestLog::Message << "glBindVertexBuffer state change check failed." << tcu::TestLog::EndMessage; 220248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos status = false; 220348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 220448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 220548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribBinding(2, 0); 220648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos va2.binding = 0; 220748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos va2.array_buffer_binding = m_vbo[0]; 220848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (!va0.stateVerify() || !vb0.stateVerify() || !va2.stateVerify() || !vb2.stateVerify()) 220948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 22103890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski m_context.getTestContext().getLog() 22113890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski << tcu::TestLog::Message << "glVertexAttribBinding state change check failed." 22123890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski << tcu::TestLog::EndMessage; 221348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos status = false; 221448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 221548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 221648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos VertexAttribState va15(15); 221748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos VertexBindingState vb15(15); 221848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribBinding(0, 15); 221948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos va0.binding = 15; 222048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos va0.array_buffer_binding = 0; 222148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (!va0.stateVerify() || !vb0.stateVerify() || !va15.stateVerify() || !vb15.stateVerify()) 222248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 22233890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski m_context.getTestContext().getLog() 22243890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski << tcu::TestLog::Message << "glVertexAttribBinding state change check failed." 22253890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski << tcu::TestLog::EndMessage; 222648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos status = false; 222748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 222848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 222948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindVertexBuffer(15, m_vbo[1], 16, 32); 223048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos va0.array_buffer_binding = m_vbo[1]; 223148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos va15.array_buffer_binding = m_vbo[1]; 223248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos vb15.buffer = m_vbo[1]; 223348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos vb15.offset = 16; 223448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos vb15.stride = 32; 223548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (!va0.stateVerify() || !vb0.stateVerify() || !va15.stateVerify() || !vb15.stateVerify()) 223648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 22373890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski m_context.getTestContext().getLog() 22383890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski << tcu::TestLog::Message << "glBindVertexBuffer state change check failed." << tcu::TestLog::EndMessage; 223948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos status = false; 224048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 224148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 224248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribFormat(15, 1, GL_HALF_FLOAT, GL_FALSE, 1024); 224348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos va15.array_size = 1; 224448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos va15.array_type = GL_HALF_FLOAT; 224548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos va15.relative_offset = 1024; 224648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (!va0.stateVerify() || !vb0.stateVerify() || !va2.stateVerify() || !vb2.stateVerify() || 224748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos !va15.stateVerify() || !vb15.stateVerify()) 224848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 22493890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski m_context.getTestContext().getLog() 22503890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski << tcu::TestLog::Message << "glVertexAttribFormat state change check failed." 22513890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski << tcu::TestLog::EndMessage; 225248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos status = false; 225348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 225448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 225548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindBuffer(GL_ARRAY_BUFFER, m_vbo[2]); 225648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribPointer(0, 4, GL_UNSIGNED_BYTE, GL_FALSE, 8, (void*)640); 225748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindBuffer(GL_ARRAY_BUFFER, 0); 225848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos va0.array_size = 4; 225948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos va0.array_type = GL_UNSIGNED_BYTE; 226048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos va0.array_stride = 8; 226148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos va0.array_pointer = 640; 226248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos va0.relative_offset = 0; 226348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos va0.array_normalized = 0; 226448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos va0.binding = 0; 226548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos va0.array_buffer_binding = m_vbo[2]; 226648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos vb0.buffer = m_vbo[2]; 226748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos vb0.offset = 640; 226848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos vb0.stride = 8; 226948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos va2.array_buffer_binding = m_vbo[2]; 227048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (!va0.stateVerify() || !vb0.stateVerify() || !va2.stateVerify() || !vb2.stateVerify() || 227148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos !va15.stateVerify() || !vb15.stateVerify()) 227248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 22733890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski m_context.getTestContext().getLog() 22743890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski << tcu::TestLog::Message << "glVertexAttribPointer state change check failed." 22753890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski << tcu::TestLog::EndMessage; 227648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos status = false; 227748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 227848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 227948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindVertexBuffer(0, m_vbo[1], 80, 24); 228048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos vb0.buffer = m_vbo[1]; 228148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos vb0.offset = 80; 228248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos vb0.stride = 24; 228348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos va2.array_buffer_binding = m_vbo[1]; 228448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos va0.array_buffer_binding = m_vbo[1]; 228548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (!va0.stateVerify() || !vb0.stateVerify() || !va2.stateVerify() || !vb2.stateVerify() || 228648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos !va15.stateVerify() || !vb15.stateVerify()) 228748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 22883890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski m_context.getTestContext().getLog() 22893890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski << tcu::TestLog::Message << "glBindVertexBuffer state change check failed." << tcu::TestLog::EndMessage; 229048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos status = false; 229148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 229248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 229348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (status) 229448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return NO_ERROR; 229548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos else 229648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return ERROR; 229748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 229848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}; 229948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos//============================================================================= 230048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos// 1.6 BasicState2 230148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos//----------------------------------------------------------------------------- 230248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosclass BasicState2 : public VertexAttribBindingBase 230348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 230448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 230548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLuint m_vao; 230648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 230748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos virtual long Setup() 230848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 230948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glGenVertexArrays(1, &m_vao); 231048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return NO_ERROR; 231148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 231248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 231348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos virtual long Cleanup() 231448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 231548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glDeleteVertexArrays(1, &m_vao); 231648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return NO_ERROR; 231748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 231848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 231948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos virtual long Run() 232048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 232148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos bool status = true; 232248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindVertexArray(m_vao); 232348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 232448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos for (GLuint i = 0; i < 16; ++i) 232548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 232648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos VertexAttribState va(i); 232748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos VertexBindingState vb(i); 232848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribDivisor(i, i + 7); 232948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos va.array_divisor = i + 7; 233048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos vb.divisor = i + 7; 233148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (!va.stateVerify() || !vb.stateVerify()) 233248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 23333890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski m_context.getTestContext().getLog() 23343890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski << tcu::TestLog::Message << "glVertexAttribDivisor state change check failed." 23353890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski << tcu::TestLog::EndMessage; 233648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos status = false; 233748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 233848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 233948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos for (GLuint i = 0; i < 16; ++i) 234048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 234148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos VertexAttribState va(i); 234248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos VertexBindingState vb(i); 234348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexBindingDivisor(i, i); 234448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos va.array_divisor = i; 234548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos vb.divisor = i; 234648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (!va.stateVerify() || !vb.stateVerify()) 234748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 23483890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski m_context.getTestContext().getLog() 23493890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski << tcu::TestLog::Message << "glVertexBindingDivisor state change check failed." 23503890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski << tcu::TestLog::EndMessage; 235148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos status = false; 235248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 235348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 235448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 235548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribBinding(2, 5); 235648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos VertexAttribState va5(5); 235748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos va5.array_divisor = 5; 235848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos VertexBindingState vb5(5); 235948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos vb5.divisor = 5; 236048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos VertexAttribState va2(2); 236148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos va2.array_divisor = 5; // binding state seen thru mapping 236248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos VertexBindingState vb2(2); 236348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos vb2.divisor = 2; 236448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos va2.binding = 5; 236548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (!va5.stateVerify() || !vb5.stateVerify() || !va2.stateVerify() || !vb2.stateVerify()) 236648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 23673890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski m_context.getTestContext().getLog() 23683890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski << tcu::TestLog::Message << "glVertexAttribBinding state change check failed." 23693890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski << tcu::TestLog::EndMessage; 237048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos status = false; 237148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 237248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 237348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribDivisor(2, 23); 237448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos va2.binding = 2; // glVAD defaults mapping 237548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos va2.array_divisor = 23; 237648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos vb2.divisor = 23; 237748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (!va5.stateVerify() || !vb5.stateVerify() || !va2.stateVerify() || !vb2.stateVerify()) 237848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 23793890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski m_context.getTestContext().getLog() 23803890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski << tcu::TestLog::Message << "glVertexAttribDivisor state change check failed." 23813890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski << tcu::TestLog::EndMessage; 238248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos status = false; 238348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 238448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 238548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (status) 238648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return NO_ERROR; 238748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos else 238848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return ERROR; 238948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 239048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}; 239148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos//============================================================================= 239248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos// 2.1 AdvancedBindingUpdate 239348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos//----------------------------------------------------------------------------- 239448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosclass AdvancedBindingUpdate : public VertexAttribBindingBase 239548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 239648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos bool pipeline; 239748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLuint m_vao[2], m_vbo[2], m_ebo[2], m_vsp, m_fsp, m_ppo; 239848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 239948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos virtual long Setup() 240048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 240148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glGenVertexArrays(2, m_vao); 240248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glGenBuffers(2, m_vbo); 240348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glGenBuffers(2, m_ebo); 240448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (pipeline) 240548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 240648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_vsp = m_fsp = 0; 240748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glGenProgramPipelines(1, &m_ppo); 240848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 240948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos else 241048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 241148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_ppo = 0; 241248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 241348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return NO_ERROR; 241448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 241548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 241648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos virtual long Cleanup() 241748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 241848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glDeleteVertexArrays(2, m_vao); 241948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glDeleteBuffers(2, m_vbo); 242048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glDeleteBuffers(2, m_ebo); 242148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (pipeline) 242248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 242348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glDeleteProgram(m_vsp); 242448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glDeleteProgram(m_fsp); 242548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glDeleteProgramPipelines(1, &m_ppo); 242648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 242748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos else 242848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 242948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glUseProgram(0); 243048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glDeleteProgram(m_ppo); 243148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 243248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return NO_ERROR; 243348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 243448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 243548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos virtual long Run() 243648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 243748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const char* const glsl_vs = 243848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos "#version 310 es" NL "layout(location = 0) in vec4 vs_in_position;" NL 243948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos "layout(location = 1) in vec2 vs_in_color_rg;" NL "layout(location = 2) in float vs_in_color_b;" NL 244048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos "layout(location = 3) in uvec3 vs_in_data0;" NL "layout(location = 4) in ivec2 vs_in_data1;" NL 244148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos "out vec2 color_rg;" NL "out float color_b;" NL "flat out uvec3 data0;" NL "flat out ivec2 data1;" NL 244248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos "void main() {" NL " data0 = vs_in_data0;" NL " data1 = vs_in_data1;" NL " color_b = vs_in_color_b;" NL 244348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos " color_rg = vs_in_color_rg;" NL " gl_Position = vs_in_position;" NL "}"; 244448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const char* const glsl_fs = 244548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos "#version 310 es" NL "precision highp float;" NL "precision highp int;" NL "in vec2 color_rg;" NL 244648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos "in float color_b;" NL "flat in uvec3 data0;" NL "flat in ivec2 data1;" NL "out vec4 fs_out_color;" NL 244748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos "uniform uvec3 g_expected_data0;" NL "uniform ivec2 g_expected_data1;" NL "void main() {" NL 244848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos " fs_out_color = vec4(color_rg, color_b, 1);" NL 244948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos " if (data0 != g_expected_data0) fs_out_color = vec4(1);" NL 245048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos " if (data1 != g_expected_data1) fs_out_color = vec4(1);" NL "}"; 245148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (pipeline) 245248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 245348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_vsp = glCreateShaderProgramv(GL_VERTEX_SHADER, 1, &glsl_vs); 245448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_fsp = glCreateShaderProgramv(GL_FRAGMENT_SHADER, 1, &glsl_fs); 245548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (!CheckProgram(m_vsp) || !CheckProgram(m_fsp)) 245648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return ERROR; 245748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glUseProgramStages(m_ppo, GL_VERTEX_SHADER_BIT, m_vsp); 245848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glUseProgramStages(m_ppo, GL_FRAGMENT_SHADER_BIT, m_fsp); 245948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 246048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos else 246148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 246248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_ppo = glCreateProgram(); 246348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLuint sh = glCreateShader(GL_VERTEX_SHADER); 246448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLuint fsh = glCreateShader(GL_FRAGMENT_SHADER); 246548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glShaderSource(sh, 1, &glsl_vs, NULL); 246648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glShaderSource(fsh, 1, &glsl_fs, NULL); 246748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glCompileShader(sh); 246848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glCompileShader(fsh); 246948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glAttachShader(m_ppo, sh); 247048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glAttachShader(m_ppo, fsh); 247148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glDeleteShader(sh); 247248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glDeleteShader(fsh); 247348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glLinkProgram(m_ppo); 247448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (!CheckProgram(m_ppo)) 247548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return ERROR; 247648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 247748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 247848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLsizei kStride[2] = { 52, 64 }; 247948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLintptr kOffset[2] = { 0, 8 }; 248048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindBuffer(GL_ARRAY_BUFFER, m_vbo[0]); 248148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* first VBO */ 248248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 248348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBufferData(GL_ARRAY_BUFFER, kOffset[0] + 4 * kStride[0], NULL, GL_STATIC_DRAW); 248448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLubyte* ptr = static_cast<GLubyte*>( 248548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glMapBufferRange(GL_ARRAY_BUFFER, 0, kOffset[0] + 4 * kStride[0], GL_MAP_WRITE_BIT)); 248648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *reinterpret_cast<Vec2*>(&ptr[kOffset[0] + 0 * kStride[0]]) = Vec2(-1.0f, -1.0f); 248748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *reinterpret_cast<Vec2*>(&ptr[kOffset[0] + 1 * kStride[0]]) = Vec2(1.0f, -1.0f); 248848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *reinterpret_cast<Vec2*>(&ptr[kOffset[0] + 2 * kStride[0]]) = Vec2(1.0f, 1.0f); 248948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *reinterpret_cast<Vec2*>(&ptr[kOffset[0] + 3 * kStride[0]]) = Vec2(-1.0f, 1.0f); 249048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos for (int i = 0; i < 4; ++i) 249148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 249248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *reinterpret_cast<Vec2*>(&ptr[kOffset[0] + 8 + i * kStride[0]]) = Vec2(0.0f, 1.0f); 249348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *reinterpret_cast<float*>(&ptr[kOffset[0] + 16 + i * kStride[0]]) = 0.0f; 249448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *reinterpret_cast<UVec3*>(&ptr[kOffset[0] + 20 + i * kStride[0]]) = UVec3(1, 2, 3); 249548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *reinterpret_cast<IVec2*>(&ptr[kOffset[0] + 44 + i * kStride[0]]) = IVec2(1, 2); 249648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 249748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glUnmapBuffer(GL_ARRAY_BUFFER); 249848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 249948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindBuffer(GL_ARRAY_BUFFER, m_vbo[1]); 250048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* second VBO */ 250148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 250248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBufferData(GL_ARRAY_BUFFER, kOffset[1] + 4 * kStride[1], NULL, GL_STATIC_DRAW); 250348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLubyte* ptr = static_cast<GLubyte*>( 250448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glMapBufferRange(GL_ARRAY_BUFFER, 0, kOffset[1] + 4 * kStride[1], GL_MAP_WRITE_BIT)); 250548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *reinterpret_cast<Vec2*>(&ptr[kOffset[1] + 0 * kStride[1]]) = Vec2(-1.0f, 1.0f); 250648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *reinterpret_cast<Vec2*>(&ptr[kOffset[1] + 1 * kStride[1]]) = Vec2(1.0f, 1.0f); 250748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *reinterpret_cast<Vec2*>(&ptr[kOffset[1] + 2 * kStride[1]]) = Vec2(1.0f, -1.0f); 250848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *reinterpret_cast<Vec2*>(&ptr[kOffset[1] + 3 * kStride[1]]) = Vec2(-1.0f, -1.0f); 250948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos for (int i = 0; i < 4; ++i) 251048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 251148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *reinterpret_cast<Vec2*>(&ptr[kOffset[1] + 8 + i * kStride[1]]) = Vec2(0.0f, 0.0f); 251248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *reinterpret_cast<float*>(&ptr[kOffset[1] + 16 + i * kStride[1]]) = 1.0f; 251348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *reinterpret_cast<UVec3*>(&ptr[kOffset[1] + 20 + i * kStride[1]]) = UVec3(4, 5, 6); 251448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *reinterpret_cast<IVec2*>(&ptr[kOffset[1] + 44 + i * kStride[1]]) = IVec2(3, 4); 251548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 251648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glUnmapBuffer(GL_ARRAY_BUFFER); 251748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 251848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindBuffer(GL_ARRAY_BUFFER, 0); 251948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 252048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_ebo[0]); 252148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* first EBO */ 252248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 252348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLushort data[4] = { 0, 1, 3, 2 }; 252448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(data), data, GL_STATIC_DRAW); 252548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 252648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_ebo[1]); 252748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* second EBO */ 252848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 252948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLuint data[4] = { 3, 2, 0, 1 }; 253048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(data), data, GL_STATIC_DRAW); 253148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 253248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); 253348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 253448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindVertexArray(m_vao[0]); 253548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribFormat(0, 2, GL_FLOAT, GL_FALSE, 0); 253648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribFormat(1, 2, GL_FLOAT, GL_FALSE, 8); 253748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribFormat(2, 1, GL_FLOAT, GL_FALSE, 16); 253848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribIFormat(3, 3, GL_UNSIGNED_INT, 20); 253948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribIFormat(4, 2, GL_INT, 44); 254048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos for (GLuint i = 0; i < 5; ++i) 254148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 254248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribBinding(i, 0); 254348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glEnableVertexAttribArray(i); 254448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 254548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindVertexArray(m_vao[1]); 254648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribFormat(0, 2, GL_FLOAT, GL_FALSE, 0); 254748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribFormat(1, 2, GL_FLOAT, GL_FALSE, 8); 254848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribFormat(2, 1, GL_FLOAT, GL_FALSE, 16); 254948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribIFormat(3, 3, GL_UNSIGNED_INT, 20); 255048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribIFormat(4, 2, GL_INT, 44); 255148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribBinding(0, 1); 255248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribBinding(1, 8); 255348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribBinding(2, 1); 255448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribBinding(3, 1); 255548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribBinding(4, 8); 255648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glEnableVertexAttribArray(0); 255748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glEnableVertexAttribArray(1); 255848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glEnableVertexAttribArray(2); 255948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glEnableVertexAttribArray(3); 256048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glEnableVertexAttribArray(4); 256148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindVertexBuffer(1, m_vbo[1], kOffset[1], kStride[1]); 256248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindVertexBuffer(8, m_vbo[0], kOffset[0], kStride[0]); 256348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_ebo[1]); 256448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindVertexArray(0); 256548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 256648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glClear(GL_COLOR_BUFFER_BIT); 256748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLuint ppo; 256848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (pipeline) 256948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 257048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindProgramPipeline(m_ppo); 257148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos ppo = m_fsp; 257248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 257348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos else 257448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 257548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glUseProgram(m_ppo); 257648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos ppo = m_ppo; 257748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 257848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindVertexArray(m_vao[0]); 257948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 258048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos // Bind first VBO 258148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glProgramUniform3ui(ppo, glGetUniformLocation(ppo, "g_expected_data0"), 1, 2, 3); 258248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glProgramUniform2i(ppo, glGetUniformLocation(ppo, "g_expected_data1"), 1, 2); 258348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindVertexBuffer(0, m_vbo[0], kOffset[0], kStride[0]); 258448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_ebo[0]); 258548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glDrawElementsInstanced(GL_TRIANGLE_STRIP, 4, GL_UNSIGNED_SHORT, 0, 1); 258648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 258748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos bool status = true; 258848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (!CheckFB(Vec3(0, 1, 0))) 258948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos status = false; 259048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (!status) 259148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return ERROR; 259248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 259348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos // Bind second VBO (change all vertex attribs with one call) 259448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glProgramUniform3ui(ppo, glGetUniformLocation(ppo, "g_expected_data0"), 4, 5, 6); 259548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glProgramUniform2i(ppo, glGetUniformLocation(ppo, "g_expected_data1"), 3, 4); 259648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 259748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindVertexBuffer(0, m_vbo[1], kOffset[1], kStride[1]); 259848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_ebo[1]); 259948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glDrawElementsInstanced(GL_TRIANGLE_STRIP, 4, GL_UNSIGNED_INT, 0, 1); 260048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 260148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (!CheckFB(Vec3(0, 0, 1))) 260248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos status = false; 260348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (!status) 260448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return ERROR; 260548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 260648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos // Change attrib bindings (all attribs from one buffer) 260748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindVertexBuffer(0, 0, 0, 0); // "unbind" buffer 260848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 260948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glProgramUniform3ui(ppo, glGetUniformLocation(ppo, "g_expected_data0"), 1, 2, 3); 261048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glProgramUniform2i(ppo, glGetUniformLocation(ppo, "g_expected_data1"), 1, 2); 261148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 261248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos for (GLuint i = 0; i < 5; ++i) 261348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribBinding(i, 15); 261448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindVertexBuffer(15, m_vbo[0], kOffset[0], kStride[0]); 261548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_ebo[0]); 261648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glDrawElementsInstanced(GL_TRIANGLE_STRIP, 4, GL_UNSIGNED_SHORT, 0, 1); 261748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 261848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (!CheckFB(Vec3(0, 1, 0))) 261948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos status = false; 262048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (!status) 262148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return ERROR; 262248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 262348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos // Change attrib bindings (attribs from two buffers) 262448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindVertexBuffer(15, 0, 0, 0); // "unbind" buffer 262548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 262648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glProgramUniform3ui(ppo, glGetUniformLocation(ppo, "g_expected_data0"), 1, 2, 3); 262748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glProgramUniform2i(ppo, glGetUniformLocation(ppo, "g_expected_data1"), 3, 4); 262848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 262948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindVertexBuffer(7, m_vbo[0], kOffset[0], kStride[0]); 263048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindVertexBuffer(12, m_vbo[1], kOffset[1], kStride[1]); 263148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribBinding(0, 7); 263248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribBinding(1, 12); 263348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribBinding(2, 12); 263448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribBinding(3, 7); 263548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribBinding(4, 12); 263648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_ebo[0]); 263748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glDrawElementsInstanced(GL_TRIANGLE_STRIP, 4, GL_UNSIGNED_SHORT, 0, 1); 263848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 263948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (!CheckFB(Vec3(0, 0, 1))) 264048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos status = false; 264148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (!status) 264248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return ERROR; 264348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 264448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos // Disable one of the attribs 264548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glClear(GL_COLOR_BUFFER_BIT); 264648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glProgramUniform2i(ppo, glGetUniformLocation(ppo, "g_expected_data1"), 0, 0); 264748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glDisableVertexAttribArray(4); 264848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribI4i(4, 0, 0, 0, 0); 264948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glDrawElementsInstanced(GL_TRIANGLE_STRIP, 4, GL_UNSIGNED_SHORT, 0, 1); 265048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 265148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (!CheckFB(Vec3(0, 0, 1))) 265248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos status = false; 265348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (!status) 265448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return ERROR; 265548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 265648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos // Change VAO 265748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glProgramUniform3ui(ppo, glGetUniformLocation(ppo, "g_expected_data0"), 4, 5, 6); 265848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glProgramUniform2i(ppo, glGetUniformLocation(ppo, "g_expected_data1"), 1, 2); 265948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 266048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindVertexArray(m_vao[1]); 266148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glDrawElementsInstanced(GL_TRIANGLE_STRIP, 4, GL_UNSIGNED_INT, 0, 1); 266248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 266348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (!CheckFB(Vec3(0, 1, 1))) 266448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos status = false; 266548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (!status) 266648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return ERROR; 266748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 266848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return NO_ERROR; 266948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 267048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 267148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulospublic: 267248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos AdvancedBindingUpdate() : pipeline(true) 267348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 267448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 267548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}; 267648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos//============================================================================= 267748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos// 2.3 AdvancedIterations 267848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos//----------------------------------------------------------------------------- 267948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosclass AdvancedIterations : public VertexAttribBindingBase 268048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 268148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 268248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLuint m_po, m_vao[2], m_xfo[2], m_buffer[2]; 268348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 268448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos virtual long Setup() 268548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 268648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_po = 0; 268748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glGenVertexArrays(2, m_vao); 268848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glGenTransformFeedbacks(2, m_xfo); 268948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glGenBuffers(2, m_buffer); 269048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return NO_ERROR; 269148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 269248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 269348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos virtual long Cleanup() 269448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 269548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glDisable(GL_RASTERIZER_DISCARD); 269648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glUseProgram(0); 269748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glDeleteProgram(m_po); 269848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glDeleteVertexArrays(2, m_vao); 269948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glDeleteTransformFeedbacks(2, m_xfo); 270048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glDeleteBuffers(2, m_buffer); 270148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return NO_ERROR; 270248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 270348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 270448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos virtual long Run() 270548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 270648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const char* const glsl_vs = "#version 310 es" NL "in ivec4 vs_in_data;" NL "flat out ivec4 data;" NL 270748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos "void main() {" NL " data = vs_in_data + 1;" NL "}"; 270848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const char* const glsl_fs = 270948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos "#version 310 es" NL "precision mediump float;" NL "flat in ivec4 data;" NL "out vec4 fs_out_color;" NL 271048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos "void main() {" NL " fs_out_color = vec4(data);" NL "}"; 271148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_po = glCreateProgram(); 271248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* attach shader */ 271348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 271448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLuint sh = glCreateShader(GL_VERTEX_SHADER); 271548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLuint fsh = glCreateShader(GL_FRAGMENT_SHADER); 271648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glShaderSource(sh, 1, &glsl_vs, NULL); 271748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glShaderSource(fsh, 1, &glsl_fs, NULL); 271848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glCompileShader(sh); 271948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glCompileShader(fsh); 272048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glAttachShader(m_po, sh); 272148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glAttachShader(m_po, fsh); 272248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glDeleteShader(sh); 272348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glDeleteShader(fsh); 272448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 272548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (!RelinkProgram(1)) 272648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return ERROR; 272748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 272848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindBuffer(GL_ARRAY_BUFFER, m_buffer[0]); 272948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos IVec4 zero(0); 273048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBufferData(GL_ARRAY_BUFFER, 16, &zero, GL_STATIC_DRAW); 273148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindBuffer(GL_ARRAY_BUFFER, 0); 273248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 273348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, m_buffer[1]); 273448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBufferData(GL_TRANSFORM_FEEDBACK_BUFFER, 16, &zero, GL_DYNAMIC_READ); 273548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, 0); 273648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 273748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindVertexArray(m_vao[0]); 273848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribIFormat(1, 4, GL_INT, 0); 273948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glEnableVertexAttribArray(1); 274048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindVertexBuffer(1, m_buffer[0], 0, 16); 274148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindVertexArray(m_vao[1]); 274248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribIFormat(1, 4, GL_INT, 0); 274348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glEnableVertexAttribArray(1); 274448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindVertexBuffer(1, m_buffer[1], 0, 16); 274548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindVertexArray(0); 274648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 274748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, m_xfo[0]); 274848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, m_buffer[1]); 274948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, m_xfo[1]); 275048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, m_buffer[0]); 275148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, 0); 275248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 275348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glEnable(GL_RASTERIZER_DISCARD); 275448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glUseProgram(m_po); 275548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 275648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos for (int i = 0; i < 10; ++i) 275748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 275848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindVertexArray(m_vao[i % 2]); 275948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, m_xfo[i % 2]); 276048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBeginTransformFeedback(GL_POINTS); 276148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glDrawArrays(GL_POINTS, 0, 1); 276248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glEndTransformFeedback(); 276348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 276448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* */ 276548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 276648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos IVec4* data = 276748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos static_cast<IVec4*>(glMapBufferRange(GL_TRANSFORM_FEEDBACK_BUFFER, 0, sizeof(IVec4), GL_MAP_READ_BIT)); 276848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (!IsEqual(*data, IVec4(10))) 276948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 27703890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski m_context.getTestContext().getLog() 27713890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski << tcu::TestLog::Message << "Data is: " << (*data)[0] << " " << (*data)[1] << " " << (*data)[2] 27723890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski << " " << (*data)[3] << ", data should be: 10 10 10 10." << tcu::TestLog::EndMessage; 277348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return ERROR; 277448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 277548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glUnmapBuffer(GL_TRANSFORM_FEEDBACK_BUFFER); 277648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 277748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 277848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (!RelinkProgram(5)) 277948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return ERROR; 278048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindVertexArray(m_vao[0]); 278148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glDisableVertexAttribArray(1); 278248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindVertexBuffer(1, 0, 0, 0); 278348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribIFormat(5, 4, GL_INT, 0); 278448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glEnableVertexAttribArray(5); 278548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindVertexBuffer(5, m_buffer[0], 0, 16); 278648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindVertexArray(m_vao[1]); 278748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glDisableVertexAttribArray(1); 278848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindVertexBuffer(1, 0, 0, 0); 278948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribIFormat(5, 4, GL_INT, 0); 279048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glEnableVertexAttribArray(5); 279148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindVertexBuffer(7, m_buffer[1], 0, 16); 279248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribBinding(5, 7); 279348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindVertexArray(0); 279448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 279548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos for (int i = 0; i < 10; ++i) 279648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 279748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindVertexArray(m_vao[i % 2]); 279848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, m_xfo[i % 2]); 279948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBeginTransformFeedback(GL_POINTS); 280048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glDrawArrays(GL_POINTS, 0, 1); 280148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glEndTransformFeedback(); 280248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 280348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* */ 280448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 280548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos IVec4* data = 280648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos static_cast<IVec4*>(glMapBufferRange(GL_TRANSFORM_FEEDBACK_BUFFER, 0, sizeof(IVec4), GL_MAP_READ_BIT)); 280748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (!IsEqual(*data, IVec4(20))) 280848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 28093890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski m_context.getTestContext().getLog() 28103890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski << tcu::TestLog::Message << "Data is: " << (*data)[0] << " " << (*data)[1] << " " << (*data)[2] 28113890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski << " " << (*data)[3] << ", data should be: 20 20 20 20." << tcu::TestLog::EndMessage; 281248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return ERROR; 281348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 281448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glUnmapBuffer(GL_TRANSFORM_FEEDBACK_BUFFER); 281548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 281648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 281748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (!RelinkProgram(11)) 281848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return ERROR; 281948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, 0); 282048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindVertexArray(m_vao[0]); 282148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glDisableVertexAttribArray(5); 282248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindVertexBuffer(5, 0, 0, 0); 282348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribIFormat(11, 4, GL_INT, 0); 282448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glEnableVertexAttribArray(11); 282548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos for (int i = 0; i < 10; ++i) 282648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 282748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindVertexBuffer(11, m_buffer[i % 2], 0, 16); 282848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, m_buffer[(i + 1) % 2]); 282948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBeginTransformFeedback(GL_POINTS); 283048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glDrawArrays(GL_POINTS, 0, 1); 283148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glEndTransformFeedback(); 283248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 283348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* */ 283448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 283548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos IVec4* data = 283648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos static_cast<IVec4*>(glMapBufferRange(GL_TRANSFORM_FEEDBACK_BUFFER, 0, sizeof(IVec4), GL_MAP_READ_BIT)); 283748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (!IsEqual(*data, IVec4(30))) 283848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 28393890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski m_context.getTestContext().getLog() 28403890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski << tcu::TestLog::Message << "Data is: " << (*data)[0] << " " << (*data)[1] << " " << (*data)[2] 28413890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski << " " << (*data)[3] << ", data should be: 30 30 30 30." << tcu::TestLog::EndMessage; 284248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return ERROR; 284348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 284448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 284548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 284648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return NO_ERROR; 284748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 284848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 284948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos bool RelinkProgram(GLuint index) 285048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 285148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindAttribLocation(m_po, index, "vs_in_data"); 285248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* setup XFB */ 285348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 285448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLchar* const v[1] = { "data" }; 285548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glTransformFeedbackVaryings(m_po, 1, v, GL_INTERLEAVED_ATTRIBS); 285648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 285748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glLinkProgram(m_po); 285848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (!CheckProgram(m_po)) 285948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return false; 286048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return true; 286148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 286248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}; 286348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos//============================================================================= 286448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos// 2.4 AdvancedLargeStrideAndOffsetsNewAndLegacyAPI 286548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos//----------------------------------------------------------------------------- 286648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosclass AdvancedLargeStrideAndOffsetsNewAndLegacyAPI : public VertexAttribBindingBase 286748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 286848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos bool pipeline; 286948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLuint m_vsp, m_fsp, m_ppo, m_ssbo, m_vao, m_vbo; 287048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 287148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos virtual long Setup() 287248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 287348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_vsp = 0; 287448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (pipeline) 287548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 287648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_vsp = m_fsp = 0; 287748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glGenProgramPipelines(1, &m_ppo); 287848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 287948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos else 288048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 288148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_ppo = 0; 288248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 288348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glGenBuffers(1, &m_ssbo); 288448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glGenVertexArrays(1, &m_vao); 288548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glGenBuffers(1, &m_vbo); 288648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return NO_ERROR; 288748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 288848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 288948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos virtual long Cleanup() 289048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 289148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glDisable(GL_RASTERIZER_DISCARD); 289248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (pipeline) 289348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 289448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glDeleteProgram(m_vsp); 289548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glDeleteProgram(m_fsp); 289648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glDeleteProgramPipelines(1, &m_ppo); 289748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 289848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos else 289948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 290048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glUseProgram(0); 290148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glDeleteProgram(m_ppo); 290248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 290348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glDeleteBuffers(1, &m_ssbo); 290448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glDeleteVertexArrays(1, &m_vao); 290548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glDeleteBuffers(1, &m_vbo); 290648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return NO_ERROR; 290748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 290848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 290948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos virtual long Run() 291048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 291148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (!IsSSBOInVSFSAvailable(2)) 291248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return NOT_SUPPORTED; 291348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const char* const glsl_vs = 291448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos "#version 310 es" NL "layout(location = 0) in vec2 vs_in_attrib0;" NL 291548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos "layout(location = 4) in ivec2 vs_in_attrib1;" NL "layout(location = 8) in uvec2 vs_in_attrib2;" NL 291648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos "layout(location = 15) in float vs_in_attrib3;" NL "layout(std430, binding = 1) buffer Output {" NL 291748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos " vec2 attrib0[4];" NL " ivec2 attrib1[4];" NL " uvec2 attrib2[4];" NL " float attrib3[4];" NL 291848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos "} g_output;" NL "void main() {" NL 291948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos " g_output.attrib0[2 * gl_InstanceID + gl_VertexID] = vs_in_attrib0;" NL 292048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos " g_output.attrib1[2 * gl_InstanceID + gl_VertexID] = vs_in_attrib1;" NL 292148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos " g_output.attrib2[2 * gl_InstanceID + gl_VertexID] = vs_in_attrib2;" NL 292248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos " g_output.attrib3[2 * gl_InstanceID + gl_VertexID] = vs_in_attrib3;" NL "}"; 292348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const char* const glsl_fs = "#version 310 es" NL "precision mediump float;" NL "out vec4 fs_out_color;" NL 292448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos "void main() {" NL " fs_out_color = vec4(0.5,0.5,0.5,1.0);" NL "}"; 292548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (pipeline) 292648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 292748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_vsp = glCreateShaderProgramv(GL_VERTEX_SHADER, 1, &glsl_vs); 292848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_fsp = glCreateShaderProgramv(GL_FRAGMENT_SHADER, 1, &glsl_fs); 292948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (!CheckProgram(m_vsp) || !CheckProgram(m_fsp)) 293048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return ERROR; 293148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glUseProgramStages(m_ppo, GL_VERTEX_SHADER_BIT, m_vsp); 293248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glUseProgramStages(m_ppo, GL_FRAGMENT_SHADER_BIT, m_fsp); 293348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 293448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos else 293548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 293648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos m_ppo = glCreateProgram(); 293748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLuint sh = glCreateShader(GL_VERTEX_SHADER); 293848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos const GLuint fsh = glCreateShader(GL_FRAGMENT_SHADER); 293948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glShaderSource(sh, 1, &glsl_vs, NULL); 294048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glShaderSource(fsh, 1, &glsl_fs, NULL); 294148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glCompileShader(sh); 294248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glCompileShader(fsh); 294348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glAttachShader(m_ppo, sh); 294448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glAttachShader(m_ppo, fsh); 294548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glDeleteShader(sh); 294648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glDeleteShader(fsh); 294748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glLinkProgram(m_ppo); 294848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (!CheckProgram(m_ppo)) 294948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return ERROR; 295048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 295148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 295248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* vbo */ 295348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 295448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindBuffer(GL_ARRAY_BUFFER, m_vbo); 295548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBufferData(GL_ARRAY_BUFFER, 100000, NULL, GL_STATIC_DRAW); 295648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLubyte* ptr = static_cast<GLubyte*>(glMapBufferRange(GL_ARRAY_BUFFER, 0, 100000, GL_MAP_WRITE_BIT)); 295748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos // attrib0 295848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *reinterpret_cast<Vec2*>(&ptr[16 + 0 * 2048]) = Vec2(1.0f, 2.0f); 295948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *reinterpret_cast<Vec2*>(&ptr[16 + 1 * 2048]) = Vec2(3.0f, 4.0f); 296048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos // attrib1 296148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *reinterpret_cast<IVec2*>(&ptr[128 + 0 * 2048]) = IVec2(5, 6); 296248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *reinterpret_cast<IVec2*>(&ptr[128 + 1 * 2048]) = IVec2(7, 8); 296348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos // attrib2 296448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *reinterpret_cast<UVec2*>(&ptr[1024 + 0 * 2048]) = UVec2(9, 10); 296548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *reinterpret_cast<UVec2*>(&ptr[1024 + 1 * 2048]) = UVec2(11, 12); 296648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos // attrib3 296748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *reinterpret_cast<float*>(&ptr[2032 + 0 * 2048]) = 13.0f; 296848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *reinterpret_cast<float*>(&ptr[2032 + 1 * 2048]) = 14.0f; 296948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glUnmapBuffer(GL_ARRAY_BUFFER); 297048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindBuffer(GL_ARRAY_BUFFER, 0); 297148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 297248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos // vao 297348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindVertexArray(m_vao); 297448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribFormat(0, 2, GL_FLOAT, GL_FALSE, 16); 297548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribIFormat(8, 2, GL_UNSIGNED_INT, 1024); 297648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribFormat(15, 1, GL_FLOAT, GL_FALSE, 2032); 297748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindBuffer(GL_ARRAY_BUFFER, m_vbo); 297848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribIPointer(4, 2, GL_INT, 2048, reinterpret_cast<void*>(128)); 297948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindBuffer(GL_ARRAY_BUFFER, 0); 298048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribBinding(8, 3); 298148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribBinding(15, 3); 298248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindVertexBuffer(0, m_vbo, 0, 2048); 298348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindVertexBuffer(3, m_vbo, 0, 2048); 298448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glEnableVertexAttribArray(0); 298548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glEnableVertexAttribArray(4); 298648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glEnableVertexAttribArray(8); 298748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glEnableVertexAttribArray(15); 298848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindVertexArray(0); 298948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 299048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos // ssbo 299148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos std::vector<GLubyte> data((sizeof(Vec2) + sizeof(IVec2) + sizeof(UVec2) + sizeof(float)) * 4, 0xff); 299248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 1, m_ssbo); 299348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBufferData(GL_SHADER_STORAGE_BUFFER, (GLsizeiptr)data.size(), &data[0], GL_DYNAMIC_DRAW); 299448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 299548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glEnable(GL_RASTERIZER_DISCARD); 299648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (pipeline) 299748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindProgramPipeline(m_ppo); 299848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos else 299948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glUseProgram(m_ppo); 300048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindVertexArray(m_vao); 300148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glDrawArraysInstanced(GL_POINTS, 0, 2, 2); 300248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 300348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* */ 300448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 300548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindBuffer(GL_SHADER_STORAGE_BUFFER, m_ssbo); 300648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLubyte* ptr = static_cast<GLubyte*>( 300748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glMapBufferRange(GL_SHADER_STORAGE_BUFFER, 0, (GLsizeiptr)data.size(), GL_MAP_READ_BIT)); 300848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos // attrib0 300948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos Vec2 i0_v0_a0 = *reinterpret_cast<Vec2*>(&ptr[0]); 301048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos Vec2 i0_v1_a0 = *reinterpret_cast<Vec2*>(&ptr[8]); 301148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos Vec2 i1_v0_a0 = *reinterpret_cast<Vec2*>(&ptr[16]); 301248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos Vec2 i1_v1_a0 = *reinterpret_cast<Vec2*>(&ptr[24]); 301348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (!IsEqual(i0_v0_a0, Vec2(1.0f, 2.0f))) 301448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return ERROR; 301548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (!IsEqual(i0_v1_a0, Vec2(3.0f, 4.0f))) 301648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return ERROR; 301748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (!IsEqual(i1_v0_a0, Vec2(1.0f, 2.0f))) 301848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return ERROR; 301948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (!IsEqual(i1_v1_a0, Vec2(3.0f, 4.0f))) 302048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return ERROR; 302148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos // attrib1 302248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos IVec2 i0_v0_a1 = *reinterpret_cast<IVec2*>(&ptr[32]); 302348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos IVec2 i0_v1_a1 = *reinterpret_cast<IVec2*>(&ptr[40]); 302448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos IVec2 i1_v0_a1 = *reinterpret_cast<IVec2*>(&ptr[48]); 302548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos IVec2 i1_v1_a1 = *reinterpret_cast<IVec2*>(&ptr[56]); 302648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (!IsEqual(i0_v0_a1, IVec2(5, 6))) 302748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return ERROR; 302848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (!IsEqual(i0_v1_a1, IVec2(7, 8))) 302948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return ERROR; 303048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (!IsEqual(i1_v0_a1, IVec2(5, 6))) 303148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return ERROR; 303248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (!IsEqual(i1_v1_a1, IVec2(7, 8))) 303348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return ERROR; 303448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos // attrib2 303548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos UVec2 i0_v0_a2 = *reinterpret_cast<UVec2*>(&ptr[64]); 303648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos UVec2 i0_v1_a2 = *reinterpret_cast<UVec2*>(&ptr[72]); 303748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos UVec2 i1_v0_a2 = *reinterpret_cast<UVec2*>(&ptr[80]); 303848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos UVec2 i1_v1_a2 = *reinterpret_cast<UVec2*>(&ptr[88]); 303948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (!IsEqual(i0_v0_a2, UVec2(9, 10))) 304048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return ERROR; 304148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (!IsEqual(i0_v1_a2, UVec2(11, 12))) 304248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return ERROR; 304348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (!IsEqual(i1_v0_a2, UVec2(9, 10))) 304448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return ERROR; 304548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (!IsEqual(i1_v1_a2, UVec2(11, 12))) 304648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return ERROR; 304748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos // attrib3 304848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos float i0_v0_a3 = *reinterpret_cast<float*>(&ptr[96]); 304948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos float i0_v1_a3 = *reinterpret_cast<float*>(&ptr[100]); 305048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos float i1_v0_a3 = *reinterpret_cast<float*>(&ptr[104]); 305148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos float i1_v1_a3 = *reinterpret_cast<float*>(&ptr[108]); 305248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (i0_v0_a3 != 13.0f) 305348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return ERROR; 305448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (i0_v1_a3 != 14.0f) 305548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return ERROR; 305648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (i1_v0_a3 != 13.0f) 305748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return ERROR; 305848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (i1_v1_a3 != 14.0f) 305948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return ERROR; 306048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glUnmapBuffer(GL_SHADER_STORAGE_BUFFER); 306148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 306248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return NO_ERROR; 306348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 306448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 306548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulospublic: 306648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos AdvancedLargeStrideAndOffsetsNewAndLegacyAPI() : pipeline(true) 306748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 306848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 306948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}; 307048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos//============================================================================= 307148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos// 4.1 NegativeBindVertexBuffer 307248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos//----------------------------------------------------------------------------- 307348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosclass NegativeBindVertexBuffer : public VertexAttribBindingBase 307448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 307548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 307648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLuint m_vao, m_vbo; 307748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 307848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos virtual long Setup() 307948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 308048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glGenVertexArrays(1, &m_vao); 308148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glGenBuffers(1, &m_vbo); 308248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return NO_ERROR; 308348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 308448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 308548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos virtual long Cleanup() 308648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 308748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glDeleteVertexArrays(1, &m_vao); 308848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glDeleteBuffers(1, &m_vbo); 308948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return NO_ERROR; 309048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 309148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 309248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos virtual long Run() 309348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 309448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* 309548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos Errors 309648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos An INVALID_OPERATION error is generated if buffer is not zero or a name 309748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos returned from a previous call to GenBuffers, or if such a name has since been 309848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos deleted with DeleteBuffers. 309948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos An INVALID_VALUE error is generated if bindingindex is greater than or 310048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos equal to the value of MAX_VERTEX_ATTRIB_BINDINGS. 310148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos OpenGL 4.4 (Core Profile) - July 21, 2013 310248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 10.3. VERTEX ARRAYS 315 310348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos An INVALID_VALUE error is generated if stride or offset is negative, or if 310448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos stride is greater than the value of MAX_VERTEX_ATTRIB_STRIDE. 310548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos An INVALID_OPERATION error is generated if no vertex array object is 310648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos bound. 310748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos */ 310848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindBuffer(GL_ARRAY_BUFFER, m_vbo); 310948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBufferData(GL_ARRAY_BUFFER, 1000, NULL, GL_STATIC_DRAW); 311048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindBuffer(GL_ARRAY_BUFFER, 0); 311148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 311248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindVertexArray(m_vao); 311348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 311448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindVertexBuffer(0, 1234, 0, 12); 311548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (glGetError() != GL_INVALID_OPERATION) 311648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 31173890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski m_context.getTestContext().getLog() 31183890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski << tcu::TestLog::Message << "INVALID_OPERATION should be generated (buffer name not genned)." 31193890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski << tcu::TestLog::EndMessage; 312048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return ERROR; 312148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 312248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 312348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLint p; 312448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glGetIntegerv(GL_MAX_VERTEX_ATTRIB_BINDINGS, &p); 312548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindVertexBuffer(p + 1, m_vbo, 0, 12); 312648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (glGetError() != GL_INVALID_VALUE) 312748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 31283890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski m_context.getTestContext().getLog() 31293890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski << tcu::TestLog::Message 31303890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski << "INVALID_VALUE should be generated (bindingIndex greater than GL_MAX_VERTEX_ATTRIB_BINDINGS)." 31313890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski << tcu::TestLog::EndMessage; 313248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return ERROR; 313348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 313448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 313548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindVertexBuffer(0, m_vbo, -10, 12); 313648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (glGetError() != GL_INVALID_VALUE) 313748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 31383890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski m_context.getTestContext().getLog() 31393890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski << tcu::TestLog::Message << "INVALID_VALUE should be generated (negative offset)." 31403890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski << tcu::TestLog::EndMessage; 314148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return ERROR; 314248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 314348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindVertexBuffer(0, m_vbo, 0, -12); 314448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (glGetError() != GL_INVALID_VALUE) 314548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 31463890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski m_context.getTestContext().getLog() 31473890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski << tcu::TestLog::Message << "INVALID_VALUE should be generated (negative stride)." 31483890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski << tcu::TestLog::EndMessage; 314948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return ERROR; 315048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 315148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 315248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glGetIntegerv(GL_MAX_VERTEX_ATTRIB_STRIDE, &p); 315348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindVertexBuffer(0, m_vbo, 0, p + 4); 315448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (glGetError() != GL_INVALID_VALUE) 315548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 31563890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski m_context.getTestContext().getLog() 31573890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski << tcu::TestLog::Message 31583890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski << "INVALID_VALUE should be generated (stride greater than GL_MAX_VERTEX_ATTRIB_STRIDE)." 31593890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski << tcu::TestLog::EndMessage; 316048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return ERROR; 316148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 316248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 316348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindVertexArray(0); 316448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindVertexBuffer(0, m_vbo, 0, 12); 316548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (glGetError() != GL_INVALID_OPERATION) 316648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 31673890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski m_context.getTestContext().getLog() 31683890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski << tcu::TestLog::Message << "INVALID_OPERATION should be generated (default VAO)." 31693890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski << tcu::TestLog::EndMessage; 317048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return ERROR; 317148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 317248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 317348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return NO_ERROR; 317448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 317548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}; 317648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos//============================================================================= 317748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos// 4.2 NegativeVertexAttribFormat 317848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos//----------------------------------------------------------------------------- 317948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosclass NegativeVertexAttribFormat : public VertexAttribBindingBase 318048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 318148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 318248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLuint m_vao, m_vbo; 318348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 318448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos virtual long Setup() 318548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 318648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glGenVertexArrays(1, &m_vao); 318748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glGenBuffers(1, &m_vbo); 318848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return NO_ERROR; 318948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 319048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 319148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos virtual long Cleanup() 319248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 319348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glDeleteVertexArrays(1, &m_vao); 319448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glDeleteBuffers(1, &m_vbo); 319548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return NO_ERROR; 319648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 319748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 319848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos virtual long Run() 319948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 320048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* 320148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos Errors 320248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos An INVALID_VALUE error is generated if attribindex is greater than or 320348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos equal to the value of MAX_VERTEX_ATTRIBS. 320448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos An INVALID_VALUE error is generated if size is not one of the values 320548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos shown in table 10.2 for the corresponding command. 320648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos An INVALID_ENUM error is generated if type is not one of the parameter 320748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos token names from table 8.2 corresponding to one of the allowed GL data types 320848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos for that command as shown in table 10.2. 320948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos An INVALID_OPERATION error is generated under any of the following 321048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos conditions: 321148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos - if no vertex array object is currently bound (see section 10.4); 321248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos - type is INT_2_10_10_10_REV or UNSIGNED_INT_2_10_10_10_- 321348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos REV, and size is not 4; 321448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos An INVALID_VALUE error is generated if relativeoffset is larger than the 321548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos value of MAX_VERTEX_ATTRIB_RELATIVE_OFFSET. 321648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos */ 321748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindBuffer(GL_ARRAY_BUFFER, m_vbo); 321848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBufferData(GL_ARRAY_BUFFER, 1000, NULL, GL_STATIC_DRAW); 321948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindBuffer(GL_ARRAY_BUFFER, 0); 322048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 322148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindVertexArray(m_vao); 322248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 322348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLint p; 322448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glGetIntegerv(GL_MAX_VERTEX_ATTRIBS, &p); 322548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribFormat(p + 1, 4, GL_FLOAT, GL_FALSE, 0); 322648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (glGetError() != GL_INVALID_VALUE) 322748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 32283890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski m_context.getTestContext().getLog() 32293890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski << tcu::TestLog::Message 32303890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski << "INVALID_VALUE should be generated (attribindex greater than GL_MAX_VERTEX_ATTRIBS)." 32313890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski << tcu::TestLog::EndMessage; 323248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return ERROR; 323348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 323448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribIFormat(p + 2, 4, GL_INT, 0); 323548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (glGetError() != GL_INVALID_VALUE) 323648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 32373890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski m_context.getTestContext().getLog() 32383890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski << tcu::TestLog::Message 32393890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski << "INVALID_VALUE should be generated (attribindex greater than GL_MAX_VERTEX_ATTRIBS)." 32403890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski << tcu::TestLog::EndMessage; 324148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return ERROR; 324248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 324348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribFormat(0, 0, GL_FLOAT, GL_FALSE, 0); 324448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (glGetError() != GL_INVALID_VALUE) 324548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 32463890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski m_context.getTestContext().getLog() 32473890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski << tcu::TestLog::Message << "INVALID_VALUE should be generated (invalid number of components)." 32483890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski << tcu::TestLog::EndMessage; 324948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return ERROR; 325048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 325148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribFormat(0, 5, GL_FLOAT, GL_FALSE, 0); 325248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (glGetError() != GL_INVALID_VALUE) 325348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 32543890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski m_context.getTestContext().getLog() 32553890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski << tcu::TestLog::Message << "INVALID_VALUE should be generated (invalid number of components)." 32563890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski << tcu::TestLog::EndMessage; 325748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return ERROR; 325848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 325948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribIFormat(0, 5, GL_INT, 0); 326048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (glGetError() != GL_INVALID_VALUE) 326148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 32623890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski m_context.getTestContext().getLog() 32633890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski << tcu::TestLog::Message << "INVALID_VALUE should be generated (invalid number of components)." 32643890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski << tcu::TestLog::EndMessage; 326548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return ERROR; 326648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 326748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribFormat(0, 4, GL_R32F, GL_FALSE, 0); 326848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (glGetError() != GL_INVALID_ENUM) 326948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 32703890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski m_context.getTestContext().getLog() 32713890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski << tcu::TestLog::Message << "INVALID_ENUM should be generated (invalid type)." 32723890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski << tcu::TestLog::EndMessage; 327348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return ERROR; 327448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 327548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribIFormat(0, 4, GL_FLOAT, 0); 327648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (glGetError() != GL_INVALID_ENUM) 327748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 32783890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski m_context.getTestContext().getLog() 32793890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski << tcu::TestLog::Message << "INVALID_ENUM should be generated (invalid type)." 32803890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski << tcu::TestLog::EndMessage; 328148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return ERROR; 328248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 328348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribFormat(0, 3, GL_INT_2_10_10_10_REV, GL_FALSE, 0); 328448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (glGetError() != GL_INVALID_OPERATION) 328548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 32863890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski m_context.getTestContext().getLog() 32873890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski << tcu::TestLog::Message 32883890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski << "INVALID_OPERATION should be generated (invalid number of components for packed type)." 32893890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski << tcu::TestLog::EndMessage; 329048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return ERROR; 329148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 329248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glGetIntegerv(GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET, &p); 329348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribFormat(0, 4, GL_FLOAT, GL_FALSE, p + 10); 329448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (glGetError() != GL_INVALID_VALUE) 329548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 32963890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski m_context.getTestContext().getLog() 32973890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski << tcu::TestLog::Message << "INVALID_VALUE should be generated (relativeoffset greater than " 32983890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski "GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET)." 32993890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski << tcu::TestLog::EndMessage; 330048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return ERROR; 330148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 330248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribIFormat(0, 4, GL_INT, p + 10); 330348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (glGetError() != GL_INVALID_VALUE) 330448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 33053890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski m_context.getTestContext().getLog() 33063890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski << tcu::TestLog::Message << "INVALID_VALUE should be generated (relativeoffset greater than " 33073890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski "GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET)." 33083890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski << tcu::TestLog::EndMessage; 330948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return ERROR; 331048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 331148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindVertexArray(0); 331248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribFormat(0, 4, GL_FLOAT, GL_FALSE, 0); 331348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (glGetError() != GL_INVALID_OPERATION) 331448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 33153890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski m_context.getTestContext().getLog() 33163890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski << tcu::TestLog::Message << "INVALID_OPERATION should be generated (default VAO)." 33173890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski << tcu::TestLog::EndMessage; 331848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return ERROR; 331948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 332048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribIFormat(0, 4, GL_INT, 0); 332148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (glGetError() != GL_INVALID_OPERATION) 332248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 33233890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski m_context.getTestContext().getLog() 33243890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski << tcu::TestLog::Message << "INVALID_OPERATION should be generated (default VAO)." 33253890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski << tcu::TestLog::EndMessage; 332648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return ERROR; 332748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 332848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return NO_ERROR; 332948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 333048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}; 333148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 333248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos//============================================================================= 333348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos// 4.3 NegativeVertexAttribBinding 333448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos//----------------------------------------------------------------------------- 333548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosclass NegativeVertexAttribBinding : public VertexAttribBindingBase 333648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 333748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLuint m_vao; 333848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 333948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos virtual long Setup() 334048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 334148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glGenVertexArrays(1, &m_vao); 334248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return NO_ERROR; 334348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 334448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 334548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos virtual long Cleanup() 334648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 334748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glDeleteVertexArrays(1, &m_vao); 334848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return NO_ERROR; 334948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 335048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 335148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos virtual long Run() 335248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 335348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* 335448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos Errors 335548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos An INVALID_VALUE error is generated if attribindex is greater than or 335648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos equal to the value of MAX_VERTEX_ATTRIBS. 335748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos An INVALID_VALUE error is generated if bindingindex is greater than or 335848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos equal to the value of MAX_VERTEX_ATTRIB_BINDINGS. 335948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos An INVALID_OPERATION error is generated if no vertex array object is 336048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos bound. 336148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos */ 336248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindVertexArray(m_vao); 336348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLint p; 336448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glGetIntegerv(GL_MAX_VERTEX_ATTRIBS, &p); 336548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribBinding(p + 1, 0); 336648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (glGetError() != GL_INVALID_VALUE) 336748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 33683890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski m_context.getTestContext().getLog() 33693890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski << tcu::TestLog::Message 33703890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski << "INVALID_VALUE should be generated (attribindex greater than GL_MAX_VERTEX_ATTRIBS)." 33713890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski << tcu::TestLog::EndMessage; 337248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return ERROR; 337348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 337448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glGetIntegerv(GL_MAX_VERTEX_ATTRIB_BINDINGS, &p); 337548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribBinding(0, p + 1); 337648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (glGetError() != GL_INVALID_VALUE) 337748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 33783890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski m_context.getTestContext().getLog() 33793890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski << tcu::TestLog::Message 33803890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski << "INVALID_VALUE should be generated (bindingIndex greater than GL_MAX_VERTEX_ATTRIB_BINDINGS)." 33813890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski << tcu::TestLog::EndMessage; 338248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return ERROR; 338348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 338448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindVertexArray(0); 338548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexAttribBinding(0, 0); 338648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (glGetError() != GL_INVALID_OPERATION) 338748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 33883890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski m_context.getTestContext().getLog() 33893890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski << tcu::TestLog::Message << "INVALID_OPERATION should be generated (default VAO)." 33903890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski << tcu::TestLog::EndMessage; 339148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return ERROR; 339248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 339348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return NO_ERROR; 339448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 339548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}; 339648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos//============================================================================= 339748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos// 4.4 NegativeVertexAttribDivisor 339848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos//----------------------------------------------------------------------------- 339948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosclass NegativeVertexAttribDivisor : public VertexAttribBindingBase 340048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 340148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 340248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLuint m_vao; 340348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 340448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos virtual long Setup() 340548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 340648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glGenVertexArrays(1, &m_vao); 340748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return NO_ERROR; 340848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 340948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 341048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos virtual long Cleanup() 341148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 341248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glDeleteVertexArrays(1, &m_vao); 341348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return NO_ERROR; 341448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 341548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 341648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos virtual long Run() 341748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 341848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos /* 341948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos Errors 342048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos An INVALID_VALUE error is generated if index is greater than or equal to 342148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos the value of MAX_VERTEX_ATTRIBS. 342248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos An INVALID_OPERATION error is generated if no vertex array object is 342348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos bound. 342448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos */ 342548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindVertexArray(m_vao); 342648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos GLint p; 342748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glGetIntegerv(GL_MAX_VERTEX_ATTRIBS, &p); 342848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexBindingDivisor(p + 1, 1); 342948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (glGetError() != GL_INVALID_VALUE) 343048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 34313890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski m_context.getTestContext().getLog() 34323890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski << tcu::TestLog::Message 34333890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski << "INVALID_VALUE should be generated (bindingIndex greater than GL_MAX_VERTEX_ATTRIBS)." 34343890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski << tcu::TestLog::EndMessage; 343548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return ERROR; 343648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 343748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glBindVertexArray(0); 343848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos glVertexBindingDivisor(0, 1); 343948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos if (glGetError() != GL_INVALID_OPERATION) 344048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos { 34413890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski m_context.getTestContext().getLog() 34423890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski << tcu::TestLog::Message << "INVALID_OPERATION should be generated (default VAO)." 34433890a411e1df7421b95bbdbff43f0763f323675fPiotr Byszewski << tcu::TestLog::EndMessage; 344448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return ERROR; 344548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 344648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos return NO_ERROR; 344748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos } 344848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}; 344948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos//============================================================================= 345048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 345148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} // namespace 345248087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosVertexAttribBindingTests::VertexAttribBindingTests(glcts::Context& context) 345348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos : TestCaseGroup(context, "vertex_attrib_binding", "") 345448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 345548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 345648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 345748087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosVertexAttribBindingTests::~VertexAttribBindingTests(void) 345848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 345948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 346048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos 346148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid VertexAttribBindingTests::init() 346248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{ 346348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos using namespace glcts; 346448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos addChild(new TestSubcase(m_context, "basic-usage", TestSubcase::Create<BasicUsage>)); 346548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos addChild(new TestSubcase(m_context, "basic-input-case1", TestSubcase::Create<BasicInputCase1>)); 346648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos addChild(new TestSubcase(m_context, "basic-input-case2", TestSubcase::Create<BasicInputCase2>)); 346748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos addChild(new TestSubcase(m_context, "basic-input-case3", TestSubcase::Create<BasicInputCase3>)); 346848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos addChild(new TestSubcase(m_context, "basic-input-case4", TestSubcase::Create<BasicInputCase4>)); 346948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos addChild(new TestSubcase(m_context, "basic-input-case5", TestSubcase::Create<BasicInputCase5>)); 347048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos addChild(new TestSubcase(m_context, "basic-input-case6", TestSubcase::Create<BasicInputCase6>)); 347148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos addChild(new TestSubcase(m_context, "basic-input-case8", TestSubcase::Create<BasicInputCase8>)); 347248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos addChild(new TestSubcase(m_context, "basic-input-case9", TestSubcase::Create<BasicInputCase9>)); 347348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos addChild(new TestSubcase(m_context, "basic-input-case11", TestSubcase::Create<BasicInputCase11>)); 347448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos addChild(new TestSubcase(m_context, "basic-input-case12", TestSubcase::Create<BasicInputCase12>)); 347548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos addChild(new TestSubcase(m_context, "basic-inputI-case1", TestSubcase::Create<BasicInputICase1>)); 347648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos addChild(new TestSubcase(m_context, "basic-inputI-case2", TestSubcase::Create<BasicInputICase2>)); 347748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos addChild(new TestSubcase(m_context, "basic-inputI-case3", TestSubcase::Create<BasicInputICase3>)); 347848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos addChild(new TestSubcase(m_context, "basic-state1", TestSubcase::Create<BasicState1>)); 347948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos addChild(new TestSubcase(m_context, "basic-state2", TestSubcase::Create<BasicState2>)); 348048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos addChild(new TestSubcase(m_context, "advanced-bindingUpdate", TestSubcase::Create<AdvancedBindingUpdate>)); 348148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos addChild(new TestSubcase(m_context, "advanced-iterations", TestSubcase::Create<AdvancedIterations>)); 348248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos addChild(new TestSubcase(m_context, "advanced-largeStrideAndOffsetsNewAndLegacyAPI", 348348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos TestSubcase::Create<AdvancedLargeStrideAndOffsetsNewAndLegacyAPI>)); 348448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos addChild(new TestSubcase(m_context, "negative-bindVertexBuffer", TestSubcase::Create<NegativeBindVertexBuffer>)); 348548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos addChild( 348648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos new TestSubcase(m_context, "negative-vertexAttribFormat", TestSubcase::Create<NegativeVertexAttribFormat>)); 348748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos addChild( 348848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos new TestSubcase(m_context, "negative-vertexAttribBinding", TestSubcase::Create<NegativeVertexAttribBinding>)); 348948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos addChild( 349048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos new TestSubcase(m_context, "negative-vertexAttribDivisor", TestSubcase::Create<NegativeVertexAttribDivisor>)); 349148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 349248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} 3493