renderer: expose half-float and depth{24,32} pixel formats

This commit is contained in:
Andrei Alexeyev 2020-01-16 21:58:25 +02:00
parent b8c2755ce1
commit 1cca9173b8
No known key found for this signature in database
GPG key ID: 363707CD4C7FE8A4
8 changed files with 137 additions and 67 deletions

View file

@ -60,18 +60,27 @@ typedef enum TextureType {
TEX_TYPE_RGB_8,
TEX_TYPE_RG_8,
TEX_TYPE_R_8,
TEX_TYPE_DEPTH_8,
TEX_TYPE_RGBA_16,
TEX_TYPE_RGB_16,
TEX_TYPE_RG_16,
TEX_TYPE_R_16,
TEX_TYPE_DEPTH_16,
TEX_TYPE_RGBA_16_FLOAT,
TEX_TYPE_RGB_16_FLOAT,
TEX_TYPE_RG_16_FLOAT,
TEX_TYPE_R_16_FLOAT,
TEX_TYPE_RGBA_32_FLOAT,
TEX_TYPE_RGB_32_FLOAT,
TEX_TYPE_RG_32_FLOAT,
TEX_TYPE_R_32_FLOAT,
TEX_TYPE_DEPTH_8,
TEX_TYPE_DEPTH_16,
TEX_TYPE_DEPTH_24,
TEX_TYPE_DEPTH_32,
TEX_TYPE_DEPTH_16_FLOAT,
TEX_TYPE_DEPTH_32_FLOAT,
TEX_TYPE_RGBA = TEX_TYPE_RGBA_8,

View file

@ -83,21 +83,25 @@ static GLuint r_wrap_to_gl_wrap(TextureWrapMode mode) {
GLTextureTypeInfo* gl33_texture_type_info(TextureType type) {
static GLTextureFormatTuple color_formats[] = {
{ GL_RED, GL_UNSIGNED_BYTE, PIXMAP_FORMAT_R8 },
{ GL_RED, GL_UNSIGNED_SHORT, PIXMAP_FORMAT_R16 },
{ GL_RED, GL_UNSIGNED_INT, PIXMAP_FORMAT_R32 },
{ GL_RED, GL_UNSIGNED_BYTE, PIXMAP_FORMAT_R8 },
{ GL_RED, GL_UNSIGNED_SHORT, PIXMAP_FORMAT_R16 },
{ GL_RED, GL_UNSIGNED_INT, PIXMAP_FORMAT_R32 },
{ GL_RED, GL_FLOAT, PIXMAP_FORMAT_R32F },
{ GL_RG, GL_UNSIGNED_BYTE, PIXMAP_FORMAT_RG8 },
{ GL_RG, GL_UNSIGNED_SHORT, PIXMAP_FORMAT_RG16 },
{ GL_RG, GL_UNSIGNED_INT, PIXMAP_FORMAT_RG32 },
{ GL_RG, GL_UNSIGNED_BYTE, PIXMAP_FORMAT_RG8 },
{ GL_RG, GL_UNSIGNED_SHORT, PIXMAP_FORMAT_RG16 },
{ GL_RG, GL_UNSIGNED_INT, PIXMAP_FORMAT_RG32 },
{ GL_RG, GL_FLOAT, PIXMAP_FORMAT_RG32F },
{ GL_RGB, GL_UNSIGNED_BYTE, PIXMAP_FORMAT_RGB8 },
{ GL_RGB, GL_UNSIGNED_SHORT, PIXMAP_FORMAT_RGB16 },
{ GL_RGB, GL_UNSIGNED_INT, PIXMAP_FORMAT_RGB32 },
{ GL_RGB, GL_UNSIGNED_BYTE, PIXMAP_FORMAT_RGB8 },
{ GL_RGB, GL_UNSIGNED_SHORT, PIXMAP_FORMAT_RGB16 },
{ GL_RGB, GL_UNSIGNED_INT, PIXMAP_FORMAT_RGB32 },
{ GL_RGB, GL_FLOAT, PIXMAP_FORMAT_RGB32F },
{ GL_RGBA, GL_UNSIGNED_BYTE, PIXMAP_FORMAT_RGBA8 },
{ GL_RGBA, GL_UNSIGNED_SHORT, PIXMAP_FORMAT_RGBA16 },
{ GL_RGBA, GL_UNSIGNED_INT, PIXMAP_FORMAT_RGBA32 },
{ GL_RGBA, GL_UNSIGNED_BYTE, PIXMAP_FORMAT_RGBA8 },
{ GL_RGBA, GL_UNSIGNED_SHORT, PIXMAP_FORMAT_RGBA16 },
{ GL_RGBA, GL_UNSIGNED_INT, PIXMAP_FORMAT_RGBA32 },
{ GL_RGBA, GL_FLOAT, PIXMAP_FORMAT_RGBA32F },
{ 0 }
};
@ -107,6 +111,7 @@ GLTextureTypeInfo* gl33_texture_type_info(TextureType type) {
{ GL_DEPTH_COMPONENT, GL_UNSIGNED_BYTE, PIXMAP_FORMAT_R8 },
{ GL_DEPTH_COMPONENT, GL_UNSIGNED_SHORT, PIXMAP_FORMAT_R16 },
{ GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, PIXMAP_FORMAT_R32 },
{ GL_DEPTH_COMPONENT, GL_FLOAT, PIXMAP_FORMAT_R32F },
{ 0 }
};
@ -116,19 +121,28 @@ GLTextureTypeInfo* gl33_texture_type_info(TextureType type) {
[TEX_TYPE_RG_8] = { GL_RG8, color_formats, { GL_RG, GL_UNSIGNED_BYTE, PIXMAP_FORMAT_RG8 } },
[TEX_TYPE_RGB_8] = { GL_RGB8, color_formats, { GL_RGB, GL_UNSIGNED_BYTE, PIXMAP_FORMAT_RGB8 } },
[TEX_TYPE_RGBA_8] = { GL_RGBA8, color_formats, { GL_RGBA, GL_UNSIGNED_BYTE, PIXMAP_FORMAT_RGBA8 } },
[TEX_TYPE_DEPTH_8] = { GL_DEPTH_COMPONENT16, depth_formats, { GL_DEPTH_COMPONENT, GL_UNSIGNED_SHORT, PIXMAP_FORMAT_R16 } },
[TEX_TYPE_R_16] = { GL_R16, color_formats, { GL_RED, GL_UNSIGNED_SHORT, PIXMAP_FORMAT_R16 } },
[TEX_TYPE_RG_16] = { GL_RG16, color_formats, { GL_RG, GL_UNSIGNED_SHORT, PIXMAP_FORMAT_RG16 } },
[TEX_TYPE_RGB_16] = { GL_RGB16, color_formats, { GL_RGB, GL_UNSIGNED_SHORT, PIXMAP_FORMAT_RGB16 } },
[TEX_TYPE_RGBA_16] = { GL_RGBA16, color_formats, { GL_RGBA, GL_UNSIGNED_SHORT, PIXMAP_FORMAT_RGBA16 } },
[TEX_TYPE_DEPTH_16] = { GL_DEPTH_COMPONENT16, depth_formats, { GL_DEPTH_COMPONENT, GL_UNSIGNED_SHORT, PIXMAP_FORMAT_R16 } },
[TEX_TYPE_R_32_FLOAT] = { GL_R32F, color_formats, { GL_RED, GL_UNSIGNED_SHORT, PIXMAP_FORMAT_R16 } },
[TEX_TYPE_RG_32_FLOAT] = { GL_RG32F, color_formats, { GL_RG, GL_UNSIGNED_SHORT, PIXMAP_FORMAT_RG16 } },
[TEX_TYPE_RGB_32_FLOAT] = { GL_RGB32F, color_formats, { GL_RGB, GL_UNSIGNED_SHORT, PIXMAP_FORMAT_RGB16 } },
[TEX_TYPE_RGBA_32_FLOAT] = { GL_RGBA32F, color_formats, { GL_RGBA, GL_UNSIGNED_SHORT, PIXMAP_FORMAT_RGBA16 } },
[TEX_TYPE_DEPTH_32_FLOAT] = { GL_DEPTH_COMPONENT32, depth_formats, { GL_DEPTH_COMPONENT32F, GL_FLOAT, PIXMAP_FORMAT_R32 } },
[TEX_TYPE_R_16_FLOAT] = { GL_R16F, color_formats, { GL_RED, GL_FLOAT, PIXMAP_FORMAT_R32F } },
[TEX_TYPE_RG_16_FLOAT] = { GL_RG16F, color_formats, { GL_RG, GL_FLOAT, PIXMAP_FORMAT_RG32F } },
[TEX_TYPE_RGB_16_FLOAT] = { GL_RGB16F, color_formats, { GL_RGB, GL_FLOAT, PIXMAP_FORMAT_RGB32F } },
[TEX_TYPE_RGBA_16_FLOAT] = { GL_RGBA16F, color_formats, { GL_RGBA, GL_FLOAT, PIXMAP_FORMAT_RGBA32F } },
[TEX_TYPE_R_32_FLOAT] = { GL_R32F, color_formats, { GL_RED, GL_FLOAT, PIXMAP_FORMAT_R32F } },
[TEX_TYPE_RG_32_FLOAT] = { GL_RG32F, color_formats, { GL_RG, GL_FLOAT, PIXMAP_FORMAT_RG32F } },
[TEX_TYPE_RGB_32_FLOAT] = { GL_RGB32F, color_formats, { GL_RGB, GL_FLOAT, PIXMAP_FORMAT_RGB32F } },
[TEX_TYPE_RGBA_32_FLOAT] = { GL_RGBA32F, color_formats, { GL_RGBA, GL_FLOAT, PIXMAP_FORMAT_RGBA32F } },
[TEX_TYPE_DEPTH_8] = { GL_DEPTH_COMPONENT16, depth_formats, { GL_DEPTH_COMPONENT, GL_UNSIGNED_SHORT, PIXMAP_FORMAT_R16 } },
[TEX_TYPE_DEPTH_16] = { GL_DEPTH_COMPONENT16, depth_formats, { GL_DEPTH_COMPONENT, GL_UNSIGNED_SHORT, PIXMAP_FORMAT_R16 } },
[TEX_TYPE_DEPTH_24] = { GL_DEPTH_COMPONENT24, depth_formats, { GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, PIXMAP_FORMAT_R32 } },
[TEX_TYPE_DEPTH_32] = { GL_DEPTH_COMPONENT32, depth_formats, { GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, PIXMAP_FORMAT_R32 } },
[TEX_TYPE_DEPTH_16_FLOAT] = { GL_DEPTH_COMPONENT32F, depth_formats, { GL_DEPTH_COMPONENT, GL_FLOAT, PIXMAP_FORMAT_R32F } },
[TEX_TYPE_DEPTH_32_FLOAT] = { GL_DEPTH_COMPONENT32F, depth_formats, { GL_DEPTH_COMPONENT, GL_FLOAT, PIXMAP_FORMAT_R32F } },
};
assert((uint)type < sizeof(map)/sizeof(*map));
@ -159,7 +173,7 @@ void gl33_texture_get_size(Texture *tex, uint mipmap, uint *width, uint *height)
}
}
static GLTextureFormatTuple* prepare_pixmap(Texture *tex, const Pixmap *px_in, Pixmap *px_out) {
static GLTextureFormatTuple *prepare_pixmap(Texture *tex, const Pixmap *px_in, Pixmap *px_out) {
GLTextureFormatTuple *fmt = glcommon_find_best_pixformat(tex->params.type, px_in->format);
pixmap_convert_alloc(px_in, px_out, fmt->px_fmt);
pixmap_flip_to_origin_inplace(px_out, PIXMAP_ORIGIN_BOTTOMLEFT);

View file

@ -78,7 +78,7 @@ static GLTextureFormatTuple* glcommon_find_best_pixformat_internal(GLTextureForm
return best;
}
GLTextureFormatTuple* glcommon_find_best_pixformat(TextureType textype, PixmapFormat pxfmt) {
GLTextureFormatTuple *glcommon_find_best_pixformat(TextureType textype, PixmapFormat pxfmt) {
GLTextureFormatTuple *formats = GLVT.texture_type_info(textype)->external_formats;
return glcommon_find_best_pixformat_internal(formats, pxfmt);
}

View file

@ -27,7 +27,7 @@ typedef struct GLTextureTypeInfo {
GLTextureFormatTuple primary_external_format;
} GLTextureTypeInfo;
GLTextureFormatTuple* glcommon_find_best_pixformat(TextureType textype, PixmapFormat pxfmt);
GLTextureFormatTuple *glcommon_find_best_pixformat(TextureType textype, PixmapFormat pxfmt);
GLenum glcommon_texture_base_format(GLenum internal_fmt);
#endif // IGUARD_renderer_glcommon_texture_h

View file

@ -13,18 +13,22 @@
#define FMT_R8 { GL_RED, GL_UNSIGNED_BYTE, PIXMAP_FORMAT_R8 }
#define FMT_R16 { GL_RED, GL_UNSIGNED_SHORT, PIXMAP_FORMAT_R16 }
#define FMT_R16F { GL_RED, GL_FLOAT, PIXMAP_FORMAT_R32F }
#define FMT_R32F { GL_RED, GL_FLOAT, PIXMAP_FORMAT_R32F }
#define FMT_RG8 { GL_RG, GL_UNSIGNED_BYTE, PIXMAP_FORMAT_RG8 }
#define FMT_RG16 { GL_RG, GL_UNSIGNED_SHORT, PIXMAP_FORMAT_RG16 }
#define FMT_RG16F { GL_RG, GL_FLOAT, PIXMAP_FORMAT_RG32F }
#define FMT_RG32F { GL_RG, GL_FLOAT, PIXMAP_FORMAT_RG32F }
#define FMT_RGB8 { GL_RGB, GL_UNSIGNED_BYTE, PIXMAP_FORMAT_RGB8 }
#define FMT_RGB16 { GL_RGB, GL_UNSIGNED_SHORT, PIXMAP_FORMAT_RGB16 }
#define FMT_RGB16F { GL_RGB, GL_FLOAT, PIXMAP_FORMAT_RGB32F }
#define FMT_RGB32F { GL_RGB, GL_FLOAT, PIXMAP_FORMAT_RGB32F }
#define FMT_RGBA8 { GL_RGBA, GL_UNSIGNED_BYTE, PIXMAP_FORMAT_RGBA8 }
#define FMT_RGBA16 { GL_RGBA, GL_UNSIGNED_SHORT, PIXMAP_FORMAT_RGBA16 }
#define FMT_RGBA16F { GL_RGBA, GL_FLOAT, PIXMAP_FORMAT_RGBA32F }
#define FMT_RGBA32F { GL_RGBA, GL_FLOAT, PIXMAP_FORMAT_RGBA32F }
#define FMT_DEPTH { GL_DEPTH_COMPONENT, GL_UNSIGNED_SHORT, PIXMAP_FORMAT_R16 }
@ -44,6 +48,11 @@ static GLTextureTypeInfo gles_texformats[] = {
[TEX_TYPE_RGB_16] = MAKEFMT(GL_RGB8, FMT_RGB8),
[TEX_TYPE_RGBA_16] = MAKEFMT(GL_RGBA8, FMT_RGBA8),
[TEX_TYPE_R_16_FLOAT] = MAKEFMT(GL_RGB8, FMT_RGB8),
[TEX_TYPE_RG_16_FLOAT] = MAKEFMT(GL_RGB8, FMT_RGB8),
[TEX_TYPE_RGB_16_FLOAT] = MAKEFMT(GL_RGB8, FMT_RGB8),
[TEX_TYPE_RGBA_16_FLOAT] = MAKEFMT(GL_RGBA8, FMT_RGBA8),
[TEX_TYPE_R_32_FLOAT] = MAKEFMT(GL_RGB8, FMT_RGB8),
[TEX_TYPE_RG_32_FLOAT] = MAKEFMT(GL_RGB8, FMT_RGB8),
[TEX_TYPE_RGB_32_FLOAT] = MAKEFMT(GL_RGB8, FMT_RGB8),
@ -52,6 +61,9 @@ static GLTextureTypeInfo gles_texformats[] = {
// WARNING: ANGLE bug(?): texture binding fails if a sized format is used here.
[TEX_TYPE_DEPTH_8] = MAKEFMT(GL_DEPTH_COMPONENT16, FMT_DEPTH),
[TEX_TYPE_DEPTH_16] = MAKEFMT(GL_DEPTH_COMPONENT16, FMT_DEPTH),
[TEX_TYPE_DEPTH_24] = MAKEFMT(GL_DEPTH_COMPONENT16, FMT_DEPTH),
[TEX_TYPE_DEPTH_32] = MAKEFMT(GL_DEPTH_COMPONENT16, FMT_DEPTH),
[TEX_TYPE_DEPTH_16_FLOAT] = MAKEFMT(GL_DEPTH_COMPONENT16, FMT_DEPTH),
[TEX_TYPE_DEPTH_32_FLOAT] = MAKEFMT(GL_DEPTH_COMPONENT16, FMT_DEPTH),
};
@ -74,6 +86,9 @@ void gles_init_texformats_table(void) {
if(is_angle) {
set_format(TEX_TYPE_DEPTH_8, GL_DEPTH_COMPONENT, FMTSTRUCT(FMT_DEPTH));
set_format(TEX_TYPE_DEPTH_16, GL_DEPTH_COMPONENT, FMTSTRUCT(FMT_DEPTH));
set_format(TEX_TYPE_DEPTH_24, GL_DEPTH_COMPONENT, FMTSTRUCT(FMT_DEPTH));
set_format(TEX_TYPE_DEPTH_32, GL_DEPTH_COMPONENT, FMTSTRUCT(FMT_DEPTH));
set_format(TEX_TYPE_DEPTH_16_FLOAT, GL_DEPTH_COMPONENT, FMTSTRUCT(FMT_DEPTH));
set_format(TEX_TYPE_DEPTH_32_FLOAT, GL_DEPTH_COMPONENT, FMTSTRUCT(FMT_DEPTH));
}
@ -93,9 +108,13 @@ void gles_init_texformats_table(void) {
}
if(have_float32 || have_float16) {
set_format(TEX_TYPE_R_32_FLOAT, have_float32 ? GL_R32F : GL_R16F, FMTSTRUCT(FMT_R32F));
set_format(TEX_TYPE_R_16_FLOAT, have_float16 ? GL_R16F : GL_R32F, FMTSTRUCT(FMT_R16F));
set_format(TEX_TYPE_RG_16_FLOAT, have_float16 ? GL_RG16F : GL_RG32F, FMTSTRUCT(FMT_RG16F));
set_format(TEX_TYPE_R_32_FLOAT, have_float32 ? GL_R32F : GL_R16F, FMTSTRUCT(FMT_R32F));
set_format(TEX_TYPE_RG_32_FLOAT, have_float32 ? GL_RG32F : GL_RG16F, FMTSTRUCT(FMT_RG32F));
} else {
gles_texformats[TEX_TYPE_R_16_FLOAT] = gles_texformats[TEX_TYPE_R_16];
gles_texformats[TEX_TYPE_RG_16_FLOAT] = gles_texformats[TEX_TYPE_RG_16];
gles_texformats[TEX_TYPE_R_32_FLOAT] = gles_texformats[TEX_TYPE_R_16];
gles_texformats[TEX_TYPE_RG_32_FLOAT] = gles_texformats[TEX_TYPE_RG_16];
}
@ -106,9 +125,13 @@ void gles_init_texformats_table(void) {
}
if(have_float32 || have_float16) {
set_format(TEX_TYPE_R_32_FLOAT, have_float32 ? GL_RGBA32F : GL_RGBA16F, FMTSTRUCT(FMT_RGBA32F));
set_format(TEX_TYPE_R_16_FLOAT, have_float16 ? GL_RGBA16F : GL_RGBA32F, FMTSTRUCT(FMT_RGBA16F));
set_format(TEX_TYPE_RG_16_FLOAT, have_float16 ? GL_RGBA16F : GL_RGBA32F, FMTSTRUCT(FMT_RGBA16F));
set_format(TEX_TYPE_R_32_FLOAT, have_float32 ? GL_RGBA32F : GL_RGBA16F, FMTSTRUCT(FMT_RGBA32F));
set_format(TEX_TYPE_RG_32_FLOAT, have_float32 ? GL_RGBA32F : GL_RGBA16F, FMTSTRUCT(FMT_RGBA32F));
} else {
gles_texformats[TEX_TYPE_R_16_FLOAT] = gles_texformats[TEX_TYPE_R_16];
gles_texformats[TEX_TYPE_RG_16_FLOAT] = gles_texformats[TEX_TYPE_RG_16];
gles_texformats[TEX_TYPE_R_32_FLOAT] = gles_texformats[TEX_TYPE_R_16];
gles_texformats[TEX_TYPE_RG_32_FLOAT] = gles_texformats[TEX_TYPE_RG_16];
}
@ -120,14 +143,19 @@ void gles_init_texformats_table(void) {
}
if(have_float32 || have_float16) {
set_format(TEX_TYPE_RGB_32_FLOAT, have_float32 ? GL_RGBA32F : GL_RGBA16F, FMTSTRUCT(FMT_RGBA32F));
set_format(TEX_TYPE_RGB_16_FLOAT, have_float16 ? GL_RGBA16F : GL_RGBA32F, FMTSTRUCT(FMT_RGBA16F));
set_format(TEX_TYPE_RGBA_16_FLOAT, have_float16 ? GL_RGBA16F : GL_RGBA32F, FMTSTRUCT(FMT_RGBA16F));
set_format(TEX_TYPE_RGB_32_FLOAT, have_float32 ? GL_RGBA32F : GL_RGBA16F, FMTSTRUCT(FMT_RGBA32F));
set_format(TEX_TYPE_RGBA_32_FLOAT, have_float32 ? GL_RGBA32F : GL_RGBA16F, FMTSTRUCT(FMT_RGBA32F));
} else {
gles_texformats[TEX_TYPE_RGB_16_FLOAT] = gles_texformats[TEX_TYPE_RGBA_16];
gles_texformats[TEX_TYPE_RGBA_16_FLOAT] = gles_texformats[TEX_TYPE_RGBA_16];
gles_texformats[TEX_TYPE_RGB_32_FLOAT] = gles_texformats[TEX_TYPE_RGBA_16];
gles_texformats[TEX_TYPE_RGBA_32_FLOAT] = gles_texformats[TEX_TYPE_RGBA_16];
}
for(uint i = 0; i < sizeof(gles_texformats)/sizeof(*gles_texformats); ++i) {
log_debug("fuck %i", i);
gles_texformats[i].external_formats[0] = gles_texformats[i].primary_external_format;
if(!is_gles3) {

View file

@ -15,8 +15,8 @@
#include "renderer/api.h"
#include "util/pixmap.h"
static void* load_texture_begin(const char *path, uint flags);
static void* load_texture_end(void *opaque, const char *path, uint flags);
static void *load_texture_begin(const char *path, uint flags);
static void *load_texture_end(void *opaque, const char *path, uint flags);
static void free_texture(Texture *tex);
ResourceHandler texture_res_handler = {
@ -141,35 +141,46 @@ static TextureType pixmap_format_to_texture_type(PixmapFormat fmt) {
bool is_float = PIXMAP_FORMAT_IS_FLOAT(fmt);
if(is_float) {
switch(layout) {
case PIXMAP_LAYOUT_R: return TEX_TYPE_R_32_FLOAT;
case PIXMAP_LAYOUT_RG: return TEX_TYPE_RG_32_FLOAT;
case PIXMAP_LAYOUT_RGB: return TEX_TYPE_RGB_32_FLOAT;
case PIXMAP_LAYOUT_RGBA: return TEX_TYPE_RGBA_32_FLOAT;
switch(depth) {
case 16: switch(layout) {
case PIXMAP_LAYOUT_R: return TEX_TYPE_R_16_FLOAT;
case PIXMAP_LAYOUT_RG: return TEX_TYPE_RG_16_FLOAT;
case PIXMAP_LAYOUT_RGB: return TEX_TYPE_RGB_16_FLOAT;
case PIXMAP_LAYOUT_RGBA: return TEX_TYPE_RGBA_16_FLOAT;
default: UNREACHABLE;
}
case 32: switch(layout) {
case PIXMAP_LAYOUT_R: return TEX_TYPE_R_32_FLOAT;
case PIXMAP_LAYOUT_RG: return TEX_TYPE_RG_32_FLOAT;
case PIXMAP_LAYOUT_RGB: return TEX_TYPE_RGB_32_FLOAT;
case PIXMAP_LAYOUT_RGBA: return TEX_TYPE_RGBA_32_FLOAT;
default: UNREACHABLE;
}
default: UNREACHABLE;
}
} else {
switch(depth) {
case 8: switch(layout) {
case PIXMAP_LAYOUT_R: return TEX_TYPE_R_8;
case PIXMAP_LAYOUT_RG: return TEX_TYPE_RG_8;
case PIXMAP_LAYOUT_RGB: return TEX_TYPE_RGB_8;
case PIXMAP_LAYOUT_RGBA: return TEX_TYPE_RGBA_8;
default: UNREACHABLE;
}
UNREACHABLE;
}
case 16: switch(layout) {
case PIXMAP_LAYOUT_R: return TEX_TYPE_R_16;
case PIXMAP_LAYOUT_RG: return TEX_TYPE_RG_16;
case PIXMAP_LAYOUT_RGB: return TEX_TYPE_RGB_16;
case PIXMAP_LAYOUT_RGBA: return TEX_TYPE_RGBA_16;
default: UNREACHABLE;
}
if(depth > 8) {
switch(layout) {
case PIXMAP_LAYOUT_R: return TEX_TYPE_R_16;
case PIXMAP_LAYOUT_RG: return TEX_TYPE_RG_16;
case PIXMAP_LAYOUT_RGB: return TEX_TYPE_RGB_16;
case PIXMAP_LAYOUT_RGBA: return TEX_TYPE_RGBA_16;
default: UNREACHABLE;
}
UNREACHABLE;
}
switch(layout) {
case PIXMAP_LAYOUT_R: return TEX_TYPE_R_8;
case PIXMAP_LAYOUT_RG: return TEX_TYPE_RG_8;
case PIXMAP_LAYOUT_RGB: return TEX_TYPE_RGB_8;
case PIXMAP_LAYOUT_RGBA: return TEX_TYPE_RGBA_8;
}
UNREACHABLE;
}
static bool parse_format(const char *val, PixmapFormat *out) {
@ -199,7 +210,7 @@ static bool parse_format(const char *val, PixmapFormat *out) {
}
if(channels < 1) {
log_warn("Invalid format '%s': bad channels specification, expected one of: RGBA, RGB, RG, R", val);
log_error("Invalid format '%s': bad channels specification, expected one of: RGBA, RGB, RG, R", val);
return false;
}
@ -209,12 +220,12 @@ static bool parse_format(const char *val, PixmapFormat *out) {
uint depth = strtol(val + channels, &end, 10);
if(val + channels == end) {
log_warn("Invalid format '%s': bad depth specification, expected an integer", val);
log_error("Invalid format '%s': bad bit depth specification, expected an integer", val);
return false;
}
if(depth != 8 && depth != 16 && depth != 32) {
log_warn("Invalid format '%s': invalid bit depth %d, only 8, 16, and 32 are currently supported", val, depth);
log_error("Invalid format '%s': invalid bit depth %d, only 8, 16, and 32 are supported", val, depth);
return false;
}
@ -230,17 +241,17 @@ static bool parse_format(const char *val, PixmapFormat *out) {
} else if(!SDL_strcasecmp(end, "f") || !SDL_strcasecmp(end, "float")) {
is_float = true;
} else {
log_warn("Invalid format '%s': bad type specification, expected one of: U, UINT, F, FLOAT, or nothing", val);
log_error("Invalid format '%s': bad type specification, expected one of: U, UINT, F, FLOAT, or nothing", val);
return false;
}
}
if(depth == 32 && !is_float) {
log_warn("Invalid format '%s': bit depth %d is currently only supported for floating point pixels", val, depth);
log_error("Invalid format '%s': bit depth %d is only supported for floating point pixels", val, depth);
return false;
} else if(depth < 16 && is_float) {
log_error("Invalid format '%s': bit depth %d is not supported for floating point pixels", val, depth);
return false;
} else if(depth < 32 && is_float) {
log_warn("Bit depth %d is currently not supported for floating point pixels, promoting to 32", depth);
depth = 32;
}
*out = PIXMAP_MAKE_FORMAT(channels, depth) | (is_float * PIXMAP_FLOAT_BIT);
@ -444,7 +455,7 @@ static Texture* texture_post_load(Texture *tex, Texture *alphamap) {
return fbo_tex;
}
static void* load_texture_end(void *opaque, const char *path, uint flags) {
static void *load_texture_end(void *opaque, const char *path, uint flags) {
TextureLoadData *ld = opaque;
if(!ld) {
@ -486,11 +497,11 @@ static void* load_texture_end(void *opaque, const char *path, uint flags) {
return texture;
}
Texture* get_tex(const char *name) {
Texture *get_tex(const char *name) {
return r_texture_get(name);
}
Texture* prefix_get_tex(const char *name, const char *prefix) {
Texture *prefix_get_tex(const char *name, const char *prefix) {
uint plen = strlen(prefix);
char buf[plen + strlen(name) + 1];
strcpy(buf, prefix);

View file

@ -16,7 +16,7 @@
typedef struct Texture Texture;
char* texture_path(const char *name);
char *texture_path(const char *name);
bool check_texture_path(const char *path);
void begin_draw_texture(FloatRect dest, FloatRect frag, Texture *tex);
@ -31,8 +31,8 @@ void fill_screen_p(Texture *tex);
void loop_tex_line_p(cmplx a, cmplx b, float w, float t, Texture *texture);
void loop_tex_line(cmplx a, cmplx b, float w, float t, const char *texture);
Texture* get_tex(const char *name);
Texture* prefix_get_tex(const char *name, const char *prefix);
Texture *get_tex(const char *name);
Texture *prefix_get_tex(const char *name, const char *prefix);
extern ResourceHandler texture_res_handler;

View file

@ -39,21 +39,29 @@ typedef enum PixmapFormat {
PIXMAP_FORMAT_R8 = PIXMAP_MAKE_FORMAT(PIXMAP_LAYOUT_R, 8),
PIXMAP_FORMAT_R16 = PIXMAP_MAKE_FORMAT(PIXMAP_LAYOUT_R, 16),
PIXMAP_FORMAT_R32 = PIXMAP_MAKE_FORMAT(PIXMAP_LAYOUT_R, 32),
PIXMAP_FORMAT_R16F = PIXMAP_MAKE_FORMAT(PIXMAP_LAYOUT_R, 16) | PIXMAP_FLOAT_BIT,
PIXMAP_FORMAT_R32F = PIXMAP_MAKE_FORMAT(PIXMAP_LAYOUT_R, 32) | PIXMAP_FLOAT_BIT,
PIXMAP_FORMAT_RG8 = PIXMAP_MAKE_FORMAT(PIXMAP_LAYOUT_RG, 8),
PIXMAP_FORMAT_RG16 = PIXMAP_MAKE_FORMAT(PIXMAP_LAYOUT_RG, 16),
PIXMAP_FORMAT_RG32 = PIXMAP_MAKE_FORMAT(PIXMAP_LAYOUT_RG, 32),
PIXMAP_FORMAT_RG16F = PIXMAP_MAKE_FORMAT(PIXMAP_LAYOUT_RG, 16) | PIXMAP_FLOAT_BIT,
PIXMAP_FORMAT_RG32F = PIXMAP_MAKE_FORMAT(PIXMAP_LAYOUT_RG, 32) | PIXMAP_FLOAT_BIT,
PIXMAP_FORMAT_RGB8 = PIXMAP_MAKE_FORMAT(PIXMAP_LAYOUT_RGB, 8),
PIXMAP_FORMAT_RGB16 = PIXMAP_MAKE_FORMAT(PIXMAP_LAYOUT_RGB, 16),
PIXMAP_FORMAT_RGB32 = PIXMAP_MAKE_FORMAT(PIXMAP_LAYOUT_RGB, 32),
PIXMAP_FORMAT_RGB16F = PIXMAP_MAKE_FORMAT(PIXMAP_LAYOUT_RGB, 16) | PIXMAP_FLOAT_BIT,
PIXMAP_FORMAT_RGB32F = PIXMAP_MAKE_FORMAT(PIXMAP_LAYOUT_RGB, 32) | PIXMAP_FLOAT_BIT,
PIXMAP_FORMAT_RGBA8 = PIXMAP_MAKE_FORMAT(PIXMAP_LAYOUT_RGBA, 8),
PIXMAP_FORMAT_RGBA16 = PIXMAP_MAKE_FORMAT(PIXMAP_LAYOUT_RGBA, 16),
PIXMAP_FORMAT_RGBA32 = PIXMAP_MAKE_FORMAT(PIXMAP_LAYOUT_RGBA, 32),
PIXMAP_FORMAT_RGBA16F = PIXMAP_MAKE_FORMAT(PIXMAP_LAYOUT_RGBA, 16) | PIXMAP_FLOAT_BIT,
PIXMAP_FORMAT_RGBA32F = PIXMAP_MAKE_FORMAT(PIXMAP_LAYOUT_RGBA, 32) | PIXMAP_FLOAT_BIT,
} PixmapFormat;