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