summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar Markus Wick2018-09-19 09:22:30 +0200
committerGravatar Markus Wick2018-09-19 09:22:30 +0200
commitf465e4aaf2d3987355ac560ead37527dc381287a (patch)
tree24f2de748d940c3c54b74d1852ad554a55475daa /src
parentMerge pull request #1348 from ogniK5377/GetImageSize (diff)
downloadyuzu-f465e4aaf2d3987355ac560ead37527dc381287a.tar.gz
yuzu-f465e4aaf2d3987355ac560ead37527dc381287a.tar.xz
yuzu-f465e4aaf2d3987355ac560ead37527dc381287a.zip
gl_rasterizer: Fix StartAddress handling with indexed draw calls.
We uploaded the wrong data before. So the offset on the host GPU pointer may work for the first vertices, the last ones run out bounds. Let's just offset the upload instead.
Diffstat (limited to 'src')
-rw-r--r--src/video_core/renderer_opengl/gl_rasterizer.cpp13
1 files changed, 7 insertions, 6 deletions
diff --git a/src/video_core/renderer_opengl/gl_rasterizer.cpp b/src/video_core/renderer_opengl/gl_rasterizer.cpp
index 274c2dbcf..e37acbfac 100644
--- a/src/video_core/renderer_opengl/gl_rasterizer.cpp
+++ b/src/video_core/renderer_opengl/gl_rasterizer.cpp
@@ -484,8 +484,13 @@ void RasterizerOpenGL::DrawArrays() {
484 GLintptr index_buffer_offset = 0; 484 GLintptr index_buffer_offset = 0;
485 if (is_indexed) { 485 if (is_indexed) {
486 MICROPROFILE_SCOPE(OpenGL_Index); 486 MICROPROFILE_SCOPE(OpenGL_Index);
487 index_buffer_offset = 487
488 buffer_cache.UploadMemory(regs.index_array.StartAddress(), index_buffer_size); 488 // Adjust the index buffer offset so it points to the first desired index.
489 auto index_start = regs.index_array.StartAddress();
490 index_start += static_cast<size_t>(regs.index_array.first) *
491 static_cast<size_t>(regs.index_array.FormatSizeInBytes());
492
493 index_buffer_offset = buffer_cache.UploadMemory(index_start, index_buffer_size);
489 } 494 }
490 495
491 SetupShaders(); 496 SetupShaders();
@@ -499,10 +504,6 @@ void RasterizerOpenGL::DrawArrays() {
499 if (is_indexed) { 504 if (is_indexed) {
500 const GLint base_vertex{static_cast<GLint>(regs.vb_element_base)}; 505 const GLint base_vertex{static_cast<GLint>(regs.vb_element_base)};
501 506
502 // Adjust the index buffer offset so it points to the first desired index.
503 index_buffer_offset += static_cast<GLintptr>(regs.index_array.first) *
504 static_cast<GLintptr>(regs.index_array.FormatSizeInBytes());
505
506 if (gpu.state.current_instance > 0) { 507 if (gpu.state.current_instance > 0) {
507 glDrawElementsInstancedBaseVertexBaseInstance( 508 glDrawElementsInstancedBaseVertexBaseInstance(
508 primitive_mode, regs.index_array.count, 509 primitive_mode, regs.index_array.count,