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