mirror of
				https://git.zaroz.cloud/nintendo-back-up/yuzu/yuzu.git
				synced 2025-05-12 00:45:25 +00:00 
			
		
		
		
	Merge pull request #606 from Subv/base_vertex
GPU: Fixed the index offset and implement BaseVertex when doing indexed rendering.
This commit is contained in:
		
						commit
						055f1546d7
					
				@ -455,7 +455,11 @@ public:
 | 
				
			|||||||
                    u32 enable[NumRenderTargets];
 | 
					                    u32 enable[NumRenderTargets];
 | 
				
			||||||
                } blend;
 | 
					                } blend;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                INSERT_PADDING_WORDS(0x77);
 | 
					                INSERT_PADDING_WORDS(0x2D);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                u32 vb_element_base;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                INSERT_PADDING_WORDS(0x49);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                struct {
 | 
					                struct {
 | 
				
			||||||
                    u32 tsc_address_high;
 | 
					                    u32 tsc_address_high;
 | 
				
			||||||
@ -745,6 +749,7 @@ ASSERT_REG_POSITION(vertex_attrib_format[0], 0x458);
 | 
				
			|||||||
ASSERT_REG_POSITION(rt_control, 0x487);
 | 
					ASSERT_REG_POSITION(rt_control, 0x487);
 | 
				
			||||||
ASSERT_REG_POSITION(independent_blend_enable, 0x4B9);
 | 
					ASSERT_REG_POSITION(independent_blend_enable, 0x4B9);
 | 
				
			||||||
ASSERT_REG_POSITION(blend, 0x4CF);
 | 
					ASSERT_REG_POSITION(blend, 0x4CF);
 | 
				
			||||||
 | 
					ASSERT_REG_POSITION(vb_element_base, 0x50D);
 | 
				
			||||||
ASSERT_REG_POSITION(tsc, 0x557);
 | 
					ASSERT_REG_POSITION(tsc, 0x557);
 | 
				
			||||||
ASSERT_REG_POSITION(tic, 0x55D);
 | 
					ASSERT_REG_POSITION(tic, 0x55D);
 | 
				
			||||||
ASSERT_REG_POSITION(code_address, 0x582);
 | 
					ASSERT_REG_POSITION(code_address, 0x582);
 | 
				
			||||||
 | 
				
			|||||||
@ -412,14 +412,16 @@ void RasterizerOpenGL::DrawArrays() {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    const GLenum primitive_mode{MaxwellToGL::PrimitiveTopology(regs.draw.topology)};
 | 
					    const GLenum primitive_mode{MaxwellToGL::PrimitiveTopology(regs.draw.topology)};
 | 
				
			||||||
    if (is_indexed) {
 | 
					    if (is_indexed) {
 | 
				
			||||||
        const GLint index_min{static_cast<GLint>(regs.index_array.first)};
 | 
					        const GLint base_vertex{static_cast<GLint>(regs.vb_element_base)};
 | 
				
			||||||
        const GLint index_max{static_cast<GLint>(regs.index_array.first + regs.index_array.count)};
 | 
					
 | 
				
			||||||
        glDrawRangeElementsBaseVertex(primitive_mode, index_min, index_max, regs.index_array.count,
 | 
					        // Adjust the index buffer offset so it points to the first desired index.
 | 
				
			||||||
 | 
					        index_buffer_offset += regs.index_array.first * regs.index_array.FormatSizeInBytes();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        glDrawElementsBaseVertex(primitive_mode, regs.index_array.count,
 | 
				
			||||||
                                 MaxwellToGL::IndexFormat(regs.index_array.format),
 | 
					                                 MaxwellToGL::IndexFormat(regs.index_array.format),
 | 
				
			||||||
                                      reinterpret_cast<const void*>(index_buffer_offset),
 | 
					                                 reinterpret_cast<const void*>(index_buffer_offset), base_vertex);
 | 
				
			||||||
                                      -index_min);
 | 
					 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
        glDrawArrays(primitive_mode, 0, regs.vertex_buffer.count);
 | 
					        glDrawArrays(primitive_mode, regs.vertex_buffer.first, regs.vertex_buffer.count);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Disable scissor test
 | 
					    // Disable scissor test
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user