mirror of
https://github.com/thunderbrewhq/thunderbrew
synced 2025-04-16 10:04:42 +03:00
238 lines
9.0 KiB
C++
238 lines
9.0 KiB
C++
#include "gx/Blit.hpp"
|
|
#include "util/Unimplemented.hpp"
|
|
#include <algorithm>
|
|
#include <cstring>
|
|
#include <tempest/Vector.hpp>
|
|
|
|
int32_t initBlit = 0;
|
|
BLIT_FUNCTION s_blits[BlitFormats_Last][BlitFormats_Last][BlitAlphas_Last];
|
|
|
|
BlitFormat GxGetBlitFormat(EGxTexFormat format) {
|
|
static BlitFormat blitTable[] = {
|
|
BlitFormat_Unknown, // GxTex_Unknown
|
|
BlitFormat_Abgr8888, // GxTex_Abgr8888
|
|
BlitFormat_Argb8888, // GxTex_Argb8888
|
|
BlitFormat_Argb4444, // GxTex_Argb4444
|
|
BlitFormat_Argb1555, // GxTex_Argb1555
|
|
BlitFormat_Rgb565, // GxTex_Rgb565
|
|
BlitFormat_Dxt1, // GxTex_Dxt1
|
|
BlitFormat_Dxt3, // GxTex_Dxt3
|
|
BlitFormat_Dxt5, // GxTex_Dxt5
|
|
BlitFormat_Uv88, // GxTex_Uv88
|
|
BlitFormat_Gr1616F, // GxTex_Gr1616F
|
|
BlitFormat_R32F, // GxTex_R32F
|
|
BlitFormat_D24X8 // GxTex_D24X8
|
|
};
|
|
|
|
return blitTable[format];
|
|
}
|
|
|
|
void Blit_uint16_uint16(const C2iVector& size, const void* in, uint32_t inStride, void* out, uint32_t outStride) {
|
|
if (inStride == 2 * size.x && outStride == 2 * size.x) {
|
|
memcpy(out, in, 2 * size.x * size.y);
|
|
return;
|
|
}
|
|
|
|
const char* in_ = reinterpret_cast<const char*>(in);
|
|
char* out_ = reinterpret_cast<char*>(out);
|
|
|
|
for (int32_t i = 0; i < size.y; i++) {
|
|
memcpy(out, in, 2 * size.x);
|
|
in_ += inStride;
|
|
out_ += outStride;
|
|
}
|
|
}
|
|
|
|
void Blit_uint32_uint32(const C2iVector& size, const void* in, uint32_t inStride, void* out, uint32_t outStride) {
|
|
if (inStride == 4 * size.x && outStride == 4 * size.x) {
|
|
memcpy(out, in, 4 * size.x * size.y);
|
|
return;
|
|
}
|
|
|
|
const char* in_ = reinterpret_cast<const char*>(in);
|
|
char* out_ = reinterpret_cast<char*>(out);
|
|
|
|
for (int32_t i = 0; i < size.y; i++) {
|
|
memcpy(out, in, 4 * size.x);
|
|
in_ += inStride;
|
|
out_ += outStride;
|
|
}
|
|
}
|
|
|
|
void Blit_Argb8888_Abgr8888(const C2iVector& size, const void* in, uint32_t inStride, void* out, uint32_t outStride) {
|
|
WHOA_UNIMPLEMENTED();
|
|
}
|
|
|
|
void Blit_Argb8888_Argb8888(const C2iVector& size, const void* in, uint32_t inStride, void* out, uint32_t outStride) {
|
|
Blit_uint32_uint32(size, in, inStride, out, outStride);
|
|
}
|
|
|
|
void Blit_Argb8888_Argb8888_A1(const C2iVector& size, const void* in, uint32_t inStride, void* out, uint32_t outStride) {
|
|
WHOA_UNIMPLEMENTED();
|
|
}
|
|
|
|
void Blit_Argb8888_Argb8888_A8(const C2iVector& size, const void* in, uint32_t inStride, void* out, uint32_t outStride) {
|
|
WHOA_UNIMPLEMENTED();
|
|
}
|
|
|
|
void Blit_Argb8888_Argb4444(const C2iVector& size, const void* in, uint32_t inStride, void* out, uint32_t outStride) {
|
|
WHOA_UNIMPLEMENTED();
|
|
}
|
|
|
|
void Blit_Argb8888_Argb1555(const C2iVector& size, const void* in, uint32_t inStride, void* out, uint32_t outStride) {
|
|
WHOA_UNIMPLEMENTED();
|
|
}
|
|
|
|
void Blit_Argb8888_Rgb565(const C2iVector& size, const void* in, uint32_t inStride, void* out, uint32_t outStride) {
|
|
WHOA_UNIMPLEMENTED();
|
|
}
|
|
|
|
void Blit_Argb4444_Abgr8888(const C2iVector& size, const void* in, uint32_t inStride, void* out, uint32_t outStride) {
|
|
WHOA_UNIMPLEMENTED();
|
|
}
|
|
|
|
void Blit_Argb4444_Argb4444(const C2iVector& size, const void* in, uint32_t inStride, void* out, uint32_t outStride) {
|
|
Blit_uint16_uint16(size, in, inStride, out, outStride);
|
|
}
|
|
|
|
void Blit_Argb1555_Argb1555(const C2iVector& size, const void* in, uint32_t inStride, void* out, uint32_t outStride) {
|
|
WHOA_UNIMPLEMENTED();
|
|
}
|
|
|
|
void Blit_Rgb565_Rgb565(const C2iVector& size, const void* in, uint32_t inStride, void* out, uint32_t outStride) {
|
|
WHOA_UNIMPLEMENTED();
|
|
}
|
|
|
|
void Blit_Dxt1_Argb8888(const C2iVector& size, const void* in, uint32_t inStride, void* out, uint32_t outStride) {
|
|
WHOA_UNIMPLEMENTED();
|
|
}
|
|
|
|
void Blit_Dxt1_Argb1555(const C2iVector& size, const void* in, uint32_t inStride, void* out, uint32_t outStride) {
|
|
WHOA_UNIMPLEMENTED();
|
|
}
|
|
|
|
void Blit_Dxt1_Rgb565(const C2iVector& size, const void* in, uint32_t inStride, void* out, uint32_t outStride) {
|
|
WHOA_UNIMPLEMENTED();
|
|
}
|
|
|
|
void Blit_Dxt1_Dxt1(const C2iVector& size, const void* in, uint32_t inStride, void* out, uint32_t outStride) {
|
|
const char* in_ = static_cast<const char*>(in);
|
|
char* out_ = static_cast<char*>(out);
|
|
|
|
int32_t v6 = std::max(size.x, 4);
|
|
int32_t v7 = std::max(size.y, 4);
|
|
|
|
memcpy(out_, in_, (4 * v6 * v7) >> 3);
|
|
}
|
|
|
|
void Blit_Dxt3_Argb8888(const C2iVector& size, const void* in, uint32_t inStride, void* out, uint32_t outStride) {
|
|
WHOA_UNIMPLEMENTED();
|
|
}
|
|
|
|
void Blit_Dxt3_Argb4444(const C2iVector& size, const void* in, uint32_t inStride, void* out, uint32_t outStride) {
|
|
WHOA_UNIMPLEMENTED();
|
|
}
|
|
|
|
void Blit_Dxt35_Dxt35(const C2iVector& size, const void* in, uint32_t inStride, void* out, uint32_t outStride) {
|
|
int32_t v5 = std::max(size.x, 4);
|
|
int32_t v6 = std::max(size.y / 4, 1);
|
|
|
|
const char* in_ = static_cast<const char*>(in);
|
|
char* out_ = static_cast<char*>(out);
|
|
|
|
if (inStride == v5 * 4 && outStride == v5 * 4) {
|
|
memcpy(out_, in_, v5 * v6 * 4);
|
|
return;
|
|
}
|
|
|
|
for (int32_t i = v6; i > 0; i--) {
|
|
memcpy(out_, in_, v5 * 4);
|
|
in_ += inStride;
|
|
out_ += outStride;
|
|
}
|
|
}
|
|
|
|
void Blit_Dxt5_Argb8888(const C2iVector& size, const void* in, uint32_t inStride, void* out, uint32_t outStride) {
|
|
WHOA_UNIMPLEMENTED();
|
|
}
|
|
|
|
void Blit_Dxt5_Argb4444(const C2iVector& size, const void* in, uint32_t inStride, void* out, uint32_t outStride) {
|
|
WHOA_UNIMPLEMENTED();
|
|
}
|
|
|
|
void Blit_Uv88_Uv88(const C2iVector& size, const void* in, uint32_t inStride, void* out, uint32_t outStride) {
|
|
WHOA_UNIMPLEMENTED();
|
|
}
|
|
|
|
void Blit_Gr1616F_Gr1616F(const C2iVector& size, const void* in, uint32_t inStride, void* out, uint32_t outStride) {
|
|
WHOA_UNIMPLEMENTED();
|
|
}
|
|
|
|
void Blit_R32F_R32F(const C2iVector& size, const void* in, uint32_t inStride, void* out, uint32_t outStride) {
|
|
WHOA_UNIMPLEMENTED();
|
|
}
|
|
|
|
void Blit_D24X8_D24X8(const C2iVector& size, const void* in, uint32_t inStride, void* out, uint32_t outStride) {
|
|
WHOA_UNIMPLEMENTED();
|
|
}
|
|
|
|
void InitBlit() {
|
|
// Source: Argb8888
|
|
s_blits [BlitFormat_Argb8888] [BlitFormat_Abgr8888] [BlitAlpha_0] = &Blit_Argb8888_Abgr8888;
|
|
s_blits [BlitFormat_Argb8888] [BlitFormat_Argb8888] [BlitAlpha_0] = &Blit_Argb8888_Argb8888;
|
|
s_blits [BlitFormat_Argb8888] [BlitFormat_Argb8888] [BlitAlpha_1] = &Blit_Argb8888_Argb8888_A1;
|
|
s_blits [BlitFormat_Argb8888] [BlitFormat_Argb8888] [BlitAlpha_8] = &Blit_Argb8888_Argb8888_A8;
|
|
s_blits [BlitFormat_Argb8888] [BlitFormat_Argb4444] [BlitAlpha_0] = &Blit_Argb8888_Argb4444;
|
|
s_blits [BlitFormat_Argb8888] [BlitFormat_Argb1555] [BlitAlpha_0] = &Blit_Argb8888_Argb1555;
|
|
s_blits [BlitFormat_Argb8888] [BlitFormat_Rgb565] [BlitAlpha_0] = &Blit_Argb8888_Rgb565;
|
|
|
|
// Source: Argb4444
|
|
s_blits [BlitFormat_Argb4444] [BlitFormat_Abgr8888] [BlitAlpha_0] = &Blit_Argb4444_Abgr8888;
|
|
s_blits [BlitFormat_Argb4444] [BlitFormat_Argb4444] [BlitAlpha_0] = &Blit_Argb4444_Argb4444;
|
|
|
|
// Source: Argb1555
|
|
s_blits [BlitFormat_Argb1555] [BlitFormat_Argb1555] [BlitAlpha_0] = &Blit_Argb1555_Argb1555;
|
|
|
|
// Source: Rgb565
|
|
s_blits [BlitFormat_Rgb565] [BlitFormat_Rgb565] [BlitAlpha_0] = &Blit_Rgb565_Rgb565;
|
|
|
|
// Source: Dxt1
|
|
s_blits [BlitFormat_Dxt1] [BlitFormat_Argb8888] [BlitAlpha_0] = &Blit_Dxt1_Argb8888;
|
|
s_blits [BlitFormat_Dxt1] [BlitFormat_Argb1555] [BlitAlpha_0] = &Blit_Dxt1_Argb1555;
|
|
s_blits [BlitFormat_Dxt1] [BlitFormat_Rgb565] [BlitAlpha_0] = &Blit_Dxt1_Rgb565;
|
|
s_blits [BlitFormat_Dxt1] [BlitFormat_Dxt1] [BlitAlpha_0] = &Blit_Dxt1_Dxt1;
|
|
|
|
// Source: Dxt3
|
|
s_blits [BlitFormat_Dxt3] [BlitFormat_Argb8888] [BlitAlpha_0] = &Blit_Dxt3_Argb8888;
|
|
s_blits [BlitFormat_Dxt3] [BlitFormat_Argb4444] [BlitAlpha_0] = &Blit_Dxt3_Argb4444;
|
|
s_blits [BlitFormat_Dxt3] [BlitFormat_Dxt3] [BlitAlpha_0] = &Blit_Dxt35_Dxt35;
|
|
|
|
// Source: Dxt5
|
|
s_blits [BlitFormat_Dxt5] [BlitFormat_Argb8888] [BlitAlpha_0] = &Blit_Dxt5_Argb8888;
|
|
s_blits [BlitFormat_Dxt5] [BlitFormat_Argb4444] [BlitAlpha_0] = &Blit_Dxt5_Argb4444;
|
|
s_blits [BlitFormat_Dxt5] [BlitFormat_Dxt5] [BlitAlpha_0] = &Blit_Dxt35_Dxt35;
|
|
|
|
// Source: Uv88
|
|
s_blits [BlitFormat_Uv88] [BlitFormat_Uv88] [BlitAlpha_0] = &Blit_Uv88_Uv88;
|
|
|
|
// Source: Gr1616F
|
|
s_blits [BlitFormat_Gr1616F] [BlitFormat_Gr1616F] [BlitAlpha_0] = &Blit_Gr1616F_Gr1616F;
|
|
|
|
// Source: R32F
|
|
s_blits [BlitFormat_R32F] [BlitFormat_R32F] [BlitAlpha_0] = &Blit_R32F_R32F;
|
|
|
|
// Source: D24X8
|
|
s_blits [BlitFormat_D24X8] [BlitFormat_D24X8] [BlitAlpha_0] = &Blit_D24X8_D24X8;
|
|
}
|
|
|
|
void Blit(const C2iVector& size, BlitAlpha alpha, const void* src, uint32_t srcStride, BlitFormat srcFmt, void* dst, uint32_t dstStride, BlitFormat dstFmt) {
|
|
if (!initBlit) {
|
|
InitBlit();
|
|
initBlit = 1;
|
|
}
|
|
|
|
BLIT_FUNCTION blit = s_blits[srcFmt][dstFmt][alpha];
|
|
|
|
blit(size, src, srcStride, dst, dstStride);
|
|
}
|