copy/blit fast path

This commit is contained in:
Bigfoot71 2025-10-27 23:39:38 +01:00
parent 3adf3e6146
commit 3cddffd5b5

69
src/external/rlsw.h vendored
View File

@ -1365,6 +1365,31 @@ static inline void sw_framebuffer_fill(sw_pixel_t *ptr, int size, sw_pixel_t val
}
}
static inline void sw_framebuffer_copy_fast(void* dst)
{
int size = RLSW.framebuffer.width * RLSW.framebuffer.height;
const sw_pixel_t *pixels = RLSW.framebuffer.pixels;
#if SW_COLOR_BUFFER_BITS == 8
uint8_t *dst8 = (uint8_t*)dst;
for (int i = 0; i < size; i++) dst8[i] = pixels[i].color[0];
#elif SW_COLOR_BUFFER_BITS == 16
uint16_t *dst16 = (uint16_t*)dst;
for (int i = 0; i < size; i++) dst16[i] = *(uint16_t*)pixels[i].color;
#else // 32 bits
uint32_t *dst32 = (uint32_t*)dst;
#if SW_GL_FRAMEBUFFER_COPY_BGRA
for (int i = 0; i < size; i++)
{
const uint8_t *c = pixels[i].color;
dst32[i] = (uint32_t)c[2] | ((uint32_t)c[1] << 8) | ((uint32_t)c[0] << 16) | ((uint32_t)c[3] << 24);
}
#else // RGBA
for (int i = 0; i < size; i++) dst32[i] = *(uint32_t*)pixels[i].color;
#endif
#endif
}
#define DEFINE_FRAMEBUFFER_COPY_BEGIN(name, DST_PTR_T) \
static inline void sw_framebuffer_copy_to_##name(int x, int y, int w, int h, DST_PTR_T *dst) \
{ \
@ -3545,17 +3570,8 @@ void swCopyFramebuffer(int x, int y, int w, int h, SWformat format, SWtype type,
{
sw_pixelformat_t pFormat = (sw_pixelformat_t)sw_get_pixel_format(format, type);
if (w <= 0)
{
RLSW.errCode = SW_INVALID_VALUE;
return;
}
if (h <= 0)
{
RLSW.errCode = SW_INVALID_VALUE;
return;
}
if (w <= 0) { RLSW.errCode = SW_INVALID_VALUE; return; }
if (h <= 0) { RLSW.errCode = SW_INVALID_VALUE; return; }
if (w > RLSW.framebuffer.width) w = RLSW.framebuffer.width;
if (h > RLSW.framebuffer.height) h = RLSW.framebuffer.height;
@ -3563,6 +3579,25 @@ void swCopyFramebuffer(int x, int y, int w, int h, SWformat format, SWtype type,
x = sw_clampi(x, 0, w);
y = sw_clampi(y, 0, h);
if (x >= w || y >= h) return;
if (x == 0 && y == 0 && w == RLSW.framebuffer.width && h == RLSW.framebuffer.height)
{
#if SW_COLOR_BUFFER_BITS == 32
if (pFormat == SW_PIXELFORMAT_UNCOMPRESSED_R8G8B8A8)
{
sw_framebuffer_copy_fast(pixels);
return;
}
#elif SW_COLOR_BUFFER_BITS == 16
if (pFormat == SW_PIXELFORMAT_UNCOMPRESSED_R5G6B5)
{
sw_framebuffer_copy_fast(pixels);
return;
}
#endif
}
switch (pFormat)
{
case SW_PIXELFORMAT_UNCOMPRESSED_GRAYSCALE: sw_framebuffer_copy_to_GRAYALPHA(x, y, w, h, (uint8_t *)pixels); break;
@ -3589,17 +3624,13 @@ void swBlitFramebuffer(int xDst, int yDst, int wDst, int hDst, int xSrc, int ySr
{
sw_pixelformat_t pFormat = (sw_pixelformat_t)sw_get_pixel_format(format, type);
if (wSrc <= 0)
if (xDst == xSrc && yDst == ySrc && wDst == wSrc && hDst == hSrc)
{
RLSW.errCode = SW_INVALID_VALUE;
return;
swCopyFramebuffer(xSrc, ySrc, wSrc, hSrc, format, type, pixels);
}
if (hSrc <= 0)
{
RLSW.errCode = SW_INVALID_VALUE;
return;
}
if (wSrc <= 0) { RLSW.errCode = SW_INVALID_VALUE; return; }
if (hSrc <= 0) { RLSW.errCode = SW_INVALID_VALUE; return; }
if (wSrc > RLSW.framebuffer.width) wSrc = RLSW.framebuffer.width;
if (hSrc > RLSW.framebuffer.height) hSrc = RLSW.framebuffer.height;