mirror of
				https://git.zaroz.cloud/nintendo-back-up/yuzu/yuzu.git
				synced 2025-05-12 00:45:25 +00:00 
			
		
		
		
	gl_rasterizer: Use a helper for aligning the buffer.
This commit is contained in:
		
							parent
							
								
									d7298ec262
								
							
						
					
					
						commit
						6f6bba3ff1
					
				| @ -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<u8*, GLintptr> 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<u8*, GLintptr> RasterizerOpenGL::AlignBuffer(u8* buffer_ptr, GLintptr buffer_offset, | ||||
|                                                        size_t alignment) { | ||||
|     // Align the offset, not the mapped pointer
 | ||||
|     GLintptr offset_aligned = | ||||
|         static_cast<GLintptr>(Common::AlignUp(static_cast<size_t>(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<GLsizeiptr>(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<u8*>(Common::AlignUp(reinterpret_cast<size_t>(offseted_buffer), 4)); | ||||
|     buffer_offset = Common::AlignUp<size_t>(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<VAddr> 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<u8*>(Common::AlignUp(reinterpret_cast<size_t>(offseted_buffer), 4)); | ||||
|     buffer_offset = Common::AlignUp<size_t>(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(); | ||||
|  | ||||
| @ -169,7 +169,9 @@ private: | ||||
| 
 | ||||
|     std::array<OGLBuffer, Tegra::Engines::Maxwell3D::Regs::MaxShaderStage> uniform_buffers; | ||||
| 
 | ||||
|     void SetupShaders(u8* buffer_ptr, GLintptr buffer_offset); | ||||
|     std::pair<u8*, GLintptr> SetupShaders(u8* buffer_ptr, GLintptr buffer_offset); | ||||
| 
 | ||||
|     std::pair<u8*, GLintptr> AlignBuffer(u8* buffer_ptr, GLintptr buffer_offset, size_t alignment); | ||||
| 
 | ||||
|     enum class AccelDraw { Disabled, Arrays, Indexed }; | ||||
|     AccelDraw accelerate_draw = AccelDraw::Disabled; | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Markus Wick
						Markus Wick