diff options
| author | 2018-08-10 09:30:35 +0200 | |
|---|---|---|
| committer | 2018-08-12 15:47:35 +0200 | |
| commit | 6f6bba3ff16641f92fbc70b31e41be80d4a3c5c8 (patch) | |
| tree | bc4fb622062c9447ec12cd29b49887d3c1960195 /src | |
| parent | Update the stream_buffer helper from Citra. (diff) | |
| download | yuzu-6f6bba3ff16641f92fbc70b31e41be80d4a3c5c8.tar.gz yuzu-6f6bba3ff16641f92fbc70b31e41be80d4a3c5c8.tar.xz yuzu-6f6bba3ff16641f92fbc70b31e41be80d4a3c5c8.zip | |
gl_rasterizer: Use a helper for aligning the buffer.
Diffstat (limited to 'src')
| -rw-r--r-- | src/video_core/renderer_opengl/gl_rasterizer.cpp | 33 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/gl_rasterizer.h | 4 |
2 files changed, 22 insertions, 15 deletions
diff --git a/src/video_core/renderer_opengl/gl_rasterizer.cpp b/src/video_core/renderer_opengl/gl_rasterizer.cpp index 94e3f59a7..0a62b7383 100644 --- a/src/video_core/renderer_opengl/gl_rasterizer.cpp +++ b/src/video_core/renderer_opengl/gl_rasterizer.cpp | |||
| @@ -192,7 +192,7 @@ static GLShader::ProgramCode GetShaderProgramCode(Maxwell::ShaderProgram program | |||
| 192 | return program_code; | 192 | return program_code; |
| 193 | } | 193 | } |
| 194 | 194 | ||
| 195 | void RasterizerOpenGL::SetupShaders(u8* buffer_ptr, GLintptr buffer_offset) { | 195 | std::pair<u8*, GLintptr> RasterizerOpenGL::SetupShaders(u8* buffer_ptr, GLintptr buffer_offset) { |
| 196 | // Helper function for uploading uniform data | 196 | // Helper function for uploading uniform data |
| 197 | const auto copy_buffer = [&](GLuint handle, GLintptr offset, GLsizeiptr size) { | 197 | const auto copy_buffer = [&](GLuint handle, GLintptr offset, GLsizeiptr size) { |
| 198 | if (has_ARB_direct_state_access) { | 198 | if (has_ARB_direct_state_access) { |
| @@ -290,6 +290,8 @@ void RasterizerOpenGL::SetupShaders(u8* buffer_ptr, GLintptr buffer_offset) { | |||
| 290 | } | 290 | } |
| 291 | 291 | ||
| 292 | shader_program_manager->UseTrivialGeometryShader(); | 292 | shader_program_manager->UseTrivialGeometryShader(); |
| 293 | |||
| 294 | return {buffer_ptr, buffer_offset}; | ||
| 293 | } | 295 | } |
| 294 | 296 | ||
| 295 | size_t RasterizerOpenGL::CalculateVertexArraysSize() const { | 297 | size_t RasterizerOpenGL::CalculateVertexArraysSize() const { |
| @@ -423,6 +425,14 @@ void RasterizerOpenGL::Clear() { | |||
| 423 | } | 425 | } |
| 424 | } | 426 | } |
| 425 | 427 | ||
| 428 | std::pair<u8*, GLintptr> RasterizerOpenGL::AlignBuffer(u8* buffer_ptr, GLintptr buffer_offset, | ||
| 429 | size_t alignment) { | ||
| 430 | // Align the offset, not the mapped pointer | ||
| 431 | GLintptr offset_aligned = | ||
| 432 | static_cast<GLintptr>(Common::AlignUp(static_cast<size_t>(buffer_offset), alignment)); | ||
| 433 | return {buffer_ptr + (offset_aligned - buffer_offset), offset_aligned}; | ||
| 434 | } | ||
| 435 | |||
| 426 | void RasterizerOpenGL::DrawArrays() { | 436 | void RasterizerOpenGL::DrawArrays() { |
| 427 | if (accelerate_draw == AccelDraw::Disabled) | 437 | if (accelerate_draw == AccelDraw::Disabled) |
| 428 | return; | 438 | return; |
| @@ -464,13 +474,11 @@ void RasterizerOpenGL::DrawArrays() { | |||
| 464 | GLintptr buffer_offset; | 474 | GLintptr buffer_offset; |
| 465 | std::tie(buffer_ptr, buffer_offset, std::ignore) = | 475 | std::tie(buffer_ptr, buffer_offset, std::ignore) = |
| 466 | stream_buffer.Map(static_cast<GLsizeiptr>(buffer_size), 4); | 476 | stream_buffer.Map(static_cast<GLsizeiptr>(buffer_size), 4); |
| 477 | u8* buffer_ptr_base = buffer_ptr; | ||
| 467 | 478 | ||
| 468 | u8* offseted_buffer; | 479 | std::tie(buffer_ptr, buffer_offset) = SetupVertexArrays(buffer_ptr, buffer_offset); |
| 469 | std::tie(offseted_buffer, buffer_offset) = SetupVertexArrays(buffer_ptr, buffer_offset); | ||
| 470 | 480 | ||
| 471 | offseted_buffer = | 481 | std::tie(buffer_ptr, buffer_offset) = AlignBuffer(buffer_ptr, buffer_offset, 4); |
| 472 | reinterpret_cast<u8*>(Common::AlignUp(reinterpret_cast<size_t>(offseted_buffer), 4)); | ||
| 473 | buffer_offset = Common::AlignUp<size_t>(buffer_offset, 4); | ||
| 474 | 482 | ||
| 475 | // If indexed mode, copy the index buffer | 483 | // If indexed mode, copy the index buffer |
| 476 | GLintptr index_buffer_offset = 0; | 484 | GLintptr index_buffer_offset = 0; |
| @@ -478,21 +486,18 @@ void RasterizerOpenGL::DrawArrays() { | |||
| 478 | const auto& memory_manager = Core::System::GetInstance().GPU().memory_manager; | 486 | const auto& memory_manager = Core::System::GetInstance().GPU().memory_manager; |
| 479 | const boost::optional<VAddr> index_data_addr{ | 487 | const boost::optional<VAddr> index_data_addr{ |
| 480 | memory_manager->GpuToCpuAddress(regs.index_array.StartAddress())}; | 488 | memory_manager->GpuToCpuAddress(regs.index_array.StartAddress())}; |
| 481 | Memory::ReadBlock(*index_data_addr, offseted_buffer, index_buffer_size); | 489 | Memory::ReadBlock(*index_data_addr, buffer_ptr, index_buffer_size); |
| 482 | 490 | ||
| 483 | index_buffer_offset = buffer_offset; | 491 | index_buffer_offset = buffer_offset; |
| 484 | offseted_buffer += index_buffer_size; | 492 | buffer_ptr += index_buffer_size; |
| 485 | buffer_offset += index_buffer_size; | 493 | buffer_offset += index_buffer_size; |
| 486 | } | 494 | } |
| 487 | 495 | ||
| 488 | offseted_buffer = | 496 | std::tie(buffer_ptr, buffer_offset) = AlignBuffer(buffer_ptr, buffer_offset, 4); |
| 489 | reinterpret_cast<u8*>(Common::AlignUp(reinterpret_cast<size_t>(offseted_buffer), 4)); | ||
| 490 | buffer_offset = Common::AlignUp<size_t>(buffer_offset, 4); | ||
| 491 | 497 | ||
| 492 | SetupShaders(offseted_buffer, buffer_offset); | 498 | std::tie(buffer_ptr, buffer_offset) = SetupShaders(buffer_ptr, buffer_offset); |
| 493 | 499 | ||
| 494 | // TODO: Don't use buffer_size here, use the updated buffer_offset. | 500 | stream_buffer.Unmap(buffer_ptr - buffer_ptr_base); |
| 495 | stream_buffer.Unmap(buffer_size); | ||
| 496 | 501 | ||
| 497 | shader_program_manager->ApplyTo(state); | 502 | shader_program_manager->ApplyTo(state); |
| 498 | state.Apply(); | 503 | state.Apply(); |
diff --git a/src/video_core/renderer_opengl/gl_rasterizer.h b/src/video_core/renderer_opengl/gl_rasterizer.h index 19146777c..d9d4e04b9 100644 --- a/src/video_core/renderer_opengl/gl_rasterizer.h +++ b/src/video_core/renderer_opengl/gl_rasterizer.h | |||
| @@ -169,7 +169,9 @@ private: | |||
| 169 | 169 | ||
| 170 | std::array<OGLBuffer, Tegra::Engines::Maxwell3D::Regs::MaxShaderStage> uniform_buffers; | 170 | std::array<OGLBuffer, Tegra::Engines::Maxwell3D::Regs::MaxShaderStage> uniform_buffers; |
| 171 | 171 | ||
| 172 | void SetupShaders(u8* buffer_ptr, GLintptr buffer_offset); | 172 | std::pair<u8*, GLintptr> SetupShaders(u8* buffer_ptr, GLintptr buffer_offset); |
| 173 | |||
| 174 | std::pair<u8*, GLintptr> AlignBuffer(u8* buffer_ptr, GLintptr buffer_offset, size_t alignment); | ||
| 173 | 175 | ||
| 174 | enum class AccelDraw { Disabled, Arrays, Indexed }; | 176 | enum class AccelDraw { Disabled, Arrays, Indexed }; |
| 175 | AccelDraw accelerate_draw = AccelDraw::Disabled; | 177 | AccelDraw accelerate_draw = AccelDraw::Disabled; |