(view as text)
diff --git a/Source/Core/VideoBackends/OGL/StreamBuffer.h b/Source/Core/VideoBackends/OGL/StreamBuffer.h
index 8fc4cef..ab31777 100644
--- a/Source/Core/VideoBackends/OGL/StreamBuffer.h
+++ b/Source/Core/VideoBackends/OGL/StreamBuffer.h
@@ -38,7 +38,7 @@ public:
u32 getBuffer() { return m_buffer; }
-private:
+//private:
void Init();
void Shutdown();
void DeleteFences();
diff --git a/Source/Core/VideoBackends/OGL/VertexManager.cpp b/Source/Core/VideoBackends/OGL/VertexManager.cpp
index 64e8f92..25eb4b1 100644
--- a/Source/Core/VideoBackends/OGL/VertexManager.cpp
+++ b/Source/Core/VideoBackends/OGL/VertexManager.cpp
@@ -39,7 +39,7 @@ namespace OGL
{
//This are the initially requested size for the buffers expressed in bytes
const u32 MAX_IBUFFER_SIZE = 2*1024*1024;
-const u32 MAX_VBUFFER_SIZE = 16*1024*1024;
+const u32 MAX_VBUFFER_SIZE = 16*1024*1024*2;
static StreamBuffer *s_vertexBuffer;
static StreamBuffer *s_indexBuffer;
@@ -60,6 +60,8 @@ void VertexManager::CreateDeviceObjects()
{
s_vertexBuffer = new StreamBuffer(GL_ARRAY_BUFFER, MAX_VBUFFER_SIZE);
m_vertex_buffers = s_vertexBuffer->getBuffer();
+ ::VertexManager::s_pBaseBufferPointer = ::VertexManager::s_pCurBufferPointer = s_vertexBuffer->pointer;
+ ::VertexManager::s_pEndBufferPointer = s_vertexBuffer->pointer + MAX_VBUFFER_SIZE;
s_indexBuffer = new StreamBuffer(GL_ELEMENT_ARRAY_BUFFER, MAX_IBUFFER_SIZE);
m_index_buffers = s_indexBuffer->getBuffer();
@@ -88,8 +90,8 @@ void VertexManager::PrepareDrawBuffers(u32 stride)
u32 point_index_size = IndexGenerator::GetPointindexLen();
u32 index_size = (triangle_index_size+line_index_size+point_index_size) * sizeof(u16);
- s_vertexBuffer->Alloc(vertex_data_size, stride);
- size_t offset = s_vertexBuffer->Upload(GetVertexBuffer(), vertex_data_size);
+ //s_vertexBuffer->Alloc(vertex_data_size, stride);
+ size_t offset = (::VertexManager::s_pCurBufferPointer-::VertexManager::s_pBaseBufferPointer)-vertex_data_size; // = s_vertexBuffer->Upload(GetVertexBuffer(), vertex_data_size);
s_baseVertex = offset / stride;
s_indexBuffer->Alloc(index_size);
diff --git a/Source/Core/VideoCommon/VertexManagerBase.cpp b/Source/Core/VideoCommon/VertexManagerBase.cpp
index b5285dd..e0ef8ef 100644
--- a/Source/Core/VideoCommon/VertexManagerBase.cpp
+++ b/Source/Core/VideoCommon/VertexManagerBase.cpp
@@ -24,8 +24,8 @@ u8 *VertexManager::s_pEndBufferPointer;
VertexManager::VertexManager()
{
LocalVBuffer.resize(MAXVBUFFERSIZE);
- s_pCurBufferPointer = s_pBaseBufferPointer = &LocalVBuffer[0];
- s_pEndBufferPointer = s_pBaseBufferPointer + LocalVBuffer.size();
+ //s_pCurBufferPointer = s_pBaseBufferPointer = &LocalVBuffer[0];
+ //s_pEndBufferPointer = s_pBaseBufferPointer + LocalVBuffer.size();
TIBuffer.resize(MAXIBUFFERSIZE);
LIBuffer.resize(MAXIBUFFERSIZE);
@@ -40,7 +40,8 @@ VertexManager::~VertexManager()
void VertexManager::ResetBuffer()
{
- s_pCurBufferPointer = s_pBaseBufferPointer;
+ if(GetRemainingSize() < MAXVBUFFERSIZE)
+ s_pCurBufferPointer = s_pBaseBufferPointer;
IndexGenerator::Start(GetTriangleIndexBuffer(), GetLineIndexBuffer(), GetPointIndexBuffer());
}
@@ -49,13 +50,26 @@ u32 VertexManager::GetRemainingSize()
return (u32)(s_pEndBufferPointer - s_pCurBufferPointer);
}
+void VertexManager::AlignToStride(u32 stride)
+{
+ u32 offset = (u32)(s_pCurBufferPointer - s_pBaseBufferPointer);
+
+ if(offset && stride) {
+ offset--;
+ offset = offset - (offset % stride) + stride;
+ s_pCurBufferPointer = s_pBaseBufferPointer + offset;
+ }
+}
+
void VertexManager::PrepareForAdditionalData(int primitive, u32 count, u32 stride)
{
u32 const needed_vertex_bytes = count * stride;
+ AlignToStride(stride);
if (count > IndexGenerator::GetRemainingIndices() || count > GetRemainingIndices(primitive) || needed_vertex_bytes > GetRemainingSize())
{
Flush();
+ AlignToStride(stride);
if(count > IndexGenerator::GetRemainingIndices())
ERROR_LOG(VIDEO, "Too little remaining index values. Use 32-bit or reset them on flush.");
@@ -70,7 +84,8 @@ void VertexManager::PrepareForAdditionalData(int primitive, u32 count, u32 strid
bool VertexManager::IsFlushed() const
{
- return s_pBaseBufferPointer == s_pCurBufferPointer;
+ return IndexGenerator::GetNumVerts() == 0;
+ //return s_pBaseBufferPointer == s_pCurBufferPointer;
}
u32 VertexManager::GetRemainingIndices(int primitive)
diff --git a/Source/Core/VideoCommon/VertexManagerBase.h b/Source/Core/VideoCommon/VertexManagerBase.h
index b5b13c8..f3788f2 100644
--- a/Source/Core/VideoCommon/VertexManagerBase.h
+++ b/Source/Core/VideoCommon/VertexManagerBase.h
@@ -33,6 +33,7 @@ public:
static u8 *s_pEndBufferPointer;
static u32 GetRemainingSize();
+ static void AlignToStride(u32 stride);
static void PrepareForAdditionalData(int primitive, u32 count, u32 stride);
static u32 GetRemainingIndices(int primitive);