summaryrefslogtreecommitdiff
path: root/src/video_core
diff options
context:
space:
mode:
Diffstat (limited to 'src/video_core')
-rw-r--r--src/video_core/renderer_opengl/gl_rasterizer.cpp57
-rw-r--r--src/video_core/renderer_opengl/gl_rasterizer.h4
2 files changed, 33 insertions, 28 deletions
diff --git a/src/video_core/renderer_opengl/gl_rasterizer.cpp b/src/video_core/renderer_opengl/gl_rasterizer.cpp
index 268b395a1..52a649e2f 100644
--- a/src/video_core/renderer_opengl/gl_rasterizer.cpp
+++ b/src/video_core/renderer_opengl/gl_rasterizer.cpp
@@ -99,7 +99,6 @@ std::pair<u8*, GLintptr> RasterizerOpenGL::SetupVertexArrays(u8* array_ptr,
99 GLintptr buffer_offset) { 99 GLintptr buffer_offset) {
100 MICROPROFILE_SCOPE(OpenGL_VAO); 100 MICROPROFILE_SCOPE(OpenGL_VAO);
101 const auto& regs = Core::System::GetInstance().GPU().Maxwell3D().regs; 101 const auto& regs = Core::System::GetInstance().GPU().Maxwell3D().regs;
102 const auto& memory_manager = Core::System::GetInstance().GPU().memory_manager;
103 102
104 state.draw.vertex_array = hw_vao.handle; 103 state.draw.vertex_array = hw_vao.handle;
105 state.draw.vertex_buffer = stream_buffer.GetHandle(); 104 state.draw.vertex_buffer = stream_buffer.GetHandle();
@@ -117,16 +116,15 @@ std::pair<u8*, GLintptr> RasterizerOpenGL::SetupVertexArrays(u8* array_ptr,
117 ASSERT(end > start); 116 ASSERT(end > start);
118 u64 size = end - start + 1; 117 u64 size = end - start + 1;
119 118
120 // Copy vertex array data 119 GLintptr vertex_buffer_offset;
121 Memory::ReadBlock(*memory_manager->GpuToCpuAddress(start), array_ptr, size); 120 std::tie(array_ptr, buffer_offset, vertex_buffer_offset) =
121 UploadMemory(array_ptr, buffer_offset, start, size);
122 122
123 // Bind the vertex array to the buffer at the current offset. 123 // Bind the vertex array to the buffer at the current offset.
124 glBindVertexBuffer(index, stream_buffer.GetHandle(), buffer_offset, vertex_array.stride); 124 glBindVertexBuffer(index, stream_buffer.GetHandle(), vertex_buffer_offset,
125 vertex_array.stride);
125 126
126 ASSERT_MSG(vertex_array.divisor == 0, "Vertex buffer divisor unimplemented"); 127 ASSERT_MSG(vertex_array.divisor == 0, "Vertex buffer divisor unimplemented");
127
128 array_ptr += size;
129 buffer_offset += size;
130 } 128 }
131 129
132 // Use the vertex array as-is, assumes that the data is formatted correctly for OpenGL. 130 // Use the vertex array as-is, assumes that the data is formatted correctly for OpenGL.
@@ -407,6 +405,23 @@ std::pair<u8*, GLintptr> RasterizerOpenGL::AlignBuffer(u8* buffer_ptr, GLintptr
407 return {buffer_ptr + (offset_aligned - buffer_offset), offset_aligned}; 405 return {buffer_ptr + (offset_aligned - buffer_offset), offset_aligned};
408} 406}
409 407
408std::tuple<u8*, GLintptr, GLintptr> RasterizerOpenGL::UploadMemory(u8* buffer_ptr,
409 GLintptr buffer_offset,
410 Tegra::GPUVAddr gpu_addr,
411 size_t size, size_t alignment) {
412 std::tie(buffer_ptr, buffer_offset) = AlignBuffer(buffer_ptr, buffer_offset, alignment);
413 GLintptr uploaded_offset = buffer_offset;
414
415 const auto& memory_manager = Core::System::GetInstance().GPU().memory_manager;
416 const boost::optional<VAddr> cpu_addr{memory_manager->GpuToCpuAddress(gpu_addr)};
417 Memory::ReadBlock(*cpu_addr, buffer_ptr, size);
418
419 buffer_ptr += size;
420 buffer_offset += size;
421
422 return {buffer_ptr, buffer_offset, uploaded_offset};
423}
424
410void RasterizerOpenGL::DrawArrays() { 425void RasterizerOpenGL::DrawArrays() {
411 if (accelerate_draw == AccelDraw::Disabled) 426 if (accelerate_draw == AccelDraw::Disabled)
412 return; 427 return;
@@ -456,23 +471,13 @@ void RasterizerOpenGL::DrawArrays() {
456 471
457 std::tie(buffer_ptr, buffer_offset) = SetupVertexArrays(buffer_ptr, buffer_offset); 472 std::tie(buffer_ptr, buffer_offset) = SetupVertexArrays(buffer_ptr, buffer_offset);
458 473
459 std::tie(buffer_ptr, buffer_offset) = AlignBuffer(buffer_ptr, buffer_offset, 4);
460
461 // If indexed mode, copy the index buffer 474 // If indexed mode, copy the index buffer
462 GLintptr index_buffer_offset = 0; 475 GLintptr index_buffer_offset = 0;
463 if (is_indexed) { 476 if (is_indexed) {
464 const auto& memory_manager = Core::System::GetInstance().GPU().memory_manager; 477 std::tie(buffer_ptr, buffer_offset, index_buffer_offset) = UploadMemory(
465 const boost::optional<VAddr> index_data_addr{ 478 buffer_ptr, buffer_offset, regs.index_array.StartAddress(), index_buffer_size);
466 memory_manager->GpuToCpuAddress(regs.index_array.StartAddress())};
467 Memory::ReadBlock(*index_data_addr, buffer_ptr, index_buffer_size);
468
469 index_buffer_offset = buffer_offset;
470 buffer_ptr += index_buffer_size;
471 buffer_offset += index_buffer_size;
472 } 479 }
473 480
474 std::tie(buffer_ptr, buffer_offset) = AlignBuffer(buffer_ptr, buffer_offset, 4);
475
476 std::tie(buffer_ptr, buffer_offset) = SetupShaders(buffer_ptr, buffer_offset); 481 std::tie(buffer_ptr, buffer_offset) = SetupShaders(buffer_ptr, buffer_offset);
477 482
478 stream_buffer.Unmap(buffer_ptr - buffer_ptr_base); 483 stream_buffer.Unmap(buffer_ptr - buffer_ptr_base);
@@ -639,8 +644,6 @@ std::tuple<u8*, GLintptr, u32> RasterizerOpenGL::SetupConstBuffers(
639 continue; 644 continue;
640 } 645 }
641 646
642 boost::optional<VAddr> addr = gpu.memory_manager->GpuToCpuAddress(buffer.address);
643
644 size_t size = 0; 647 size_t size = 0;
645 648
646 if (used_buffer.IsIndirect()) { 649 if (used_buffer.IsIndirect()) {
@@ -662,15 +665,13 @@ std::tuple<u8*, GLintptr, u32> RasterizerOpenGL::SetupConstBuffers(
662 size = Common::AlignUp(size, sizeof(GLvec4)); 665 size = Common::AlignUp(size, sizeof(GLvec4));
663 ASSERT_MSG(size <= MaxConstbufferSize, "Constbuffer too big"); 666 ASSERT_MSG(size <= MaxConstbufferSize, "Constbuffer too big");
664 667
665 std::tie(buffer_ptr, buffer_offset) = 668 GLintptr const_buffer_offset;
666 AlignBuffer(buffer_ptr, buffer_offset, static_cast<size_t>(uniform_buffer_alignment)); 669 std::tie(buffer_ptr, buffer_offset, const_buffer_offset) =
670 UploadMemory(buffer_ptr, buffer_offset, buffer.address, size,
671 static_cast<size_t>(uniform_buffer_alignment));
667 672
668 glBindBufferRange(GL_UNIFORM_BUFFER, current_bindpoint + bindpoint, 673 glBindBufferRange(GL_UNIFORM_BUFFER, current_bindpoint + bindpoint,
669 stream_buffer.GetHandle(), buffer_offset, size); 674 stream_buffer.GetHandle(), const_buffer_offset, size);
670
671 Memory::ReadBlock(*addr, buffer_ptr, size);
672 buffer_ptr += size;
673 buffer_offset += size;
674 675
675 // Now configure the bindpoint of the buffer inside the shader 676 // Now configure the bindpoint of the buffer inside the shader
676 const std::string buffer_name = used_buffer.GetName(); 677 const std::string buffer_name = used_buffer.GetName();
diff --git a/src/video_core/renderer_opengl/gl_rasterizer.h b/src/video_core/renderer_opengl/gl_rasterizer.h
index aa6afc1de..74307f626 100644
--- a/src/video_core/renderer_opengl/gl_rasterizer.h
+++ b/src/video_core/renderer_opengl/gl_rasterizer.h
@@ -171,6 +171,10 @@ private:
171 171
172 std::pair<u8*, GLintptr> AlignBuffer(u8* buffer_ptr, GLintptr buffer_offset, size_t alignment); 172 std::pair<u8*, GLintptr> AlignBuffer(u8* buffer_ptr, GLintptr buffer_offset, size_t alignment);
173 173
174 std::tuple<u8*, GLintptr, GLintptr> UploadMemory(u8* buffer_ptr, GLintptr buffer_offset,
175 Tegra::GPUVAddr gpu_addr, size_t size,
176 size_t alignment = 4);
177
174 enum class AccelDraw { Disabled, Arrays, Indexed }; 178 enum class AccelDraw { Disabled, Arrays, Indexed };
175 AccelDraw accelerate_draw = AccelDraw::Disabled; 179 AccelDraw accelerate_draw = AccelDraw::Disabled;
176}; 180};