2012-04-19 14:35:52 +08:00
|
|
|
/*
|
|
|
|
Copyright 2010 Google Inc.
|
|
|
|
|
|
|
|
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.
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
#ifndef GrVertexBufferAllocPool_DEFINED
|
|
|
|
#define GrVertexBufferAllocPool_DEFINED
|
|
|
|
|
|
|
|
#include "GrNoncopyable.h"
|
|
|
|
#include "GrTDArray.h"
|
|
|
|
#include "GrTArray.h"
|
|
|
|
|
|
|
|
class GrVertexBuffer;
|
|
|
|
class GrGpu;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* A pool of vertices in vertex buffers tied to a GrGpu.
|
|
|
|
*
|
|
|
|
* The pool has an alloc() function that returns a pointer into a locked
|
|
|
|
* vertex buffer. A client can release() if it has over-allocated.
|
|
|
|
*
|
|
|
|
* At creation time a minimum VB size can be specified. Additionally,
|
|
|
|
* a number of vertex buffers to preallocate can be specified. These will
|
|
|
|
* be allocated at the min size and kept until the pool is destroyed.
|
|
|
|
*/
|
|
|
|
class GrVertexBufferAllocPool : GrNoncopyable {
|
|
|
|
public:
|
|
|
|
/**
|
|
|
|
* Constructor
|
|
|
|
*
|
|
|
|
* @param gpu The GrGpu used to create the vertex buffers.
|
|
|
|
* @param bufferSize The size of created VBs (unless an alloc request
|
|
|
|
* exceeds this size in which case a larger VB is
|
|
|
|
* created). This value is clamped to some
|
|
|
|
* reasonable minimum.
|
|
|
|
* @param preallocBufferCnt The pool will allocate this number of VBs at
|
|
|
|
* bufferSize and keep them until it is destroyed.
|
|
|
|
*/
|
|
|
|
GrVertexBufferAllocPool(GrGpu* gpu,
|
|
|
|
size_t bufferSize = 0,
|
|
|
|
int preallocBufferCnt = 0);
|
|
|
|
~GrVertexBufferAllocPool();
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Ensures all VBs are unlocked. Call before using to draw.
|
|
|
|
*/
|
|
|
|
void unlock();
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Frees all vertex data that has been allocated with alloc().
|
|
|
|
*/
|
|
|
|
void reset();
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Returns a block of memory bytes size big. The vertex buffer
|
|
|
|
* containing the memory is returned in buffer.
|
|
|
|
*
|
|
|
|
* @param layout specifies type of vertices to allocate space for
|
|
|
|
* @param vertexCount number of vertices to allocate space for
|
|
|
|
* @param buffer returns the vertex buffer that will hold the
|
|
|
|
* vertices.
|
|
|
|
* @param startVertex returns the offset into buffer of the first vertex.
|
|
|
|
* In units of the size of a vertex using layout param.
|
|
|
|
* @return pointer to first vertex.
|
|
|
|
*/
|
|
|
|
void* alloc(GrVertexLayout layout,
|
|
|
|
uint32_t vertexCount,
|
|
|
|
GrVertexBuffer** buffer,
|
|
|
|
uint32_t* startVertex);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Gets the number of vertices that can be allocated without changing VBs.
|
|
|
|
* This means either the last VB returned by alloc() if the last alloc did
|
|
|
|
* not exhaust it. If that VB was exhausted by the last alloc or alloc hasn't
|
|
|
|
* been called since reset() then it will be the number of vertices that
|
|
|
|
* would fit in an available preallocated VB. If no preallocated VB
|
|
|
|
* is available then it returns 0 since the next alloc would force a new
|
|
|
|
* VB to be created.
|
|
|
|
*/
|
|
|
|
int currentBufferVertices(GrVertexLayout layout) const;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Gets the number of preallocated buffers that are yet to be used.
|
|
|
|
*/
|
|
|
|
int preallocatedBuffersRemaining() const;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Gets the number of vertices that can fit in a preallocated vertex buffer.
|
|
|
|
* Zero if no preallocated buffers.
|
|
|
|
*/
|
|
|
|
int preallocatedBufferVertices(GrVertexLayout layout) const;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* gets the number of preallocated vertex buffers
|
|
|
|
*/
|
|
|
|
int preallocatedBufferCount() const;
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Releases the most recently allocated bytes back to the pool.
|
|
|
|
*/
|
|
|
|
void release(size_t bytes);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Gets the GrGpu that this pool is associated with.
|
|
|
|
*/
|
|
|
|
GrGpu* getGpu() { return fGpu; }
|
|
|
|
|
|
|
|
|
|
|
|
private:
|
|
|
|
struct BufferBlock {
|
|
|
|
size_t fBytesFree;
|
|
|
|
GrVertexBuffer* fVertexBuffer;
|
|
|
|
};
|
|
|
|
|
|
|
|
bool createBlock(size_t size);
|
|
|
|
void destroyBlock();
|
|
|
|
|
|
|
|
GrTArray<BufferBlock> fBlocks;
|
|
|
|
GrTDArray<GrVertexBuffer*> fPreallocBuffers;
|
|
|
|
int fPreallocBuffersInUse;
|
|
|
|
int fFirstPreallocBuffer;
|
|
|
|
|
|
|
|
size_t fMinBlockSize;
|
|
|
|
GrGpu* fGpu;
|
|
|
|
void* fBufferPtr;
|
|
|
|
};
|
|
|
|
|
|
|
|
#endif
|