/*-------------------------------------------------------------------------
 * drawElements Quality Program Reference Renderer
 * -----------------------------------------------
 *
 * Copyright 2014 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 *//*!
 * \file
 * \brief Primitive packet
 *//*--------------------------------------------------------------------*/

#include "rrPrimitivePacket.hpp"

#include "rrVertexPacket.hpp"

namespace rr
{

GeometryEmitter::GeometryEmitter (VertexPacketAllocator& vpalloc, size_t numVertices)
	: m_vpalloc		(vpalloc)
	, m_numEmitted	(0)
	, m_maxVertices	(numVertices)
{
}

void GeometryEmitter::EmitVertex (const tcu::Vec4& position, float pointSize, const GenericVec4* varyings, int primitiveID)
{
	VertexPacket* packet;

	if (++m_numEmitted > m_maxVertices)
	{
		DE_ASSERT(!"Undefined results, too many vertices emitted.");
		return;
	}

	packet = m_vpalloc.alloc();

	packet->position = position;
	packet->pointSize = pointSize;
	packet->primitiveID = primitiveID;

	for (size_t ndx = 0; ndx < m_vpalloc.getNumVertexOutputs(); ++ndx)
		packet->outputs[ndx] = varyings[ndx];

	m_emitted.push_back(packet);
}

void GeometryEmitter::EndPrimitive (void)
{
	m_numEmitted = 0;
	m_emitted.push_back(DE_NULL);
}

void GeometryEmitter::moveEmittedTo (std::vector<VertexPacket*>& output)
{
	m_emitted.swap(output);
	m_emitted.clear();
}

} // rr
