diff --git a/src/graphics/glwrap.cpp b/src/graphics/glwrap.cpp index f4a9a0505..e13454bef 100644 --- a/src/graphics/glwrap.cpp +++ b/src/graphics/glwrap.cpp @@ -119,143 +119,6 @@ void initGL() #endif } -static std::string LoadHeader() -{ - std::string result; - std::ifstream Stream(file_manager->getAsset("shaders/header.txt").c_str(), std::ios::in); - - if (Stream.is_open()) - { - std::string Line = ""; - while (getline(Stream, Line)) - result += "\n" + Line; - Stream.close(); - } - - return result; -} - -// Mostly from shader tutorial -GLuint LoadShader(const char * file, unsigned type) -{ - GLuint Id = glCreateShader(type); - char versionString[20]; - sprintf(versionString, "#version %d\n", irr_driver->getGLSLVersion()); - std::string Code = versionString; - if (irr_driver->hasVSLayerExtension()) - Code += "#extension GL_AMD_vertex_shader_layer : enable\n"; - if (UserConfigParams::m_azdo) - Code += "#extension GL_ARB_bindless_texture : enable\n"; - else - { - Code += "#extension GL_ARB_bindless_texture : disable\n"; - Code += "#undef GL_ARB_bindless_texture\n"; - } - std::ifstream Stream(file, std::ios::in); - Code += "//" + std::string(file) + "\n"; - if (irr_driver->needUBOWorkaround()) - Code += "#define UBO_DISABLED\n"; - if (irr_driver->hasVSLayerExtension()) - Code += "#define VSLayer\n"; - if (irr_driver->needsRGBBindlessWorkaround()) - Code += "#define SRGBBindlessFix\n"; - Code += LoadHeader(); - if (Stream.is_open()) - { - std::string Line = ""; - while (getline(Stream, Line)) - Code += "\n" + Line; - Stream.close(); - } - GLint Result = GL_FALSE; - int InfoLogLength; - Log::info("GLWrap", "Compiling shader : %s", file); - char const * SourcePointer = Code.c_str(); - int length = (int)strlen(SourcePointer); - glShaderSource(Id, 1, &SourcePointer, &length); - glCompileShader(Id); - - glGetShaderiv(Id, GL_COMPILE_STATUS, &Result); - if (Result == GL_FALSE) - { - Log::error("GLWrap", "Error in shader %s", file); - glGetShaderiv(Id, GL_INFO_LOG_LENGTH, &InfoLogLength); - if(InfoLogLength<0) - InfoLogLength = 1024; - char *ErrorMessage = new char[InfoLogLength]; - ErrorMessage[0]=0; - glGetShaderInfoLog(Id, InfoLogLength, NULL, ErrorMessage); - Log::error("GLWrap", ErrorMessage); - delete[] ErrorMessage; - } - - glGetError(); - - return Id; -} - -void setAttribute(AttributeType Tp, GLuint ProgramID) -{ - switch (Tp) - { - case OBJECT: - glBindAttribLocation(ProgramID, 0, "Position"); - glBindAttribLocation(ProgramID, 1, "Normal"); - glBindAttribLocation(ProgramID, 2, "Color"); - glBindAttribLocation(ProgramID, 3, "Texcoord"); - glBindAttribLocation(ProgramID, 4, "SecondTexcoord"); - glBindAttribLocation(ProgramID, 5, "Tangent"); - glBindAttribLocation(ProgramID, 6, "Bitangent"); - glBindAttribLocation(ProgramID, 7, "Origin"); - glBindAttribLocation(ProgramID, 8, "Orientation"); - glBindAttribLocation(ProgramID, 9, "Scale"); - break; - case PARTICLES_SIM: - glBindAttribLocation(ProgramID, 0, "particle_position"); - glBindAttribLocation(ProgramID, 1, "lifetime"); - glBindAttribLocation(ProgramID, 2, "particle_velocity"); - glBindAttribLocation(ProgramID, 3, "size"); - glBindAttribLocation(ProgramID, 4, "particle_position_initial"); - glBindAttribLocation(ProgramID, 5, "lifetime_initial"); - glBindAttribLocation(ProgramID, 6, "particle_velocity_initial"); - glBindAttribLocation(ProgramID, 7, "size_initial"); - break; - case PARTICLES_RENDERING: - glBindAttribLocation(ProgramID, 1, "lifetime"); - glBindAttribLocation(ProgramID, 2, "size"); - glBindAttribLocation(ProgramID, 4, "quadcorner"); - glBindAttribLocation(ProgramID, 5, "rotationvec"); - glBindAttribLocation(ProgramID, 6, "anglespeed"); - break; - } -} - -GLuint LoadTFBProgram(const char * vertex_file_path, const char **varyings, unsigned varyingscount) -{ - GLuint Program = glCreateProgram(); - loadAndAttach(Program, GL_VERTEX_SHADER, vertex_file_path); - if (irr_driver->getGLSLVersion() < 330) - setAttribute(PARTICLES_SIM, Program); - glTransformFeedbackVaryings(Program, varyingscount, varyings, GL_INTERLEAVED_ATTRIBS); - glLinkProgram(Program); - - GLint Result = GL_FALSE; - int InfoLogLength; - glGetProgramiv(Program, GL_LINK_STATUS, &Result); - if (Result == GL_FALSE) - { - glGetProgramiv(Program, GL_INFO_LOG_LENGTH, &InfoLogLength); - char *ErrorMessage = new char[InfoLogLength]; - glGetProgramInfoLog(Program, InfoLogLength, NULL, ErrorMessage); - Log::error("GLWrap", ErrorMessage); - delete[] ErrorMessage; - } - - glGetError(); - - return Program; -} - ScopedGPUTimer::ScopedGPUTimer(GPUTimer &t) : timer(t) { if (!UserConfigParams::m_profiler_enabled) return; diff --git a/src/graphics/glwrap.hpp b/src/graphics/glwrap.hpp index bc6d4adc3..631fc4cf2 100644 --- a/src/graphics/glwrap.hpp +++ b/src/graphics/glwrap.hpp @@ -15,77 +15,7 @@ namespace HardwareStats } void initGL(); -GLuint LoadTFBProgram(const char * vertex_file_path, const char **varyings, unsigned varyingscount); video::ITexture* getUnicolorTexture(const video::SColor &c); -GLuint LoadShader(const char * file, unsigned type); - -template -void loadAndAttach(GLint ProgramID) -{ - return; -} - -template -void loadAndAttach(GLint ProgramID, GLint ShaderType, const char *filepath, Types ... args) -{ - GLint ShaderID = LoadShader(filepath, ShaderType); - glAttachShader(ProgramID, ShaderID); - glDeleteShader(ShaderID); - loadAndAttach(ProgramID, args...); -} - -template -void printFileList() -{ - return; -} - -template -void printFileList(GLint ShaderType, const char *filepath, Types ... args) -{ - Log::error("GLWrapp", filepath); - printFileList(args...); -} - -enum AttributeType -{ - OBJECT, - PARTICLES_SIM, - PARTICLES_RENDERING, -}; - -void setAttribute(AttributeType Tp, GLuint ProgramID); - -template -GLint LoadProgram(AttributeType Tp, Types ... args) -{ - GLint ProgramID = glCreateProgram(); - loadAndAttach(ProgramID, args...); - if (irr_driver->getGLSLVersion() < 330) - setAttribute(Tp, ProgramID); - glLinkProgram(ProgramID); - - GLint Result = GL_FALSE; - int InfoLogLength; - glGetProgramiv(ProgramID, GL_LINK_STATUS, &Result); - if (Result == GL_FALSE) { - Log::error("GLWrapp", "Error when linking these shaders :"); - printFileList(args...); - glGetProgramiv(ProgramID, GL_INFO_LOG_LENGTH, &InfoLogLength); - char *ErrorMessage = new char[InfoLogLength]; - glGetProgramInfoLog(ProgramID, InfoLogLength, NULL, ErrorMessage); - Log::error("GLWrapp", ErrorMessage); - delete[] ErrorMessage; - } - - GLenum glErr = glGetError(); - if (glErr != GL_NO_ERROR) - { - Log::warn("IrrDriver", "GLWrap : OpenGL error %i\n", glErr); - } - - return ProgramID; -} class GPUTimer; diff --git a/src/graphics/shaders.cpp b/src/graphics/shaders.cpp index 97e6b6020..6566c25ae 100644 --- a/src/graphics/shaders.cpp +++ b/src/graphics/shaders.cpp @@ -123,6 +123,145 @@ Shaders::Shaders() loadShaders(); } +// Shader loading related hook + +static std::string LoadHeader() +{ + std::string result; + std::ifstream Stream(file_manager->getAsset("shaders/header.txt").c_str(), std::ios::in); + + if (Stream.is_open()) + { + std::string Line = ""; + while (getline(Stream, Line)) + result += "\n" + Line; + Stream.close(); + } + + return result; +} + +// Mostly from shader tutorial +GLuint LoadShader(const char * file, unsigned type) +{ + GLuint Id = glCreateShader(type); + char versionString[20]; + sprintf(versionString, "#version %d\n", irr_driver->getGLSLVersion()); + std::string Code = versionString; + if (irr_driver->hasVSLayerExtension()) + Code += "#extension GL_AMD_vertex_shader_layer : enable\n"; + if (UserConfigParams::m_azdo) + Code += "#extension GL_ARB_bindless_texture : enable\n"; + else + { + Code += "#extension GL_ARB_bindless_texture : disable\n"; + Code += "#undef GL_ARB_bindless_texture\n"; + } + std::ifstream Stream(file, std::ios::in); + Code += "//" + std::string(file) + "\n"; + if (irr_driver->needUBOWorkaround()) + Code += "#define UBO_DISABLED\n"; + if (irr_driver->hasVSLayerExtension()) + Code += "#define VSLayer\n"; + if (irr_driver->needsRGBBindlessWorkaround()) + Code += "#define SRGBBindlessFix\n"; + Code += LoadHeader(); + if (Stream.is_open()) + { + std::string Line = ""; + while (getline(Stream, Line)) + Code += "\n" + Line; + Stream.close(); + } + GLint Result = GL_FALSE; + int InfoLogLength; + Log::info("GLWrap", "Compiling shader : %s", file); + char const * SourcePointer = Code.c_str(); + int length = (int)strlen(SourcePointer); + glShaderSource(Id, 1, &SourcePointer, &length); + glCompileShader(Id); + + glGetShaderiv(Id, GL_COMPILE_STATUS, &Result); + if (Result == GL_FALSE) + { + Log::error("GLWrap", "Error in shader %s", file); + glGetShaderiv(Id, GL_INFO_LOG_LENGTH, &InfoLogLength); + if (InfoLogLength<0) + InfoLogLength = 1024; + char *ErrorMessage = new char[InfoLogLength]; + ErrorMessage[0] = 0; + glGetShaderInfoLog(Id, InfoLogLength, NULL, ErrorMessage); + Log::error("GLWrap", ErrorMessage); + delete[] ErrorMessage; + } + + glGetError(); + + return Id; +} + +void setAttribute(AttributeType Tp, GLuint ProgramID) +{ + switch (Tp) + { + case OBJECT: + glBindAttribLocation(ProgramID, 0, "Position"); + glBindAttribLocation(ProgramID, 1, "Normal"); + glBindAttribLocation(ProgramID, 2, "Color"); + glBindAttribLocation(ProgramID, 3, "Texcoord"); + glBindAttribLocation(ProgramID, 4, "SecondTexcoord"); + glBindAttribLocation(ProgramID, 5, "Tangent"); + glBindAttribLocation(ProgramID, 6, "Bitangent"); + glBindAttribLocation(ProgramID, 7, "Origin"); + glBindAttribLocation(ProgramID, 8, "Orientation"); + glBindAttribLocation(ProgramID, 9, "Scale"); + break; + case PARTICLES_SIM: + glBindAttribLocation(ProgramID, 0, "particle_position"); + glBindAttribLocation(ProgramID, 1, "lifetime"); + glBindAttribLocation(ProgramID, 2, "particle_velocity"); + glBindAttribLocation(ProgramID, 3, "size"); + glBindAttribLocation(ProgramID, 4, "particle_position_initial"); + glBindAttribLocation(ProgramID, 5, "lifetime_initial"); + glBindAttribLocation(ProgramID, 6, "particle_velocity_initial"); + glBindAttribLocation(ProgramID, 7, "size_initial"); + break; + case PARTICLES_RENDERING: + glBindAttribLocation(ProgramID, 1, "lifetime"); + glBindAttribLocation(ProgramID, 2, "size"); + glBindAttribLocation(ProgramID, 4, "quadcorner"); + glBindAttribLocation(ProgramID, 5, "rotationvec"); + glBindAttribLocation(ProgramID, 6, "anglespeed"); + break; + } +} + +GLuint LoadTFBProgram(const char * vertex_file_path, const char **varyings, unsigned varyingscount) +{ + GLuint Program = glCreateProgram(); + loadAndAttach(Program, GL_VERTEX_SHADER, vertex_file_path); + if (irr_driver->getGLSLVersion() < 330) + setAttribute(PARTICLES_SIM, Program); + glTransformFeedbackVaryings(Program, varyingscount, varyings, GL_INTERLEAVED_ATTRIBS); + glLinkProgram(Program); + + GLint Result = GL_FALSE; + int InfoLogLength; + glGetProgramiv(Program, GL_LINK_STATUS, &Result); + if (Result == GL_FALSE) + { + glGetProgramiv(Program, GL_INFO_LOG_LENGTH, &InfoLogLength); + char *ErrorMessage = new char[InfoLogLength]; + glGetProgramInfoLog(Program, InfoLogLength, NULL, ErrorMessage); + Log::error("GLWrap", ErrorMessage); + delete[] ErrorMessage; + } + + glGetError(); + + return Program; +} + GLuint quad_vbo, tri_vbo; GLuint SharedObject::FullScreenQuadVAO = 0; diff --git a/src/graphics/shaders_util.hpp b/src/graphics/shaders_util.hpp index 6b1563bed..9631a2cd2 100644 --- a/src/graphics/shaders_util.hpp +++ b/src/graphics/shaders_util.hpp @@ -12,6 +12,77 @@ bool needsUBO(); unsigned getGLSLVersion(); +GLuint LoadShader(const char * file, unsigned type); +GLuint LoadTFBProgram(const char * vertex_file_path, const char **varyings, unsigned varyingscount); + +template +void loadAndAttach(GLint ProgramID) +{ + return; +} + +template +void loadAndAttach(GLint ProgramID, GLint ShaderType, const char *filepath, Types ... args) +{ + GLint ShaderID = LoadShader(filepath, ShaderType); + glAttachShader(ProgramID, ShaderID); + glDeleteShader(ShaderID); + loadAndAttach(ProgramID, args...); +} + +template +void printFileList() +{ + return; +} + +template +void printFileList(GLint ShaderType, const char *filepath, Types ... args) +{ + Log::error("GLWrapp", filepath); + printFileList(args...); +} + +enum AttributeType +{ + OBJECT, + PARTICLES_SIM, + PARTICLES_RENDERING, +}; + +void setAttribute(AttributeType Tp, GLuint ProgramID); + +template +GLint LoadProgram(AttributeType Tp, Types ... args) +{ + GLint ProgramID = glCreateProgram(); + loadAndAttach(ProgramID, args...); + if (irr_driver->getGLSLVersion() < 330) + setAttribute(Tp, ProgramID); + glLinkProgram(ProgramID); + + GLint Result = GL_FALSE; + int InfoLogLength; + glGetProgramiv(ProgramID, GL_LINK_STATUS, &Result); + if (Result == GL_FALSE) { + Log::error("GLWrapp", "Error when linking these shaders :"); + printFileList(args...); + glGetProgramiv(ProgramID, GL_INFO_LOG_LENGTH, &InfoLogLength); + char *ErrorMessage = new char[InfoLogLength]; + glGetProgramInfoLog(ProgramID, InfoLogLength, NULL, ErrorMessage); + Log::error("GLWrapp", ErrorMessage); + delete[] ErrorMessage; + } + + GLenum glErr = glGetError(); + if (glErr != GL_NO_ERROR) + { + Log::warn("IrrDriver", "GLWrap : OpenGL error %i\n", glErr); + } + + return ProgramID; +} + struct UniformHelper { template