renderer: expose half-float and depth{24,32} pixel formats
This commit is contained in:
parent
b8c2755ce1
commit
1cca9173b8
8 changed files with 137 additions and 67 deletions
|
@ -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,
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
Loading…
Reference in a new issue