Skip to content

Commit 554fade

Browse files
committed
opengl validation
1 parent 86e4991 commit 554fade

7 files changed

Lines changed: 218 additions & 45 deletions

File tree

src/MarlinSimulator/application.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -307,12 +307,20 @@ void Application::update() {
307307
}
308308

309309
void Application::render() {
310+
renderer::gl_log_error();
310311
sim.vis.framebuffer->bind();
312+
renderer::gl_log_error();
311313
glClearColor(clear_color.x, clear_color.y, clear_color.z, 1.0);
314+
renderer::gl_log_error();
312315
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
316+
renderer::gl_log_error();
313317
sim.vis.update(); // Update and render
318+
renderer::gl_log_error();
314319
sim.vis.framebuffer->render(); // Render and unbind framebuffer
320+
renderer::gl_log_error();
315321

316322
user_interface.render();
323+
renderer::gl_log_error();
317324
window.swap_buffers();
325+
renderer::gl_log_error();
318326
}

src/MarlinSimulator/renderer/renderer.cpp

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -84,18 +84,4 @@ void render(glm::mat4 global_transform) {
8484
execute_deferred_calls();
8585
}
8686

87-
template<> void ShaderProgramInstance::set_uniform<float>(std::string name, float* value) {
88-
using gl_uniform_type = gl_uniform<type_to_gl_enum<float>::value>;
89-
if (m_program->m_uniforms.count(name)) {
90-
auto uniform = m_program->m_uniforms[name];
91-
m_uniforms[uniform.location] = shader_uniform_t {
92-
uniform,
93-
gl_uniform_type {value},
94-
[](shader_attr_t& uniform_desc, gl_uniform_t& uniform_data) {
95-
gl_uniform_type().invoke(uniform_desc.location, uniform_desc.size, std::get<gl_uniform_type>(uniform_data).value);
96-
},
97-
};
98-
}
99-
}
100-
10187
}

src/MarlinSimulator/renderer/renderer.h

Lines changed: 90 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,50 @@
1414
#include "../resources/resources.h"
1515
#include "gl.h"
1616

17+
#include <debugbreak.h>
18+
1719
namespace renderer {
1820

21+
#ifndef SIM_GL_LOG_LEVEL
22+
#define SIM_GL_LOG_LEVEL 0
23+
#endif
24+
25+
inline constexpr int gl_log_level = SIM_GL_LOG_LEVEL;
26+
27+
template <typename... Args> inline void gl_debug_printf(const char* fmt, Args&&... args) {
28+
if constexpr (gl_log_level > 0) {
29+
if constexpr (sizeof...(Args)) printf(fmt, std::forward<Args>(args)...);
30+
else puts(fmt);
31+
}
32+
}
33+
34+
//#define gl_debug_printf(...)
35+
36+
constexpr std::string_view gl_error_to_sv(const uint32_t gl_error) {
37+
switch(gl_error) {
38+
case GL_NO_ERROR: return "GL_NO_ERROR";
39+
case GL_INVALID_ENUM: return "GL_INVALID_ENUM";
40+
case GL_INVALID_VALUE: return "GL_INVALID_VALUE";
41+
case GL_INVALID_OPERATION: return "GL_INVALID_OPERATION";
42+
case GL_INVALID_FRAMEBUFFER_OPERATION: return "GL_INVALID_FRAMEBUFFER_OPERATION";
43+
case GL_OUT_OF_MEMORY: return "GL_OUT_OF_MEMORY";
44+
default: return "Invalid return value from glGetError";
45+
}
46+
}
47+
48+
inline void gl_log_error() {
49+
if constexpr (gl_log_level == 0) {
50+
return;
51+
} else {
52+
auto gl_error_value = glGetError();
53+
if (gl_error_value == 0) return;
54+
gl_debug_printf("GL Error: [%d]: %s\n", gl_error_value, std::string(gl_error_to_sv(gl_error_value)).c_str());
55+
if constexpr (gl_log_level > 1) {
56+
debug_break();
57+
}
58+
}
59+
}
60+
1961
using mesh_id_t = size_t;
2062
class Mesh;
2163
extern mesh_id_t next_mesh_index;
@@ -71,32 +113,44 @@ class ShaderProgram {
71113

72114
GLuint shader_program = glCreateProgram();
73115
glAttachShader(shader_program, vertex_shader);
116+
gl_log_error();
74117
glAttachShader(shader_program, fragment_shader);
75-
if (geometry_shader) glAttachShader(shader_program, geometry_shader);
118+
gl_log_error();
119+
if (geometry_shader) {
120+
glAttachShader(shader_program, geometry_shader);
121+
gl_log_error();
122+
}
76123

77124
glLinkProgram(shader_program);
125+
gl_log_error();
78126

79127
GLint result = 0;
80128
glGetProgramiv(shader_program, GL_LINK_STATUS, &result);
81129
if (result == GL_TRUE) {
82130
glUseProgram(shader_program);
131+
gl_debug_printf("ShaderProgram::load_program: shader program(%d) linked and activated\n", shader_program);
132+
gl_log_error();
83133
} else {
84134
glDeleteProgram(shader_program);
85135
shader_program = 0;
136+
gl_debug_printf("ShaderProgram::load_program: unable to link shaders\n");
86137
}
87138

88139
if (vertex_shader) glDeleteShader(vertex_shader);
89140
if (fragment_shader) glDeleteShader(fragment_shader);
90141
if (geometry_shader) glDeleteShader(geometry_shader);
91142

143+
gl_log_error();
92144
return shader_program;
93145
}
94146

95147
static GLuint load_shader(GLuint shader_type, char const* shader_string) {
96148
GLuint shader_id = glCreateShader(shader_type);
97149
int length = strlen(shader_string);
98150
glShaderSource(shader_id, 1, (GLchar const**)&shader_string, &length);
151+
gl_log_error();
99152
glCompileShader(shader_id);
153+
gl_log_error();
100154

101155
GLint status;
102156
glGetShaderiv(shader_id, GL_COMPILE_STATUS, &status);
@@ -106,10 +160,11 @@ class ShaderProgram {
106160
std::vector<GLchar> errorLog(maxLength + 1);
107161
errorLog[maxLength] = 0;
108162
glGetShaderInfoLog(shader_id, maxLength, &maxLength, errorLog.data());
109-
printf("%s\n", errorLog.data());
163+
gl_debug_printf("%s\n", errorLog.data());
110164
glDeleteShader(shader_id);
111165
return 0;
112166
}
167+
gl_log_error();
113168
return shader_id;
114169
}
115170

@@ -143,6 +198,7 @@ class ShaderProgram {
143198
}
144199

145200
void build_cache() {
201+
gl_debug_printf("ShaderProgram::build_cache\n");
146202
GLint size {}; // size of the variable
147203
GLenum type {}; // type of the variable (float, vec3 or mat4, etc)
148204

@@ -155,19 +211,31 @@ class ShaderProgram {
155211
attr.second.active = false; // disable all current attributes for reload
156212
}
157213
glGetProgramiv(m_program_id, GL_ACTIVE_ATTRIBUTES, &attribute_count);
214+
gl_debug_printf("attribute:\n");
215+
gl_log_error();
158216
for (GLint i = 0; i < attribute_count; i++) {
159217
glGetActiveAttrib(m_program_id, (GLuint)i, bufSize, &length, &size, &type, (char*)name);
160-
m_attributes[name] = shader_attr_t {(uint32_t)i, name, type, size};
218+
gl_log_error();
219+
auto attrib_loc = glGetAttribLocation(m_program_id, name);
220+
gl_log_error();
221+
gl_debug_printf("index: %d, location: %d, name: %s, type: %d, size: %d\n", i, attrib_loc, name, type, size);
222+
m_attributes[name] = shader_attr_t {(uint32_t)attrib_loc, name, type, size};
161223
}
162224

163225
GLint uniform_count;
164226
for (auto& uniform : m_uniforms) {
165227
uniform.second.active = false; // disable all current uniforms for reload
166228
}
167229
glGetProgramiv(m_program_id, GL_ACTIVE_UNIFORMS, &uniform_count);
230+
gl_debug_printf("uniform:\n");
231+
gl_log_error();
168232
for (GLint i = 0; i < uniform_count; i++) {
169233
glGetActiveUniform(m_program_id, (GLuint)i, bufSize, &length, &size, &type, (char*)name);
170-
m_uniforms[name] = shader_attr_t {(uint32_t)i, name, type, size};
234+
gl_log_error();
235+
auto uniform_loc = glGetUniformLocation(m_program_id, name);
236+
gl_log_error();
237+
gl_debug_printf("index: %d, location: %d, name: %s, type: %d, size: %d\n", i, uniform_loc, name, type, size);
238+
m_uniforms[name] = shader_attr_t {(uint32_t)uniform_loc, name, type, size};
171239
}
172240
}
173241

@@ -190,14 +258,19 @@ class ShaderProgramInstance {
190258
};
191259

192260
void bind_immediate() {
261+
gl_log_error();
262+
if (m_program == nullptr) return;
193263
glUseProgram(m_program->m_program_id);
264+
gl_log_error();
194265
for (auto& [location, uniform] : m_uniforms) {
195266
uniform.gl_uniform_call(uniform.desc, uniform.uniform_data);
196267
}
197268
}
198269

199270
template<typename T> void set_uniform(std::string name, T* value) {
200-
using gl_uniform_type = gl_uniform<type_to_gl_enum<T>::value>;
271+
using gl_uniform_type = gl_uniform<type_to_gl_enum<T>::value>;
272+
if (m_program == nullptr) return;
273+
if (!m_program->m_uniforms.count(name)) return;
201274
auto uniform = m_program->m_uniforms[name];
202275
m_uniforms[uniform.location] = shader_uniform_t {
203276
uniform,
@@ -210,6 +283,7 @@ class ShaderProgramInstance {
210283
} else {
211284
gl_uniform_type().invoke(uniform_desc.location, uniform_desc.size, glm::value_ptr(*std::get<gl_uniform_type>(uniform_data).value));
212285
}
286+
gl_log_error();
213287
},
214288
};
215289
return;
@@ -242,14 +316,20 @@ template<typename ElementType> class Buffer : public BufferBase {
242316
public:
243317
virtual void generate() override {
244318
glGenVertexArrays(1, &m_vao);
319+
gl_log_error();
245320
glGenBuffers(1, &m_vbo);
321+
gl_log_error();
246322
glBindVertexArray(m_vao);
323+
gl_log_error();
247324
glBindBuffer(GL_ARRAY_BUFFER, m_vbo);
325+
gl_log_error();
248326

249327
size_t index = 0, offset = 0;
250328
for (auto& attrib : ElementType::descriptor) {
251329
glEnableVertexAttribArray(index);
330+
gl_log_error();
252331
glVertexAttribPointer(index, attrib.elements, attrib.gl_enum, GL_FALSE, sizeof(ElementType), (void*)offset);
332+
gl_log_error();
253333
++index;
254334
offset += attrib.length;
255335
}
@@ -272,13 +352,16 @@ template<typename ElementType> class Buffer : public BufferBase {
272352
if (!m_generated) generate();
273353
if (m_vao == 0 || m_vbo == 0) return false;
274354
glBindVertexArray(m_vao);
355+
gl_log_error();
275356
glBindBuffer(GL_ARRAY_BUFFER, m_vbo);
357+
gl_log_error();
276358
return true;
277359
}
278360

279361
virtual void upload() override {
280362
if (m_dirty && m_data.size() > 0) {
281363
glBufferData(GL_ARRAY_BUFFER, m_data.size() * sizeof(ElementType), &m_data[0], m_storage_hint);
364+
gl_log_error();
282365
m_dirty = false;
283366
}
284367
}
@@ -287,6 +370,7 @@ template<typename ElementType> class Buffer : public BufferBase {
287370
if (bind()) {
288371
upload();
289372
glDrawArrays((GLenum)m_geometry_type, m_geometry_offset, m_data.size());
373+
gl_log_error();
290374
}
291375
}
292376

@@ -381,7 +465,7 @@ class Mesh {
381465
bool m_shader_dirty = true;
382466
bool m_delete = false;
383467
std::vector<std::shared_ptr<BufferBase>> m_buffer {};
384-
std::shared_ptr<ShaderProgramInstance> m_shader_instance = 0;
468+
std::shared_ptr<ShaderProgramInstance> m_shader_instance {};
385469

386470
private:
387471
Mesh() { }

src/MarlinSimulator/resources/resource_data.h

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -118,9 +118,9 @@ static const char * data_shader_extrusion_gs = R"SHADERSTR(
118118

119119
static const char * data_shader_extrusion_vs = R"SHADERSTR(
120120
#version 330 core
121-
in vec3 i_position;
122-
in vec3 i_normal;
123-
in vec4 i_color;
121+
layout(location = 0) in vec3 i_position;
122+
layout(location = 1) in vec3 i_normal;
123+
layout(location = 2) in vec4 i_color;
124124
out vec4 g_color;
125125
out vec3 g_normal;
126126
void main() {
@@ -170,9 +170,9 @@ static const char * data_shader_extrusion_fs = R"SHADERSTR(
170170

171171
static const char * data_shader_default_vs = R"SHADERSTR(
172172
#version 330 core
173-
in vec3 i_position;
174-
in vec3 i_normal;
175-
in vec4 i_color;
173+
layout(location = 0) in vec3 i_position;
174+
layout(location = 1) in vec3 i_normal;
175+
layout(location = 2) in vec4 i_color;
176176
out vec4 v_color;
177177
out vec3 v_normal;
178178
out vec3 v_position;

src/MarlinSimulator/user_interface.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
#include <imgui.h>
44
#include <imgui_impl_sdl2.h>
55
#include <imgui_impl_opengl3.h>
6+
#include "renderer/renderer.h"
67
#include "user_interface.h"
78

89
std::map<std::string, std::shared_ptr<UiWindow>> UserInterface::ui_elements;
@@ -59,12 +60,17 @@ void UserInterface::show() {
5960
}
6061

6162
void UserInterface::render() {
63+
renderer::gl_log_error();
6264
ImGui::Render();
65+
renderer::gl_log_error();
6366
{
6467
ImGuiIO& io = ImGui::GetIO();
6568
glViewport(0, 0, (int)io.DisplaySize.x, (int)io.DisplaySize.y);
69+
renderer::gl_log_error();
6670
glClearColor(0.0f, 0.0f, 0.0f, 1.0);
71+
renderer::gl_log_error();
6772
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
73+
renderer::gl_log_error();
6874

6975
if (io.ConfigFlags & ImGuiConfigFlags_ViewportsEnable) {
7076
SDL_Window* backup_current_window = SDL_GL_GetCurrentWindow();
@@ -73,6 +79,8 @@ void UserInterface::render() {
7379
ImGui::RenderPlatformWindowsDefault();
7480
SDL_GL_MakeCurrent(backup_current_window, backup_current_context);
7581
}
82+
renderer::gl_log_error();
7683
ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData());
84+
renderer::gl_log_error();
7785
}
7886
}

src/MarlinSimulator/visualisation.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -413,6 +413,8 @@ void Visualisation::ui_viewport_callback(UiWindow* window) {
413413
auto& ex = extrusion[0];
414414

415415
if (viewport.dirty) {
416+
viewport.viewport_size.x = viewport.viewport_size.x > 0 ? viewport.viewport_size.x : 0;
417+
viewport.viewport_size.y = viewport.viewport_size.y > 0 ? viewport.viewport_size.y : 0;
416418
framebuffer->update(viewport.viewport_size.x, viewport.viewport_size.y);
417419
viewport.texture_id = framebuffer->texture_id();
418420
camera.update_aspect_ratio(viewport.viewport_size.x / viewport.viewport_size.y);

0 commit comments

Comments
 (0)