Skip to content

Commit

Permalink
Some cleanup + better errors on shader issues (openscad#5008)
Browse files Browse the repository at this point in the history
  • Loading branch information
kintel authored Feb 26, 2024
1 parent 378f98e commit f5c4aab
Show file tree
Hide file tree
Showing 5 changed files with 63 additions and 57 deletions.
103 changes: 48 additions & 55 deletions src/glview/Renderer.cc
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,29 @@

#ifndef NULLGL


namespace {

GLuint compileShader(const std::string& name, GLuint shader_type) {
auto shader_source = Renderer::loadShaderSource(name);
GLuint shader = glCreateShader(shader_type);
auto *c_source = shader_source.c_str();
glShaderSource(shader, 1, (const GLchar **)&c_source, nullptr);
glCompileShader(shader);
GLint status;
glGetShaderiv(shader, GL_COMPILE_STATUS, &status);
if (!status) {
int loglen;
char logbuffer[1000];
glGetShaderInfoLog(shader, sizeof(logbuffer), &loglen, logbuffer);
PRINTDB("OpenGL shader compilation error:\n%s", logbuffer);
return 0;
}
return shader;
}

} // namespace

Renderer::Renderer()
{
PRINTD("Renderer() start");
Expand All @@ -34,86 +57,56 @@ Renderer::Renderer()

Renderer::setColorScheme(ColorMap::inst()->defaultColorScheme());

std::string vs_str = Renderer::loadShaderSource("Preview.vert");
std::string fs_str = Renderer::loadShaderSource("Preview.frag");
const char *vs_source = vs_str.c_str();
const char *fs_source = fs_str.c_str();
setupShader();
PRINTD("Renderer() end");
}

GLint status;
GLenum err;
auto vs = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vs, 1, (const GLchar **)&vs_source, nullptr);
glCompileShader(vs);
err = glGetError();
if (err != GL_NO_ERROR) {
PRINTDB("OpenGL Error: %s\n", gluErrorString(err));
return;
}
glGetShaderiv(vs, GL_COMPILE_STATUS, &status);
if (status == GL_FALSE) {
int loglen;
char logbuffer[1000];
glGetShaderInfoLog(vs, sizeof(logbuffer), &loglen, logbuffer);
PRINTDB("OpenGL Program Compile Vertex Shader Error:\n%s", logbuffer);
return;
}
void Renderer::setupShader() {
renderer_shader.progid = 0;

auto fs = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fs, 1, (const GLchar **)&fs_source, nullptr);
glCompileShader(fs);
err = glGetError();
if (err != GL_NO_ERROR) {
PRINTDB("OpenGL Error: %s\n", gluErrorString(err));
auto fs = compileShader("Preview.vert", GL_VERTEX_SHADER);
if (!fs) {
// FIXME: Print to error
LOG("OpenGL Error: Error compiling Preview vertex shader");
return;
}
glGetShaderiv(fs, GL_COMPILE_STATUS, &status);
if (status == GL_FALSE) {
int loglen;
char logbuffer[1000];
glGetShaderInfoLog(fs, sizeof(logbuffer), &loglen, logbuffer);
PRINTDB("OpenGL Program Compile Fragment Shader Error:\n%s", logbuffer);
auto vs = compileShader("Preview.frag", GL_FRAGMENT_SHADER);
if (!vs) {
// FIXME: Print to error
LOG("OpenGL Error: Error compiling Preview fragment shader");
return;
}


auto edgeshader_prog = glCreateProgram();
glAttachShader(edgeshader_prog, vs);
glAttachShader(edgeshader_prog, fs);
glLinkProgram(edgeshader_prog);

err = glGetError();
if (err != GL_NO_ERROR) {
PRINTDB("OpenGL Error: %s\n", gluErrorString(err));
return;
}

IF_GL_CHECK(glLinkProgram(edgeshader_prog)) return;
GLint status;
glGetProgramiv(edgeshader_prog, GL_LINK_STATUS, &status);
if (status == GL_FALSE) {
if (!status) {
int loglen;
char logbuffer[1000];
glGetProgramInfoLog(edgeshader_prog, sizeof(logbuffer), &loglen, logbuffer);
PRINTDB("OpenGL Program Linker Error:\n%s", logbuffer);
return;
}

int loglen;
char logbuffer[1000];
glGetProgramInfoLog(edgeshader_prog, sizeof(logbuffer), &loglen, logbuffer);
if (loglen > 0) {
PRINTDB("OpenGL Program Link OK:\n%s", logbuffer);
}
glValidateProgram(edgeshader_prog);
glGetProgramInfoLog(edgeshader_prog, sizeof(logbuffer), &loglen, logbuffer);
if (loglen > 0) {
PRINTDB("OpenGL Program Validation results:\n%s", logbuffer);
{
int loglen;
char logbuffer[1000];
glValidateProgram(edgeshader_prog);
glGetProgramInfoLog(edgeshader_prog, sizeof(logbuffer), &loglen, logbuffer);
if (loglen > 0) {
PRINTDB("OpenGL Program Validation results:\n%s", logbuffer);
}
}

renderer_shader.progid = edgeshader_prog;
renderer_shader.type = EDGE_RENDERING;
renderer_shader.data.csg_rendering.color_area = glGetUniformLocation(edgeshader_prog, "color1"); // 1
renderer_shader.data.csg_rendering.color_edge = glGetUniformLocation(edgeshader_prog, "color2"); // 2
renderer_shader.data.csg_rendering.barycentric = glGetAttribLocation(edgeshader_prog, "barycentric"); // 3

PRINTD("Renderer() end");
}

void Renderer::resize(int /*w*/, int /*h*/)
Expand Down
1 change: 1 addition & 0 deletions src/glview/Renderer.h
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,7 @@ class Renderer
protected:
std::map<ColorMode, Color4f> colormap;
const ColorScheme *colorscheme{nullptr};
void setupShader();

private:
shaderinfo_t renderer_shader;
Expand Down
6 changes: 5 additions & 1 deletion src/glview/preview/OpenCSGRenderer.cc
Original file line number Diff line number Diff line change
Expand Up @@ -152,7 +152,11 @@ void OpenCSGRenderer::createCSGVBOProducts(
elements_vbo);
vertex_array.addSurfaceData();
vertex_array.writeSurface();
add_shader_data(vertex_array);
if (getShader().progid != 0) {
add_shader_data(vertex_array);
} else {
LOG("Warning: Shader not available");
}

size_t num_vertices = 0;
for (const auto &csgobj : product.intersections) {
Expand Down
6 changes: 5 additions & 1 deletion src/glview/preview/ThrownTogetherRenderer.cc
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,11 @@ void ThrownTogetherRenderer::prepare(bool /*showfaces*/, bool /*showedges*/, con
}
VertexArray vertex_array(std::make_unique<TTRVertexStateFactory>(), vertex_states, vertices_vbo, elements_vbo);
vertex_array.addSurfaceData();
add_shader_data(vertex_array);
if (getShader().progid != 0) {
add_shader_data(vertex_array);
} else {
LOG("Warning: Shader not available");
}

size_t num_vertices = 0;
if (this->root_products) num_vertices += (getSurfaceBufferSize(this->root_products, true) * 2);
Expand Down
4 changes: 4 additions & 0 deletions src/io/export_png.cc
Original file line number Diff line number Diff line change
Expand Up @@ -81,8 +81,10 @@ std::unique_ptr<OffscreenView> prepare_preview(Tree& tree, const ViewOptions& op
if (options.previewer == Previewer::OPENCSG) {
#ifdef ENABLE_OPENCSG
#ifdef USE_LEGACY_RENDERERS
PRINTD("Initializing LegacyOpenCSGRenderer");
renderer = std::make_shared<LegacyOpenCSGRenderer>(csgInfo.root_products, csgInfo.highlights_products, csgInfo.background_products);
#else
PRINTD("Initializing OpenCSGRenderer");
renderer = std::make_shared<OpenCSGRenderer>(csgInfo.root_products, csgInfo.highlights_products, csgInfo.background_products);
#endif
#else
Expand All @@ -91,8 +93,10 @@ std::unique_ptr<OffscreenView> prepare_preview(Tree& tree, const ViewOptions& op
#endif
} else {
#ifdef USE_LEGACY_RENDERERS
PRINTD("Initializing LegacyThrownTogetherRenderer");
renderer = std::make_shared<LegacyThrownTogetherRenderer>(csgInfo.root_products, csgInfo.highlights_products, csgInfo.background_products);
#else
PRINTD("Initializing ThrownTogetherRenderer");
renderer = std::make_shared<ThrownTogetherRenderer>(csgInfo.root_products, csgInfo.highlights_products, csgInfo.background_products);
#endif
}
Expand Down

0 comments on commit f5c4aab

Please sign in to comment.