summaryrefslogtreecommitdiff
path: root/Source/Core/VideoBackends
diff options
context:
space:
mode:
authordegasus <wickmarkus@web.de>2014-01-17 16:35:54 +0100
committerdegasus <wickmarkus@web.de>2014-01-17 16:35:54 +0100
commit355df60abdfab7c2476f5fa7848329c69da066a3 (patch)
treef6f54f75fe8a676933b7af48f2de0af1e7b6e115 /Source/Core/VideoBackends
parent770485ad04185c93ea18b8bf86e56569d1fb8f37 (diff)
parent304adc6e0ddef6411739d0fb577a63108a362c6a (diff)
Merge branch 'index_buffer_cleanup'
Diffstat (limited to 'Source/Core/VideoBackends')
-rw-r--r--Source/Core/VideoBackends/D3D/VertexManager.cpp36
-rw-r--r--Source/Core/VideoBackends/D3D/VertexManager.h4
-rw-r--r--Source/Core/VideoBackends/OGL/VertexManager.cpp76
3 files changed, 38 insertions, 78 deletions
diff --git a/Source/Core/VideoBackends/D3D/VertexManager.cpp b/Source/Core/VideoBackends/D3D/VertexManager.cpp
index 45638dfbf1..6553a56084 100644
--- a/Source/Core/VideoBackends/D3D/VertexManager.cpp
+++ b/Source/Core/VideoBackends/D3D/VertexManager.cpp
@@ -36,9 +36,7 @@ void VertexManager::CreateDeviceObjects()
D3D11_BIND_INDEX_BUFFER, D3D11_USAGE_DYNAMIC, D3D11_CPU_ACCESS_WRITE);
m_vertex_draw_offset = 0;
- m_triangle_draw_index = 0;
- m_line_draw_index = 0;
- m_point_draw_index = 0;
+ m_index_draw_offset = 0;
m_index_buffers = new PID3D11Buffer[MAX_VBUFFER_COUNT];
m_vertex_buffers = new PID3D11Buffer[MAX_VBUFFER_COUNT];
for (m_current_index_buffer = 0; m_current_index_buffer < MAX_VBUFFER_COUNT; m_current_index_buffer++)
@@ -108,8 +106,7 @@ void VertexManager::PrepareDrawBuffers()
m_vertex_draw_offset = m_vertex_buffer_cursor;
m_vertex_buffer_cursor += vSize;
- UINT iCount = IndexGenerator::GetTriangleindexLen() +
- IndexGenerator::GetLineindexLen() + IndexGenerator::GetPointindexLen();
+ UINT iCount = IndexGenerator::GetIndexLen();
MapType = D3D11_MAP_WRITE_NO_OVERWRITE;
if (m_index_buffer_cursor + iCount >= (IBUFFER_SIZE / sizeof(u16)))
{
@@ -120,13 +117,9 @@ void VertexManager::PrepareDrawBuffers()
}
D3D::context->Map(m_index_buffers[m_current_index_buffer], 0, MapType, 0, &map);
- m_triangle_draw_index = m_index_buffer_cursor;
- m_line_draw_index = m_triangle_draw_index + IndexGenerator::GetTriangleindexLen();
- m_point_draw_index = m_line_draw_index + IndexGenerator::GetLineindexLen();
- memcpy((u16*)map.pData + m_triangle_draw_index, GetTriangleIndexBuffer(), sizeof(u16) * IndexGenerator::GetTriangleindexLen());
- memcpy((u16*)map.pData + m_line_draw_index, GetLineIndexBuffer(), sizeof(u16) * IndexGenerator::GetLineindexLen());
- memcpy((u16*)map.pData + m_point_draw_index, GetPointIndexBuffer(), sizeof(u16) * IndexGenerator::GetPointindexLen());
+ memcpy((u16*)map.pData + m_index_buffer_cursor, GetIndexBuffer(), sizeof(u16) * IndexGenerator::GetIndexLen());
D3D::context->Unmap(m_index_buffers[m_current_index_buffer], 0);
+ m_index_draw_offset = m_index_buffer_cursor;
m_index_buffer_cursor += iCount;
ADDSTAT(stats.thisFrame.bytesVertexStreamed, vSize);
@@ -142,16 +135,13 @@ void VertexManager::Draw(UINT stride)
D3D::context->IASetVertexBuffers(0, 1, &m_vertex_buffers[m_current_vertex_buffer], &stride, &m_vertex_draw_offset);
D3D::context->IASetIndexBuffer(m_index_buffers[m_current_index_buffer], DXGI_FORMAT_R16_UINT, 0);
- if (IndexGenerator::GetNumTriangles() > 0)
+ if (current_primitive_type == PRIMITIVE_TRIANGLES)
{
D3D::context->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP);
- D3D::context->DrawIndexed(IndexGenerator::GetTriangleindexLen(), m_triangle_draw_index, 0);
+ D3D::context->DrawIndexed(IndexGenerator::GetIndexLen(), m_index_draw_offset, 0);
INCSTAT(stats.thisFrame.numIndexedDrawCalls);
}
- // Disable culling for lines and points
- if (IndexGenerator::GetNumLines() > 0 || IndexGenerator::GetNumPoints() > 0)
- ((DX11::Renderer*)g_renderer)->ApplyCullDisable();
- if (IndexGenerator::GetNumLines() > 0)
+ else if (current_primitive_type == PRIMITIVE_LINES)
{
float lineWidth = float(bpmem.lineptwidth.linesize) / 6.f;
float texOffset = LINE_PT_TEX_OFFSETS[bpmem.lineptwidth.lineoff];
@@ -166,14 +156,16 @@ void VertexManager::Draw(UINT stride)
if (m_lineShader.SetShader(g_nativeVertexFmt->m_components, lineWidth,
texOffset, vpWidth, vpHeight, texOffsetEnable))
{
+ ((DX11::Renderer*)g_renderer)->ApplyCullDisable(); // Disable culling for lines and points
D3D::context->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_LINELIST);
- D3D::context->DrawIndexed(IndexGenerator::GetLineindexLen(), m_line_draw_index, 0);
+ D3D::context->DrawIndexed(IndexGenerator::GetIndexLen(), m_index_draw_offset, 0);
INCSTAT(stats.thisFrame.numIndexedDrawCalls);
D3D::context->GSSetShader(NULL, NULL, 0);
+ ((DX11::Renderer*)g_renderer)->RestoreCull();
}
}
- if (IndexGenerator::GetNumPoints() > 0)
+ else //if (current_primitive_type == PRIMITIVE_POINTS)
{
float pointSize = float(bpmem.lineptwidth.pointsize) / 6.f;
float texOffset = LINE_PT_TEX_OFFSETS[bpmem.lineptwidth.pointoff];
@@ -188,15 +180,15 @@ void VertexManager::Draw(UINT stride)
if (m_pointShader.SetShader(g_nativeVertexFmt->m_components, pointSize,
texOffset, vpWidth, vpHeight, texOffsetEnable))
{
+ ((DX11::Renderer*)g_renderer)->ApplyCullDisable(); // Disable culling for lines and points
D3D::context->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_POINTLIST);
- D3D::context->DrawIndexed(IndexGenerator::GetPointindexLen(), m_point_draw_index, 0);
+ D3D::context->DrawIndexed(IndexGenerator::GetIndexLen(), m_index_draw_offset, 0);
INCSTAT(stats.thisFrame.numIndexedDrawCalls);
D3D::context->GSSetShader(NULL, NULL, 0);
+ ((DX11::Renderer*)g_renderer)->RestoreCull();
}
}
- if (IndexGenerator::GetNumLines() > 0 || IndexGenerator::GetNumPoints() > 0)
- ((DX11::Renderer*)g_renderer)->RestoreCull();
}
void VertexManager::vFlush()
diff --git a/Source/Core/VideoBackends/D3D/VertexManager.h b/Source/Core/VideoBackends/D3D/VertexManager.h
index b4b7aa0ef4..9440c737b2 100644
--- a/Source/Core/VideoBackends/D3D/VertexManager.h
+++ b/Source/Core/VideoBackends/D3D/VertexManager.h
@@ -32,11 +32,9 @@ private:
u32 m_vertex_buffer_cursor;
u32 m_vertex_draw_offset;
u32 m_index_buffer_cursor;
+ u32 m_index_draw_offset;
u32 m_current_vertex_buffer;
u32 m_current_index_buffer;
- u32 m_triangle_draw_index;
- u32 m_line_draw_index;
- u32 m_point_draw_index;
typedef ID3D11Buffer* PID3D11Buffer;
PID3D11Buffer* m_index_buffers;
PID3D11Buffer* m_vertex_buffers;
diff --git a/Source/Core/VideoBackends/OGL/VertexManager.cpp b/Source/Core/VideoBackends/OGL/VertexManager.cpp
index f10618e7f3..fdd1fbee34 100644
--- a/Source/Core/VideoBackends/OGL/VertexManager.cpp
+++ b/Source/Core/VideoBackends/OGL/VertexManager.cpp
@@ -44,7 +44,7 @@ const u32 MAX_VBUFFER_SIZE = 16*1024*1024;
static StreamBuffer *s_vertexBuffer;
static StreamBuffer *s_indexBuffer;
static size_t s_baseVertex;
-static size_t s_offset[3];
+static size_t s_index_offset;
VertexManager::VertexManager()
{
@@ -83,74 +83,44 @@ void VertexManager::DestroyDeviceObjects()
void VertexManager::PrepareDrawBuffers(u32 stride)
{
u32 vertex_data_size = IndexGenerator::GetNumVerts() * stride;
- u32 triangle_index_size = IndexGenerator::GetTriangleindexLen();
- u32 line_index_size = IndexGenerator::GetLineindexLen();
- u32 point_index_size = IndexGenerator::GetPointindexLen();
- u32 index_size = (triangle_index_size+line_index_size+point_index_size) * sizeof(u16);
+ u32 index_data_size = IndexGenerator::GetIndexLen() * sizeof(u16);
s_vertexBuffer->Alloc(vertex_data_size, stride);
size_t offset = s_vertexBuffer->Upload(GetVertexBuffer(), vertex_data_size);
s_baseVertex = offset / stride;
- s_indexBuffer->Alloc(index_size);
- if(triangle_index_size)
- {
- s_offset[0] = s_indexBuffer->Upload((u8*)GetTriangleIndexBuffer(), triangle_index_size * sizeof(u16));
- }
- if(line_index_size)
- {
- s_offset[1] = s_indexBuffer->Upload((u8*)GetLineIndexBuffer(), line_index_size * sizeof(u16));
- }
- if(point_index_size)
- {
- s_offset[2] = s_indexBuffer->Upload((u8*)GetPointIndexBuffer(), point_index_size * sizeof(u16));
- }
+ s_indexBuffer->Alloc(index_data_size);
+ s_index_offset = s_indexBuffer->Upload((u8*)GetIndexBuffer(), index_data_size);
ADDSTAT(stats.thisFrame.bytesVertexStreamed, vertex_data_size);
- ADDSTAT(stats.thisFrame.bytesIndexStreamed, index_size);
+ ADDSTAT(stats.thisFrame.bytesIndexStreamed, index_data_size);
}
void VertexManager::Draw(u32 stride)
{
- u32 triangle_index_size = IndexGenerator::GetTriangleindexLen();
- u32 line_index_size = IndexGenerator::GetLineindexLen();
- u32 point_index_size = IndexGenerator::GetPointindexLen();
+ u32 index_size = IndexGenerator::GetIndexLen();
u32 max_index = IndexGenerator::GetNumVerts();
- GLenum triangle_mode = g_ActiveConfig.backend_info.bSupportsPrimitiveRestart?GL_TRIANGLE_STRIP:GL_TRIANGLES;
+ GLenum primitive_mode = 0;
+
+ switch(current_primitive_type)
+ {
+ case PRIMITIVE_POINTS:
+ primitive_mode = GL_POINTS;
+ break;
+ case PRIMITIVE_LINES:
+ primitive_mode = GL_LINES;
+ break;
+ case PRIMITIVE_TRIANGLES:
+ primitive_mode = g_ActiveConfig.backend_info.bSupportsPrimitiveRestart ? GL_TRIANGLE_STRIP : GL_TRIANGLES;
+ break;
+ }
if(g_ogl_config.bSupportsGLBaseVertex) {
- if (triangle_index_size > 0)
- {
- glDrawRangeElementsBaseVertex(triangle_mode, 0, max_index, triangle_index_size, GL_UNSIGNED_SHORT, (u8*)NULL+s_offset[0], (GLint)s_baseVertex);
- INCSTAT(stats.thisFrame.numIndexedDrawCalls);
- }
- if (line_index_size > 0)
- {
- glDrawRangeElementsBaseVertex(GL_LINES, 0, max_index, line_index_size, GL_UNSIGNED_SHORT, (u8*)NULL+s_offset[1], (GLint)s_baseVertex);
- INCSTAT(stats.thisFrame.numIndexedDrawCalls);
- }
- if (point_index_size > 0)
- {
- glDrawRangeElementsBaseVertex(GL_POINTS, 0, max_index, point_index_size, GL_UNSIGNED_SHORT, (u8*)NULL+s_offset[2], (GLint)s_baseVertex);
- INCSTAT(stats.thisFrame.numIndexedDrawCalls);
- }
+ glDrawRangeElementsBaseVertex(primitive_mode, 0, max_index, index_size, GL_UNSIGNED_SHORT, (u8*)NULL+s_index_offset, (GLint)s_baseVertex);
} else {
- if (triangle_index_size > 0)
- {
- glDrawRangeElements(triangle_mode, 0, max_index, triangle_index_size, GL_UNSIGNED_SHORT, (u8*)NULL+s_offset[0]);
- INCSTAT(stats.thisFrame.numIndexedDrawCalls);
- }
- if (line_index_size > 0)
- {
- glDrawRangeElements(GL_LINES, 0, max_index, line_index_size, GL_UNSIGNED_SHORT, (u8*)NULL+s_offset[1]);
- INCSTAT(stats.thisFrame.numIndexedDrawCalls);
- }
- if (point_index_size > 0)
- {
- glDrawRangeElements(GL_POINTS, 0, max_index, point_index_size, GL_UNSIGNED_SHORT, (u8*)NULL+s_offset[2]);
- INCSTAT(stats.thisFrame.numIndexedDrawCalls);
- }
+ glDrawRangeElements(primitive_mode, 0, max_index, index_size, GL_UNSIGNED_SHORT, (u8*)NULL+s_index_offset);
}
+ INCSTAT(stats.thisFrame.numIndexedDrawCalls);
}
void VertexManager::vFlush()