diff --git a/include/c3d/texture.h b/include/c3d/texture.h index 8a77ccd..a9d743c 100644 --- a/include/c3d/texture.h +++ b/include/c3d/texture.h @@ -13,6 +13,7 @@ typedef struct } C3D_Tex; bool C3D_TexInit(C3D_Tex* tex, int width, int height, GPU_TEXCOLOR format); +bool C3D_TexInitVRAM(C3D_Tex* tex, int width, int height, GPU_TEXCOLOR format); void C3D_TexUpload(C3D_Tex* tex, const void* data); void C3D_TexSetFilter(C3D_Tex* tex, GPU_TEXTURE_FILTER_PARAM magFilter, GPU_TEXTURE_FILTER_PARAM minFilter); void C3D_TexSetWrap(C3D_Tex* tex, GPU_TEXTURE_WRAP_PARAM wrapS, GPU_TEXTURE_WRAP_PARAM wrapT); diff --git a/source/texture.c b/source/texture.c index b25afae..233831d 100644 --- a/source/texture.c +++ b/source/texture.c @@ -18,7 +18,13 @@ static inline size_t fmtSize(GPU_TEXCOLOR fmt) } } -bool C3D_TexInit(C3D_Tex* tex, int width, int height, GPU_TEXCOLOR format) +static inline bool addrIsVRAM(const void* addr) +{ + u32 vaddr = (u32)addr; + return vaddr >= 0x1F000000 && vaddr < 0x1F600000; +} + +static bool C3Di_TexInitCommon(C3D_Tex* tex, int width, int height, GPU_TEXCOLOR format, void* (*texAlloc)(size_t)) { if (tex->data) return false; @@ -26,7 +32,7 @@ bool C3D_TexInit(C3D_Tex* tex, int width, int height, GPU_TEXCOLOR format) if (!size) return false; size *= width * height; - tex->data = linearMemAlign(size, 0x80); + tex->data = texAlloc(size); if (!tex->data) return false; tex->width = width; @@ -37,9 +43,19 @@ bool C3D_TexInit(C3D_Tex* tex, int width, int height, GPU_TEXCOLOR format) return true; } +bool C3D_TexInit(C3D_Tex* tex, int width, int height, GPU_TEXCOLOR format) +{ + return C3Di_TexInitCommon(tex, width, height, format, linearAlloc); +} + +bool C3D_TexInitVRAM(C3D_Tex* tex, int width, int height, GPU_TEXCOLOR format) +{ + return C3Di_TexInitCommon(tex, width, height, format, vramAlloc); +} + void C3D_TexUpload(C3D_Tex* tex, const void* data) { - if (tex->data) + if (tex->data && !addrIsVRAM(tex->data)) memcpy(tex->data, data, tex->size); } @@ -68,7 +84,7 @@ void C3D_TexBind(int unitId, C3D_Tex* tex) void C3D_TexFlush(C3D_Tex* tex) { - if (tex->data) + if (tex->data && !addrIsVRAM(tex->data)) GSPGPU_FlushDataCache(tex->data, tex->size); } @@ -76,6 +92,10 @@ void C3D_TexDelete(C3D_Tex* tex) { if (!tex->data) return; - linearFree(tex->data); + if (addrIsVRAM(tex->data)) + vramFree(tex->data); + else + linearFree(tex->data); + tex->data = NULL; }