summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/video_core/renderer_opengl/gl_rasterizer.cpp36
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