commit bed49138833a575a2588eeb2f5ef78a9b71eed1b
parent 646ba013c9b55efd0daebd002da96b2abea20300
Author: bsandro <email@bsandro.tech>
Date: Sat, 8 Nov 2025 13:04:03 +0200
using ASTC texture (buggy version)
Diffstat:
| M | texture.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);