summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar Markus Wick2018-08-10 09:30:35 +0200
committerGravatar Markus Wick2018-08-12 15:47:35 +0200
commit6f6bba3ff16641f92fbc70b31e41be80d4a3c5c8 (patch)
treebc4fb622062c9447ec12cd29b49887d3c1960195 /src
parentUpdate the stream_buffer helper from Citra. (diff)
downloadyuzu-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.cpp33
-rw-r--r--src/video_core/renderer_opengl/gl_rasterizer.h4
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
195void RasterizerOpenGL::SetupShaders(u8* buffer_ptr, GLintptr buffer_offset) { 195std::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
295size_t RasterizerOpenGL::CalculateVertexArraysSize() const { 297size_t RasterizerOpenGL::CalculateVertexArraysSize() const {
@@ -423,6 +425,14 @@ void RasterizerOpenGL::Clear() {
423 } 425 }
424} 426}
425 427
428std::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
426void RasterizerOpenGL::DrawArrays() { 436void 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;