From 1cca9173b8bf03a77349e04acd3bd2b09dc1cd8d Mon Sep 17 00:00:00 2001 From: Andrei Alexeyev Date: Thu, 16 Jan 2020 21:58:25 +0200 Subject: [PATCH] renderer: expose half-float and depth{24,32} pixel formats --- src/renderer/api.h | 13 ++++- src/renderer/gl33/texture.c | 54 ++++++++++++-------- src/renderer/glcommon/texture.c | 2 +- src/renderer/glcommon/texture.h | 2 +- src/renderer/glescommon/texture.c | 34 +++++++++++-- src/resource/texture.c | 85 +++++++++++++++++-------------- src/resource/texture.h | 6 +-- src/util/pixmap.h | 8 +++ 8 files changed, 137 insertions(+), 67 deletions(-) diff --git a/src/renderer/api.h b/src/renderer/api.h index 0dd462d7..42d3d532 100644 --- a/src/renderer/api.h +++ b/src/renderer/api.h @@ -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, diff --git a/src/renderer/gl33/texture.c b/src/renderer/gl33/texture.c index 5c06e1d7..5479ad24 100644 --- a/src/renderer/gl33/texture.c +++ b/src/renderer/gl33/texture.c @@ -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); diff --git a/src/renderer/glcommon/texture.c b/src/renderer/glcommon/texture.c index dd90b812..11015374 100644 --- a/src/renderer/glcommon/texture.c +++ b/src/renderer/glcommon/texture.c @@ -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); } diff --git a/src/renderer/glcommon/texture.h b/src/renderer/glcommon/texture.h index 3e5f38c5..4b99b564 100644 --- a/src/renderer/glcommon/texture.h +++ b/src/renderer/glcommon/texture.h @@ -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 diff --git a/src/renderer/glescommon/texture.c b/src/renderer/glescommon/texture.c index 122f6919..043bc8fe 100644 --- a/src/renderer/glescommon/texture.c +++ b/src/renderer/glescommon/texture.c @@ -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) { diff --git a/src/resource/texture.c b/src/resource/texture.c index 8869f5ce..af7fa552 100644 --- a/src/resource/texture.c +++ b/src/resource/texture.c @@ -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); diff --git a/src/resource/texture.h b/src/resource/texture.h index b78a631b..3f3e28f2 100644 --- a/src/resource/texture.h +++ b/src/resource/texture.h @@ -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; diff --git a/src/util/pixmap.h b/src/util/pixmap.h index 282cfc3e..8f0b13a4 100644 --- a/src/util/pixmap.h +++ b/src/util/pixmap.h @@ -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;