Move shader load code to shader.cpp instead of glwrap.hpp
This commit is contained in:
parent
80c7c5e49b
commit
e23aba65f4
@ -119,143 +119,6 @@ void initGL()
|
|||||||
#endif
|
#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)
|
ScopedGPUTimer::ScopedGPUTimer(GPUTimer &t) : timer(t)
|
||||||
{
|
{
|
||||||
if (!UserConfigParams::m_profiler_enabled) return;
|
if (!UserConfigParams::m_profiler_enabled) return;
|
||||||
|
@ -15,77 +15,7 @@ namespace HardwareStats
|
|||||||
}
|
}
|
||||||
|
|
||||||
void initGL();
|
void initGL();
|
||||||
GLuint LoadTFBProgram(const char * vertex_file_path, const char **varyings, unsigned varyingscount);
|
|
||||||
video::ITexture* getUnicolorTexture(const video::SColor &c);
|
video::ITexture* getUnicolorTexture(const video::SColor &c);
|
||||||
GLuint LoadShader(const char * file, unsigned type);
|
|
||||||
|
|
||||||
template<typename ... Types>
|
|
||||||
void loadAndAttach(GLint ProgramID)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename ... Types>
|
|
||||||
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<typename ...Types>
|
|
||||||
void printFileList()
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename ...Types>
|
|
||||||
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<typename ... Types>
|
|
||||||
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;
|
class GPUTimer;
|
||||||
|
|
||||||
|
@ -123,6 +123,145 @@ Shaders::Shaders()
|
|||||||
loadShaders();
|
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 quad_vbo, tri_vbo;
|
||||||
|
|
||||||
GLuint SharedObject::FullScreenQuadVAO = 0;
|
GLuint SharedObject::FullScreenQuadVAO = 0;
|
||||||
|
@ -12,6 +12,77 @@ bool needsUBO();
|
|||||||
|
|
||||||
unsigned getGLSLVersion();
|
unsigned getGLSLVersion();
|
||||||
|
|
||||||
|
GLuint LoadShader(const char * file, unsigned type);
|
||||||
|
GLuint LoadTFBProgram(const char * vertex_file_path, const char **varyings, unsigned varyingscount);
|
||||||
|
|
||||||
|
template<typename ... Types>
|
||||||
|
void loadAndAttach(GLint ProgramID)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename ... Types>
|
||||||
|
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<typename ...Types>
|
||||||
|
void printFileList()
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename ...Types>
|
||||||
|
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<typename ... Types>
|
||||||
|
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
|
struct UniformHelper
|
||||||
{
|
{
|
||||||
template<unsigned N = 0>
|
template<unsigned N = 0>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user