gl_shader_gen: Always declare extensions after the version declaration

This addresses a bug on geometry shaders where code was being written
before all #extension declarations were done. Ref to #2523
merge-requests/60/head
ReinUsesLisp 2019-05-27 00:51:35 +07:00
parent 90c9d703ba
commit 84928e6d67
2 changed files with 5 additions and 7 deletions

@ -170,7 +170,8 @@ GLShader::ProgramResult CreateProgram(const Device& device, Maxwell::ShaderProgr
CachedProgram SpecializeShader(const std::string& code, const GLShader::ShaderEntries& entries, CachedProgram SpecializeShader(const std::string& code, const GLShader::ShaderEntries& entries,
Maxwell::ShaderProgram program_type, BaseBindings base_bindings, Maxwell::ShaderProgram program_type, BaseBindings base_bindings,
GLenum primitive_mode, bool hint_retrievable = false) { GLenum primitive_mode, bool hint_retrievable = false) {
std::string source = "#version 430 core\n"; std::string source = "#version 430 core\n"
"#extension GL_ARB_separate_shader_objects : enable\n\n";
source += fmt::format("#define EMULATION_UBO_BINDING {}\n", base_bindings.cbuf++); source += fmt::format("#define EMULATION_UBO_BINDING {}\n", base_bindings.cbuf++);
for (const auto& cbuf : entries.const_buffers) { for (const auto& cbuf : entries.const_buffers) {

@ -19,8 +19,7 @@ static constexpr u32 PROGRAM_OFFSET{10};
ProgramResult GenerateVertexShader(const Device& device, const ShaderSetup& setup) { ProgramResult GenerateVertexShader(const Device& device, const ShaderSetup& setup) {
const std::string id = fmt::format("{:016x}", setup.program.unique_identifier); const std::string id = fmt::format("{:016x}", setup.program.unique_identifier);
std::string out = "#extension GL_ARB_separate_shader_objects : enable\n\n"; std::string out = "// Shader Unique Id: VS" + id + "\n\n";
out += "// Shader Unique Id: VS" + id + "\n\n";
out += GetCommonDeclarations(); out += GetCommonDeclarations();
out += R"( out += R"(
@ -82,8 +81,7 @@ void main() {
ProgramResult GenerateGeometryShader(const Device& device, const ShaderSetup& setup) { ProgramResult GenerateGeometryShader(const Device& device, const ShaderSetup& setup) {
const std::string id = fmt::format("{:016x}", setup.program.unique_identifier); const std::string id = fmt::format("{:016x}", setup.program.unique_identifier);
std::string out = "#extension GL_ARB_separate_shader_objects : enable\n\n"; std::string out = "// Shader Unique Id: GS" + id + "\n\n";
out += "// Shader Unique Id: GS" + id + "\n\n";
out += GetCommonDeclarations(); out += GetCommonDeclarations();
out += R"( out += R"(
@ -113,8 +111,7 @@ void main() {
ProgramResult GenerateFragmentShader(const Device& device, const ShaderSetup& setup) { ProgramResult GenerateFragmentShader(const Device& device, const ShaderSetup& setup) {
const std::string id = fmt::format("{:016x}", setup.program.unique_identifier); const std::string id = fmt::format("{:016x}", setup.program.unique_identifier);
std::string out = "#extension GL_ARB_separate_shader_objects : enable\n\n"; std::string out = "// Shader Unique Id: FS" + id + "\n\n";
out += "// Shader Unique Id: FS" + id + "\n\n";
out += GetCommonDeclarations(); out += GetCommonDeclarations();
out += R"( out += R"(