diff options
Diffstat (limited to 'src/video_core')
| -rw-r--r-- | src/video_core/renderer_opengl/gl_rasterizer.cpp | 57 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/gl_rasterizer.h | 4 |
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 | ||
| 408 | std::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 | |||
| 410 | void RasterizerOpenGL::DrawArrays() { | 425 | void 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 | }; |