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