diff options
Diffstat (limited to 'Source/ThirdParty/ANGLE/src/libGLESv2/Buffer.cpp')
-rw-r--r-- | Source/ThirdParty/ANGLE/src/libGLESv2/Buffer.cpp | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/Source/ThirdParty/ANGLE/src/libGLESv2/Buffer.cpp b/Source/ThirdParty/ANGLE/src/libGLESv2/Buffer.cpp index 43993e7..17cea6c 100644 --- a/Source/ThirdParty/ANGLE/src/libGLESv2/Buffer.cpp +++ b/Source/ThirdParty/ANGLE/src/libGLESv2/Buffer.cpp @@ -10,6 +10,10 @@ #include "libGLESv2/Buffer.h" +#include "libGLESv2/main.h" +#include "libGLESv2/geometry/VertexDataManager.h" +#include "libGLESv2/geometry/IndexDataManager.h" + namespace gl { @@ -18,11 +22,16 @@ Buffer::Buffer(GLuint id) : RefCountObject(id) mContents = NULL; mSize = 0; mUsage = GL_DYNAMIC_DRAW; + + mVertexBuffer = NULL; + mIndexBuffer = NULL; } Buffer::~Buffer() { delete[] mContents; + delete mVertexBuffer; + delete mIndexBuffer; } void Buffer::bufferData(const void *data, GLsizeiptr size, GLenum usage) @@ -46,11 +55,52 @@ void Buffer::bufferData(const void *data, GLsizeiptr size, GLenum usage) mSize = size; mUsage = usage; + + invalidateStaticData(); + + if (usage == GL_STATIC_DRAW) + { + mVertexBuffer = new StaticVertexBuffer(getDevice()); + mIndexBuffer = new StaticIndexBuffer(getDevice()); + } } void Buffer::bufferSubData(const void *data, GLsizeiptr size, GLintptr offset) { memcpy(mContents + offset, data, size); + + if ((mVertexBuffer && mVertexBuffer->size() != 0) || (mIndexBuffer && mIndexBuffer->size() != 0)) + { + invalidateStaticData(); + + if (mUsage == GL_STATIC_DRAW) + { + // If applications update the buffer data after it has already been used in a draw call, + // it most likely isn't used as a static buffer so we should fall back to streaming usage + // for best performance. So ignore the usage hint and don't create new static buffers. + // mVertexBuffer = new StaticVertexBuffer(getDevice()); + // mIndexBuffer = new StaticIndexBuffer(getDevice()); + } + } +} + +StaticVertexBuffer *Buffer::getVertexBuffer() +{ + return mVertexBuffer; +} + +StaticIndexBuffer *Buffer::getIndexBuffer() +{ + return mIndexBuffer; +} + +void Buffer::invalidateStaticData() +{ + delete mVertexBuffer; + mVertexBuffer = NULL; + + delete mIndexBuffer; + mIndexBuffer = NULL; } } |