summaryrefslogtreecommitdiffstats
path: root/Source/ThirdParty/ANGLE/src/libGLESv2/Buffer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Source/ThirdParty/ANGLE/src/libGLESv2/Buffer.cpp')
-rw-r--r--Source/ThirdParty/ANGLE/src/libGLESv2/Buffer.cpp65
1 files changed, 38 insertions, 27 deletions
diff --git a/Source/ThirdParty/ANGLE/src/libGLESv2/Buffer.cpp b/Source/ThirdParty/ANGLE/src/libGLESv2/Buffer.cpp
index 17cea6c..dd12e3c 100644
--- a/Source/ThirdParty/ANGLE/src/libGLESv2/Buffer.cpp
+++ b/Source/ThirdParty/ANGLE/src/libGLESv2/Buffer.cpp
@@ -11,8 +11,8 @@
#include "libGLESv2/Buffer.h"
#include "libGLESv2/main.h"
-#include "libGLESv2/geometry/VertexDataManager.h"
-#include "libGLESv2/geometry/IndexDataManager.h"
+#include "libGLESv2/VertexDataManager.h"
+#include "libGLESv2/IndexDataManager.h"
namespace gl
{
@@ -23,15 +23,16 @@ Buffer::Buffer(GLuint id) : RefCountObject(id)
mSize = 0;
mUsage = GL_DYNAMIC_DRAW;
- mVertexBuffer = NULL;
- mIndexBuffer = NULL;
+ mStaticVertexBuffer = NULL;
+ mStaticIndexBuffer = NULL;
+ mUnmodifiedDataUse = 0;
}
Buffer::~Buffer()
{
delete[] mContents;
- delete mVertexBuffer;
- delete mIndexBuffer;
+ delete mStaticVertexBuffer;
+ delete mStaticIndexBuffer;
}
void Buffer::bufferData(const void *data, GLsizeiptr size, GLenum usage)
@@ -60,47 +61,57 @@ void Buffer::bufferData(const void *data, GLsizeiptr size, GLenum usage)
if (usage == GL_STATIC_DRAW)
{
- mVertexBuffer = new StaticVertexBuffer(getDevice());
- mIndexBuffer = new StaticIndexBuffer(getDevice());
+ mStaticVertexBuffer = new StaticVertexBuffer(getDevice());
+ mStaticIndexBuffer = 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))
+
+ if ((mStaticVertexBuffer && mStaticVertexBuffer->size() != 0) || (mStaticIndexBuffer && mStaticIndexBuffer->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());
- }
}
+
+ mUnmodifiedDataUse = 0;
}
-StaticVertexBuffer *Buffer::getVertexBuffer()
+StaticVertexBuffer *Buffer::getStaticVertexBuffer()
{
- return mVertexBuffer;
+ return mStaticVertexBuffer;
}
-StaticIndexBuffer *Buffer::getIndexBuffer()
+StaticIndexBuffer *Buffer::getStaticIndexBuffer()
{
- return mIndexBuffer;
+ return mStaticIndexBuffer;
}
void Buffer::invalidateStaticData()
{
- delete mVertexBuffer;
- mVertexBuffer = NULL;
+ delete mStaticVertexBuffer;
+ mStaticVertexBuffer = NULL;
+
+ delete mStaticIndexBuffer;
+ mStaticIndexBuffer = NULL;
+
+ mUnmodifiedDataUse = 0;
+}
+
+// Creates static buffers if sufficient used data has been left unmodified
+void Buffer::promoteStaticUsage(int dataSize)
+{
+ if (!mStaticVertexBuffer && !mStaticIndexBuffer)
+ {
+ mUnmodifiedDataUse += dataSize;
- delete mIndexBuffer;
- mIndexBuffer = NULL;
+ if (mUnmodifiedDataUse > 3 * mSize)
+ {
+ mStaticVertexBuffer = new StaticVertexBuffer(getDevice());
+ mStaticIndexBuffer = new StaticIndexBuffer(getDevice());
+ }
+ }
}
}