(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);