diff options
author | bunnei <bunneidev@gmail.com> | 2018-08-20 20:32:50 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-08-20 20:32:50 +0200 |
commit | 028d90eb79b75292d352cc8d4b96a2df74cd6b6e (patch) | |
tree | ab7df9fd12b103b7c832e9691d2abbb72ca38e93 /src/video_core/renderer_opengl | |
parent | Merge pull request #1115 from Subv/texs_mask (diff) | |
parent | GLRasterizer: Implemented instanced vertex arrays. (diff) | |
download | yuzu-028d90eb79b75292d352cc8d4b96a2df74cd6b6e.tar yuzu-028d90eb79b75292d352cc8d4b96a2df74cd6b6e.tar.gz yuzu-028d90eb79b75292d352cc8d4b96a2df74cd6b6e.tar.bz2 yuzu-028d90eb79b75292d352cc8d4b96a2df74cd6b6e.tar.lz yuzu-028d90eb79b75292d352cc8d4b96a2df74cd6b6e.tar.xz yuzu-028d90eb79b75292d352cc8d4b96a2df74cd6b6e.tar.zst yuzu-028d90eb79b75292d352cc8d4b96a2df74cd6b6e.zip |
Diffstat (limited to 'src/video_core/renderer_opengl')
-rw-r--r-- | src/video_core/renderer_opengl/gl_rasterizer.cpp | 19 |
1 files changed, 16 insertions, 3 deletions
diff --git a/src/video_core/renderer_opengl/gl_rasterizer.cpp b/src/video_core/renderer_opengl/gl_rasterizer.cpp index 93eadde7a..fe1f55e85 100644 --- a/src/video_core/renderer_opengl/gl_rasterizer.cpp +++ b/src/video_core/renderer_opengl/gl_rasterizer.cpp @@ -98,7 +98,8 @@ RasterizerOpenGL::~RasterizerOpenGL() {} std::pair<u8*, GLintptr> RasterizerOpenGL::SetupVertexArrays(u8* array_ptr, GLintptr buffer_offset) { 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_buffer = stream_buffer.GetHandle(); @@ -110,9 +111,13 @@ std::pair<u8*, GLintptr> RasterizerOpenGL::SetupVertexArrays(u8* array_ptr, if (!vertex_array.IsEnabled()) continue; - const Tegra::GPUVAddr start = vertex_array.StartAddress(); + Tegra::GPUVAddr start = vertex_array.StartAddress(); 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); 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, 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. |