summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSubv <subv2112@gmail.com>2018-04-15 21:42:23 +0200
committerSubv <subv2112@gmail.com>2018-04-15 22:02:50 +0200
commit477aab59603825e3cfc5144b784d0fe3df286ae4 (patch)
tree4ea684514f99ad3e1718282e01e2d04c6b938f5f
parentGPU: Don't use explicit binding points when uploading the constbuffers to opengl. (diff)
downloadyuzu-477aab59603825e3cfc5144b784d0fe3df286ae4.tar
yuzu-477aab59603825e3cfc5144b784d0fe3df286ae4.tar.gz
yuzu-477aab59603825e3cfc5144b784d0fe3df286ae4.tar.bz2
yuzu-477aab59603825e3cfc5144b784d0fe3df286ae4.tar.lz
yuzu-477aab59603825e3cfc5144b784d0fe3df286ae4.tar.xz
yuzu-477aab59603825e3cfc5144b784d0fe3df286ae4.tar.zst
yuzu-477aab59603825e3cfc5144b784d0fe3df286ae4.zip
-rw-r--r--src/video_core/renderer_opengl/gl_rasterizer.cpp17
-rw-r--r--src/video_core/renderer_opengl/gl_rasterizer.h5
-rw-r--r--src/video_core/renderer_opengl/gl_shader_decompiler.cpp5
-rw-r--r--src/video_core/renderer_opengl/gl_shader_gen.h14
4 files changed, 24 insertions, 17 deletions
diff --git a/src/video_core/renderer_opengl/gl_rasterizer.cpp b/src/video_core/renderer_opengl/gl_rasterizer.cpp
index a80923285..28abc563a 100644
--- a/src/video_core/renderer_opengl/gl_rasterizer.cpp
+++ b/src/video_core/renderer_opengl/gl_rasterizer.cpp
@@ -226,10 +226,6 @@ void RasterizerOpenGL::SetupShaders(u8* buffer_ptr, GLintptr buffer_offset, size
Memory::ReadBlock(cpu_address, program_code.data(), program_code.size() * sizeof(u64));
GLShader::ShaderSetup setup{std::move(program_code)};
- static constexpr std::array<const char*, Maxwell::MaxShaderStage> base_names = {
- "buffer_vs_c", "buffer_tessc_c", "buffer_tesse_c", "buffer_gs_c", "buffer_fs_c",
- };
-
GLShader::ShaderEntries shader_resources;
switch (program) {
@@ -255,9 +251,9 @@ void RasterizerOpenGL::SetupShaders(u8* buffer_ptr, GLintptr buffer_offset, size
static_cast<Maxwell::ShaderStage>(stage));
// Configure the const buffers for this shader stage.
- current_constbuffer_bindpoint = SetupConstBuffers(
- static_cast<Maxwell::ShaderStage>(stage), gl_stage_program, base_names[stage],
- current_constbuffer_bindpoint, shader_resources.const_buffer_entries);
+ current_constbuffer_bindpoint =
+ SetupConstBuffers(static_cast<Maxwell::ShaderStage>(stage), gl_stage_program,
+ current_constbuffer_bindpoint, shader_resources.const_buffer_entries);
}
shader_program_manager->UseTrivialGeometryShader();
@@ -555,7 +551,7 @@ void RasterizerOpenGL::SamplerInfo::SyncWithConfig(const Tegra::Texture::TSCEntr
}
u32 RasterizerOpenGL::SetupConstBuffers(Maxwell::ShaderStage stage, GLuint program,
- const std::string& base_name, u32 current_bindpoint,
+ u32 current_bindpoint,
const std::vector<GLShader::ConstBufferEntry>& entries) {
auto& gpu = Core::System::GetInstance().GPU();
auto& maxwell3d = gpu.Get3DEngine();
@@ -591,10 +587,11 @@ u32 RasterizerOpenGL::SetupConstBuffers(Maxwell::ShaderStage stage, GLuint progr
glBindBuffer(GL_SHADER_STORAGE_BUFFER, 0);
// Now configure the bindpoint of the buffer inside the shader
- std::string buffer_name = base_name + std::to_string(used_buffer.GetIndex());
+ std::string buffer_name = used_buffer.GetName();
GLuint index =
glGetProgramResourceIndex(program, GL_SHADER_STORAGE_BLOCK, buffer_name.c_str());
- glShaderStorageBlockBinding(program, index, buffer_draw_state.bindpoint);
+ if (index != -1)
+ glShaderStorageBlockBinding(program, index, buffer_draw_state.bindpoint);
}
state.Apply();
diff --git a/src/video_core/renderer_opengl/gl_rasterizer.h b/src/video_core/renderer_opengl/gl_rasterizer.h
index 32d9598aa..548ce0453 100644
--- a/src/video_core/renderer_opengl/gl_rasterizer.h
+++ b/src/video_core/renderer_opengl/gl_rasterizer.h
@@ -91,14 +91,13 @@ private:
* Configures the current constbuffers to use for the draw command.
* @param stage The shader stage to configure buffers for.
* @param program The OpenGL program object that contains the specified stage.
- * @param base_name The name prefix of the buffer objects in the GLSL shaders.
* @param current_bindpoint The offset at which to start counting new buffer bindpoints.
* @param entries Vector describing the buffers that are actually used in the guest shader.
* @returns The next available bindpoint for use in the next shader stage.
*/
u32 SetupConstBuffers(Tegra::Engines::Maxwell3D::Regs::ShaderStage stage, GLuint program,
- const std::string& base_name, u32 current_bindpoint,
- const std::vector<GLShader::ConstBufferEntry>& entries);
+ u32 current_bindpoint,
+ const std::vector<GLShader::ConstBufferEntry>& entries);
/// Syncs the viewport to match the guest state
void SyncViewport(const MathUtil::Rectangle<u32>& surfaces_rect, u16 res_scale);
diff --git a/src/video_core/renderer_opengl/gl_shader_decompiler.cpp b/src/video_core/renderer_opengl/gl_shader_decompiler.cpp
index 9cf2c6a0c..e11711533 100644
--- a/src/video_core/renderer_opengl/gl_shader_decompiler.cpp
+++ b/src/video_core/renderer_opengl/gl_shader_decompiler.cpp
@@ -192,7 +192,7 @@ private:
/// Generates code representing a uniform (C buffer) register.
std::string GetUniform(const Uniform& reg) {
- declr_const_buffers[reg.index].MarkAsUsed(reg.index, reg.offset);
+ declr_const_buffers[reg.index].MarkAsUsed(reg.index, reg.offset, stage);
return 'c' + std::to_string(reg.index) + '[' + std::to_string(reg.offset) + ']';
}
@@ -478,8 +478,7 @@ private:
unsigned const_buffer_layout = 0;
for (const auto& entry : GetConstBuffersDeclarations()) {
- declarations.AddLine("layout(std430, binding = " + std::to_string(const_buffer_layout) +
- ") buffer c" + std::to_string(entry.GetIndex()) + "_buffer");
+ declarations.AddLine("layout(std430) buffer " + entry.GetName());
declarations.AddLine("{");
declarations.AddLine(" float c" + std::to_string(entry.GetIndex()) + "[];");
declarations.AddLine("};");
diff --git a/src/video_core/renderer_opengl/gl_shader_gen.h b/src/video_core/renderer_opengl/gl_shader_gen.h
index 3d9aead74..458032b5c 100644
--- a/src/video_core/renderer_opengl/gl_shader_gen.h
+++ b/src/video_core/renderer_opengl/gl_shader_gen.h
@@ -19,10 +19,13 @@ constexpr size_t MAX_PROGRAM_CODE_LENGTH{0x1000};
using ProgramCode = std::array<u64, MAX_PROGRAM_CODE_LENGTH>;
class ConstBufferEntry {
+ using Maxwell = Tegra::Engines::Maxwell3D::Regs;
+
public:
- void MarkAsUsed(unsigned index, unsigned offset) {
+ void MarkAsUsed(unsigned index, unsigned offset, Maxwell::ShaderStage stage) {
is_used = true;
this->index = index;
+ this->stage = stage;
max_offset = std::max(max_offset, offset);
}
@@ -38,10 +41,19 @@ public:
return max_offset + 1;
}
+ std::string GetName() const {
+ return BufferBaseNames[static_cast<size_t>(stage)] + std::to_string(index);
+ }
+
private:
+ static constexpr std::array<const char*, Maxwell::MaxShaderStage> BufferBaseNames = {
+ "buffer_vs_c", "buffer_tessc_c", "buffer_tesse_c", "buffer_gs_c", "buffer_fs_c",
+ };
+
bool is_used{};
unsigned index{};
unsigned max_offset{};
+ Maxwell::ShaderStage stage;
};
struct ShaderEntries {