1
0
Fork 0
forked from suyu/suyu

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:
Sebastian Valle 2018-07-02 14:07:38 -05:00 committed by GitHub
commit 055f1546d7
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 15 additions and 8 deletions

View file

@ -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);

View file

@ -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.
MaxwellToGL::IndexFormat(regs.index_array.format), index_buffer_offset += regs.index_array.first * regs.index_array.FormatSizeInBytes();
reinterpret_cast<const void*>(index_buffer_offset),
-index_min); glDrawElementsBaseVertex(primitive_mode, regs.index_array.count,
MaxwellToGL::IndexFormat(regs.index_array.format),
reinterpret_cast<const void*>(index_buffer_offset), base_vertex);
} 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