From cc73bad293cadb2323a821fa32bcd03c9d359e3e Mon Sep 17 00:00:00 2001 From: Subv Date: Mon, 2 Jul 2018 11:21:23 -0500 Subject: GPU: Added register definitions for the vertex buffer base element. --- src/video_core/engines/maxwell_3d.h | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/video_core/engines/maxwell_3d.h b/src/video_core/engines/maxwell_3d.h index 180be4ff4..58db81222 100644 --- a/src/video_core/engines/maxwell_3d.h +++ b/src/video_core/engines/maxwell_3d.h @@ -455,7 +455,11 @@ public: u32 enable[NumRenderTargets]; } blend; - INSERT_PADDING_WORDS(0x77); + INSERT_PADDING_WORDS(0x2D); + + u32 vb_element_base; + + INSERT_PADDING_WORDS(0x49); struct { u32 tsc_address_high; @@ -745,6 +749,7 @@ ASSERT_REG_POSITION(vertex_attrib_format[0], 0x458); ASSERT_REG_POSITION(rt_control, 0x487); ASSERT_REG_POSITION(independent_blend_enable, 0x4B9); ASSERT_REG_POSITION(blend, 0x4CF); +ASSERT_REG_POSITION(vb_element_base, 0x50D); ASSERT_REG_POSITION(tsc, 0x557); ASSERT_REG_POSITION(tic, 0x55D); ASSERT_REG_POSITION(code_address, 0x582); -- cgit v1.2.3 From fca3d1cc65c3a0a838cf57b716063d9d803c5788 Mon Sep 17 00:00:00 2001 From: Subv Date: Mon, 2 Jul 2018 11:22:17 -0500 Subject: GPU: Fixed the index offset rendering, and implemented the base vertex functionality. This fixes Stardew Valley. --- src/video_core/renderer_opengl/gl_rasterizer.cpp | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/video_core/renderer_opengl/gl_rasterizer.cpp b/src/video_core/renderer_opengl/gl_rasterizer.cpp index 62ee45a36..fe78f4226 100644 --- a/src/video_core/renderer_opengl/gl_rasterizer.cpp +++ b/src/video_core/renderer_opengl/gl_rasterizer.cpp @@ -412,12 +412,14 @@ void RasterizerOpenGL::DrawArrays() { const GLenum primitive_mode{MaxwellToGL::PrimitiveTopology(regs.draw.topology)}; if (is_indexed) { - const GLint index_min{static_cast(regs.index_array.first)}; - const GLint index_max{static_cast(regs.index_array.first + regs.index_array.count)}; - glDrawRangeElementsBaseVertex(primitive_mode, index_min, index_max, regs.index_array.count, - MaxwellToGL::IndexFormat(regs.index_array.format), - reinterpret_cast(index_buffer_offset), - -index_min); + const GLint base_vertex{static_cast(regs.vb_element_base)}; + + // Adjust the index buffer offset so it points to the first desired index. + index_buffer_offset += regs.index_array.first * regs.index_array.FormatSizeInBytes(); + + glDrawElementsBaseVertex(primitive_mode, regs.index_array.count, + MaxwellToGL::IndexFormat(regs.index_array.format), + reinterpret_cast(index_buffer_offset), base_vertex); } else { glDrawArrays(primitive_mode, 0, regs.vertex_buffer.count); } -- cgit v1.2.3 From 4c59105adf8dc5171f3c7388b6b0db3cd0ee57ba Mon Sep 17 00:00:00 2001 From: Subv Date: Mon, 2 Jul 2018 11:23:36 -0500 Subject: GPU: Implement offsetted rendering when using non-indexed drawing. --- src/video_core/renderer_opengl/gl_rasterizer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/video_core/renderer_opengl/gl_rasterizer.cpp b/src/video_core/renderer_opengl/gl_rasterizer.cpp index fe78f4226..b10a860a6 100644 --- a/src/video_core/renderer_opengl/gl_rasterizer.cpp +++ b/src/video_core/renderer_opengl/gl_rasterizer.cpp @@ -421,7 +421,7 @@ void RasterizerOpenGL::DrawArrays() { MaxwellToGL::IndexFormat(regs.index_array.format), reinterpret_cast(index_buffer_offset), base_vertex); } else { - glDrawArrays(primitive_mode, 0, regs.vertex_buffer.count); + glDrawArrays(primitive_mode, regs.vertex_buffer.first, regs.vertex_buffer.count); } // Disable scissor test -- cgit v1.2.3