GPU: Use the same buffer names in the generated GLSL and the buffer uploading code.

This commit is contained in:
Subv 2018-04-15 14:42:23 -05:00
parent 14ac40436e
commit 477aab5960
4 changed files with 24 additions and 17 deletions

View file

@ -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)); Memory::ReadBlock(cpu_address, program_code.data(), program_code.size() * sizeof(u64));
GLShader::ShaderSetup setup{std::move(program_code)}; 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; GLShader::ShaderEntries shader_resources;
switch (program) { switch (program) {
@ -255,8 +251,8 @@ void RasterizerOpenGL::SetupShaders(u8* buffer_ptr, GLintptr buffer_offset, size
static_cast<Maxwell::ShaderStage>(stage)); static_cast<Maxwell::ShaderStage>(stage));
// Configure the const buffers for this shader stage. // Configure the const buffers for this shader stage.
current_constbuffer_bindpoint = SetupConstBuffers( current_constbuffer_bindpoint =
static_cast<Maxwell::ShaderStage>(stage), gl_stage_program, base_names[stage], SetupConstBuffers(static_cast<Maxwell::ShaderStage>(stage), gl_stage_program,
current_constbuffer_bindpoint, shader_resources.const_buffer_entries); current_constbuffer_bindpoint, shader_resources.const_buffer_entries);
} }
@ -555,7 +551,7 @@ void RasterizerOpenGL::SamplerInfo::SyncWithConfig(const Tegra::Texture::TSCEntr
} }
u32 RasterizerOpenGL::SetupConstBuffers(Maxwell::ShaderStage stage, GLuint program, 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) { const std::vector<GLShader::ConstBufferEntry>& entries) {
auto& gpu = Core::System::GetInstance().GPU(); auto& gpu = Core::System::GetInstance().GPU();
auto& maxwell3d = gpu.Get3DEngine(); auto& maxwell3d = gpu.Get3DEngine();
@ -591,9 +587,10 @@ u32 RasterizerOpenGL::SetupConstBuffers(Maxwell::ShaderStage stage, GLuint progr
glBindBuffer(GL_SHADER_STORAGE_BUFFER, 0); glBindBuffer(GL_SHADER_STORAGE_BUFFER, 0);
// Now configure the bindpoint of the buffer inside the shader // 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 = GLuint index =
glGetProgramResourceIndex(program, GL_SHADER_STORAGE_BLOCK, buffer_name.c_str()); glGetProgramResourceIndex(program, GL_SHADER_STORAGE_BLOCK, buffer_name.c_str());
if (index != -1)
glShaderStorageBlockBinding(program, index, buffer_draw_state.bindpoint); glShaderStorageBlockBinding(program, index, buffer_draw_state.bindpoint);
} }

View file

@ -91,13 +91,12 @@ private:
* Configures the current constbuffers to use for the draw command. * Configures the current constbuffers to use for the draw command.
* @param stage The shader stage to configure buffers for. * @param stage The shader stage to configure buffers for.
* @param program The OpenGL program object that contains the specified stage. * @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 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. * @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. * @returns The next available bindpoint for use in the next shader stage.
*/ */
u32 SetupConstBuffers(Tegra::Engines::Maxwell3D::Regs::ShaderStage stage, GLuint program, u32 SetupConstBuffers(Tegra::Engines::Maxwell3D::Regs::ShaderStage stage, GLuint program,
const std::string& base_name, u32 current_bindpoint, u32 current_bindpoint,
const std::vector<GLShader::ConstBufferEntry>& entries); const std::vector<GLShader::ConstBufferEntry>& entries);
/// Syncs the viewport to match the guest state /// Syncs the viewport to match the guest state

View file

@ -192,7 +192,7 @@ private:
/// Generates code representing a uniform (C buffer) register. /// Generates code representing a uniform (C buffer) register.
std::string GetUniform(const Uniform& reg) { 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) + ']'; return 'c' + std::to_string(reg.index) + '[' + std::to_string(reg.offset) + ']';
} }
@ -478,8 +478,7 @@ private:
unsigned const_buffer_layout = 0; unsigned const_buffer_layout = 0;
for (const auto& entry : GetConstBuffersDeclarations()) { for (const auto& entry : GetConstBuffersDeclarations()) {
declarations.AddLine("layout(std430, binding = " + std::to_string(const_buffer_layout) + declarations.AddLine("layout(std430) buffer " + entry.GetName());
") buffer c" + std::to_string(entry.GetIndex()) + "_buffer");
declarations.AddLine("{"); declarations.AddLine("{");
declarations.AddLine(" float c" + std::to_string(entry.GetIndex()) + "[];"); declarations.AddLine(" float c" + std::to_string(entry.GetIndex()) + "[];");
declarations.AddLine("};"); declarations.AddLine("};");

View file

@ -19,10 +19,13 @@ constexpr size_t MAX_PROGRAM_CODE_LENGTH{0x1000};
using ProgramCode = std::array<u64, MAX_PROGRAM_CODE_LENGTH>; using ProgramCode = std::array<u64, MAX_PROGRAM_CODE_LENGTH>;
class ConstBufferEntry { class ConstBufferEntry {
using Maxwell = Tegra::Engines::Maxwell3D::Regs;
public: public:
void MarkAsUsed(unsigned index, unsigned offset) { void MarkAsUsed(unsigned index, unsigned offset, Maxwell::ShaderStage stage) {
is_used = true; is_used = true;
this->index = index; this->index = index;
this->stage = stage;
max_offset = std::max(max_offset, offset); max_offset = std::max(max_offset, offset);
} }
@ -38,10 +41,19 @@ public:
return max_offset + 1; return max_offset + 1;
} }
std::string GetName() const {
return BufferBaseNames[static_cast<size_t>(stage)] + std::to_string(index);
}
private: 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{}; bool is_used{};
unsigned index{}; unsigned index{};
unsigned max_offset{}; unsigned max_offset{};
Maxwell::ShaderStage stage;
}; };
struct ShaderEntries { struct ShaderEntries {