|
|
@ -98,7 +98,8 @@ RasterizerOpenGL::~RasterizerOpenGL() {}
|
|
|
|
std::pair<u8*, GLintptr> RasterizerOpenGL::SetupVertexArrays(u8* array_ptr,
|
|
|
|
std::pair<u8*, GLintptr> RasterizerOpenGL::SetupVertexArrays(u8* array_ptr,
|
|
|
|
GLintptr buffer_offset) {
|
|
|
|
GLintptr buffer_offset) {
|
|
|
|
MICROPROFILE_SCOPE(OpenGL_VAO);
|
|
|
|
MICROPROFILE_SCOPE(OpenGL_VAO);
|
|
|
|
const auto& regs = Core::System::GetInstance().GPU().Maxwell3D().regs;
|
|
|
|
const auto& gpu = Core::System::GetInstance().GPU().Maxwell3D();
|
|
|
|
|
|
|
|
const auto& regs = gpu.regs;
|
|
|
|
|
|
|
|
|
|
|
|
state.draw.vertex_array = hw_vao.handle;
|
|
|
|
state.draw.vertex_array = hw_vao.handle;
|
|
|
|
state.draw.vertex_buffer = stream_buffer.GetHandle();
|
|
|
|
state.draw.vertex_buffer = stream_buffer.GetHandle();
|
|
|
@ -110,9 +111,13 @@ std::pair<u8*, GLintptr> RasterizerOpenGL::SetupVertexArrays(u8* array_ptr,
|
|
|
|
if (!vertex_array.IsEnabled())
|
|
|
|
if (!vertex_array.IsEnabled())
|
|
|
|
continue;
|
|
|
|
continue;
|
|
|
|
|
|
|
|
|
|
|
|
const Tegra::GPUVAddr start = vertex_array.StartAddress();
|
|
|
|
Tegra::GPUVAddr start = vertex_array.StartAddress();
|
|
|
|
const Tegra::GPUVAddr end = regs.vertex_array_limit[index].LimitAddress();
|
|
|
|
const Tegra::GPUVAddr end = regs.vertex_array_limit[index].LimitAddress();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (regs.instanced_arrays.IsInstancingEnabled(index) && vertex_array.divisor != 0) {
|
|
|
|
|
|
|
|
start += vertex_array.stride * (gpu.state.current_instance / vertex_array.divisor);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
ASSERT(end > start);
|
|
|
|
ASSERT(end > start);
|
|
|
|
u64 size = end - start + 1;
|
|
|
|
u64 size = end - start + 1;
|
|
|
|
|
|
|
|
|
|
|
@ -124,7 +129,15 @@ std::pair<u8*, GLintptr> RasterizerOpenGL::SetupVertexArrays(u8* array_ptr,
|
|
|
|
glBindVertexBuffer(index, stream_buffer.GetHandle(), vertex_buffer_offset,
|
|
|
|
glBindVertexBuffer(index, stream_buffer.GetHandle(), vertex_buffer_offset,
|
|
|
|
vertex_array.stride);
|
|
|
|
vertex_array.stride);
|
|
|
|
|
|
|
|
|
|
|
|
ASSERT_MSG(vertex_array.divisor == 0, "Instanced vertex arrays are not supported");
|
|
|
|
if (regs.instanced_arrays.IsInstancingEnabled(index) && vertex_array.divisor != 0) {
|
|
|
|
|
|
|
|
// Tell OpenGL that this is an instanced vertex buffer to prevent accessing different
|
|
|
|
|
|
|
|
// indexes on each vertex. We do the instance indexing manually by incrementing the
|
|
|
|
|
|
|
|
// start address of the vertex buffer.
|
|
|
|
|
|
|
|
glVertexBindingDivisor(index, 1);
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
// Disable the vertex buffer instancing.
|
|
|
|
|
|
|
|
glVertexBindingDivisor(index, 0);
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Use the vertex array as-is, assumes that the data is formatted correctly for OpenGL.
|
|
|
|
// Use the vertex array as-is, assumes that the data is formatted correctly for OpenGL.
|
|
|
|