13c827367444ee418f129b2c238299f49d3264554Jarkko Poyry/*------------------------------------------------------------------------- 23c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * drawElements Quality Program OpenGL ES Utilities 33c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * ------------------------------------------------ 43c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * 53c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * Copyright 2014 The Android Open Source Project 63c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * 73c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * Licensed under the Apache License, Version 2.0 (the "License"); 83c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * you may not use this file except in compliance with the License. 93c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * You may obtain a copy of the License at 103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * 113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * http://www.apache.org/licenses/LICENSE-2.0 123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * 133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * Unless required by applicable law or agreed to in writing, software 143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * distributed under the License is distributed on an "AS IS" BASIS, 153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * See the License for the specific language governing permissions and 173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * limitations under the License. 183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * 193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*! 203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \file 213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \brief SGLR Context utilities. 223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*--------------------------------------------------------------------*/ 233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "sglrContextUtil.hpp" 253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "sglrContext.hpp" 263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "glwEnums.hpp" 273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 283c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace sglr 293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 313c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid drawQuad (sglr::Context& ctx, deUint32 program, const tcu::Vec3& p0, const tcu::Vec3& p1) 323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const glu::ContextType ctxType = ctx.getType(); 343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (glu::isContextTypeGLCore(ctxType) || (contextSupports(ctxType, glu::ApiType::es(3,1)))) 363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry drawQuadWithVaoBuffers(ctx, program, p0, p1); 373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry else 383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry DE_ASSERT(isContextTypeES(ctxType)); 403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry drawQuadWithClientPointers(ctx, program, p0, p1); 413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 443c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid drawQuadWithVaoBuffers (sglr::Context& ctx, deUint32 program, const tcu::Vec3& p0, const tcu::Vec3& p1) 453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // Vertex data. 473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry float hz = (p0.z() + p1.z()) * 0.5f; 483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry float position[] = 493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry p0.x(), p0.y(), p0.z(), 1.0f, 513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry p0.x(), p1.y(), hz, 1.0f, 523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry p1.x(), p0.y(), hz, 1.0f, 533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry p1.x(), p1.y(), p1.z(), 1.0f 543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry }; 553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const float coord[] = 563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 0.0f, 0.0f, 583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 0.0f, 1.0f, 593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1.0f, 0.0f, 603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1.0f, 1.0f 613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry }; 623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const deUint16 indices[] = { 0, 1, 2, 2, 1, 3 }; 633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry deInt32 posLoc = ctx.getAttribLocation(program, "a_position"); 653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry deInt32 coordLoc = ctx.getAttribLocation(program, "a_coord"); 663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry deUint32 vaoID; 673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry deUint32 bufIDs[2]; 683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry ctx.genVertexArrays(1, &vaoID); 703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry ctx.bindVertexArray(vaoID); 713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry ctx.genBuffers(2, &bufIDs[0]); 733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry ctx.useProgram(program); 753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry TCU_CHECK(posLoc >= 0); 763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry ctx.bindBuffer(GL_ARRAY_BUFFER, bufIDs[0]); 783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry ctx.bufferData(GL_ARRAY_BUFFER, DE_LENGTH_OF_ARRAY(position)*sizeof(float), &position[0], GL_STATIC_DRAW); 793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry ctx.enableVertexAttribArray(posLoc); 813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry ctx.vertexAttribPointer(posLoc, 4, GL_FLOAT, GL_FALSE, 0, 0); 823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry ctx.bindBuffer(GL_ARRAY_BUFFER, 0); 843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (coordLoc >= 0) 873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry ctx.bindBuffer(GL_ARRAY_BUFFER, bufIDs[1]); 893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry ctx.bufferData(GL_ARRAY_BUFFER, DE_LENGTH_OF_ARRAY(coord)*sizeof(float), &coord[0], GL_STATIC_DRAW); 903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry ctx.enableVertexAttribArray(coordLoc); 923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry ctx.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, 0); 933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry ctx.bindBuffer(GL_ARRAY_BUFFER, 0); 953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry deUint32 ndxID; 993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry ctx.genBuffers(1, &ndxID); 1003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry ctx.bindBuffer(GL_ELEMENT_ARRAY_BUFFER, ndxID); 1023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry ctx.bufferData(GL_ELEMENT_ARRAY_BUFFER, DE_LENGTH_OF_ARRAY(indices)*sizeof(deUint16), &indices[0], GL_STATIC_DRAW); 1033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry ctx.drawElements(GL_TRIANGLES, DE_LENGTH_OF_ARRAY(indices), GL_UNSIGNED_SHORT, 0); 1053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry ctx.bindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); 1073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry ctx.deleteBuffers(1, &ndxID); 1083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 1093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry ctx.deleteBuffers(2, &bufIDs[0]); 1113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry ctx.deleteVertexArrays(1, &vaoID); 1123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 1133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1143c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid drawQuadWithClientPointers (sglr::Context& ctx, deUint32 program, const tcu::Vec3& p0, const tcu::Vec3& p1) 1153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{ 1163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry // Vertex data. 1173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry float hz = (p0.z() + p1.z()) * 0.5f; 1183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry float position[] = 1193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 1203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry p0.x(), p0.y(), p0.z(), 1.0f, 1213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry p0.x(), p1.y(), hz, 1.0f, 1223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry p1.x(), p0.y(), hz, 1.0f, 1233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry p1.x(), p1.y(), p1.z(), 1.0f 1243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry }; 1253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const float coord[] = 1263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 1273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 0.0f, 0.0f, 1283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 0.0f, 1.0f, 1293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1.0f, 0.0f, 1303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1.0f, 1.0f 1313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry }; 1323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry const deUint16 indices[] = { 0, 1, 2, 2, 1, 3 }; 1333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry deInt32 posLoc = ctx.getAttribLocation(program, "a_position"); 1353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry deInt32 coordLoc = ctx.getAttribLocation(program, "a_coord"); 1363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry ctx.useProgram(program); 1383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry TCU_CHECK(posLoc >= 0); 1393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 1403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry ctx.enableVertexAttribArray(posLoc); 1413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry ctx.vertexAttribPointer(posLoc, 4, GL_FLOAT, GL_FALSE, 0, &position[0]); 1423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 1433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (coordLoc >= 0) 1453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry { 1463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry ctx.enableVertexAttribArray(coordLoc); 1473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry ctx.vertexAttribPointer(coordLoc, 2, GL_FLOAT, GL_FALSE, 0, &coord[0]); 1483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry } 1493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry ctx.drawElements(GL_TRIANGLES, DE_LENGTH_OF_ARRAY(indices), GL_UNSIGNED_SHORT, &indices[0]); 1513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (posLoc >= 0) 1533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry ctx.disableVertexAttribArray(posLoc); 1543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry if (coordLoc >= 0) 1563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry ctx.disableVertexAttribArray(coordLoc); 1573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} 1583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry 1593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} //sglr 160