From d9c60f2d39eb7d53bed69d2e85460eb3f2a916be Mon Sep 17 00:00:00 2001 From: Bigfoot71 Date: Sun, 11 May 2025 00:12:47 +0200 Subject: [PATCH] tweak framebuffer functions for better readability --- src/external/rlsw.h | 174 ++++++++++++++++++++++++++++---------------- 1 file changed, 113 insertions(+), 61 deletions(-) diff --git a/src/external/rlsw.h b/src/external/rlsw.h index aecebeb3a..d436d1dd8 100644 --- a/src/external/rlsw.h +++ b/src/external/rlsw.h @@ -519,7 +519,6 @@ void swBindTexture(uint32_t id); #endif // RLSW_H -#define RLSW_IMPL #ifdef RLSW_IMPL #include @@ -901,84 +900,35 @@ static inline void sw_framebuffer_inc_depth_addr(void** ptr) *ptr = (void*)(((uint8_t*)*ptr) + SW_DEPTH_PIXEL_SIZE); } +#if (SW_COLOR_BUFFER_BITS == 8) // RGB - 332 + static inline void sw_framebuffer_read_color(float dst[4], const void* src) { -#if (SW_COLOR_BUFFER_BITS == 8) // RGB - 332 uint8_t pixel = ((uint8_t*)src)[0]; + dst[0] = ((pixel >> 5) & 0x07) * (1.0f / 7.0f); dst[1] = ((pixel >> 2) & 0x07) * (1.0f / 7.0f); dst[2] = (pixel & 0x03) * (1.0f / 3.0f); dst[3] = 1.0f; -#elif (SW_COLOR_BUFFER_BITS == 16) // RGB - 565 - uint16_t pixel = ((uint16_t*)src)[0]; - dst[0] = ((pixel >> 11) & 0x1F) * (1.0f / 31.0f); - dst[1] = ((pixel >> 5) & 0x3F) * (1.0f / 63.0f); - dst[2] = (pixel & 0x1F) * (1.0f / 31.0f); - dst[3] = 1.0f; -#elif (SW_COLOR_BUFFER_BITS == 24) // RGB - 888 - dst[0] = ((uint8_t*)src)[0] * (1.0f / 255.0f); - dst[1] = ((uint8_t*)src)[1] * (1.0f / 255.0f); - dst[2] = ((uint8_t*)src)[2] * (1.0f / 255.0f); - dst[3] = 1.0f; -#endif } static inline void sw_framebuffer_write_color(void* dst, float color[3]) { -#if (SW_COLOR_BUFFER_BITS == 8) // RGB - 332 uint8_t r = ((uint8_t)(color[0] * UINT8_MAX) >> 5) & 0x07; uint8_t g = ((uint8_t)(color[1] * UINT8_MAX) >> 5) & 0x07; uint8_t b = ((uint8_t)(color[2] * UINT8_MAX) >> 6) & 0x03; + ((uint8_t*)dst)[0] = (r << 5) | (g << 2) | b; - -#elif (SW_COLOR_BUFFER_BITS == 16) // RGB - 565 - uint8_t r = (uint8_t)(color[0] * 31.0f + 0.5f) & 0x1F; - uint8_t g = (uint8_t)(color[1] * 63.0f + 0.5f) & 0x3F; - uint8_t b = (uint8_t)(color[2] * 31.0f + 0.5f) & 0x1F; - ((uint16_t*)dst)[0] = (r << 11) | (g << 5) | b; - -#elif (SW_COLOR_BUFFER_BITS == 24) // RGB - 888 - ((uint8_t*)dst)[0] = (uint8_t)(color[0] * UINT8_MAX); - ((uint8_t*)dst)[1] = (uint8_t)(color[1] * UINT8_MAX); - ((uint8_t*)dst)[2] = (uint8_t)(color[2] * UINT8_MAX); -#endif -} - -static inline float sw_framebuffer_read_depth(const void* src) -{ -#if (SW_DEPTH_BUFFER_BITS == 8) - return (float)((uint8_t*)src)[0] * (1.0f / UINT8_MAX); -#elif (SW_DEPTH_BUFFER_BITS == 16) - return (float)((uint16_t*)src)[0] * (1.0f / UINT16_MAX); -#elif (SW_DEPTH_BUFFER_BITS == 24) - uint32_t depth24 = (((uint8_t*)src)[0] << 16) | - (((uint8_t*)src)[1] << 8) | - ((uint8_t*)src)[2]; - return depth24 / (float)0xFFFFFF; -#endif -} - -static inline void sw_framebuffer_write_depth(void* dst, float depth) -{ -#if (SW_DEPTH_BUFFER_BITS == 8) - ((uint8_t*)dst)[0] = (uint8_t)(depth * UINT8_MAX); -#elif (SW_DEPTH_BUFFER_BITS == 16) - ((uint16_t*)dst)[0] = (uint16_t)(depth * UINT16_MAX); -#elif (SW_DEPTH_BUFFER_BITS == 24) - uint32_t depth24 = (uint32_t)(depth * 0xFFFFFF); - ((uint8_t*)dst)[0] = (depth24 >> 16) & 0xFF; - ((uint8_t*)dst)[1] = (depth24 >> 8) & 0xFF; - ((uint8_t*)dst)[2] = depth24 & 0xFF; -#endif } static inline void sw_framebuffer_fill_color(void* ptr, int size, float color[4]) { -#if (SW_COLOR_BUFFER_BITS == 8) uint8_t r = ((uint8_t)(color[0] * UINT8_MAX) >> 5) & 0x07; uint8_t g = ((uint8_t)(color[1] * UINT8_MAX) >> 5) & 0x07; uint8_t b = ((uint8_t)(color[2] * UINT8_MAX) >> 6) & 0x03; + uint8_t* p = (uint8_t*)ptr; + if (RLSW.stateFlags & SW_STATE_SCISSOR_TEST) { for (int y = RLSW.scMin[1]; y <= RLSW.scMax[1]; y++) { for (int x = RLSW.scMin[0]; x <= RLSW.scMax[0]; x++) { @@ -990,11 +940,37 @@ static inline void sw_framebuffer_fill_color(void* ptr, int size, float color[4] p[i] = (r << 5) | (g << 2) | b; } } -#elif (SW_COLOR_BUFFER_BITS == 16) +} + +#elif (SW_COLOR_BUFFER_BITS == 16) // RGB - 565 + +static inline void sw_framebuffer_read_color(float dst[4], const void* src) +{ + uint16_t pixel = ((uint16_t*)src)[0]; + + dst[0] = ((pixel >> 11) & 0x1F) * (1.0f / 31.0f); + dst[1] = ((pixel >> 5) & 0x3F) * (1.0f / 63.0f); + dst[2] = (pixel & 0x1F) * (1.0f / 31.0f); + dst[3] = 1.0f; +} + +static inline void sw_framebuffer_write_color(void* dst, float color[3]) +{ uint8_t r = (uint8_t)(color[0] * 31.0f + 0.5f) & 0x1F; uint8_t g = (uint8_t)(color[1] * 63.0f + 0.5f) & 0x3F; uint8_t b = (uint8_t)(color[2] * 31.0f + 0.5f) & 0x1F; + + ((uint16_t*)dst)[0] = (r << 11) | (g << 5) | b; +} + +static inline void sw_framebuffer_fill_color(void* ptr, int size, float color[4]) +{ + uint8_t r = (uint8_t)(color[0] * 31.0f + 0.5f) & 0x1F; + uint8_t g = (uint8_t)(color[1] * 63.0f + 0.5f) & 0x3F; + uint8_t b = (uint8_t)(color[2] * 31.0f + 0.5f) & 0x1F; + uint16_t* p = (uint16_t*)ptr; + if (RLSW.stateFlags & SW_STATE_SCISSOR_TEST) { for (int y = RLSW.scMin[1]; y <= RLSW.scMax[1]; y++) { for (int x = RLSW.scMin[0]; x <= RLSW.scMax[0]; x++) { @@ -1006,11 +982,33 @@ static inline void sw_framebuffer_fill_color(void* ptr, int size, float color[4] p[i] = (r << 11) | (g << 5) | b; } } -#elif (SW_COLOR_BUFFER_BITS == 24) +} + +#elif (SW_COLOR_BUFFER_BITS == 24) // RGB - 888 + +static inline void sw_framebuffer_read_color(float dst[4], const void* src) +{ + dst[0] = ((uint8_t*)src)[0] * (1.0f / 255.0f); + dst[1] = ((uint8_t*)src)[1] * (1.0f / 255.0f); + dst[2] = ((uint8_t*)src)[2] * (1.0f / 255.0f); + dst[3] = 1.0f; +} + +static inline void sw_framebuffer_write_color(void* dst, float color[3]) +{ + ((uint8_t*)dst)[0] = (uint8_t)(color[0] * UINT8_MAX); + ((uint8_t*)dst)[1] = (uint8_t)(color[1] * UINT8_MAX); + ((uint8_t*)dst)[2] = (uint8_t)(color[2] * UINT8_MAX); +} + +static inline void sw_framebuffer_fill_color(void* ptr, int size, float color[4]) +{ uint8_t r = (uint8_t)(color[0] * 255); uint8_t g = (uint8_t)(color[1] * 255); uint8_t b = (uint8_t)(color[2] * 255); + uint8_t* p = (uint8_t*)ptr; + if (RLSW.stateFlags & SW_STATE_SCISSOR_TEST) { for (int y = RLSW.scMin[1]; y <= RLSW.scMax[1]; y++) { for (int x = RLSW.scMin[0]; x <= RLSW.scMax[0]; x++) { @@ -1027,14 +1025,27 @@ static inline void sw_framebuffer_fill_color(void* ptr, int size, float color[4] *p++ = b; } } -#endif +} + +#endif // SW_COLOR_BUFFER_BITS + +#if (SW_DEPTH_BUFFER_BITS == 8) + +static inline float sw_framebuffer_read_depth(const void* src) +{ + return (float)((uint8_t*)src)[0] * (1.0f / UINT8_MAX); +} + +static inline void sw_framebuffer_write_depth(void* dst, float depth) +{ + ((uint8_t*)dst)[0] = (uint8_t)(depth * UINT8_MAX); } static inline void sw_framebuffer_fill_depth(void* ptr, int size, float value) { -#if (SW_DEPTH_BUFFER_BITS == 8) uint8_t v = value * UINT8_MAX; uint8_t* p = (uint8_t*)ptr; + if (RLSW.stateFlags & SW_STATE_SCISSOR_TEST) { for (int y = RLSW.scMin[1]; y <= RLSW.scMax[1]; y++) { for (int x = RLSW.scMin[0]; x <= RLSW.scMax[0]; x++) { @@ -1047,9 +1058,25 @@ static inline void sw_framebuffer_fill_depth(void* ptr, int size, float value) p[i] = v; } } +} + #elif (SW_DEPTH_BUFFER_BITS == 16) + +static inline float sw_framebuffer_read_depth(const void* src) +{ + return (float)((uint16_t*)src)[0] * (1.0f / UINT16_MAX); +} + +static inline void sw_framebuffer_write_depth(void* dst, float depth) +{ + ((uint16_t*)dst)[0] = (uint16_t)(depth * UINT16_MAX); +} + +static inline void sw_framebuffer_fill_depth(void* ptr, int size, float value) +{ uint16_t v = value * UINT16_MAX; uint16_t* p = (uint16_t*)ptr; + if (RLSW.stateFlags & SW_STATE_SCISSOR_TEST) { for (int y = RLSW.scMin[1]; y <= RLSW.scMax[1]; y++) { for (int x = RLSW.scMin[0]; x <= RLSW.scMax[0]; x++) { @@ -1062,9 +1089,33 @@ static inline void sw_framebuffer_fill_depth(void* ptr, int size, float value) p[i] = v; } } +} + #elif (SW_DEPTH_BUFFER_BITS == 24) + +static inline float sw_framebuffer_read_depth(const void* src) +{ + uint32_t depth24 = (((uint8_t*)src)[0] << 16) | + (((uint8_t*)src)[1] << 8) | + ((uint8_t*)src)[2]; + + return depth24 / (float)0xFFFFFF; +} + +static inline void sw_framebuffer_write_depth(void* dst, float depth) +{ + uint32_t depth24 = (uint32_t)(depth * 0xFFFFFF); + + ((uint8_t*)dst)[0] = (depth24 >> 16) & 0xFF; + ((uint8_t*)dst)[1] = (depth24 >> 8) & 0xFF; + ((uint8_t*)dst)[2] = depth24 & 0xFF; +} + +static inline void sw_framebuffer_fill_depth(void* ptr, int size, float value) +{ uint32_t v = value * UINT32_MAX; uint8_t* p = (uint8_t*)ptr; + if (RLSW.stateFlags & SW_STATE_SCISSOR_TEST) { for (int y = RLSW.scMin[1]; y <= RLSW.scMax[1]; y++) { for (int x = RLSW.scMin[0]; x <= RLSW.scMax[0]; x++) { @@ -1082,9 +1133,10 @@ static inline void sw_framebuffer_fill_depth(void* ptr, int size, float value) *p++ = v & 0xFF; } } -#endif } +#endif // SW_DEPTH_BUFFER_BITS + static inline void sw_framebuffer_fill(void* colorPtr, void* depthPtr, int size, float color[4], float depth_value) { #if (SW_COLOR_BUFFER_BITS == 8)