X-Git-Url: https://eleni.mutantstargoat.com/git/?p=test_compression;a=blobdiff_plain;f=main.c;fp=main.c;h=6f3742b5f98117e2cb6ae27c6d4831497fbc9ead;hp=dc9ca52778d2f62745ae47f4c43e3b028ad698ee;hb=03daf3cf2183d0c1aabe1b10645dba9c8597d53e;hpb=a76e52b12bf54efdeb95b7f6d8ecfdcec0ab81ae diff --git a/main.c b/main.c index dc9ca52..6f3742b 100644 --- a/main.c +++ b/main.c @@ -6,37 +6,32 @@ #include #include -#undef USE_SRGB - -#ifdef USE_SRGB -#define COMP_FMT GL_COMPRESSED_SRGB8_ETC2 -#else -#define COMP_FMT GL_COMPRESSED_RGB8_ETC2 -#endif +struct texture { + unsigned int id; + int width, height; + unsigned int fmt; + unsigned int compsize; + void *data; +}; int init(void); -int texcomp(unsigned char *compix, unsigned int tofmt, unsigned char *pixels, - int xsz, int ysz, unsigned int fromfmt, unsigned int fromtype); void disp(void); void reshape(int x, int y); void keyb(unsigned char key, int x, int y); -void idle(); -void gen_image(unsigned char *pixels, int xsz, int ysz); -unsigned char *load_compressed_image(const char *fname, int *cszptr, int *xszptr, int *yszptr); -int dump_compressed_image(const char *fname, unsigned char *data, int size, int w, int h); +void idle(void); +int load_texture(const char *fname, struct texture *tex); +const char *fmtstr(int fmt); void print_compressed_formats(void); -unsigned int tex, tex2, comp_tex; +struct texture tex; +unsigned int tex2; const char *texfile; -int subtest, copytest, loop; +int subtest, copytest; int main(int argc, char **argv) { - int i; + int i, loop = 0; unsigned int glut_flags = GLUT_RGB | GLUT_DOUBLE; -#ifdef USE_SRGB - glut_flags |= GLUT_SRGB; -#endif for(i=1; i 20 || !hdr.datadesc[0].size) { + fprintf(stderr, "%s is not a compressed texture file, or is corrupted\n", fname); + fclose(fp); + return -1; } - if(fread(pixels, 1, comp_size, fp) < comp_size) { - fprintf(stderr, "failed to read compressed texture file: %s: %s\n", texfile, strerror(errno)); + + if(!(buf = malloc(hdr.datadesc[0].size))) { + fprintf(stderr, "failed to allocate compressed texture buffer (%d bytes): %s\n", + hdr.datadesc[0].size, strerror(errno)); fclose(fp); - free(pixels); - return 0; + return -1; + } + if(!(tex->data = malloc(hdr.datadesc[0].size))) { + fprintf(stderr, "failed to allocate data buffer\n"); + fclose(fp); + free(buf); + return -1; } - fclose(fp); - *cszptr = comp_size; - *xszptr = xsz; - *yszptr = ysz; - return pixels; -} -int dump_compressed_image(const char *fname, unsigned char *data, int size, int w, int h) -{ - FILE *fp; + glGenTextures(1, &tex->id); + glBindTexture(GL_TEXTURE_2D, tex->id); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, + hdr.levels > 1 ? GL_NEAREST_MIPMAP_NEAREST : GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP_SGIS, 1); - if(!(fp = fopen(fname, "wb"))) { - fprintf(stderr, "failed to open compressed texture dump file: %s: %s\n", fname, strerror(errno)); - return -1; - } + tex->fmt = hdr.glfmt; + tex->width = hdr.width; + tex->height = hdr.height; + tex->compsize = hdr.datadesc[0].size; + + printf("%s: %dx%d format: %s\n", fname, tex->width, tex->height, fmtstr(tex->fmt)); + glutReshapeWindow(tex->width + tex->width / 2, tex->height); - if(fwrite(&w, sizeof w, 1, fp) < 1 || - fwrite(&h, sizeof h, 1, fp) < 1 || - fwrite(data, 1, size, fp) < size) { - fprintf(stderr, "failed to dump compressed texture: %s\n", strerror(errno)); + for(i=0; iid); + return -1; + } + if(i == 0) { + memcpy(tex->data, buf, hdr.datadesc[0].size); + } + glCompressedTexImage2D(GL_TEXTURE_2D, i, hdr.glfmt, hdr.width, hdr.height, 0, + hdr.datadesc[i].size, buf); + + hdr.width /= 2; + hdr.height /= 2; } + + free(buf); fclose(fp); return 0; } @@ -390,6 +398,25 @@ const char *fmtstr(int fmt) case 0x93DB: return "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10"; case 0x93DC: return "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12"; case 0x93DD: return "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12"; + case GL_LUMINANCE: + case 1: + return "GL_LUMINANCE"; + case GL_RGB: + case 3: + return "GL_RGB"; + case GL_RGBA: + case 4: + return "GL_RGBA"; + case GL_BGR: return "GL_BGR"; + case GL_BGRA: return "GL_BGRA"; + case GL_SLUMINANCE: return "GL_SLUMINANCE"; + case GL_SLUMINANCE8: return "GL_SLUMINANCE8"; + case GL_SLUMINANCE_ALPHA: return "GL_SLUMINANCE_ALPHA"; + case GL_SLUMINANCE8_ALPHA8: return "GL_SLUMINANCE8_ALPHA8"; + case GL_SRGB: return "GL_SRGB"; + case GL_SRGB8: return "GL_SRGB8"; + case GL_SRGB_ALPHA: return "GL_SRGB_ALPHA"; + case GL_SRGB8_ALPHA8: return "GL_SRGB8_ALPHA8"; default: break; }