diff options
| author | degasus <wickmarkus@web.de> | 2014-01-17 16:35:54 +0100 |
|---|---|---|
| committer | degasus <wickmarkus@web.de> | 2014-01-17 16:35:54 +0100 |
| commit | 355df60abdfab7c2476f5fa7848329c69da066a3 (patch) | |
| tree | f6f54f75fe8a676933b7af48f2de0af1e7b6e115 /Source/Core/VideoBackends | |
| parent | 770485ad04185c93ea18b8bf86e56569d1fb8f37 (diff) | |
| parent | 304adc6e0ddef6411739d0fb577a63108a362c6a (diff) | |
Merge branch 'index_buffer_cleanup'
Diffstat (limited to 'Source/Core/VideoBackends')
| -rw-r--r-- | Source/Core/VideoBackends/D3D/VertexManager.cpp | 36 | ||||
| -rw-r--r-- | Source/Core/VideoBackends/D3D/VertexManager.h | 4 | ||||
| -rw-r--r-- | Source/Core/VideoBackends/OGL/VertexManager.cpp | 76 |
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() |
