From 6f6bba3ff16641f92fbc70b31e41be80d4a3c5c8 Mon Sep 17 00:00:00 2001 From: Markus Wick Date: Fri, 10 Aug 2018 09:30:35 +0200 Subject: gl_rasterizer: Use a helper for aligning the buffer. --- src/video_core/renderer_opengl/gl_rasterizer.cpp | 33 ++++++++++++++---------- src/video_core/renderer_opengl/gl_rasterizer.h | 4 ++- 2 files changed, 22 insertions(+), 15 deletions(-) (limited to 'src') 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 return program_code; } -void RasterizerOpenGL::SetupShaders(u8* buffer_ptr, GLintptr buffer_offset) { +std::pair RasterizerOpenGL::SetupShaders(u8* buffer_ptr, GLintptr buffer_offset) { // Helper function for uploading uniform data const auto copy_buffer = [&](GLuint handle, GLintptr offset, GLsizeiptr size) { if (has_ARB_direct_state_access) { @@ -290,6 +290,8 @@ void RasterizerOpenGL::SetupShaders(u8* buffer_ptr, GLintptr buffer_offset) { } shader_program_manager->UseTrivialGeometryShader(); + + return {buffer_ptr, buffer_offset}; } size_t RasterizerOpenGL::CalculateVertexArraysSize() const { @@ -423,6 +425,14 @@ void RasterizerOpenGL::Clear() { } } +std::pair RasterizerOpenGL::AlignBuffer(u8* buffer_ptr, GLintptr buffer_offset, + size_t alignment) { + // Align the offset, not the mapped pointer + GLintptr offset_aligned = + static_cast(Common::AlignUp(static_cast(buffer_offset), alignment)); + return {buffer_ptr + (offset_aligned - buffer_offset), offset_aligned}; +} + void RasterizerOpenGL::DrawArrays() { if (accelerate_draw == AccelDraw::Disabled) return; @@ -464,13 +474,11 @@ void RasterizerOpenGL::DrawArrays() { GLintptr buffer_offset; std::tie(buffer_ptr, buffer_offset, std::ignore) = stream_buffer.Map(static_cast(buffer_size), 4); + u8* buffer_ptr_base = buffer_ptr; - u8* offseted_buffer; - std::tie(offseted_buffer, buffer_offset) = SetupVertexArrays(buffer_ptr, buffer_offset); + std::tie(buffer_ptr, buffer_offset) = SetupVertexArrays(buffer_ptr, buffer_offset); - offseted_buffer = - reinterpret_cast(Common::AlignUp(reinterpret_cast(offseted_buffer), 4)); - buffer_offset = Common::AlignUp(buffer_offset, 4); + std::tie(buffer_ptr, buffer_offset) = AlignBuffer(buffer_ptr, buffer_offset, 4); // If indexed mode, copy the index buffer GLintptr index_buffer_offset = 0; @@ -478,21 +486,18 @@ void RasterizerOpenGL::DrawArrays() { const auto& memory_manager = Core::System::GetInstance().GPU().memory_manager; const boost::optional index_data_addr{ memory_manager->GpuToCpuAddress(regs.index_array.StartAddress())}; - Memory::ReadBlock(*index_data_addr, offseted_buffer, index_buffer_size); + Memory::ReadBlock(*index_data_addr, buffer_ptr, index_buffer_size); index_buffer_offset = buffer_offset; - offseted_buffer += index_buffer_size; + buffer_ptr += index_buffer_size; buffer_offset += index_buffer_size; } - offseted_buffer = - reinterpret_cast(Common::AlignUp(reinterpret_cast(offseted_buffer), 4)); - buffer_offset = Common::AlignUp(buffer_offset, 4); + std::tie(buffer_ptr, buffer_offset) = AlignBuffer(buffer_ptr, buffer_offset, 4); - SetupShaders(offseted_buffer, buffer_offset); + std::tie(buffer_ptr, buffer_offset) = SetupShaders(buffer_ptr, buffer_offset); - // TODO: Don't use buffer_size here, use the updated buffer_offset. - stream_buffer.Unmap(buffer_size); + stream_buffer.Unmap(buffer_ptr - buffer_ptr_base); shader_program_manager->ApplyTo(state); 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: std::array uniform_buffers; - void SetupShaders(u8* buffer_ptr, GLintptr buffer_offset); + std::pair SetupShaders(u8* buffer_ptr, GLintptr buffer_offset); + + std::pair AlignBuffer(u8* buffer_ptr, GLintptr buffer_offset, size_t alignment); enum class AccelDraw { Disabled, Arrays, Indexed }; AccelDraw accelerate_draw = AccelDraw::Disabled; -- cgit v1.2.3