From 08dcbfa7772149bcdcc0ab660a897853a30103a0 Mon Sep 17 00:00:00 2001 From: dec05eba Date: Tue, 12 Oct 2021 21:09:53 +0200 Subject: compressed texture --- README.md | 3 ++- include/mgl/gl.h | 5 +++++ include/mgl/window.h | 6 +++--- src/graphics/texture.c | 13 ++++++++++++- src/window.c | 12 ++++++------ tests/main.c | 8 +++++--- 6 files changed, 33 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index 1b80299..4fed650 100644 --- a/README.md +++ b/README.md @@ -7,4 +7,5 @@ Written in C. ## Runtime `libglvnd (libGL.so)` ## TODO -Handle window close (window destroyed event, disconnected from server and socket becomes invalid (check select return?)) \ No newline at end of file +Handle window close (window destroyed event, disconnected from server and socket becomes invalid (check select return?)).\ +Bind texture and cache the bound texture to reduce calls to opengl. \ No newline at end of file diff --git a/include/mgl/gl.h b/include/mgl/gl.h index e715ec2..7d9900c 100644 --- a/include/mgl/gl.h +++ b/include/mgl/gl.h @@ -39,6 +39,11 @@ #define GL_LUMINANCE8_ALPHA8 0x8045 #define GL_RGB8 0x8051 #define GL_RGBA8 0x8058 +#define GL_COMPRESSED_RGB_S3TC_DXT1_EXT 0x83F0 +#define GL_COMPRESSED_RGBA_S3TC_DXT1_EXT 0x83F1 +#define GL_COMPRESSED_RGBA_S3TC_DXT3_EXT 0x83F2 +#define GL_COMPRESSED_RGBA_S3TC_DXT5_EXT 0x83F3 + #define GL_CLAMP_TO_EDGE 0x812F #define GL_LINEAR 0x2601 diff --git a/include/mgl/window.h b/include/mgl/window.h index 7db4ecb..1cee698 100644 --- a/include/mgl/window.h +++ b/include/mgl/window.h @@ -4,17 +4,17 @@ typedef struct mgl_window mgl_window; typedef struct { + void *userdata; void (*draw)(mgl_window *window, void *userdata); } mgl_window_callback; struct mgl_window { unsigned long window; mgl_window_callback callback; - void *callback_userdata; }; -int mgl_window_create(mgl_window *self, const char *title, int width, int height, mgl_window_callback *callback, void *userdata); -int mgl_window_create_with_params(mgl_window *self, const char *title, int width, int height, unsigned long parent_window, mgl_window_callback *callback, void *userdata); +int mgl_window_create(mgl_window *self, const char *title, int width, int height, mgl_window_callback *callback); +int mgl_window_create_with_params(mgl_window *self, const char *title, int width, int height, unsigned long parent_window, mgl_window_callback *callback); void mgl_window_deinit(mgl_window *self); void mgl_window_events_poll(mgl_window *self); diff --git a/src/graphics/texture.c b/src/graphics/texture.c index 3d3ea6f..ebc4e58 100644 --- a/src/graphics/texture.c +++ b/src/graphics/texture.c @@ -19,6 +19,16 @@ static int mgl_texture_format_to_opengl_format(mgl_texture_format format) { return 0; } +static int mgl_texture_format_to_compressed_opengl_format(mgl_texture_format format) { + switch(format) { + case MGL_TEXTURE_GRAY: return GL_LUMINANCE8; + case MGL_TEXTURE_GRAY_ALPHA: return GL_LUMINANCE8_ALPHA8; + case MGL_TEXTURE_RGB: return GL_COMPRESSED_RGB_S3TC_DXT1_EXT; + case MGL_TEXTURE_RGB_ALPHA: return GL_COMPRESSED_RGBA_S3TC_DXT5_EXT; + } + return 0; +} + static int mgl_texture_format_to_source_opengl_format(mgl_texture_format format) { switch(format) { case MGL_TEXTURE_GRAY: return GL_LUMINANCE8_ALPHA8; @@ -30,6 +40,7 @@ static int mgl_texture_format_to_source_opengl_format(mgl_texture_format format) } /* TODO: Ensure texture is power of 2 if the hardware doesn't support non power of two textures */ +/* TODO: Verify if source format should always be 4 components (RGBA) because apparently if its another format then opengl will internally convert it to RGBA */ int mgl_texture_load_from_file(mgl_texture *self, const char *filepath) { self->id = 0; @@ -48,7 +59,7 @@ int mgl_texture_load_from_file(mgl_texture *self, const char *filepath) { return -1; } - const int opengl_texture_format = mgl_texture_format_to_opengl_format(self->format); + const int opengl_texture_format = mgl_texture_format_to_compressed_opengl_format(self->format); context->gl.glBindTexture(GL_TEXTURE_2D, self->id); context->gl.glTexImage2D(GL_TEXTURE_2D, 0, opengl_texture_format, self->width, self->height, 0, mgl_texture_format_to_source_opengl_format(self->format), GL_UNSIGNED_BYTE, image_data); diff --git a/src/window.c b/src/window.c index 7d13ffe..ccfab93 100644 --- a/src/window.c +++ b/src/window.c @@ -1,6 +1,7 @@ #include "../include/mgl/window.h" #include "../include/mgl/mgl.h" #include +#include #include /* TODO: check for glx swap control extension string (GLX_EXT_swap_control, etc) */ @@ -26,14 +27,13 @@ static void set_vertical_sync_enabled(Window window, int enabled) { fprintf(stderr, "Warning: setting vertical sync failed\n"); } -int mgl_window_create(mgl_window *self, const char *title, int width, int height, mgl_window_callback *callback, void *userdata) { - return mgl_window_create_with_params(self, title, width, height, DefaultRootWindow(mgl_get_context()->connection), callback, userdata); +int mgl_window_create(mgl_window *self, const char *title, int width, int height, mgl_window_callback *callback) { + return mgl_window_create_with_params(self, title, width, height, DefaultRootWindow(mgl_get_context()->connection), callback); } -int mgl_window_create_with_params(mgl_window *self, const char *title, int width, int height, unsigned long parent_window, mgl_window_callback *callback, void *userdata) { +int mgl_window_create_with_params(mgl_window *self, const char *title, int width, int height, unsigned long parent_window, mgl_window_callback *callback) { self->window = 0; self->callback = *callback; - self->callback_userdata = userdata; mgl_context *context = mgl_get_context(); @@ -104,7 +104,7 @@ void mgl_window_events_poll(mgl_window *self) { XNextEvent(display, &xev); on_receive_x11_event(self, &xev); } - } else if(num_ready_fds == -1) { + } else if(num_ready_fds == -1 && errno != EINTR) { /* TODO: */ fprintf(stderr, "Disconnected!\n"); } @@ -121,6 +121,6 @@ void mgl_window_draw(mgl_window *self) { context->gl.glClear(GL_COLOR_BUFFER_BIT); context->gl.glClearColor(0.0f, 0.0f, 0.0f, 1.0f); if(self->callback.draw) - self->callback.draw(self, self->callback_userdata); + self->callback.draw(self, self->callback.userdata); context->gl.glXSwapBuffers(context->connection, self->window); } diff --git a/tests/main.c b/tests/main.c index fdd6cfe..7a40d80 100644 --- a/tests/main.c +++ b/tests/main.c @@ -43,14 +43,16 @@ int main(int argc, char **argv) { return 1; mgl_texture texture; - mgl_window_callback window_callback; - window_callback.draw = draw; Userdata userdata; userdata.texture = &texture; + mgl_window_callback window_callback; + window_callback.userdata = &userdata; + window_callback.draw = draw; + mgl_window window; - if(mgl_window_create(&window, "mgl", 1280, 720, &window_callback, &userdata) != 0) + if(mgl_window_create(&window, "mgl", 1280, 720, &window_callback) != 0) return 1; if(mgl_texture_load_from_file(&texture, "X11.png") != 0) -- cgit v1.2.3