105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger/* 205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger Copyright 2010 Google Inc. 305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger 405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger Licensed under the Apache License, Version 2.0 (the "License"); 505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger you may not use this file except in compliance with the License. 605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger You may obtain a copy of the License at 705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger 805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger http://www.apache.org/licenses/LICENSE-2.0 905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger 1005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger Unless required by applicable law or agreed to in writing, software 1105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger distributed under the License is distributed on an "AS IS" BASIS, 1205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger See the License for the specific language governing permissions and 1405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger limitations under the License. 1505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger */ 1605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger 1705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger 1805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger#ifndef GrBufferAllocPool_DEFINED 1905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger#define GrBufferAllocPool_DEFINED 2005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger 2105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger#include "GrNoncopyable.h" 2205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger#include "GrTDArray.h" 2305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger#include "GrTArray.h" 2405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger#include "GrMemory.h" 2505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger 2605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerclass GrGeometryBuffer; 2705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerclass GrGpu; 2805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger 2905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger/** 3005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * A pool of geometry buffers tied to a GrGpu. 3105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * 3205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * The pool allows a client to make space for geometry and then put back excess 3305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * space if it over allocated. When a client is ready to draw from the pool 3405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * it calls unlock on the pool ensure buffers are ready for drawing. The pool 3505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * can be reset after drawing is completed to recycle space. 3605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * 3705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * At creation time a minimum per-buffer size can be specified. Additionally, 3805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * a number of buffers to preallocate can be specified. These will 3905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * be allocated at the min size and kept around until the pool is destroyed. 4005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger */ 4105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerclass GrBufferAllocPool : GrNoncopyable { 4205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger 4305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerpublic: 4405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger /** 4505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * Ensures all buffers are unlocked and have all data written to them. 4605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * Call before drawing using buffers from the pool. 4705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger */ 4805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger void unlock(); 4905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger 5005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger /** 5105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * Invalidates all the data in the pool, unrefs non-preallocated buffers. 5205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger */ 5305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger void reset(); 5405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger 5505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger /** 5605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * Gets the number of preallocated buffers that are yet to be used. 5705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger */ 5805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger int preallocatedBuffersRemaining() const; 5905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger 6005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger /** 6105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * gets the number of preallocated buffers 6205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger */ 6305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger int preallocatedBufferCount() const; 6405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger 6505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger /** 6605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * Frees data from makeSpaces in LIFO order. 6705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger */ 6805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger void putBack(size_t bytes); 6905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger 7005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger /** 7105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * Gets the GrGpu that this pool is associated with. 7205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger */ 7305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger GrGpu* getGpu() { return fGpu; } 7405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger 7505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerprotected: 7605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger /** 7787b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger * Used to determine what type of buffers to create. We could make the 7887b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger * createBuffer a virtual except that we want to use it in the cons for 7987b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger * pre-allocated buffers. 8087b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger */ 8187b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger enum BufferType { 8287b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger kVertex_BufferType, 8387b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger kIndex_BufferType, 8487b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger }; 8587b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger 8687b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger /** 8787b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger * Constructor 8887b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger * 8987b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger * @param gpu The GrGpu used to create the buffers. 9087b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger * @param bufferType The type of buffers to create. 9187b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger * @param frequentResetHint A hint that indicates that the pool 9287b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger * should expect frequent unlock() calls 9387b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger * (as opposed to many makeSpace / acquires 9487b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger * between resets). 9587b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger * @param bufferSize The minimum size of created buffers. 9687b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger * This value will be clamped to some 9787b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger * reasonable minimum. 9887b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger * @param preallocBufferCnt The pool will allocate this number of 9987b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger * buffers at bufferSize and keep them until it 10087b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger * is destroyed. 10187b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger */ 10287b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger GrBufferAllocPool(GrGpu* gpu, 10387b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger BufferType bufferType, 10487b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger bool frequentResetHint, 10587b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger size_t bufferSize = 0, 10687b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger int preallocBufferCnt = 0); 10787b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger 10887b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger virtual ~GrBufferAllocPool(); 10987b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger 11087b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger /** 11105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * Gets the size of the preallocated buffers. 11205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * 11305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * @return the size of preallocated buffers. 11405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger */ 11505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger size_t preallocatedBufferSize() const { 11605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger return fPreallocBuffers.count() ? fMinBlockSize : 0; 11705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger } 11805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger 11905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger /** 12005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * Returns a block of memory to hold data. A buffer designated to hold the 12105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * data is given to the caller. The buffer may or may not be locked. The 12205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * returned ptr remains valid until any of the following: 12305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * *makeSpace is called again. 12405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * *unlock is called. 12505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * *reset is called. 12605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * *this object is destroyed. 12705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * 12805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * Once unlock on the pool is called the data is guaranteed to be in the 12905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * buffer at the offset indicated by offset. Until that time it may be 13005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * in temporary storage and/or the buffer may be locked. 13105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * 13205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * @param size the amount of data to make space for 13305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * @param alignment alignment constraint from start of buffer 13405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * @param buffer returns the buffer that will hold the data. 13505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * @param offset returns the offset into buffer of the data. 13605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * @return pointer to where the client should write the data. 13705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger */ 13805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger void* makeSpace(size_t size, 13905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger size_t alignment, 14005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger const GrGeometryBuffer** buffer, 14105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger size_t* offset); 14205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger 14305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger /** 14405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * Gets the number of items of a size that can be added to the current 14505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * buffer without spilling to another buffer. If the pool has been reset, or 14605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * the previous makeSpace completely exhausted a buffer then the returned 14705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * size will be the size of the next available preallocated buffer, or zero 14805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * if no preallocated buffer remains available. It is assumed that items 14905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * should be itemSize-aligned from the start of a buffer. 15005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * 15105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * @return the number of items that would fit in the current buffer. 15205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger */ 15305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger int currentBufferItems(size_t itemSize) const; 15405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger 15505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger GrGeometryBuffer* createBuffer(size_t size); 15605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger 15705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerprivate: 15805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger 15987b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger // The GrGpu must be able to clear the ref of pools it creates as members 16087b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger friend class GrGpu; 16187b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger void releaseGpuRef(); 16287b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger 16305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger struct BufferBlock { 16405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger size_t fBytesFree; 16505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger GrGeometryBuffer* fBuffer; 16605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger }; 16705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger 16805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger bool createBlock(size_t requestSize); 16905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger void destroyBlock(); 17005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger void flushCpuData(GrGeometryBuffer* buffer, size_t flushSize); 17105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger#if GR_DEBUG 17205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger void validate() const; 17305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger#endif 17405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger 17505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger GrGpu* fGpu; 17687b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger bool fGpuIsReffed; 17705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger bool fFrequentResetHint; 17805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger GrTDArray<GrGeometryBuffer*> fPreallocBuffers; 17905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger size_t fMinBlockSize; 18005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger BufferType fBufferType; 18105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger 18205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger GrTArray<BufferBlock> fBlocks; 18305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger int fPreallocBuffersInUse; 18405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger int fFirstPreallocBuffer; 18505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger GrAutoMalloc fCpuData; 18605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger void* fBufferPtr; 18705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger}; 18805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger 18905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerclass GrVertexBuffer; 19005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger 19105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger/** 19205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * A GrBufferAllocPool of vertex buffers 19305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger */ 19405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerclass GrVertexBufferAllocPool : public GrBufferAllocPool { 19505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerpublic: 19605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger /** 19705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * Constructor 19805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * 19905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * @param gpu The GrGpu used to create the vertex buffers. 20005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * @param frequentResetHint A hint that indicates that the pool 20105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * should expect frequent unlock() calls 20205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * (as opposed to many makeSpace / acquires 20305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * between resets). 20405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * @param bufferSize The minimum size of created VBs This value 20505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * will be clamped to some reasonable minimum. 20605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * @param preallocBufferCnt The pool will allocate this number of VBs at 20705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * bufferSize and keep them until it is 20805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * destroyed. 20905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger */ 21005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger GrVertexBufferAllocPool(GrGpu* gpu, 21105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger bool frequentResetHint, 21205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger size_t bufferSize = 0, 21305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger int preallocBufferCnt = 0); 21405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger 21505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger /** 21605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * Returns a block of memory to hold vertices. A buffer designated to hold 21705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * the vertices given to the caller. The buffer may or may not be locked. 21805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * The returned ptr remains valid until any of the following: 21905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * *makeSpace is called again. 22005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * *unlock is called. 22105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * *reset is called. 22205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * *this object is destroyed. 22305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * 22405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * Once unlock on the pool is called the vertices are guaranteed to be in 22505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * the buffer at the offset indicated by startVertex. Until that time they 22605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * may be in temporary storage and/or the buffer may be locked. 22705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * 22805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * @param layout specifies type of vertices to allocate space for 22905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * @param vertexCount number of vertices to allocate space for 23005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * @param buffer returns the vertex buffer that will hold the 23105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * vertices. 23205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * @param startVertex returns the offset into buffer of the first vertex. 23305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * In units of the size of a vertex from layout param. 23405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * @return pointer to first vertex. 23505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger */ 23605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger void* makeSpace(GrVertexLayout layout, 23705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger int vertexCount, 23805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger const GrVertexBuffer** buffer, 23905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger int* startVertex); 24005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger 24105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger /** 24205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * Shortcut to make space and then write verts into the made space. 24305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger */ 24405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger bool appendVertices(GrVertexLayout layout, 24505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger int vertexCount, 24605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger const void* vertices, 24705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger const GrVertexBuffer** buffer, 24805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger int* startVertex); 24905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger 25005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger /** 25105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * Gets the number of vertices that can be added to the current VB without 25205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * spilling to another VB. If the pool has been reset, or the previous 25305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * makeSpace completely exhausted a VB then the returned number of vertices 25405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * would fit in the next available preallocated buffer. If any makeSpace 25505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * would force a new VB to be created the return value will be zero. 25605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * 25705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * @param the format of vertices to compute space for. 25805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * @return the number of vertices that would fit in the current buffer. 25905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger */ 26005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger int currentBufferVertices(GrVertexLayout layout) const; 26105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger 26205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger /** 26305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * Gets the number of vertices that can fit in a preallocated vertex buffer. 26405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * Zero if no preallocated buffers. 26505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * 26605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * @param the format of vertices to compute space for. 26705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * 26805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * @return number of vertices that fit in one of the preallocated vertex 26905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * buffers. 27005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger */ 27105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger int preallocatedBufferVertices(GrVertexLayout layout) const; 27205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger 27305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerprivate: 27405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger typedef GrBufferAllocPool INHERITED; 27505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger}; 27605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger 27705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerclass GrIndexBuffer; 27805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger 27905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger/** 28005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * A GrBufferAllocPool of index buffers 28105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger */ 28205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerclass GrIndexBufferAllocPool : public GrBufferAllocPool { 28305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerpublic: 28405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger /** 28505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * Constructor 28605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * 28705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * @param gpu The GrGpu used to create the index buffers. 28805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * @param frequentResetHint A hint that indicates that the pool 28905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * should expect frequent unlock() calls 29005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * (as opposed to many makeSpace / acquires 29105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * between resets). 29205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * @param bufferSize The minimum size of created IBs This value 29305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * will be clamped to some reasonable minimum. 29405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * @param preallocBufferCnt The pool will allocate this number of VBs at 29505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * bufferSize and keep them until it is 29605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * destroyed. 29705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger */ 29805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger GrIndexBufferAllocPool(GrGpu* gpu, 29905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger bool frequentResetHint, 30005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger size_t bufferSize = 0, 30105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger int preallocBufferCnt = 0); 30205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger 30305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger /** 30405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * Returns a block of memory to hold indices. A buffer designated to hold 30505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * the indices is given to the caller. The buffer may or may not be locked. 30605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * The returned ptr remains valid until any of the following: 30705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * *makeSpace is called again. 30805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * *unlock is called. 30905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * *reset is called. 31005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * *this object is destroyed. 31105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * 31205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * Once unlock on the pool is called the indices are guaranteed to be in the 31305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * buffer at the offset indicated by startIndex. Until that time they may be 31405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * in temporary storage and/or the buffer may be locked. 31505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * 31605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * @param indexCount number of indices to allocate space for 31705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * @param buffer returns the index buffer that will hold the indices. 31805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * @param startIndex returns the offset into buffer of the first index. 31905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * @return pointer to first index. 32005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger */ 32105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger void* makeSpace(int indexCount, 32205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger const GrIndexBuffer** buffer, 32305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger int* startIndex); 32405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger 32505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger /** 32605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * Shortcut to make space and then write indices into the made space. 32705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger */ 32805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger bool appendIndices(int indexCount, 32905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger const void* indices, 33005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger const GrIndexBuffer** buffer, 33105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger int* startIndex); 33205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger 33305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger /** 33405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * Gets the number of indices that can be added to the current IB without 33505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * spilling to another IB. If the pool has been reset, or the previous 33605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * makeSpace completely exhausted a IB then the returned number of indices 33705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * would fit in the next available preallocated buffer. If any makeSpace 33805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * would force a new IB to be created the return value will be zero. 33905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger */ 34005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger int currentBufferIndices() const; 34105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger 34205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger /** 34305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * Gets the number of indices that can fit in a preallocated index buffer. 34405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * Zero if no preallocated buffers. 34505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * 34605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * @return number of indices that fit in one of the preallocated index 34705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * buffers. 34805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger */ 34905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger int preallocatedBufferIndices() const; 35005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger 35105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerprivate: 35205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger typedef GrBufferAllocPool INHERITED; 35305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger}; 35405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger 35505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger#endif 356