diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/video_core/renderer_opengl/gl_rasterizer.cpp | 36 |
1 files changed, 28 insertions, 8 deletions
diff --git a/src/video_core/renderer_opengl/gl_rasterizer.cpp b/src/video_core/renderer_opengl/gl_rasterizer.cpp index b0eb14c8b..88e40827b 100644 --- a/src/video_core/renderer_opengl/gl_rasterizer.cpp +++ b/src/video_core/renderer_opengl/gl_rasterizer.cpp | |||
| @@ -611,7 +611,7 @@ void RasterizerOpenGL::Draw(bool is_indexed, bool is_instanced) { | |||
| 611 | 611 | ||
| 612 | // Setup shaders and their used resources. | 612 | // Setup shaders and their used resources. |
| 613 | texture_cache.GuardSamplers(true); | 613 | texture_cache.GuardSamplers(true); |
| 614 | const auto primitive_mode = MaxwellToGL::PrimitiveTopology(gpu.regs.draw.topology); | 614 | const GLenum primitive_mode = MaxwellToGL::PrimitiveTopology(gpu.regs.draw.topology); |
| 615 | SetupShaders(primitive_mode); | 615 | SetupShaders(primitive_mode); |
| 616 | texture_cache.GuardSamplers(false); | 616 | texture_cache.GuardSamplers(false); |
| 617 | 617 | ||
| @@ -642,18 +642,38 @@ void RasterizerOpenGL::Draw(bool is_indexed, bool is_instanced) { | |||
| 642 | const GLsizei num_instances = | 642 | const GLsizei num_instances = |
| 643 | static_cast<GLsizei>(is_instanced ? gpu.mme_draw.instance_count : 1); | 643 | static_cast<GLsizei>(is_instanced ? gpu.mme_draw.instance_count : 1); |
| 644 | if (is_indexed) { | 644 | if (is_indexed) { |
| 645 | const GLenum index_format = MaxwellToGL::IndexFormat(gpu.regs.index_array.format); | ||
| 646 | const GLint base_vertex = static_cast<GLint>(gpu.regs.vb_element_base); | 645 | const GLint base_vertex = static_cast<GLint>(gpu.regs.vb_element_base); |
| 647 | const GLsizei num_vertices = static_cast<GLsizei>(gpu.regs.index_array.count); | 646 | const GLsizei num_vertices = static_cast<GLsizei>(gpu.regs.index_array.count); |
| 648 | glDrawElementsInstancedBaseVertexBaseInstance( | 647 | const GLvoid* offset = reinterpret_cast<const GLvoid*>(index_buffer_offset); |
| 649 | primitive_mode, num_vertices, index_format, | 648 | const GLenum format = MaxwellToGL::IndexFormat(gpu.regs.index_array.format); |
| 650 | reinterpret_cast<const void*>(index_buffer_offset), num_instances, base_vertex, | 649 | if (num_instances == 1 && base_instance == 0 && base_vertex == 0) { |
| 651 | base_instance); | 650 | glDrawElements(primitive_mode, num_vertices, format, offset); |
| 651 | } else if (num_instances == 1 && base_instance == 0) { | ||
| 652 | glDrawElementsBaseVertex(primitive_mode, num_vertices, format, offset, base_vertex); | ||
| 653 | } else if (base_vertex == 0 && base_instance == 0) { | ||
| 654 | glDrawElementsInstanced(primitive_mode, num_vertices, format, offset, num_instances); | ||
| 655 | } else if (base_vertex == 0) { | ||
| 656 | glDrawElementsInstancedBaseInstance(primitive_mode, num_vertices, format, offset, | ||
| 657 | num_instances, base_instance); | ||
| 658 | } else if (base_instance == 0) { | ||
| 659 | glDrawElementsInstancedBaseVertex(primitive_mode, num_vertices, format, offset, | ||
| 660 | num_instances, base_vertex); | ||
| 661 | } else { | ||
| 662 | glDrawElementsInstancedBaseVertexBaseInstance(primitive_mode, num_vertices, format, | ||
| 663 | offset, num_instances, base_vertex, | ||
| 664 | base_instance); | ||
| 665 | } | ||
| 652 | } else { | 666 | } else { |
| 653 | const GLint base_vertex = static_cast<GLint>(gpu.regs.vertex_buffer.first); | 667 | const GLint base_vertex = static_cast<GLint>(gpu.regs.vertex_buffer.first); |
| 654 | const GLsizei num_vertices = static_cast<GLsizei>(gpu.regs.vertex_buffer.count); | 668 | const GLsizei num_vertices = static_cast<GLsizei>(gpu.regs.vertex_buffer.count); |
| 655 | glDrawArraysInstancedBaseInstance(primitive_mode, base_vertex, num_vertices, num_instances, | 669 | if (num_instances == 1 && base_instance == 0) { |
| 656 | base_instance); | 670 | glDrawArrays(primitive_mode, base_vertex, num_vertices); |
| 671 | } else if (base_instance == 0) { | ||
| 672 | glDrawArraysInstanced(primitive_mode, base_vertex, num_vertices, num_instances); | ||
| 673 | } else { | ||
| 674 | glDrawArraysInstancedBaseInstance(primitive_mode, base_vertex, num_vertices, | ||
| 675 | num_instances, base_instance); | ||
| 676 | } | ||
| 657 | } | 677 | } |
| 658 | } | 678 | } |
| 659 | 679 | ||