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 4bdc8db85..c9c175846 100644 --- a/src/video_core/renderer_opengl/gl_rasterizer.cpp +++ b/src/video_core/renderer_opengl/gl_rasterizer.cpp | |||
| @@ -617,7 +617,7 @@ void RasterizerOpenGL::Draw(bool is_indexed, bool is_instanced) { | |||
| 617 | 617 | ||
| 618 | // Setup shaders and their used resources. | 618 | // Setup shaders and their used resources. |
| 619 | texture_cache.GuardSamplers(true); | 619 | texture_cache.GuardSamplers(true); |
| 620 | const auto primitive_mode = MaxwellToGL::PrimitiveTopology(gpu.regs.draw.topology); | 620 | const GLenum primitive_mode = MaxwellToGL::PrimitiveTopology(gpu.regs.draw.topology); |
| 621 | SetupShaders(primitive_mode); | 621 | SetupShaders(primitive_mode); |
| 622 | texture_cache.GuardSamplers(false); | 622 | texture_cache.GuardSamplers(false); |
| 623 | 623 | ||
| @@ -650,18 +650,38 @@ void RasterizerOpenGL::Draw(bool is_indexed, bool is_instanced) { | |||
| 650 | const GLsizei num_instances = | 650 | const GLsizei num_instances = |
| 651 | static_cast<GLsizei>(is_instanced ? gpu.mme_draw.instance_count : 1); | 651 | static_cast<GLsizei>(is_instanced ? gpu.mme_draw.instance_count : 1); |
| 652 | if (is_indexed) { | 652 | if (is_indexed) { |
| 653 | const GLenum index_format = MaxwellToGL::IndexFormat(gpu.regs.index_array.format); | ||
| 654 | const GLint base_vertex = static_cast<GLint>(gpu.regs.vb_element_base); | 653 | const GLint base_vertex = static_cast<GLint>(gpu.regs.vb_element_base); |
| 655 | const GLsizei num_vertices = static_cast<GLsizei>(gpu.regs.index_array.count); | 654 | const GLsizei num_vertices = static_cast<GLsizei>(gpu.regs.index_array.count); |
| 656 | glDrawElementsInstancedBaseVertexBaseInstance( | 655 | const GLvoid* offset = reinterpret_cast<const GLvoid*>(index_buffer_offset); |
| 657 | primitive_mode, num_vertices, index_format, | 656 | const GLenum format = MaxwellToGL::IndexFormat(gpu.regs.index_array.format); |
| 658 | reinterpret_cast<const void*>(index_buffer_offset), num_instances, base_vertex, | 657 | if (num_instances == 1 && base_instance == 0 && base_vertex == 0) { |
| 659 | base_instance); | 658 | glDrawElements(primitive_mode, num_vertices, format, offset); |
| 659 | } else if (num_instances == 1 && base_instance == 0) { | ||
| 660 | glDrawElementsBaseVertex(primitive_mode, num_vertices, format, offset, base_vertex); | ||
| 661 | } else if (base_vertex == 0 && base_instance == 0) { | ||
| 662 | glDrawElementsInstanced(primitive_mode, num_vertices, format, offset, num_instances); | ||
| 663 | } else if (base_vertex == 0) { | ||
| 664 | glDrawElementsInstancedBaseInstance(primitive_mode, num_vertices, format, offset, | ||
| 665 | num_instances, base_instance); | ||
| 666 | } else if (base_instance == 0) { | ||
| 667 | glDrawElementsInstancedBaseVertex(primitive_mode, num_vertices, format, offset, | ||
| 668 | num_instances, base_vertex); | ||
| 669 | } else { | ||
| 670 | glDrawElementsInstancedBaseVertexBaseInstance(primitive_mode, num_vertices, format, | ||
| 671 | offset, num_instances, base_vertex, | ||
| 672 | base_instance); | ||
| 673 | } | ||
| 660 | } else { | 674 | } else { |
| 661 | const GLint base_vertex = static_cast<GLint>(gpu.regs.vertex_buffer.first); | 675 | const GLint base_vertex = static_cast<GLint>(gpu.regs.vertex_buffer.first); |
| 662 | const GLsizei num_vertices = static_cast<GLsizei>(gpu.regs.vertex_buffer.count); | 676 | const GLsizei num_vertices = static_cast<GLsizei>(gpu.regs.vertex_buffer.count); |
| 663 | glDrawArraysInstancedBaseInstance(primitive_mode, base_vertex, num_vertices, num_instances, | 677 | if (num_instances == 1 && base_instance == 0) { |
| 664 | base_instance); | 678 | glDrawArrays(primitive_mode, base_vertex, num_vertices); |
| 679 | } else if (base_instance == 0) { | ||
| 680 | glDrawArraysInstanced(primitive_mode, base_vertex, num_vertices, num_instances); | ||
| 681 | } else { | ||
| 682 | glDrawArraysInstancedBaseInstance(primitive_mode, base_vertex, num_vertices, | ||
| 683 | num_instances, base_instance); | ||
| 684 | } | ||
| 665 | } | 685 | } |
| 666 | } | 686 | } |
| 667 | 687 | ||