mirror of
				https://github.com/PabloMK7/citra.git
				synced 2025-10-31 13:50:03 +00:00 
			
		
		
		
	OGL: Use stream buffer for vertex data.
This commit is contained in:
		
							parent
							
								
									50598fbbf4
								
							
						
					
					
						commit
						ac92664aa7
					
				
					 2 changed files with 15 additions and 6 deletions
				
			
		|  | @ -41,12 +41,13 @@ RasterizerOpenGL::RasterizerOpenGL() : shader_dirty(true) { | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     // Generate VBO, VAO and UBO
 |     // Generate VBO, VAO and UBO
 | ||||||
|     vertex_buffer.Create(); |     vertex_buffer = OGLStreamBuffer::MakeBuffer(GLAD_GL_ARB_buffer_storage, GL_ARRAY_BUFFER); | ||||||
|  |     vertex_buffer->Create(VERTEX_BUFFER_SIZE, VERTEX_BUFFER_SIZE / 2); | ||||||
|     vertex_array.Create(); |     vertex_array.Create(); | ||||||
|     uniform_buffer.Create(); |     uniform_buffer.Create(); | ||||||
| 
 | 
 | ||||||
|     state.draw.vertex_array = vertex_array.handle; |     state.draw.vertex_array = vertex_array.handle; | ||||||
|     state.draw.vertex_buffer = vertex_buffer.handle; |     state.draw.vertex_buffer = vertex_buffer->GetHandle(); | ||||||
|     state.draw.uniform_buffer = uniform_buffer.handle; |     state.draw.uniform_buffer = uniform_buffer.handle; | ||||||
|     state.Apply(); |     state.Apply(); | ||||||
| 
 | 
 | ||||||
|  | @ -434,9 +435,15 @@ void RasterizerOpenGL::DrawTriangles() { | ||||||
|     state.Apply(); |     state.Apply(); | ||||||
| 
 | 
 | ||||||
|     // Draw the vertex batch
 |     // Draw the vertex batch
 | ||||||
|     glBufferData(GL_ARRAY_BUFFER, vertex_batch.size() * sizeof(HardwareVertex), vertex_batch.data(), |     size_t max_vertices = 3 * (VERTEX_BUFFER_SIZE / (3 * sizeof(HardwareVertex))); | ||||||
|                  GL_STREAM_DRAW); |     for (size_t base_vertex = 0; base_vertex < vertex_batch.size(); base_vertex += max_vertices) { | ||||||
|     glDrawArrays(GL_TRIANGLES, 0, (GLsizei)vertex_batch.size()); |         size_t vertices = std::min(max_vertices, vertex_batch.size() - base_vertex); | ||||||
|  |         size_t vertex_size = vertices * sizeof(HardwareVertex); | ||||||
|  |         auto map = vertex_buffer->Map(vertex_size, 1); | ||||||
|  |         memcpy(map.first, vertex_batch.data() + base_vertex, vertex_size); | ||||||
|  |         vertex_buffer->Unmap(); | ||||||
|  |         glDrawArrays(GL_TRIANGLES, map.second / sizeof(HardwareVertex), (GLsizei)vertices); | ||||||
|  |     } | ||||||
| 
 | 
 | ||||||
|     // Disable scissor test
 |     // Disable scissor test
 | ||||||
|     state.scissor.enabled = false; |     state.scissor.enabled = false; | ||||||
|  |  | ||||||
|  | @ -27,6 +27,7 @@ | ||||||
| #include "video_core/renderer_opengl/gl_resource_manager.h" | #include "video_core/renderer_opengl/gl_resource_manager.h" | ||||||
| #include "video_core/renderer_opengl/gl_shader_gen.h" | #include "video_core/renderer_opengl/gl_shader_gen.h" | ||||||
| #include "video_core/renderer_opengl/gl_state.h" | #include "video_core/renderer_opengl/gl_state.h" | ||||||
|  | #include "video_core/renderer_opengl/gl_stream_buffer.h" | ||||||
| #include "video_core/renderer_opengl/pica_to_gl.h" | #include "video_core/renderer_opengl/pica_to_gl.h" | ||||||
| #include "video_core/shader/shader.h" | #include "video_core/shader/shader.h" | ||||||
| 
 | 
 | ||||||
|  | @ -283,7 +284,8 @@ private: | ||||||
| 
 | 
 | ||||||
|     std::array<SamplerInfo, 3> texture_samplers; |     std::array<SamplerInfo, 3> texture_samplers; | ||||||
|     OGLVertexArray vertex_array; |     OGLVertexArray vertex_array; | ||||||
|     OGLBuffer vertex_buffer; |     static constexpr size_t VERTEX_BUFFER_SIZE = 128 * 1024 * 1024; | ||||||
|  |     std::unique_ptr<OGLStreamBuffer> vertex_buffer; | ||||||
|     OGLBuffer uniform_buffer; |     OGLBuffer uniform_buffer; | ||||||
|     OGLFramebuffer framebuffer; |     OGLFramebuffer framebuffer; | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue