summaryrefslogtreecommitdiff
path: root/graphics/asymptote/shaders.cc
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2021-12-28 03:01:00 +0000
committerNorbert Preining <norbert@preining.info>2021-12-28 03:01:00 +0000
commitecdf859b6ce481abfd530425dcf6f0f764bd0001 (patch)
tree13bc161dc046876ac6c92fce5f9f5034ba9aa573 /graphics/asymptote/shaders.cc
parent790995b7e79697514364450bf9c04f1b8d500838 (diff)
CTAN sync 202112280300
Diffstat (limited to 'graphics/asymptote/shaders.cc')
-rw-r--r--graphics/asymptote/shaders.cc61
1 files changed, 33 insertions, 28 deletions
diff --git a/graphics/asymptote/shaders.cc b/graphics/asymptote/shaders.cc
index a9c038c229..55bd17a889 100644
--- a/graphics/asymptote/shaders.cc
+++ b/graphics/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 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,compute);
+ if(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 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(compute) return 0;
GLint length;
glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &length);
@@ -64,50 +69,50 @@ 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 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
+ 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,compute);
}
#endif