Does OpenGL (ES) really not have a way to have your textures be flipped at upload time, even as a (widely supported) extension?
What shit were they huffing in the 90s to have the UV coordinates origin in the bottom left?
It could have been so elegant, but now I have to use the row-by-row reading function and put that shit in upside-down.
glGenBuffers(1, &ctxt.upload_buf);
glGenTextures(1, &ctxt.texture);
glBindBuffer(GL_PIXEL_UNPACK_BUFFER_NV, ctxt.upload_buf);
glBufferData(GL_PIXEL_UNPACK_BUFFER_NV, dec_size, nullptr, GL_STATIC_DRAW);
void *ptr = glMapBufferRangeEXT(GL_PIXEL_UNPACK_BUFFER_NV, 0, dec_size,
GL_MAP_WRITE_BIT_EXT | GL_MAP_INVALIDATE_BUFFER_BIT_EXT);
spng_decode_image(spng_ctx, ptr, dec_size, SPNG_FMT_RGBA8, SPNG_DECODE_GAMMA);
spng_ctx_free(spng_ctx);
glUnmapBufferOES(GL_PIXEL_UNPACK_BUFFER_NV);
glBindTexture(GL_TEXTURE_2D, ctxt.texture);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, ihdr.width, ihdr.height, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
glBindTexture(GL_TEXTURE_2D, 0);
glBindBuffer(GL_PIXEL_UNPACK_BUFFER_NV, 0);