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