22 unsigned int iUseCount;
23 unsigned int iUseCountPrev;
30enum ETransferMode __trmode = ETM_INLINE;
38_blockCreate(
unsigned int start,
unsigned int size)
44 block->iStart = start;
47 block->iUseCountPrev = 0;
60 next->pNext = block->pNext;
62 if(block->pNext != NULL)
63 block->pNext->pPrev = next;
73 if(block->pPrev != NULL)
74 block->pPrev->pNext = block->pNext;
75 if(block->pNext != NULL)
76 block->pNext->pPrev = block->pPrev;
85_blockSplitFree(
struct SVramBlock * block,
unsigned int size)
90 pNewBlock = _blockCreate(block->iStart + size, block->iSize - size);
94 _blockInsertAfter(block, pNewBlock);
104 while ((block->pPrev != NULL) && (block->pPrev->tex == NULL))
105 block = block->pPrev;
108 while((block->pNext != NULL) && (block->pNext->tex == NULL)) {
109 block->iSize += block->pNext->iSize;
110 _blockRemove(block->pNext);
118static inline unsigned int
121 unsigned int weight = 0;
123 if ((block != NULL) && (block->tex != NULL)) {
124 if(block->iUseCount == block->iUseCountPrev) {
128 weight += block->iUseCountPrev;
130 else if(block->iUseCount < block->iUseCountPrev) {
133 weight += block->iUseCountPrev - block->iUseCount;
135 weight += block->iUseCountPrev;
142 weight += block->iUseCount;
152_blockAlloc(
unsigned int size)
155 unsigned int weight = 0;
158 for (block = __head; block != NULL; block = block->pNext) {
159 if ((block->tex == NULL) && (block->iSize >= size)) {
165 while (block == NULL) {
167 for (block = __head; block != NULL; block = block->pNext) {
168 if ((block->tex != NULL) && (_blockGetWeight(block) <= weight)) {
171 block = _blockMergeFree(block);
172 if (block->iSize >= size) {
183 block = _blockSplitFree(block, size);
200 block = _blockRemove(block);
218 unsigned int ttransfer = 0;
219 unsigned int ctransfer = 0;
221 unsigned int csize = 0;
222 unsigned int cwidth = 16;
223 unsigned int cheight = 16;
226 for (block = __head; block != NULL; block = block->pNext) {
227 if(block->tex == tex)
232 if (tex->
Clut != NULL) {
235 csize = gsKit_texture_size(cwidth, cheight, tex->
ClutPSM);
240 block = _blockAlloc(tsize + csize);
242 block->iUseCount = 0;
243 block->iUseCountPrev = 1;
258 tex->
Vram = block->iStart;
259 gsKit_setup_tbw(tex);
260 SyncDCache(tex->
Mem, (u8 *)(tex->
Mem) + tsize);
261 if (__trmode == ETM_INLINE)
268 tex->
VramClut = block->iStart + tsize;
269 SyncDCache(tex->
Clut, (u8 *)(tex->
Clut) + csize);
270 if (__trmode == ETM_INLINE)
273 gsKit_texture_send(tex->
Clut, cwidth, cheight, tex->
VramClut, tex->
ClutPSM, 1, GS_CLUT_PALLETE);
278 return (ttransfer|ctransfer);
296 for (block = __head; block != NULL; block = block->pNext) {
297 if(block->tex == tex) {
300 _blockMergeFree(block);
315 for(block = __head; block != NULL; block = block->pNext) {
316 if(block->tex != NULL) {
317 block->iUseCountPrev = block->iUseCount;
318 block->iUseCount = 0;
#define GS_PSM_T8
8 Bit Texture with CLUT
void gsKit_TexManager_init(GSGLOBAL *gsGlobal)
Initialize the texture manager.
unsigned int gsKit_TexManager_bind(GSGLOBAL *gsGlobal, GSTEXTURE *tex)
Bind a texture to VRAM, will automatically transfer the texture.
void gsKit_TexManager_nextFrame(GSGLOBAL *gsGlobal)
void gsKit_TexManager_setmode(GSGLOBAL *gsGlobal, enum ETransferMode mode)
Set the texture transfer mode (inline or direct).
void gsKit_TexManager_invalidate(GSGLOBAL *gsGlobal, GSTEXTURE *tex)
Invalidate a texture, will automatically transfer the texture on next bind call.
void gsKit_TexManager_free(GSGLOBAL *gsGlobal, GSTEXTURE *tex)
u32 CurrentPointer
Current VRAM Pointer.
u32 * Clut
EE CLUT Memory Pointer.
u32 TBW
Texture Base Width.
u32 * Mem
EE Memory Pointer.
u32 Vram
GS VRAM Memory Pointer.
u32 VramClut
GS VRAM CLUT Memory Pointer.
u8 ClutPSM
CLUT Pixel Storage Method (Color Format).
u8 PSM
Pixel Storage Method (Color Format).
u32 Height
Height of the Texture.
u32 Width
Width of the Texture.