diff options
Diffstat (limited to 'Build/source/utils/asymptote/shaders.cc')
-rw-r--r-- | Build/source/utils/asymptote/shaders.cc | 62 |
1 files changed, 34 insertions, 28 deletions
diff --git a/Build/source/utils/asymptote/shaders.cc b/Build/source/utils/asymptote/shaders.cc index a9c038c2299..36dc72a4aeb 100644 --- a/Build/source/utils/asymptote/shaders.cc +++ b/Build/source/utils/asymptote/shaders.cc @@ -13,9 +13,11 @@ #include "shaders.h" +int GLSLversion; + GLuint compileAndLinkShader(std::vector<ShaderfileModePair> const& shaders, - size_t Nlights, size_t NMaterials, - std::vector<std::string> const& defineflags) + std::vector<std::string> const& defineflags, + bool ssbo, bool compute) { GLuint shader = glCreateProgram(); std::vector<GLuint> compiledShaders; @@ -23,7 +25,8 @@ GLuint compileAndLinkShader(std::vector<ShaderfileModePair> const& shaders, size_t n=shaders.size(); for(size_t i=0; i < n; ++i) { GLint newshader=createShaderFile(shaders[i].first,shaders[i].second, - Nlights,NMaterials,defineflags); + defineflags,ssbo,compute); + if((ssbo || compute) && newshader == 0) return 0; glAttachShader(shader,newshader); compiledShaders.push_back(newshader); } @@ -44,17 +47,19 @@ GLuint compileAndLinkShader(std::vector<ShaderfileModePair> const& shaders, return shader; } -GLuint createShaders(GLchar const* src, int shaderType, - std::string const& filename) +GLuint createShader(const std::string& src, int shaderType, + const std::string& filename, bool ssbo, bool compute) { + const GLchar *source=src.c_str(); GLuint shader=glCreateShader(shaderType); - glShaderSource(shader, 1, &src, NULL); + glShaderSource(shader, 1, &source, NULL); glCompileShader(shader); GLint status; glGetShaderiv(shader, GL_COMPILE_STATUS, &status); if(status != GL_TRUE) { + if(ssbo || compute) return 0; GLint length; glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &length); @@ -64,50 +69,51 @@ GLuint createShaders(GLchar const* src, int shaderType, glGetShaderInfoLog(shader, length, &length, msg.data()); size_t n=msg.size(); - for(size_t i=0; i < n; ++i) { + for(size_t i=0; i < n; ++i) std::cerr << msg[i]; - } std::cerr << std::endl << "GL Compile error" << std::endl; - std::cerr << src << std::endl; - throw 1; + std::stringstream s(src); + std::string line; + unsigned int k=0; + while(getline(s,line)) + std::cerr << ++k << ": " << line << std::endl; + exit(-1); } return shader; } -GLuint createShaderFile(std::string file, int shaderType, size_t Nlights, - size_t Nmaterials, - std::vector<std::string> const& defineflags) +GLuint createShaderFile(std::string file, int shaderType, + std::vector<std::string> const& defineflags, + bool ssbo, bool compute) { std::ifstream shaderFile; shaderFile.open(file.c_str()); std::stringstream shaderSrc; -#ifdef __APPLE__ -#define GLSL_VERSION "410" -#else -#define GLSL_VERSION "130" + shaderSrc << "#version " << GLSLversion << "\n"; +#ifndef __APPLE__ + shaderSrc << "#extension GL_ARB_uniform_buffer_object : enable" << "\n"; +#ifdef HAVE_SSBO + if(ssbo) + shaderSrc << "#extension GL_ARB_shader_storage_buffer_object : enable" << "\n"; + if(compute) + shaderSrc << "#extension GL_ARB_compute_shader : enable" << "\n"; +#endif #endif - - shaderSrc << "#version " << GLSL_VERSION << "\n"; - shaderSrc << "#extension GL_ARB_uniform_buffer_object : enable" - << "\n"; size_t n=defineflags.size(); - for(size_t i=0; i < n; ++i) { + for(size_t i=0; i < n; ++i) shaderSrc << "#define " << defineflags[i] << "\n"; - } - - shaderSrc << "#define Nlights " << Nlights << "\n"; - shaderSrc << "const int Nmaterials=" << Nmaterials << ";\n"; if(shaderFile) { shaderSrc << shaderFile.rdbuf(); shaderFile.close(); } else { - throw 1; + std::cerr << "Cannot read from shader file " << file << std::endl; + exit(-1); } - return createShaders(shaderSrc.str().data(), shaderType, file); + return createShader(shaderSrc.str(),shaderType,file,ssbo,compute); } #endif |