1*35238bceSAndroid Build Coastguard Worker /*------------------------------------------------------------------------- 2*35238bceSAndroid Build Coastguard Worker * drawElements Quality Program Reference Renderer 3*35238bceSAndroid Build Coastguard Worker * ----------------------------------------------- 4*35238bceSAndroid Build Coastguard Worker * 5*35238bceSAndroid Build Coastguard Worker * Copyright 2014 The Android Open Source Project 6*35238bceSAndroid Build Coastguard Worker * 7*35238bceSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 8*35238bceSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 9*35238bceSAndroid Build Coastguard Worker * You may obtain a copy of the License at 10*35238bceSAndroid Build Coastguard Worker * 11*35238bceSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 12*35238bceSAndroid Build Coastguard Worker * 13*35238bceSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 14*35238bceSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 15*35238bceSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 16*35238bceSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 17*35238bceSAndroid Build Coastguard Worker * limitations under the License. 18*35238bceSAndroid Build Coastguard Worker * 19*35238bceSAndroid Build Coastguard Worker *//*! 20*35238bceSAndroid Build Coastguard Worker * \file 21*35238bceSAndroid Build Coastguard Worker * \brief Vertex packet and Vertex packet allocator 22*35238bceSAndroid Build Coastguard Worker *//*--------------------------------------------------------------------*/ 23*35238bceSAndroid Build Coastguard Worker 24*35238bceSAndroid Build Coastguard Worker #include "rrVertexPacket.hpp" 25*35238bceSAndroid Build Coastguard Worker 26*35238bceSAndroid Build Coastguard Worker namespace rr 27*35238bceSAndroid Build Coastguard Worker { 28*35238bceSAndroid Build Coastguard Worker VertexPacket(void)29*35238bceSAndroid Build Coastguard WorkerVertexPacket::VertexPacket(void) 30*35238bceSAndroid Build Coastguard Worker { 31*35238bceSAndroid Build Coastguard Worker } 32*35238bceSAndroid Build Coastguard Worker ~VertexPacket(void)33*35238bceSAndroid Build Coastguard WorkerVertexPacket::~VertexPacket(void) 34*35238bceSAndroid Build Coastguard Worker { 35*35238bceSAndroid Build Coastguard Worker } 36*35238bceSAndroid Build Coastguard Worker VertexPacketAllocator(const size_t numberOfVertexOutputs)37*35238bceSAndroid Build Coastguard WorkerVertexPacketAllocator::VertexPacketAllocator(const size_t numberOfVertexOutputs) 38*35238bceSAndroid Build Coastguard Worker : m_numberOfVertexOutputs(numberOfVertexOutputs) 39*35238bceSAndroid Build Coastguard Worker { 40*35238bceSAndroid Build Coastguard Worker } 41*35238bceSAndroid Build Coastguard Worker ~VertexPacketAllocator(void)42*35238bceSAndroid Build Coastguard WorkerVertexPacketAllocator::~VertexPacketAllocator(void) 43*35238bceSAndroid Build Coastguard Worker { 44*35238bceSAndroid Build Coastguard Worker for (size_t i = 0; i < m_allocations.size(); ++i) 45*35238bceSAndroid Build Coastguard Worker delete[] m_allocations[i]; 46*35238bceSAndroid Build Coastguard Worker m_allocations.clear(); 47*35238bceSAndroid Build Coastguard Worker } 48*35238bceSAndroid Build Coastguard Worker allocArray(size_t count)49*35238bceSAndroid Build Coastguard Workerstd::vector<VertexPacket *> VertexPacketAllocator::allocArray(size_t count) 50*35238bceSAndroid Build Coastguard Worker { 51*35238bceSAndroid Build Coastguard Worker if (!count) 52*35238bceSAndroid Build Coastguard Worker return std::vector<VertexPacket *>(); 53*35238bceSAndroid Build Coastguard Worker 54*35238bceSAndroid Build Coastguard Worker const size_t extraVaryings = (m_numberOfVertexOutputs == 0) ? (0) : (m_numberOfVertexOutputs - 1); 55*35238bceSAndroid Build Coastguard Worker const size_t packetSize = sizeof(VertexPacket) + extraVaryings * sizeof(GenericVec4); 56*35238bceSAndroid Build Coastguard Worker 57*35238bceSAndroid Build Coastguard Worker std::vector<VertexPacket *> retVal; 58*35238bceSAndroid Build Coastguard Worker int8_t *ptr = new int8_t[packetSize * count]; // throws bad_alloc => ok 59*35238bceSAndroid Build Coastguard Worker 60*35238bceSAndroid Build Coastguard Worker // *.push_back might throw bad_alloc 61*35238bceSAndroid Build Coastguard Worker try 62*35238bceSAndroid Build Coastguard Worker { 63*35238bceSAndroid Build Coastguard Worker // run ctors 64*35238bceSAndroid Build Coastguard Worker for (size_t i = 0; i < count; ++i) 65*35238bceSAndroid Build Coastguard Worker retVal.push_back(new (ptr + i * packetSize) VertexPacket()); // throws bad_alloc 66*35238bceSAndroid Build Coastguard Worker 67*35238bceSAndroid Build Coastguard Worker m_allocations.push_back(ptr); // throws bad_alloc 68*35238bceSAndroid Build Coastguard Worker } 69*35238bceSAndroid Build Coastguard Worker catch (std::bad_alloc &) 70*35238bceSAndroid Build Coastguard Worker { 71*35238bceSAndroid Build Coastguard Worker delete[] ptr; 72*35238bceSAndroid Build Coastguard Worker throw; 73*35238bceSAndroid Build Coastguard Worker } 74*35238bceSAndroid Build Coastguard Worker 75*35238bceSAndroid Build Coastguard Worker return retVal; 76*35238bceSAndroid Build Coastguard Worker } 77*35238bceSAndroid Build Coastguard Worker alloc(void)78*35238bceSAndroid Build Coastguard WorkerVertexPacket *VertexPacketAllocator::alloc(void) 79*35238bceSAndroid Build Coastguard Worker { 80*35238bceSAndroid Build Coastguard Worker const size_t poolSize = 8; 81*35238bceSAndroid Build Coastguard Worker 82*35238bceSAndroid Build Coastguard Worker if (m_singleAllocPool.empty()) 83*35238bceSAndroid Build Coastguard Worker m_singleAllocPool = allocArray(poolSize); 84*35238bceSAndroid Build Coastguard Worker 85*35238bceSAndroid Build Coastguard Worker VertexPacket *packet = *--m_singleAllocPool.end(); 86*35238bceSAndroid Build Coastguard Worker m_singleAllocPool.pop_back(); 87*35238bceSAndroid Build Coastguard Worker return packet; 88*35238bceSAndroid Build Coastguard Worker } 89*35238bceSAndroid Build Coastguard Worker 90*35238bceSAndroid Build Coastguard Worker } // namespace rr 91