summaryrefslogtreecommitdiffstats
path: root/src/video_core/renderer_opengl/gl_rasterizer.cpp
diff options
context:
space:
mode:
authorSubv <subv2112@gmail.com>2018-06-10 01:02:05 +0200
committerSubv <subv2112@gmail.com>2018-06-10 01:02:05 +0200
commit2a7653142dd8adeacafd8c90e64d52d6959f0aa7 (patch)
tree45507c03f0a4bfa0fb0dc9736fccd448bb9ea0df /src/video_core/renderer_opengl/gl_rasterizer.cpp
parentMerge pull request #550 from Subv/ssy (diff)
downloadyuzu-2a7653142dd8adeacafd8c90e64d52d6959f0aa7.tar
yuzu-2a7653142dd8adeacafd8c90e64d52d6959f0aa7.tar.gz
yuzu-2a7653142dd8adeacafd8c90e64d52d6959f0aa7.tar.bz2
yuzu-2a7653142dd8adeacafd8c90e64d52d6959f0aa7.tar.lz
yuzu-2a7653142dd8adeacafd8c90e64d52d6959f0aa7.tar.xz
yuzu-2a7653142dd8adeacafd8c90e64d52d6959f0aa7.tar.zst
yuzu-2a7653142dd8adeacafd8c90e64d52d6959f0aa7.zip
Diffstat (limited to '')
-rw-r--r--src/video_core/renderer_opengl/gl_rasterizer.cpp28
1 files changed, 17 insertions, 11 deletions
diff --git a/src/video_core/renderer_opengl/gl_rasterizer.cpp b/src/video_core/renderer_opengl/gl_rasterizer.cpp
index 6f05f24a0..e04966849 100644
--- a/src/video_core/renderer_opengl/gl_rasterizer.cpp
+++ b/src/video_core/renderer_opengl/gl_rasterizer.cpp
@@ -197,8 +197,8 @@ void RasterizerOpenGL::SetupShaders(u8* buffer_ptr, GLintptr buffer_offset) {
ASSERT_MSG(!gpu.regs.shader_config[0].enable, "VertexA is unsupported!");
// Next available bindpoints to use when uploading the const buffers and textures to the GLSL
- // shaders.
- u32 current_constbuffer_bindpoint = 0;
+ // shaders. The constbuffer bindpoint starts after the shader stage configuration bind points.
+ u32 current_constbuffer_bindpoint = uniform_buffers.size();
u32 current_texture_bindpoint = 0;
for (unsigned index = 1; index < Maxwell::MaxShaderProgram; ++index) {
@@ -608,27 +608,33 @@ u32 RasterizerOpenGL::SetupConstBuffers(Maxwell::ShaderStage stage, GLuint progr
boost::optional<VAddr> addr = gpu.memory_manager->GpuToCpuAddress(buffer.address);
- std::vector<u8> data;
+ size_t size = 0;
+
if (used_buffer.IsIndirect()) {
// Buffer is accessed indirectly, so upload the entire thing
- data.resize(buffer.size * sizeof(float));
+ size = buffer.size * sizeof(float);
} else {
// Buffer is accessed directly, upload just what we use
- data.resize(used_buffer.GetSize() * sizeof(float));
+ size = used_buffer.GetSize() * sizeof(float);
}
+ // Align the actual size so it ends up being a multiple of vec4 to meet the OpenGL std140
+ // UBO alignment requirements.
+ size = Common::AlignUp(size, sizeof(GLvec4));
+ ASSERT_MSG(size <= MaxConstbufferSize, "Constbuffer too big");
+
+ std::vector<u8> data(size);
Memory::ReadBlock(*addr, data.data(), data.size());
- glBindBuffer(GL_SHADER_STORAGE_BUFFER, buffer_draw_state.ssbo);
- glBufferData(GL_SHADER_STORAGE_BUFFER, data.size(), data.data(), GL_DYNAMIC_DRAW);
- glBindBuffer(GL_SHADER_STORAGE_BUFFER, 0);
+ glBindBuffer(GL_UNIFORM_BUFFER, buffer_draw_state.ssbo);
+ glBufferData(GL_UNIFORM_BUFFER, data.size(), data.data(), GL_DYNAMIC_DRAW);
+ glBindBuffer(GL_UNIFORM_BUFFER, 0);
// Now configure the bindpoint of the buffer inside the shader
std::string buffer_name = used_buffer.GetName();
- GLuint index =
- glGetProgramResourceIndex(program, GL_SHADER_STORAGE_BLOCK, buffer_name.c_str());
+ GLuint index = glGetProgramResourceIndex(program, GL_UNIFORM_BLOCK, buffer_name.c_str());
if (index != -1)
- glShaderStorageBlockBinding(program, index, buffer_draw_state.bindpoint);
+ glUniformBlockBinding(program, index, buffer_draw_state.bindpoint);
}
state.Apply();