review the loading and management of textures
to be closer to the OpenGL API
This commit is contained in:
parent
6b8978cb3e
commit
9be90fd5e6
217
src/external/rlsw.h
vendored
217
src/external/rlsw.h
vendored
|
|
@ -134,6 +134,19 @@
|
||||||
#define GL_STACK_UNDERFLOW 0x0504
|
#define GL_STACK_UNDERFLOW 0x0504
|
||||||
#define GL_OUT_OF_MEMORY 0x0505
|
#define GL_OUT_OF_MEMORY 0x0505
|
||||||
|
|
||||||
|
#define GL_ALPHA 0x1906
|
||||||
|
#define GL_LUMINANCE 0x1909
|
||||||
|
#define GL_LUMINANCE_ALPHA 0x190A
|
||||||
|
#define GL_RGB 0x1907
|
||||||
|
#define GL_RGBA 0x1908
|
||||||
|
|
||||||
|
#define GL_BYTE 0x1400
|
||||||
|
#define GL_UNSIGNED_BYTE 0x1401
|
||||||
|
#define GL_SHORT 0x1402
|
||||||
|
#define GL_UNSIGNED_SHORT 0x1403
|
||||||
|
#define GL_INT 0x1404
|
||||||
|
#define GL_UNSIGNED_INT 0x1405
|
||||||
|
#define GL_FLOAT 0x1406
|
||||||
|
|
||||||
/* === RLSW Enums === */
|
/* === RLSW Enums === */
|
||||||
|
|
||||||
|
|
@ -189,31 +202,21 @@ typedef enum {
|
||||||
} SWfactor;
|
} SWfactor;
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
SW_PIXELFORMAT_UNCOMPRESSED_GRAYSCALE = 1, // 8 bit per pixel (no alpha)
|
SW_LUMINANCE = GL_LUMINANCE,
|
||||||
SW_PIXELFORMAT_UNCOMPRESSED_GRAY_ALPHA, // 8*2 bpp (2 channels)
|
SW_LUMINANCE_ALPHA = GL_LUMINANCE_ALPHA,
|
||||||
SW_PIXELFORMAT_UNCOMPRESSED_R5G6B5, // 16 bpp
|
SW_RGB = GL_RGB,
|
||||||
SW_PIXELFORMAT_UNCOMPRESSED_R8G8B8, // 24 bpp
|
SW_RGBA = GL_RGBA,
|
||||||
SW_PIXELFORMAT_UNCOMPRESSED_R5G5B5A1, // 16 bpp (1 bit alpha)
|
} SWformat;
|
||||||
SW_PIXELFORMAT_UNCOMPRESSED_R4G4B4A4, // 16 bpp (4 bit alpha)
|
|
||||||
SW_PIXELFORMAT_UNCOMPRESSED_R8G8B8A8, // 32 bpp
|
typedef enum {
|
||||||
SW_PIXELFORMAT_UNCOMPRESSED_R32, // 32 bpp (1 channel - float)
|
SW_UNSIGNED_BYTE = GL_UNSIGNED_BYTE,
|
||||||
SW_PIXELFORMAT_UNCOMPRESSED_R32G32B32, // 32*3 bpp (3 channels - float)
|
SW_BYTE = GL_BYTE,
|
||||||
SW_PIXELFORMAT_UNCOMPRESSED_R32G32B32A32, // 32*4 bpp (4 channels - float)
|
SW_UNSIGNED_SHORT = GL_UNSIGNED_SHORT,
|
||||||
SW_PIXELFORMAT_UNCOMPRESSED_R16, // 16 bpp (1 channel - half float)
|
SW_SHORT = GL_SHORT,
|
||||||
SW_PIXELFORMAT_UNCOMPRESSED_R16G16B16, // 16*3 bpp (3 channels - half float)
|
SW_UNSIGNED_INT = GL_UNSIGNED_INT,
|
||||||
SW_PIXELFORMAT_UNCOMPRESSED_R16G16B16A16, // 16*4 bpp (4 channels - half float)
|
SW_INT = GL_INT,
|
||||||
SW_PIXELFORMAT_COMPRESSED_DXT1_RGB, // 4 bpp (no alpha)
|
SW_FLOAT = GL_FLOAT
|
||||||
SW_PIXELFORMAT_COMPRESSED_DXT1_RGBA, // 4 bpp (1 bit alpha)
|
} SWtype;
|
||||||
SW_PIXELFORMAT_COMPRESSED_DXT3_RGBA, // 8 bpp
|
|
||||||
SW_PIXELFORMAT_COMPRESSED_DXT5_RGBA, // 8 bpp
|
|
||||||
SW_PIXELFORMAT_COMPRESSED_ETC1_RGB, // 4 bpp
|
|
||||||
SW_PIXELFORMAT_COMPRESSED_ETC2_RGB, // 4 bpp
|
|
||||||
SW_PIXELFORMAT_COMPRESSED_ETC2_EAC_RGBA, // 8 bpp
|
|
||||||
SW_PIXELFORMAT_COMPRESSED_PVRT_RGB, // 4 bpp
|
|
||||||
SW_PIXELFORMAT_COMPRESSED_PVRT_RGBA, // 4 bpp
|
|
||||||
SW_PIXELFORMAT_COMPRESSED_ASTC_4x4_RGBA, // 8 bpp
|
|
||||||
SW_PIXELFORMAT_COMPRESSED_ASTC_8x8_RGBA // 2 bpp
|
|
||||||
} SWpixelformat;
|
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
SW_NEAREST = GL_NEAREST,
|
SW_NEAREST = GL_NEAREST,
|
||||||
|
|
@ -312,10 +315,11 @@ void swNormal3fv(const float* v);
|
||||||
void swBindArray(SWarray type, void *buffer);
|
void swBindArray(SWarray type, void *buffer);
|
||||||
void swDrawArrays(SWdraw mode, int offset, int count);
|
void swDrawArrays(SWdraw mode, int offset, int count);
|
||||||
|
|
||||||
uint32_t swLoadTexture(const void *data, int width, int height, int format, int mipmapCount);
|
void swGenTextures(int count, uint32_t* textures);
|
||||||
void swUnloadTexture(uint32_t id);
|
void swDeleteTextures(int count, uint32_t* textures);
|
||||||
|
|
||||||
void swTextureParameters(uint32_t id, int param, int value);
|
void swTexImage2D(int width, int height, SWformat format, SWtype type, const void* data);
|
||||||
|
void swTexParameteri(int param, int value);
|
||||||
void swBindTexture(uint32_t id);
|
void swBindTexture(uint32_t id);
|
||||||
|
|
||||||
#endif // RLSW_H
|
#endif // RLSW_H
|
||||||
|
|
@ -348,6 +352,33 @@ void swBindTexture(uint32_t id);
|
||||||
|
|
||||||
/* === Internal Structs === */
|
/* === Internal Structs === */
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
SW_PIXELFORMAT_UNCOMPRESSED_GRAYSCALE = 1, // 8 bit per pixel (no alpha)
|
||||||
|
SW_PIXELFORMAT_UNCOMPRESSED_GRAY_ALPHA, // 8*2 bpp (2 channels)
|
||||||
|
SW_PIXELFORMAT_UNCOMPRESSED_R5G6B5, // 16 bpp
|
||||||
|
SW_PIXELFORMAT_UNCOMPRESSED_R8G8B8, // 24 bpp
|
||||||
|
SW_PIXELFORMAT_UNCOMPRESSED_R5G5B5A1, // 16 bpp (1 bit alpha)
|
||||||
|
SW_PIXELFORMAT_UNCOMPRESSED_R4G4B4A4, // 16 bpp (4 bit alpha)
|
||||||
|
SW_PIXELFORMAT_UNCOMPRESSED_R8G8B8A8, // 32 bpp
|
||||||
|
SW_PIXELFORMAT_UNCOMPRESSED_R32, // 32 bpp (1 channel - float)
|
||||||
|
SW_PIXELFORMAT_UNCOMPRESSED_R32G32B32, // 32*3 bpp (3 channels - float)
|
||||||
|
SW_PIXELFORMAT_UNCOMPRESSED_R32G32B32A32, // 32*4 bpp (4 channels - float)
|
||||||
|
SW_PIXELFORMAT_UNCOMPRESSED_R16, // 16 bpp (1 channel - half float)
|
||||||
|
SW_PIXELFORMAT_UNCOMPRESSED_R16G16B16, // 16*3 bpp (3 channels - half float)
|
||||||
|
SW_PIXELFORMAT_UNCOMPRESSED_R16G16B16A16, // 16*4 bpp (4 channels - half float)
|
||||||
|
SW_PIXELFORMAT_COMPRESSED_DXT1_RGB, // 4 bpp (no alpha)
|
||||||
|
SW_PIXELFORMAT_COMPRESSED_DXT1_RGBA, // 4 bpp (1 bit alpha)
|
||||||
|
SW_PIXELFORMAT_COMPRESSED_DXT3_RGBA, // 8 bpp
|
||||||
|
SW_PIXELFORMAT_COMPRESSED_DXT5_RGBA, // 8 bpp
|
||||||
|
SW_PIXELFORMAT_COMPRESSED_ETC1_RGB, // 4 bpp
|
||||||
|
SW_PIXELFORMAT_COMPRESSED_ETC2_RGB, // 4 bpp
|
||||||
|
SW_PIXELFORMAT_COMPRESSED_ETC2_EAC_RGBA, // 8 bpp
|
||||||
|
SW_PIXELFORMAT_COMPRESSED_PVRT_RGB, // 4 bpp
|
||||||
|
SW_PIXELFORMAT_COMPRESSED_PVRT_RGBA, // 4 bpp
|
||||||
|
SW_PIXELFORMAT_COMPRESSED_ASTC_4x4_RGBA, // 8 bpp
|
||||||
|
SW_PIXELFORMAT_COMPRESSED_ASTC_8x8_RGBA // 2 bpp
|
||||||
|
} sw_pixelformat_e;
|
||||||
|
|
||||||
typedef float sw_matrix_t[4*4];
|
typedef float sw_matrix_t[4*4];
|
||||||
typedef uint16_t sw_half_t;
|
typedef uint16_t sw_half_t;
|
||||||
|
|
||||||
|
|
@ -531,7 +562,54 @@ static inline sw_vertex_t sw_lerp_vertex_PNTCH(const sw_vertex_t* a, const sw_ve
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* === Pixel Format Conversion Part === */
|
/* === Pixel Format Part === */
|
||||||
|
|
||||||
|
int sw_get_pixel_format(SWformat format, SWtype type)
|
||||||
|
{
|
||||||
|
int channels = 0;
|
||||||
|
int bitsPerChannel = 8; // Default: 8 bits per channel
|
||||||
|
|
||||||
|
// Determine the number of channels (format)
|
||||||
|
switch (format) {
|
||||||
|
case SW_LUMINANCE: channels = 1; break;
|
||||||
|
case SW_LUMINANCE_ALPHA: channels = 2; break;
|
||||||
|
case SW_RGB: channels = 3; break;
|
||||||
|
case SW_RGBA: channels = 4; break;
|
||||||
|
default: return -1; // Unknown format
|
||||||
|
}
|
||||||
|
|
||||||
|
// Determine the depth of each channel (type)
|
||||||
|
switch (type) {
|
||||||
|
case SW_UNSIGNED_BYTE: bitsPerChannel = 8; break;
|
||||||
|
case SW_BYTE: bitsPerChannel = 8; break;
|
||||||
|
case SW_UNSIGNED_SHORT: bitsPerChannel = 16; break;
|
||||||
|
case SW_SHORT: bitsPerChannel = 16; break;
|
||||||
|
case SW_UNSIGNED_INT: bitsPerChannel = 32; break;
|
||||||
|
case SW_INT: bitsPerChannel = 32; break;
|
||||||
|
case SW_FLOAT: bitsPerChannel = 32; break;
|
||||||
|
default: return -1; // Unknown type
|
||||||
|
}
|
||||||
|
|
||||||
|
// Map the format and type to the correct internal format
|
||||||
|
if (bitsPerChannel == 8) {
|
||||||
|
if (channels == 1) return SW_PIXELFORMAT_UNCOMPRESSED_GRAYSCALE;
|
||||||
|
if (channels == 2) return SW_PIXELFORMAT_UNCOMPRESSED_GRAY_ALPHA;
|
||||||
|
if (channels == 3) return SW_PIXELFORMAT_UNCOMPRESSED_R8G8B8;
|
||||||
|
if (channels == 4) return SW_PIXELFORMAT_UNCOMPRESSED_R8G8B8A8;
|
||||||
|
}
|
||||||
|
else if (bitsPerChannel == 16) {
|
||||||
|
if (channels == 1) return SW_PIXELFORMAT_UNCOMPRESSED_R16;
|
||||||
|
if (channels == 3) return SW_PIXELFORMAT_UNCOMPRESSED_R16G16B16;
|
||||||
|
if (channels == 4) return SW_PIXELFORMAT_UNCOMPRESSED_R16G16B16A16;
|
||||||
|
}
|
||||||
|
else if (bitsPerChannel == 32) {
|
||||||
|
if (channels == 1) return SW_PIXELFORMAT_UNCOMPRESSED_R32;
|
||||||
|
if (channels == 3) return SW_PIXELFORMAT_UNCOMPRESSED_R32G32B32;
|
||||||
|
if (channels == 4) return SW_PIXELFORMAT_UNCOMPRESSED_R32G32B32A32;
|
||||||
|
}
|
||||||
|
|
||||||
|
return -1; // Unsupported format
|
||||||
|
}
|
||||||
|
|
||||||
static inline uint32_t sw_cvt_hf_ui(uint16_t h)
|
static inline uint32_t sw_cvt_hf_ui(uint16_t h)
|
||||||
{
|
{
|
||||||
|
|
@ -690,7 +768,7 @@ static inline void sw_get_pixel_rgba_32323232(float* color, const void* pixels,
|
||||||
color[3] = pixel[3];
|
color[3] = pixel[3];
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void sw_get_pixel(float* color, const void* pixels, uint32_t offset, SWpixelformat format)
|
static inline void sw_get_pixel(float* color, const void* pixels, uint32_t offset, sw_pixelformat_e format)
|
||||||
{
|
{
|
||||||
switch (format) {
|
switch (format) {
|
||||||
|
|
||||||
|
|
@ -1773,7 +1851,7 @@ static inline void sw_line_render(sw_vertex_t* v0, sw_vertex_t* v1)
|
||||||
|
|
||||||
/* === Some Validity Check Helper === */
|
/* === Some Validity Check Helper === */
|
||||||
|
|
||||||
static inline bool sw_is_texture_id_valid(uint32_t id)
|
static inline bool sw_is_texture_valid(uint32_t id)
|
||||||
{
|
{
|
||||||
bool valid = true;
|
bool valid = true;
|
||||||
|
|
||||||
|
|
@ -2718,26 +2796,17 @@ void swDrawArrays(SWdraw mode, int offset, int count)
|
||||||
swEnd();
|
swEnd();
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t swLoadTexture(const void *data, int width, int height, int format, int mipmapCount)
|
void swGenTextures(int count, uint32_t* textures)
|
||||||
{
|
{
|
||||||
if (RLSW.loadedTextureCount >= SW_MAX_TEXTURES) {
|
if (count == 0 || textures == NULL) {
|
||||||
RLSW.errCode = SW_STACK_OVERFLOW; //< Out of memory, not really stack overflow
|
return;
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
sw_texture_t texture = { 0 };
|
for (int i = 0; i < count; i++) {
|
||||||
texture.pixels = data;
|
if (RLSW.loadedTextureCount >= SW_MAX_TEXTURES) {
|
||||||
texture.width = width;
|
RLSW.errCode = SW_STACK_OVERFLOW; //< Out of memory, not really stack overflow
|
||||||
texture.height = height;
|
return;
|
||||||
texture.format = format;
|
}
|
||||||
texture.minFilter = SW_NEAREST;
|
|
||||||
texture.magFilter = SW_NEAREST;
|
|
||||||
texture.sWrap = SW_REPEAT;
|
|
||||||
texture.tWrap = SW_REPEAT;
|
|
||||||
texture.tx = 1.0f / width;
|
|
||||||
texture.ty = 1.0f / height;
|
|
||||||
(void)mipmapCount;
|
|
||||||
|
|
||||||
uint32_t id = 0;
|
uint32_t id = 0;
|
||||||
if (RLSW.freeTextureIdCount > 0) {
|
if (RLSW.freeTextureIdCount > 0) {
|
||||||
id = RLSW.freeTextureIds[--RLSW.freeTextureIdCount];
|
id = RLSW.freeTextureIds[--RLSW.freeTextureIdCount];
|
||||||
|
|
@ -2745,26 +2814,58 @@ uint32_t swLoadTexture(const void *data, int width, int height, int format, int
|
||||||
else {
|
else {
|
||||||
id = RLSW.loadedTextureCount++;
|
id = RLSW.loadedTextureCount++;
|
||||||
}
|
}
|
||||||
|
RLSW.loadedTextures[id] = RLSW.loadedTextures[0];
|
||||||
RLSW.loadedTextures[id] = texture;
|
textures[i] = id;
|
||||||
|
}
|
||||||
return id;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void swUnloadTexture(uint32_t id)
|
void swDeleteTextures(int count, uint32_t* textures)
|
||||||
{
|
{
|
||||||
if (!sw_is_texture_id_valid(id)) {
|
if (count == 0 || textures == NULL) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = 0; i < count; i++) {
|
||||||
|
if (!sw_is_texture_valid(textures[i])) {
|
||||||
|
RLSW.errCode = SW_INVALID_VALUE;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
RLSW.loadedTextures[textures[i]].pixels = 0;
|
||||||
|
RLSW.freeTextureIds[RLSW.freeTextureIdCount++] = textures[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void swTexImage2D(int width, int height, SWformat format, SWtype type, const void* data)
|
||||||
|
{
|
||||||
|
uint32_t id = RLSW.currentTexture;
|
||||||
|
|
||||||
|
if (!sw_is_texture_valid(id)) {
|
||||||
RLSW.errCode = SW_INVALID_VALUE;
|
RLSW.errCode = SW_INVALID_VALUE;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
RLSW.loadedTextures[id].pixels = 0;
|
int pixelFormat = sw_get_pixel_format(format, type);
|
||||||
RLSW.freeTextureIds[RLSW.freeTextureIdCount++] = id;
|
|
||||||
|
if (pixelFormat < 0) {
|
||||||
|
RLSW.errCode = SW_INVALID_ENUM;
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
void swTextureParameters(uint32_t id, int param, int value)
|
sw_texture_t* texture = &RLSW.loadedTextures[id];
|
||||||
|
|
||||||
|
texture->pixels = data;
|
||||||
|
texture->width = width;
|
||||||
|
texture->height = height;
|
||||||
|
texture->format = pixelFormat;
|
||||||
|
texture->tx = 1.0f / width;
|
||||||
|
texture->ty = 1.0f / height;
|
||||||
|
}
|
||||||
|
|
||||||
|
void swTexParameteri(int param, int value)
|
||||||
{
|
{
|
||||||
if (!sw_is_texture_id_valid(id)) {
|
uint32_t id = RLSW.currentTexture;
|
||||||
|
|
||||||
|
if (!sw_is_texture_valid(id)) {
|
||||||
RLSW.errCode = SW_INVALID_VALUE;
|
RLSW.errCode = SW_INVALID_VALUE;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user