Edit

kc3-lang/angle/src/libANGLE/Buffer.h

Branch :

  • Show log

    Commit

  • Author : Geoff Lang
    Date : 2015-05-05 13:12:36
    Hash : 520c4ae2
    Message : Add a Buffer::getIndexRange function. Instead of exposing the index range cache, add a more generic method that allows the buffers to handle their own caching of index ranges. BufferImpl::getData can be hard to implement for BufferGL because there isn't a way to tell the buffer to unmap and glGetBufferSubData can be very expensive, requiring an extra copy of the data. BUG=angleproject:881 Change-Id: Idec645219056132e0d72a410fbe7b971fa02c9e9 Reviewed-on: https://chromium-review.googlesource.com/261892 Reviewed-by: Jamie Madill <jmadill@chromium.org> Reviewed-by: Olli Etuaho <oetuaho@nvidia.com> Tested-by: Geoff Lang <geofflang@chromium.org>

  • src/libANGLE/Buffer.h
  • //
    // Copyright (c) 2002-2014 The ANGLE Project Authors. All rights reserved.
    // Use of this source code is governed by a BSD-style license that can be
    // found in the LICENSE file.
    //
    
    // Buffer.h: Defines the gl::Buffer class, representing storage of vertex and/or
    // index data. Implements GL buffer objects and related functionality.
    // [OpenGL ES 2.0.24] section 2.9 page 21.
    
    #ifndef LIBANGLE_BUFFER_H_
    #define LIBANGLE_BUFFER_H_
    
    #include "common/angleutils.h"
    #include "libANGLE/Error.h"
    #include "libANGLE/IndexRangeCache.h"
    #include "libANGLE/RefCountObject.h"
    
    namespace rx
    {
    class BufferImpl;
    };
    
    namespace gl
    {
    
    class Buffer : public RefCountObject
    {
      public:
        Buffer(rx::BufferImpl *impl, GLuint id);
    
        virtual ~Buffer();
    
        Error bufferData(const void *data, GLsizeiptr size, GLenum usage);
        Error bufferSubData(const void *data, GLsizeiptr size, GLintptr offset);
        Error copyBufferSubData(Buffer* source, GLintptr sourceOffset, GLintptr destOffset, GLsizeiptr size);
        Error map(GLenum access);
        Error mapRange(GLintptr offset, GLsizeiptr length, GLbitfield access);
        Error unmap(GLboolean *result);
    
        void onTransformFeedback();
        void onPixelUnpack();
    
        Error getIndexRange(GLenum type, size_t offset, size_t count, RangeUI *outRange) const;
    
        GLenum getUsage() const { return mUsage; }
        GLbitfield getAccessFlags() const { return mAccessFlags; }
        GLenum getAccess() const { return mAccess; }
        GLboolean isMapped() const { return mMapped; }
        GLvoid *getMapPointer() const { return mMapPointer; }
        GLint64 getMapOffset() const { return mMapOffset; }
        GLint64 getMapLength() const { return mMapLength; }
        GLint64 getSize() const { return mSize; }
    
        rx::BufferImpl *getImplementation() const { return mBuffer; }
    
      private:
        rx::BufferImpl *mBuffer;
    
        GLenum mUsage;
        GLint64 mSize;
        GLbitfield mAccessFlags;
        GLenum mAccess;
        GLboolean mMapped;
        GLvoid *mMapPointer;
        GLint64 mMapOffset;
        GLint64 mMapLength;
    
        mutable IndexRangeCache mIndexRangeCache;
    };
    
    }
    
    #endif   // LIBANGLE_BUFFER_H_