/*
 Copyright 2011 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 GrGeometryBuffer_DEFINED
#define GrGeometryBuffer_DEFINED

#include "GrRefCnt.h"

/**
 * Parent class for vertex and index buffers
 */
class GrGeometryBuffer : public GrRefCnt {
public:
    virtual ~GrGeometryBuffer() {}
    
    /**
     * Retrieves the size of the buffer
     *
     * @return the size of the buffer in bytes
     */
    size_t size() const { return fSizeInBytes; }
    
    /**
     *Retrieves whether the buffer was created with the dynamic flag
     *
     * @return true if the buffer was created with the dynamic flag
     */
    bool dynamic() const { return fDynamic; }
    
    /**
     * Indicates that GPU context in which this veretx buffer was created is 
     * destroyed and that Ganesh should not attempt to free the buffer in the
     * underlying API.
     */
    virtual void abandon() = 0;
    
    /**
     * Locks the buffer to be written by the CPU.
     * 
     * The previous content of the buffer is invalidated. It is an error
     * to draw from the buffer while it is locked. It is an error to call lock
     * on an already locked buffer.
     * 
     * @return a pointer to the data or NULL if the lock fails.
     */
    virtual void* lock() = 0;
    
    /**
     * Returns the same ptr that lock() returned at time of lock or NULL if the
     * is not locked.
     *
     * @return ptr to locked buffer data or undefined if buffer is not locked.
     */
    virtual void* lockPtr() const = 0;
    
    /** 
     * Unlocks the buffer. 
     * 
     * The pointer returned by the previous lock call will no longer be valid.
     */
    virtual void unlock() = 0;
    
    /** 
     Queries whether the buffer has been locked.
     
     @return true if the buffer is locked, false otherwise.
     */
    virtual bool isLocked() const = 0;
    
    /**
     * Updates the buffer data. 
     *  
     * The size of the buffer will be preserved. The src data will be 
     * placed at the begining of the buffer and any remaining contents will
     * be undefined.
     * 
     * @return returns true if the update succeeds, false otherwise.
     */
    virtual bool updateData(const void* src, size_t srcSizeInBytes) = 0;
    
    /**
     * Updates a portion of the buffer data. 
     * 
     * The contents of the buffer outside the update region are preserved.
     * 
     * @return returns true if the update succeeds, false otherwise.
     */
    virtual bool updateSubData(const void* src, 
                               size_t srcSizeInBytes, 
                               size_t offset) = 0;
protected:
    GrGeometryBuffer(size_t sizeInBytes, bool dynamic) : 
        fSizeInBytes(sizeInBytes),
        fDynamic(dynamic) {}

private:
    size_t   fSizeInBytes;
    bool     fDynamic;

    typedef GrRefCnt INHERITED;
};

#endif
