opengl_x11

Playing with OpenGL
git clone git://bsandro.tech/opengl_x11
Log | Files | Refs | README | LICENSE

commit bed49138833a575a2588eeb2f5ef78a9b71eed1b
parent 646ba013c9b55efd0daebd002da96b2abea20300
Author: bsandro <email@bsandro.tech>
Date:   Sat,  8 Nov 2025 13:04:03 +0200

using ASTC texture (buggy version)

Diffstat:
Mtexture.c | 82++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++---
1 file changed, 79 insertions(+), 3 deletions(-)

diff --git a/texture.c b/texture.c @@ -14,6 +14,28 @@ #define STB_IMAGE_IMPLEMENTATION #include "stb_image.h" +#define GL_CHECK(x) \ +x; \ +{ \ + GLenum glError = glGetError(); \ + if (glError!=GL_NO_ERROR) { \ + printf("glGetError() = %i (%#.8x) at %s:%i\n", glError, glError, __FILE__, __LINE__); \ + exit(EXIT_FAILURE); \ + } \ +} + +/* ASTC header declaration. */ +typedef struct +{ + uint8_t magic[4]; + uint8_t blockdim_x; + uint8_t blockdim_y; + uint8_t blockdim_z; + uint8_t xsize[3]; + uint8_t ysize[3]; + uint8_t zsize[3]; +} astc_header; + static const double current_ts() { struct timespec ts; timespec_get(&ts, TIME_UTC); @@ -86,7 +108,7 @@ static GLuint mkTexture(const char *filename) { glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); int w, h, numchan; stbi_set_flip_vertically_on_load(1); - unsigned char *data = stbi_load(filename, &w, &h, &numchan, 0); + uint8_t *data = stbi_load(filename, &w, &h, &numchan, 0); if (data) { glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, w, h, 0, GL_RGB, GL_UNSIGNED_BYTE, data); glGenerateMipmap(GL_TEXTURE_2D); @@ -98,6 +120,52 @@ static GLuint mkTexture(const char *filename) { return tex; } +static GLuint mkTextureAstc(const char *filename) { + FILE *f = fopen(filename, "rb"); + if (f==NULL) { + printf("error loading file %s\n", filename); + exit(EXIT_FAILURE); + } + + fseek(f, 0, SEEK_END); + int64_t fsize = ftell(f); + rewind(f); + + uint8_t *data = malloc(fsize); + if (fread(data, 1, fsize, f) != fsize) { + printf("error reading file %s\n", filename); + exit(EXIT_FAILURE); + } + + const astc_header *astc_data = (astc_header *)data; + /* Merge x,y,z-sizes from 3 chars into one integer value. */ + GLsizei xsize = astc_data->xsize[0] + (astc_data->xsize[1] << 8) + (astc_data->xsize[2] << 16); + GLsizei ysize = astc_data->ysize[0] + (astc_data->ysize[1] << 8) + (astc_data->ysize[2] << 16); + GLsizei zsize = astc_data->zsize[0] + (astc_data->zsize[1] << 8) + (astc_data->zsize[2] << 16); + + /* Compute number of blocks in each direction. */ + GLsizei xblocks = (xsize + astc_data->blockdim_x - 1) / astc_data->blockdim_x; + GLsizei yblocks = (ysize + astc_data->blockdim_y - 1) / astc_data->blockdim_y; + GLsizei zblocks = (zsize + astc_data->blockdim_z - 1) / astc_data->blockdim_z; + + GLsizei astc_size = xblocks * yblocks * zblocks << 4; + + GLuint tex; + GL_CHECK(glGenTextures(1, &tex)); + GL_CHECK(glBindTexture(GL_TEXTURE_2D, tex)); + GL_CHECK(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT)); + GL_CHECK(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT)); + //glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); + GL_CHECK(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR)); + GL_CHECK(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR)); + GL_CHECK(glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA_ASTC_6x6_KHR, xsize, ysize, 0, astc_size, (const GLvoid *)astc_data)); + //GL_CHECK(glGenerateMipmap(GL_TEXTURE_2D)); + GL_CHECK(glEnable(GL_TEXTURE_2D)); + + fclose(f); + return tex; +} + void __attribute__((constructor)) start() { printf("start()\n"); t_started = current_ts(); @@ -112,7 +180,6 @@ int main(int argc, char *argv[]) { XSetWindowAttributes swa; Window win; XWindowAttributes gwa; - XEvent xev; GLint attr[] = { GLX_RGBA, GLX_DEPTH_SIZE, 24, GLX_DOUBLEBUFFER, None }; if (dpy == NULL) { @@ -139,6 +206,14 @@ int main(int argc, char *argv[]) { GLXContext ctx = glXCreateContext(dpy, vi, NULL, GL_TRUE); glXMakeCurrent(dpy, win, ctx); + GLint extn; + GL_CHECK(glGetIntegerv(GL_NUM_EXTENSIONS, &extn)); + printf("%d GL Extensions:\n", extn); + for (GLint i=0; i<extn; ++i) { + printf("\t%s\n", glGetStringi(GL_EXTENSIONS, i)); + } + + GLuint vao; glGenVertexArrays(1, &vao); glBindVertexArray(vao); @@ -174,7 +249,8 @@ int main(int argc, char *argv[]) { printf("shader link status: %s\n", prgStatus == GL_TRUE ? "ok" : "error"); // texture - GLuint tex = mkTexture("hina1.png"); + //GLuint tex = mkTexture("hina.png"); + GLuint tex = mkTextureAstc("hina.astc"); GLint position = glGetAttribLocation(shaderPrg, "position"); glVertexAttribPointer(position, 2, GL_FLOAT, GL_FALSE, 4*sizeof(GLfloat), (void *)0); glEnableVertexAttribArray(position);