diff options
Diffstat (limited to 'src/draw/opengl.c')
| -rw-r--r-- | src/draw/opengl.c | 206 |
1 files changed, 103 insertions, 103 deletions
diff --git a/src/draw/opengl.c b/src/draw/opengl.c index 76c44f9..ac5f250 100644 --- a/src/draw/opengl.c +++ b/src/draw/opengl.c @@ -21,7 +21,7 @@ struct gl_shader { struct gl_texture { GLuint txo; - GLenum type; + GLenum type; }; static struct { @@ -40,63 +40,63 @@ static struct { static void opengl_error(GLenum err, const char *file, int line) { - switch (err) { - case GL_INVALID_ENUM: fprintf(stderr, "opengl error: INVALID_ENUM %s:%d\n", file, line); break; - case GL_INVALID_VALUE: fprintf(stderr, "opengl error: INVALID_VALUE %s:%d\n", file, line); break; - case GL_INVALID_OPERATION: fprintf(stderr, "opengl error: INVALID_OPERATION %s:%d\n", file, line); break; - case GL_STACK_OVERFLOW: fprintf(stderr, "opengl error: STACK_OVERFLOW %s:%d\n", file, line); break; - case GL_STACK_UNDERFLOW: fprintf(stderr, "opengl error: STACK_UNDERFLOW %s:%d\n", file, line); break; - case GL_OUT_OF_MEMORY: fprintf(stderr, "opengl error: OUT_OF_MEMORY %s:%d\n", file, line); break; - case GL_INVALID_FRAMEBUFFER_OPERATION: fprintf(stderr, "opengl error: INVALID_FRAMEBUFFER_OPERATION %s:%d\n", file, line); break; - default: break; - } + switch (err) { + case GL_INVALID_ENUM: fprintf(stderr, "opengl error: INVALID_ENUM %s:%d\n", file, line); break; + case GL_INVALID_VALUE: fprintf(stderr, "opengl error: INVALID_VALUE %s:%d\n", file, line); break; + case GL_INVALID_OPERATION: fprintf(stderr, "opengl error: INVALID_OPERATION %s:%d\n", file, line); break; + case GL_STACK_OVERFLOW: fprintf(stderr, "opengl error: STACK_OVERFLOW %s:%d\n", file, line); break; + case GL_STACK_UNDERFLOW: fprintf(stderr, "opengl error: STACK_UNDERFLOW %s:%d\n", file, line); break; + case GL_OUT_OF_MEMORY: fprintf(stderr, "opengl error: OUT_OF_MEMORY %s:%d\n", file, line); break; + case GL_INVALID_FRAMEBUFFER_OPERATION: fprintf(stderr, "opengl error: INVALID_FRAMEBUFFER_OPERATION %s:%d\n", file, line); break; + default: break; + } } #define GL_DEBUG opengl_debug(__FILE__, __LINE__); __attribute__((unused)) static void opengl_debug(const char *file, int line) { - GLenum err = glGetError(); - if (err != GL_NO_ERROR) - opengl_error(err, file, line); + GLenum err = glGetError(); + if (err != GL_NO_ERROR) + opengl_error(err, file, line); } static const char *debug_source_to_string(GLenum source) { - switch (source) { - case GL_DEBUG_SOURCE_API: return "API"; - case GL_DEBUG_SOURCE_WINDOW_SYSTEM: return "WINDOW SYSTEM"; + switch (source) { + case GL_DEBUG_SOURCE_API: return "API"; + case GL_DEBUG_SOURCE_WINDOW_SYSTEM: return "WINDOW SYSTEM"; case GL_DEBUG_SOURCE_SHADER_COMPILER: return "SHADER COMPILER"; - case GL_DEBUG_SOURCE_THIRD_PARTY: return "THIRD PARTY"; - case GL_DEBUG_SOURCE_APPLICATION: return "APPLICATION"; + case GL_DEBUG_SOURCE_THIRD_PARTY: return "THIRD PARTY"; + case GL_DEBUG_SOURCE_APPLICATION: return "APPLICATION"; case GL_DEBUG_SOURCE_OTHER: return "OTHER"; - default: return "UNKNOWN"; - } + default: return "UNKNOWN"; + } } static const char *debug_type_to_string(GLenum type) { - switch (type) { - case GL_DEBUG_TYPE_ERROR: return "ERROR"; - case GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR: return "DEPRECATED BEHAVIOR"; - case GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR: return "UDEFINED BEHAVIOR"; - case GL_DEBUG_TYPE_PORTABILITY: return "PORTABILITY"; - case GL_DEBUG_TYPE_PERFORMANCE: return "PERFORMANCE"; - case GL_DEBUG_TYPE_OTHER: return "OTHER"; + switch (type) { + case GL_DEBUG_TYPE_ERROR: return "ERROR"; + case GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR: return "DEPRECATED BEHAVIOR"; + case GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR: return "UDEFINED BEHAVIOR"; + case GL_DEBUG_TYPE_PORTABILITY: return "PORTABILITY"; + case GL_DEBUG_TYPE_PERFORMANCE: return "PERFORMANCE"; + case GL_DEBUG_TYPE_OTHER: return "OTHER"; case GL_DEBUG_TYPE_MARKER: return "MARKER"; - default: return "UNKNOWN"; - } + default: return "UNKNOWN"; + } } static const char *debug_severity_to_string(GLenum severity) { - switch (severity) { - case GL_DEBUG_SEVERITY_HIGH: return "HIGH"; - case GL_DEBUG_SEVERITY_MEDIUM: return "MEDIUM"; - case GL_DEBUG_SEVERITY_LOW: return "LOW"; - case GL_DEBUG_SEVERITY_NOTIFICATION: return "NOTIFICATION"; - default: return "UNKNOWN"; - } + switch (severity) { + case GL_DEBUG_SEVERITY_HIGH: return "HIGH"; + case GL_DEBUG_SEVERITY_MEDIUM: return "MEDIUM"; + case GL_DEBUG_SEVERITY_LOW: return "LOW"; + case GL_DEBUG_SEVERITY_NOTIFICATION: return "NOTIFICATION"; + default: return "UNKNOWN"; + } } static void APIENTRY debug_message_callback(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *msg, const void *data) @@ -104,8 +104,8 @@ static void APIENTRY debug_message_callback(GLenum source, GLenum type, GLuint i (void) data, (void) length; if (severity == GL_DEBUG_SEVERITY_NOTIFICATION) return; fprintf(stderr, "%d: %s of %s severity, raised from %s: %s\n", - id, debug_type_to_string(type), debug_severity_to_string(severity), - debug_source_to_string(source), msg); + id, debug_type_to_string(type), debug_severity_to_string(severity), + debug_source_to_string(source), msg); } static void init_egl(unsigned int size[2]) @@ -148,28 +148,28 @@ static void init_target(unsigned int size[2]) { state.target.size[0] = size[0]; state.target.size[1] = size[1]; - state.target.buffer = malloc(size[0] * size[1] * 4); + state.target.buffer = malloc(size[0] * size[1] * 4); - glGenRenderbuffers(1, &state.target.rbo); - glBindRenderbuffer(GL_RENDERBUFFER, state.target.rbo); - glRenderbufferStorageMultisample(GL_RENDERBUFFER, 8, GL_DEPTH24_STENCIL8, size[0], size[1]); + glGenRenderbuffers(1, &state.target.rbo); + glBindRenderbuffer(GL_RENDERBUFFER, state.target.rbo); + glRenderbufferStorageMultisample(GL_RENDERBUFFER, 8, GL_DEPTH24_STENCIL8, size[0], size[1]); - glGenTextures(2, state.target.txos); + glGenTextures(2, state.target.txos); - glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, state.target.txos[0]); - glTexImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, 8, GL_RGBA, size[0], size[1], GL_TRUE); + glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, state.target.txos[0]); + glTexImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, 8, GL_RGBA, size[0], size[1], GL_TRUE); - glBindTexture(GL_TEXTURE_2D, state.target.txos[1]); - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, size[0], size[1], 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr); + glBindTexture(GL_TEXTURE_2D, state.target.txos[1]); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, size[0], size[1], 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr); - glGenFramebuffers(2, state.target.fbos); + glGenFramebuffers(2, state.target.fbos); - glBindFramebuffer(GL_FRAMEBUFFER, state.target.fbos[0]); - glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D_MULTISAMPLE, state.target.txos[0], 0); - glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, state.target.rbo); + glBindFramebuffer(GL_FRAMEBUFFER, state.target.fbos[0]); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D_MULTISAMPLE, state.target.txos[0], 0); + glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, state.target.rbo); - glBindFramebuffer(GL_FRAMEBUFFER, state.target.fbos[1]); - glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, state.target.txos[1], 0); + glBindFramebuffer(GL_FRAMEBUFFER, state.target.fbos[1]); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, state.target.txos[1], 0); } static void init_shaders() @@ -201,35 +201,35 @@ static void init_shaders() GLuint src_ids[4]; for (size_t i = 0; i < 4; i++) { - src_ids[i] = glCreateShader(src[i].type); - GLint size = src[i].size; - glShaderSource(src_ids[i], 1, &src[i].src, &size); - glCompileShader(src_ids[i]); - - GLint success; - glGetShaderiv(src_ids[i], GL_COMPILE_STATUS, &success); - if (!success) { - char error[BUFSIZ]; - glGetShaderInfoLog(src_ids[i], BUFSIZ, nullptr, error); - eprintf("failed to compile %s: %s", src[i].name, error); - } + src_ids[i] = glCreateShader(src[i].type); + GLint size = src[i].size; + glShaderSource(src_ids[i], 1, &src[i].src, &size); + glCompileShader(src_ids[i]); + + GLint success; + glGetShaderiv(src_ids[i], GL_COMPILE_STATUS, &success); + if (!success) { + char error[BUFSIZ]; + glGetShaderInfoLog(src_ids[i], BUFSIZ, nullptr, error); + eprintf("failed to compile %s: %s", src[i].name, error); + } } const char *names[3] = { "color", "texture", "cubemap" }; for (size_t i = 0; i < 3; i++) { struct gl_shader *shader = &state.shaders[i]; - shader->program = glCreateProgram(); + shader->program = glCreateProgram(); glAttachShader(shader->program, src_ids[0]); glAttachShader(shader->program, src_ids[i+1]); glLinkProgram(shader->program); - GLint success; - glGetProgramiv(shader->program, GL_LINK_STATUS, &success); - if (!success) { - char error[BUFSIZ]; - glGetShaderInfoLog(shader->program, BUFSIZ, nullptr, error); - eprintf("failed to link %s shader: %s", names[i], error); - } + GLint success; + glGetProgramiv(shader->program, GL_LINK_STATUS, &success); + if (!success) { + char error[BUFSIZ]; + glGetShaderInfoLog(shader->program, BUFSIZ, nullptr, error); + eprintf("failed to link %s shader: %s", names[i], error); + } shader->loc_color = glGetUniformLocation(shader->program, "color"); shader->loc_model = glGetUniformLocation(shader->program, "model"); @@ -245,8 +245,8 @@ static void opengl_init(unsigned int size[2]) init_egl(size); if (true) { - glEnable(GL_DEBUG_OUTPUT); - glDebugMessageCallback(debug_message_callback, nullptr); + glEnable(GL_DEBUG_OUTPUT); + glDebugMessageCallback(debug_message_callback, nullptr); } init_target(size); @@ -263,7 +263,7 @@ static bool opengl_create_mesh(size_t n_verts, const struct draw_vertex verts[n_ glBindVertexArray(mesh.vao); glBindBuffer(GL_ARRAY_BUFFER, mesh.vbo); - glBufferData(GL_ARRAY_BUFFER, mesh.count * sizeof(struct draw_vertex), verts, GL_STATIC_DRAW); + glBufferData(GL_ARRAY_BUFFER, mesh.count * sizeof(struct draw_vertex), verts, GL_STATIC_DRAW); glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(struct draw_vertex), (GLvoid *) offsetof(struct draw_vertex, pos)); glEnableVertexAttribArray(0); @@ -273,7 +273,7 @@ static bool opengl_create_mesh(size_t n_verts, const struct draw_vertex verts[n_ *id = state.meshes.len; arraybuf_insert(&state.meshes, mesh); - return true; + return true; } static void image_flip(rgba_data dst, rgba_data src, unsigned int size[2]) @@ -291,10 +291,10 @@ static bool opengl_create_texture(enum texture_type type, unsigned int size[2], case TEXTURE_2D: tex.type = GL_TEXTURE_2D; break; case TEXTURE_CUBEMAP: tex.type = GL_TEXTURE_CUBE_MAP; break; } - glGenTextures(1, &tex.txo); - glBindTexture(tex.type, tex.txo); + glGenTextures(1, &tex.txo); + glBindTexture(tex.type, tex.txo); - rgba_data flipped = malloc(size[0]*size[1]*4); + rgba_data flipped = malloc(size[0]*size[1]*4); size_t n_faces = tex.type == GL_TEXTURE_CUBE_MAP ? 6 : 1; for (size_t i = 0; i < n_faces; i++) { @@ -302,18 +302,18 @@ static bool opengl_create_texture(enum texture_type type, unsigned int size[2], ? GL_TEXTURE_CUBE_MAP_POSITIVE_X + i : GL_TEXTURE_2D; image_flip(flipped, faces[i], size); - glTexImage2D(target, 0, GL_RGBA, size[0], size[1], 0, GL_RGBA, GL_UNSIGNED_BYTE, flipped); - } + glTexImage2D(target, 0, GL_RGBA, size[0], size[1], 0, GL_RGBA, GL_UNSIGNED_BYTE, flipped); + } - free(flipped); + free(flipped); GLint filter = bilinear ? GL_LINEAR : GL_NEAREST; glTexParameteri(tex.type, GL_TEXTURE_MIN_FILTER, filter); glTexParameteri(tex.type, GL_TEXTURE_MAG_FILTER, filter); GLint wrap = tex.type == GL_TEXTURE_CUBE_MAP ? GL_CLAMP_TO_EDGE : GL_REPEAT; - glTexParameteri(tex.type, GL_TEXTURE_WRAP_S, wrap); - glTexParameteri(tex.type, GL_TEXTURE_WRAP_T, wrap); + glTexParameteri(tex.type, GL_TEXTURE_WRAP_S, wrap); + glTexParameteri(tex.type, GL_TEXTURE_WRAP_T, wrap); if (tex.type == GL_TEXTURE_CUBE_MAP) glTexParameteri(tex.type, GL_TEXTURE_WRAP_R, wrap); @@ -325,7 +325,7 @@ static bool opengl_create_texture(enum texture_type type, unsigned int size[2], static void opengl_draw_frame(struct draw_frame *frame, rgba_data out_data) { glEnable(GL_DEPTH_TEST); - glEnable(GL_MULTISAMPLE); + glEnable(GL_MULTISAMPLE); glBindFramebuffer(GL_FRAMEBUFFER, state.target.fbos[0]); glViewport(0, 0, state.target.size[0], state.target.size[1]); @@ -345,7 +345,7 @@ static void opengl_draw_frame(struct draw_frame *frame, rgba_data out_data) } /* - glEnable(GL_CULL_FACE); + glEnable(GL_CULL_FACE); glCullFace(GL_BACK); glFrontFace(GL_CCW); */ @@ -362,7 +362,7 @@ static void opengl_draw_frame(struct draw_frame *frame, rgba_data out_data) } else { texture = nullptr; shader = &state.shaders[0]; - } + } glUseProgram(shader->program); glUniform3fv(shader->loc_color, 1, call->surface.color); @@ -374,20 +374,20 @@ static void opengl_draw_frame(struct draw_frame *frame, rgba_data out_data) } glBindVertexArray(mesh->vao); - glDrawArrays(GL_TRIANGLES, 0, mesh->count); + glDrawArrays(GL_TRIANGLES, 0, mesh->count); } - glBindFramebuffer(GL_READ_FRAMEBUFFER, state.target.fbos[0]); - glBindFramebuffer(GL_DRAW_FRAMEBUFFER, state.target.fbos[1]); - glBlitFramebuffer( - 0, 0, state.target.size[0], state.target.size[1], - 0, 0, state.target.size[0], state.target.size[1], - GL_COLOR_BUFFER_BIT, GL_NEAREST); + glBindFramebuffer(GL_READ_FRAMEBUFFER, state.target.fbos[0]); + glBindFramebuffer(GL_DRAW_FRAMEBUFFER, state.target.fbos[1]); + glBlitFramebuffer( + 0, 0, state.target.size[0], state.target.size[1], + 0, 0, state.target.size[0], state.target.size[1], + GL_COLOR_BUFFER_BIT, GL_NEAREST); - glBindFramebuffer(GL_FRAMEBUFFER, state.target.fbos[1]); - glPixelStorei(GL_PACK_ALIGNMENT, 1); - glReadPixels(0, 0, state.target.size[0], state.target.size[1], - GL_RGBA, GL_UNSIGNED_BYTE, state.target.buffer); + glBindFramebuffer(GL_FRAMEBUFFER, state.target.fbos[1]); + glPixelStorei(GL_PACK_ALIGNMENT, 1); + glReadPixels(0, 0, state.target.size[0], state.target.size[1], + GL_RGBA, GL_UNSIGNED_BYTE, state.target.buffer); image_flip(out_data, state.target.buffer, state.target.size); } @@ -396,9 +396,9 @@ static void opengl_cleanup() { free(state.target.buffer); - glDeleteRenderbuffers(1, &state.target.rbo); - glDeleteTextures(2, state.target.txos); - glDeleteFramebuffers(2, state.target.fbos); + glDeleteRenderbuffers(1, &state.target.rbo); + glDeleteTextures(2, state.target.txos); + glDeleteFramebuffers(2, state.target.fbos); for (size_t i = 0; i < 3; i++) glDeleteProgram(state.shaders[i].program); |
