22static inline u32 lzw(u32 val)
25 __asm__ __volatile__ (
" plzcw %0, %1 " :
"=r" (res) :
"r" (val));
30u32 gsKit_texture_size_ee(
int width,
int height,
int psm)
34 printf(
"Width: %d - Height: %d\n", width, height);
44 default: printf(
"gsKit: unsupported PSM %d\n", psm);
50u32 gsKit_texture_size(
int width,
int height,
int psm)
52 int widthBlocks, heightBlocks;
53 int widthAlign, heightAlign;
61 widthBlocks = (width + 7) / 8;
62 heightBlocks = (height + 7) / 8;
67 widthBlocks = (width + 15) / 16;
68 heightBlocks = (height + 7) / 8;
72 widthBlocks = (width + 15) / 16;
73 heightBlocks = (height + 15) / 16;
77 widthBlocks = (width + 31) / 32;
78 heightBlocks = (height + 15) / 16;
81 printf(
"gsKit: unsupported PSM %d\n", psm);
93 if(widthBlocks <= 2 && heightBlocks <= 1) {
97 else if(widthBlocks <= 4 && heightBlocks <= 2) {
101 else if(widthBlocks <= 8 && heightBlocks <= 4) {
121 if(widthBlocks <= 1 && heightBlocks <= 2) {
125 else if(widthBlocks <= 2 && heightBlocks <= 4) {
129 else if(widthBlocks <= 4 && heightBlocks <= 8) {
149 if(widthBlocks <= 1 && heightBlocks <= 2) {
153 else if(widthBlocks <= 2 && heightBlocks <= 2) {
157 else if(widthBlocks <= 2 && heightBlocks <= 8) {
167 widthBlocks = (-widthAlign) & (widthBlocks + widthAlign - 1);
168 heightBlocks = (-heightAlign) & (heightBlocks + heightAlign - 1);
170 return widthBlocks * heightBlocks * 256;
174from8to5(u8 c,
const s8 dither)
178 else if((c+dither) < 0)
181 return (c+dither)>>3;
185fromRGBto16(
const s8 dither, u8 r, u8 g, u8 b)
188 return 0x8000 | (from8to5(b, dither)<<10) | (from8to5(g, dither)<<5) | from8to5(r, dither);
192from24to16(
const s8 dither, u8 *c)
194 return fromRGBto16(dither, c[0], c[1], c[2]);
197void gsKit_texture_to_psm16(GSTEXTURE *Texture)
200 const s8 dither_matrix[16] = {-4,2,-3,3,0,-2,1,-1,-3,3,-4,2,1,-1,0,-2};
210 pixels16 = (u16*)memalign(128, size);
211 pixels24 = (u8 *)Texture->
Mem;
213 for(y=0; y < Texture->
Height; y++) {
214 for(x=0; x < Texture->
Width; x++) {
215 int i = y * Texture->
Width + x;
216 s8 dither = dither_matrix[(y&3)*4+(x&3)];
217 pixels16[i] = from24to16(dither, &pixels24[i*3]);
222 Texture->
Mem = (
void*)pixels16;
226void gsKit_texture_send(u32 *mem,
int width,
int height, u32 tbp, u32 psm, u32 tbw, u8 clut)
236 qwc = gsKit_texture_size_ee(width, height, psm) / 16;
237 if( gsKit_texture_size_ee(width, height, psm) % 16 )
240 printf(
"Uneven division of quad word count from VRAM alloc. Rounding up QWC.\n");
249 if(clut == GS_CLUT_TEXTURE)
250 p_size = (7+(packets * 3)+remain);
252 p_size = (9+(packets * 3)+remain);
257 p_store = p_data = memalign(64, (p_size * 16));
262 *p_data++ = DMA_TAG( 5, 0, DMA_CNT, 0, 0, 0 );
270 printf(
"ERROR: Texture base pointer not on 256 byte alignment - Modulo = %d\n", tbp % 256);
273 *p_data++ = GS_SETREG_BITBLTBUF(0, 0, 0, tbp/256, tbw, psm);
276 *p_data++ = GS_SETREG_TRXPOS(0, 0, 0, 0, 0);
279 *p_data++ = GS_SETREG_TRXREG(width, height);
282 *p_data++ = GS_SETREG_TRXDIR(0);
285 while (packets-- > 0)
287 *p_data++ = DMA_TAG( 1, 0, DMA_CNT, 0, 0, 0);
297 *p_data++ = DMA_TAG( 1, 0, DMA_CNT, 0, 0, 0);
299 *p_data++ =
GIF_TAG( remain, 0, 0, 0, GSKIT_GIF_FLG_IMAGE, 0 );
301 *p_data++ = DMA_TAG( remain, 1, DMA_REF, 0, (u32)p_mem, 0 );
305 if(clut == GS_CLUT_TEXTURE)
307 *p_data++ = DMA_TAG( 0, 0, DMA_END, 0, 0, 0 );
312 *p_data++ = DMA_TAG( 2, 0, DMA_END, 0, 0, 0 );
330void gsKit_texture_send_inline(GSGLOBAL *
gsGlobal, u32 *mem,
int width,
int height, u32 tbp, u32 psm, u32 tbw, u8 clut)
339 qwc = gsKit_texture_size_ee(width, height, psm) / 16;
340 if( gsKit_texture_size_ee(width, height, psm) % 16 )
343 printf(
"Uneven division of quad word count from VRAM alloc. Rounding up QWC.\n");
359 printf(
"ERROR: Texture base pointer not on 256 byte alignment - Modulo = %d\n", tbp % 256);
362 *p_data++ = GS_SETREG_BITBLTBUF(0, 0, 0, tbp/256, tbw, psm);
365 *p_data++ = GS_SETREG_TRXPOS(0, 0, 0, 0, 0);
368 *p_data++ = GS_SETREG_TRXREG(width, height);
371 *p_data++ = GS_SETREG_TRXDIR(0);
374 dmasize = (packets * 3);
378 p_data = gsKit_heap_alloc_dma(
gsGlobal, dmasize, dmasize * 16);
380 while (packets-- > 0)
382 *p_data++ = DMA_TAG( 1, 0, DMA_CNT, 0, 0, 0);
392 *p_data++ = DMA_TAG( 1, 0, DMA_CNT, 0, 0, 0);
394 *p_data++ =
GIF_TAG( remain, 0, 0, 0, GSKIT_GIF_FLG_IMAGE, 0 );
396 *p_data++ = DMA_TAG( remain, 0, DMA_REF, 0, (u32)p_mem, 0 );
400 if(clut != GS_CLUT_TEXTURE)
412void gsKit_texture_upload(GSGLOBAL *
gsGlobal, GSTEXTURE *Texture)
414 gsKit_setup_tbw(Texture);
418 gsKit_texture_send(Texture->
Mem, Texture->
Width, Texture->
Height, Texture->
Vram, Texture->
PSM, Texture->
TBW, GS_CLUT_TEXTURE);
419 gsKit_texture_send(Texture->
Clut, 16, 16, Texture->
VramClut, Texture->
ClutPSM, 1, GS_CLUT_PALLETE);
424 gsKit_texture_send(Texture->
Mem, Texture->
Width, Texture->
Height, Texture->
Vram, Texture->
PSM, Texture->
TBW, GS_CLUT_TEXTURE);
425 gsKit_texture_send(Texture->
Clut, 8, 2, Texture->
VramClut, Texture->
ClutPSM, 1, GS_CLUT_PALLETE);
429 gsKit_texture_send(Texture->
Mem, Texture->
Width, Texture->
Height, Texture->
Vram, Texture->
PSM, Texture->
TBW, GS_CLUT_NONE);
433static inline void gsKit_set_tw_th(
const GSTEXTURE *Texture,
int *tw,
int *th)
435 *tw = 31 - (lzw(Texture->
Width) + 1);
436 if(Texture->
Width > (1<<*tw))
439 *th = 31 - (lzw(Texture->
Height) + 1);
440 if(Texture->
Height > (1<<*th))
443void gsKit_prim_sprite_texture_3d(GSGLOBAL *
gsGlobal,
const GSTEXTURE *Texture,
444 float x1,
float y1,
int iz1,
float u1,
float v1,
445 float x2,
float y2,
int iz2,
float u2,
float v2, u64 color)
468 gsKit_set_tw_th(Texture, &tw, &th);
470 ix1 = gsKit_float_to_int_x(
gsGlobal, x1);
471 ix2 = gsKit_float_to_int_x(
gsGlobal, x2);
472 iy1 = gsKit_float_to_int_y(
gsGlobal, y1);
473 iy2 = gsKit_float_to_int_y(
gsGlobal, y2);
475 iu1 = gsKit_float_to_int_u(Texture, u1);
476 iu2 = gsKit_float_to_int_u(Texture, u2);
477 iv1 = gsKit_float_to_int_v(Texture, v1);
478 iv2 = gsKit_float_to_int_v(Texture, v2);
480 p_data = gsKit_heap_alloc(
gsGlobal, qsize, bsize, GSKIT_GIF_PRIM_SPRITE_TEXTURED);
487 *p_data++ = GS_SETREG_TEX0(Texture->
Vram/256, Texture->
TBW, Texture->
PSM,
489 0, 0, 0, 0, GS_CLUT_STOREMODE_NOLOAD);
493 *p_data++ = GS_SETREG_TEX0(Texture->
Vram/256, Texture->
TBW, Texture->
PSM,
504 *p_data++ = GS_SETREG_UV( iu1, iv1 );
507 *p_data++ = GS_SETREG_UV( iu2, iv2 );
511void gsKit_prim_sprite_striped_texture_3d(GSGLOBAL *
gsGlobal,
const GSTEXTURE *Texture,
512 float x1,
float y1,
int iz1,
float u1,
float v1,
513 float x2,
float y2,
int iz2,
float u2,
float v2, u64 color)
551 iy1 = gsKit_float_to_int_y(
gsGlobal, y1);
552 iy2 = gsKit_float_to_int_y(
gsGlobal, y2);
554 iv1 = gsKit_float_to_int_v(Texture, v1);
555 iv2 = gsKit_float_to_int_v(Texture, v2);
557 gsKit_set_tw_th(Texture, &tw, &th);
561 Tex0 = GS_SETREG_TEX0(Texture->
Vram/256, Texture->
TBW, Texture->
PSM,
563 0, 0, 0, 0, GS_CLUT_STOREMODE_NOLOAD);
567 Tex0 = GS_SETREG_TEX0(Texture->
Vram/256, Texture->
TBW, Texture->
PSM,
569 Texture->
VramClut/256, Texture->
ClutPSM, 0, 0, GS_CLUT_STOREMODE_LOAD);
576 ix1 = ((ix1 >> 6) << 6);
577 ix2 = ((ix2 >> 6) << 6);
590 stripcount = ((ix2 - ix1) / 64);
592 if(!(stripcount + extracount))
597 leftwidth = ix1 - (float)x1;
598 rightwidth = (float)x2 - ix2;
600 leftuwidth = ((leftwidth / (x2-x1)) * (u2 - u1));
602 rightuwidth = ((rightwidth / (x2-x1)) * (u2 - u1));
604 ustripwidth = ((((u2 - u1) - leftuwidth) - rightuwidth) / stripcount);
609 p_data = gsKit_heap_alloc(
gsGlobal, qsize * (stripcount + extracount), bsize * (stripcount + extracount),
GIF_AD);
616 if(leftwidth >= 1.0f)
623 *p_data++ = GS_SETREG_UV( gsKit_float_to_int_u(Texture, u1), iv1 );
628 *p_data++ = GS_SETREG_UV( gsKit_float_to_int_u(Texture, fu1), iv2 );
641 *p_data++ = GS_SETREG_UV( gsKit_float_to_int_u(Texture, fu1), iv1 );
647 *p_data++ = GS_SETREG_UV( gsKit_float_to_int_u(Texture, fu1), iv2 );
654 if(rightwidth > 0.0f)
662 *p_data++ = GS_SETREG_UV( gsKit_float_to_int_u(Texture, fu1), iv1 );
668 *p_data++ = GS_SETREG_UV( gsKit_float_to_int_u(Texture, fu1), iv2 );
676void gskit_prim_list_sprite_texture_uv_3d(GSGLOBAL *
gsGlobal,
const GSTEXTURE *Texture,
int count,
const GSPRIMUVPOINT *vertices)
682 int qsize = (count*3) + 2;
683 int bytes = count *
sizeof(GSPRIMUVPOINT);
686 gsKit_set_tw_th(Texture, &tw, &th);
688 p_store = p_data = gsKit_heap_alloc(
gsGlobal, qsize, (qsize*16),
GIF_AD);
698 *p_data++ = GS_SETREG_TEX0(Texture->
Vram/256, Texture->
TBW, Texture->
PSM,
700 0, 0, 0, 0, GS_CLUT_STOREMODE_NOLOAD);
704 *p_data++ = GS_SETREG_TEX0(Texture->
Vram/256, Texture->
TBW, Texture->
PSM,
716 memcpy(p_data, vertices, bytes);
719void gskit_prim_list_sprite_texture_uv_flat(GSGLOBAL *
gsGlobal,
const GSTEXTURE *Texture,
int count,
const u128 *flatContent)
725 int qsize = (count) + 2;
726 int bytes = count *
sizeof(u128);
729 gsKit_set_tw_th(Texture, &tw, &th);
731 p_store = p_data = gsKit_heap_alloc(
gsGlobal, qsize, (qsize*16),
GIF_AD);
741 *p_data++ = GS_SETREG_TEX0(Texture->
Vram/256, Texture->
TBW, Texture->
PSM,
743 0, 0, 0, 0, GS_CLUT_STOREMODE_NOLOAD);
747 *p_data++ = GS_SETREG_TEX0(Texture->
Vram/256, Texture->
TBW, Texture->
PSM,
759 memcpy(p_data, flatContent, bytes);
762void gskit_prim_list_sprite_texture_uv_flat_color(GSGLOBAL *
gsGlobal,
const GSTEXTURE *Texture, gs_rgbaq color,
int count,
const GSPRIMUVPOINTFLAT *vertices)
768 int qsize = (count * 2) + 3;
769 int bytes = count *
sizeof(GSPRIMUVPOINTFLAT);
772 gsKit_set_tw_th(Texture, &tw, &th);
774 p_store = p_data = gsKit_heap_alloc(
gsGlobal, qsize, (qsize*16),
GIF_AD);
784 *p_data++ = GS_SETREG_TEX0(Texture->
Vram/256, Texture->
TBW, Texture->
PSM,
786 0, 0, 0, 0, GS_CLUT_STOREMODE_NOLOAD);
790 *p_data++ = GS_SETREG_TEX0(Texture->
Vram/256, Texture->
TBW, Texture->
PSM,
803 memcpy(p_data, &color,
sizeof(gs_rgbaq));
806 memcpy(p_data, vertices, bytes);
810void gsKit_prim_triangle_texture_3d(GSGLOBAL *
gsGlobal, GSTEXTURE *Texture,
811 float x1,
float y1,
int iz1,
float u1,
float v1,
812 float x2,
float y2,
int iz2,
float u2,
float v2,
813 float x3,
float y3,
int iz3,
float u3,
float v3, u64 color)
840 gsKit_set_tw_th(Texture, &tw, &th);
842 ix1 = gsKit_float_to_int_x(
gsGlobal, x1);
843 ix2 = gsKit_float_to_int_x(
gsGlobal, x2);
844 ix3 = gsKit_float_to_int_x(
gsGlobal, x3);
845 iy1 = gsKit_float_to_int_y(
gsGlobal, y1);
846 iy2 = gsKit_float_to_int_y(
gsGlobal, y2);
847 iy3 = gsKit_float_to_int_y(
gsGlobal, y3);
849 iu1 = gsKit_float_to_int_u(Texture, u1);
850 iu2 = gsKit_float_to_int_u(Texture, u2);
851 iu3 = gsKit_float_to_int_u(Texture, u3);
852 iv1 = gsKit_float_to_int_v(Texture, v1);
853 iv2 = gsKit_float_to_int_v(Texture, v2);
854 iv3 = gsKit_float_to_int_v(Texture, v3);
856 p_data = gsKit_heap_alloc(
gsGlobal, qsize, bsize, GSKIT_GIF_PRIM_TRIANGLE_TEXTURED);
863 *p_data++ = GS_SETREG_TEX0(Texture->
Vram/256, Texture->
TBW, Texture->
PSM,
865 0, 0, 0, 0, GS_CLUT_STOREMODE_NOLOAD);
869 *p_data++ = GS_SETREG_TEX0(Texture->
Vram/256, Texture->
TBW, Texture->
PSM,
881 *p_data++ = GS_SETREG_UV( iu1, iv1 );
884 *p_data++ = GS_SETREG_UV( iu2, iv2 );
887 *p_data++ = GS_SETREG_UV( iu3, iv3 );
891void gsKit_prim_triangle_goraud_texture_3d(GSGLOBAL *
gsGlobal, GSTEXTURE *Texture,
892 float x1,
float y1,
int iz1,
float u1,
float v1,
893 float x2,
float y2,
int iz2,
float u2,
float v2,
894 float x3,
float y3,
int iz3,
float u3,
float v3,
895 u64 color1, u64 color2, u64 color3)
922 gsKit_set_tw_th(Texture, &tw, &th);
924 ix1 = gsKit_float_to_int_x(
gsGlobal, x1);
925 ix2 = gsKit_float_to_int_x(
gsGlobal, x2);
926 ix3 = gsKit_float_to_int_x(
gsGlobal, x3);
927 iy1 = gsKit_float_to_int_y(
gsGlobal, y1);
928 iy2 = gsKit_float_to_int_y(
gsGlobal, y2);
929 iy3 = gsKit_float_to_int_y(
gsGlobal, y3);
931 iu1 = gsKit_float_to_int_u(Texture, u1);
932 iu2 = gsKit_float_to_int_u(Texture, u2);
933 iu3 = gsKit_float_to_int_u(Texture, u3);
934 iv1 = gsKit_float_to_int_v(Texture, v1);
935 iv2 = gsKit_float_to_int_v(Texture, v2);
936 iv3 = gsKit_float_to_int_v(Texture, v3);
938 p_data = gsKit_heap_alloc(
gsGlobal, qsize, bsize, GSKIT_GIF_PRIM_TRIANGLE_TEXTURED);
945 *p_data++ = GS_SETREG_TEX0(Texture->
Vram/256, Texture->
TBW, Texture->
PSM,
947 0, 0, 0, 0, GS_CLUT_STOREMODE_NOLOAD);
951 *p_data++ = GS_SETREG_TEX0(Texture->
Vram/256, Texture->
TBW, Texture->
PSM,
962 *p_data++ = GS_SETREG_UV( iu1, iv1 );
966 *p_data++ = GS_SETREG_UV( iu2, iv2 );
970 *p_data++ = GS_SETREG_UV( iu3, iv3 );
974void gsKit_prim_list_triangle_goraud_texture_uv_3d(GSGLOBAL *
gsGlobal, GSTEXTURE *Texture,
int count,
const GSPRIMUVPOINT *vertices)
980 int qsize = (count*3) + 2;
981 int bytes = count *
sizeof(GSPRIMUVPOINT);
984 gsKit_set_tw_th(Texture, &tw, &th);
986 p_store = p_data = gsKit_heap_alloc(
gsGlobal, qsize, (qsize*16),
GIF_AD);
996 *p_data++ = GS_SETREG_TEX0(Texture->
Vram/256, Texture->
TBW, Texture->
PSM,
998 0, 0, 0, 0, GS_CLUT_STOREMODE_NOLOAD);
1002 *p_data++ = GS_SETREG_TEX0(Texture->
Vram/256, Texture->
TBW, Texture->
PSM,
1014 memcpy(p_data, vertices, bytes);
1017void gsKit_prim_list_triangle_goraud_texture_stq_3d(GSGLOBAL *
gsGlobal, GSTEXTURE *Texture,
int count,
const GSPRIMSTQPOINT *vertices)
1023 int qsize = (count*3) + 2;
1024 int bytes = count *
sizeof(GSPRIMSTQPOINT);
1027 gsKit_set_tw_th(Texture, &tw, &th);
1029 p_store = p_data = gsKit_heap_alloc(
gsGlobal, qsize, (qsize*16),
GIF_AD);
1039 *p_data++ = GS_SETREG_TEX0(Texture->
Vram/256, Texture->
TBW, Texture->
PSM,
1041 0, 0, 0, 0, GS_CLUT_STOREMODE_NOLOAD);
1045 *p_data++ = GS_SETREG_TEX0(Texture->
Vram/256, Texture->
TBW, Texture->
PSM,
1057 memcpy(p_data, vertices, bytes);
1060void gsKit_prim_triangle_strip_texture(GSGLOBAL *
gsGlobal, GSTEXTURE *Texture,
1061 float *TriStrip,
int segments,
int iz, u64 color)
1067 int vertexdata[segments*4];
1072 qsize = 3 + (segments * 2);
1074 gsKit_set_tw_th(Texture, &tw, &th);
1076 for(count = 0; count < (segments * 4); count+=4)
1078 vertexdata[count+0] = gsKit_float_to_int_x(
gsGlobal, *TriStrip++);
1079 vertexdata[count+1] = gsKit_float_to_int_y(
gsGlobal, *TriStrip++);
1080 vertexdata[count+2] = gsKit_float_to_int_u(Texture, *TriStrip++);
1081 vertexdata[count+3] = gsKit_float_to_int_v(Texture, *TriStrip++);
1084 p_data = gsKit_heap_alloc(
gsGlobal, qsize, (qsize * 16),
GIF_AD);
1091 *p_data++ = GS_SETREG_TEX0(Texture->
Vram/256, Texture->
TBW, Texture->
PSM,
1093 0, 0, 0, 0, GS_CLUT_STOREMODE_NOLOAD);
1097 *p_data++ = GS_SETREG_TEX0(Texture->
Vram/256, Texture->
TBW, Texture->
PSM,
1112 for(count = 0; count < (segments * 4); count+=4)
1114 *p_data++ = GS_SETREG_UV( vertexdata[count+2], vertexdata[count+3] );
1117 *p_data++ =
GS_SETREG_XYZ2( vertexdata[count], vertexdata[count+1], iz );
1122void gsKit_prim_triangle_strip_texture_3d(GSGLOBAL *
gsGlobal, GSTEXTURE *Texture,
1123 float *TriStrip,
int segments, u64 color)
1129 int vertexdata[segments*5];
1134 qsize = 3 + (segments * 2);
1136 gsKit_set_tw_th(Texture, &tw, &th);
1138 for(count = 0; count < (segments * 5); count+=5)
1140 vertexdata[count+0] = gsKit_float_to_int_x(
gsGlobal, *TriStrip++);
1141 vertexdata[count+1] = gsKit_float_to_int_y(
gsGlobal, *TriStrip++);
1142 vertexdata[count+2] = (int)((*TriStrip++) * 16.0f);
1143 vertexdata[count+3] = gsKit_float_to_int_u(Texture, *TriStrip++);
1144 vertexdata[count+4] = gsKit_float_to_int_v(Texture, *TriStrip++);
1147 p_data = gsKit_heap_alloc(
gsGlobal, qsize, (qsize * 16),
GIF_AD);
1154 *p_data++ = GS_SETREG_TEX0(Texture->
Vram/256, Texture->
TBW, Texture->
PSM,
1156 0, 0, 0, 0, GS_CLUT_STOREMODE_NOLOAD);
1160 *p_data++ = GS_SETREG_TEX0(Texture->
Vram/256, Texture->
TBW, Texture->
PSM,
1175 for(count = 0; count < (segments * 5); count+=5)
1177 *p_data++ = GS_SETREG_UV( vertexdata[count+3], vertexdata[count+4] );
1180 *p_data++ =
GS_SETREG_XYZ2( vertexdata[count], vertexdata[count+1], vertexdata[count+2] );
1185void gsKit_prim_triangle_fan_texture(GSGLOBAL *
gsGlobal, GSTEXTURE *Texture,
1186 float *TriFan,
int verticies,
int iz, u64 color)
1192 int vertexdata[verticies*4];
1197 qsize = 3 + (verticies * 2);
1199 gsKit_set_tw_th(Texture, &tw, &th);
1201 for(count = 0; count < (verticies * 4); count+=4)
1203 vertexdata[count+0] = gsKit_float_to_int_x(
gsGlobal, *TriFan++);
1204 vertexdata[count+1] = gsKit_float_to_int_y(
gsGlobal, *TriFan++);
1205 vertexdata[count+2] = gsKit_float_to_int_u(Texture, *TriFan++);
1206 vertexdata[count+3] = gsKit_float_to_int_v(Texture, *TriFan++);
1209 p_data = gsKit_heap_alloc(
gsGlobal, qsize, (qsize * 16),
GIF_AD);
1216 *p_data++ = GS_SETREG_TEX0(Texture->
Vram/256, Texture->
TBW, Texture->
PSM,
1218 0, 0, 0, 0, GS_CLUT_STOREMODE_NOLOAD);
1222 *p_data++ = GS_SETREG_TEX0(Texture->
Vram/256, Texture->
TBW, Texture->
PSM,
1237 for(count = 0; count < (verticies * 4); count+=4)
1239 *p_data++ = GS_SETREG_UV( vertexdata[count+2], vertexdata[count+3] );
1242 *p_data++ =
GS_SETREG_XYZ2( vertexdata[count], vertexdata[count+1], iz );
1247void gsKit_prim_triangle_fan_texture_3d(GSGLOBAL *
gsGlobal, GSTEXTURE *Texture,
1248 float *TriFan,
int verticies, u64 color)
1253 int vertexdata[verticies*5];
1258 qsize = 3 + (verticies * 2);
1260 gsKit_set_tw_th(Texture, &tw, &th);
1262 for(count = 0; count < (verticies * 5); count+=5)
1264 vertexdata[count+0] = gsKit_float_to_int_x(
gsGlobal, *TriFan++);
1265 vertexdata[count+1] = gsKit_float_to_int_y(
gsGlobal, *TriFan++);
1266 vertexdata[count+2] = (int)((*TriFan++) * 16.0f);
1267 vertexdata[count+3] = gsKit_float_to_int_u(Texture, *TriFan++);
1268 vertexdata[count+4] = gsKit_float_to_int_v(Texture, *TriFan++);
1271 p_data = gsKit_heap_alloc(
gsGlobal, qsize, (qsize * 16),
GIF_AD);
1278 *p_data++ = GS_SETREG_TEX0(Texture->
Vram/256, Texture->
TBW, Texture->
PSM,
1280 0, 0, 0, 0, GS_CLUT_STOREMODE_NOLOAD);
1284 *p_data++ = GS_SETREG_TEX0(Texture->
Vram/256, Texture->
TBW, Texture->
PSM,
1299 for(count = 0; count < (verticies * 5); count+=5)
1301 *p_data++ = GS_SETREG_UV( vertexdata[count+3], vertexdata[count+4] );
1304 *p_data++ =
GS_SETREG_XYZ2( vertexdata[count], vertexdata[count+1], vertexdata[count+2] );
1309void gsKit_prim_quad_texture_3d(GSGLOBAL *
gsGlobal, GSTEXTURE *Texture,
1310 float x1,
float y1,
int iz1,
float u1,
float v1,
1311 float x2,
float y2,
int iz2,
float u2,
float v2,
1312 float x3,
float y3,
int iz3,
float u3,
float v3,
1313 float x4,
float y4,
int iz4,
float u4,
float v4, u64 color)
1345 gsKit_set_tw_th(Texture, &tw, &th);
1347 ix1 = gsKit_float_to_int_x(
gsGlobal, x1);
1348 ix2 = gsKit_float_to_int_x(
gsGlobal, x2);
1349 ix3 = gsKit_float_to_int_x(
gsGlobal, x3);
1350 ix4 = gsKit_float_to_int_x(
gsGlobal, x4);
1351 iy1 = gsKit_float_to_int_y(
gsGlobal, y1);
1352 iy2 = gsKit_float_to_int_y(
gsGlobal, y2);
1353 iy3 = gsKit_float_to_int_y(
gsGlobal, y3);
1354 iy4 = gsKit_float_to_int_y(
gsGlobal, y4);
1356 iu1 = gsKit_float_to_int_u(Texture, u1);
1357 iu2 = gsKit_float_to_int_u(Texture, u2);
1358 iu3 = gsKit_float_to_int_u(Texture, u3);
1359 iu4 = gsKit_float_to_int_u(Texture, u4);
1360 iv1 = gsKit_float_to_int_v(Texture, v1);
1361 iv2 = gsKit_float_to_int_v(Texture, v2);
1362 iv3 = gsKit_float_to_int_v(Texture, v3);
1363 iv4 = gsKit_float_to_int_v(Texture, v4);
1365 p_data = gsKit_heap_alloc(
gsGlobal, qsize, bsize, GSKIT_GIF_PRIM_QUAD_TEXTURED);
1372 *p_data++ = GS_SETREG_TEX0(Texture->
Vram/256, Texture->
TBW, Texture->
PSM,
1374 0, 0, 0, 0, GS_CLUT_STOREMODE_NOLOAD);
1378 *p_data++ = GS_SETREG_TEX0(Texture->
Vram/256, Texture->
TBW, Texture->
PSM,
1389 *p_data++ = GS_SETREG_UV( iu1, iv1 );
1392 *p_data++ = GS_SETREG_UV( iu2, iv2 );
1395 *p_data++ = GS_SETREG_UV( iu3, iv3 );
1398 *p_data++ = GS_SETREG_UV( iu4, iv4 );
1402void gsKit_prim_quad_goraud_texture_3d(GSGLOBAL *
gsGlobal, GSTEXTURE *Texture,
1403 float x1,
float y1,
int iz1,
float u1,
float v1,
1404 float x2,
float y2,
int iz2,
float u2,
float v2,
1405 float x3,
float y3,
int iz3,
float u3,
float v3,
1406 float x4,
float y4,
int iz4,
float u4,
float v4,
1407 u64 color1, u64 color2, u64 color3, u64 color4)
1438 gsKit_set_tw_th(Texture, &tw, &th);
1440 ix1 = gsKit_float_to_int_x(
gsGlobal, x1);
1441 ix2 = gsKit_float_to_int_x(
gsGlobal, x2);
1442 ix3 = gsKit_float_to_int_x(
gsGlobal, x3);
1443 ix4 = gsKit_float_to_int_x(
gsGlobal, x4);
1444 iy1 = gsKit_float_to_int_y(
gsGlobal, y1);
1445 iy2 = gsKit_float_to_int_y(
gsGlobal, y2);
1446 iy3 = gsKit_float_to_int_y(
gsGlobal, y3);
1447 iy4 = gsKit_float_to_int_y(
gsGlobal, y4);
1449 iu1 = gsKit_float_to_int_u(Texture, u1);
1450 iu2 = gsKit_float_to_int_u(Texture, u2);
1451 iu3 = gsKit_float_to_int_u(Texture, u3);
1452 iu4 = gsKit_float_to_int_u(Texture, u4);
1453 iv1 = gsKit_float_to_int_v(Texture, v1);
1454 iv2 = gsKit_float_to_int_v(Texture, v2);
1455 iv3 = gsKit_float_to_int_v(Texture, v3);
1456 iv4 = gsKit_float_to_int_v(Texture, v4);
1458 p_data = gsKit_heap_alloc(
gsGlobal, qsize, bsize, GSKIT_GIF_PRIM_QUAD_TEXTURED);
1465 *p_data++ = GS_SETREG_TEX0(Texture->
Vram/256, Texture->
TBW, Texture->
PSM,
1467 0, 0, 0, 0, GS_CLUT_STOREMODE_NOLOAD);
1471 *p_data++ = GS_SETREG_TEX0(Texture->
Vram/256, Texture->
TBW, Texture->
PSM,
1481 *p_data++ = GS_SETREG_UV( iu1, iv1 );
1485 *p_data++ = GS_SETREG_UV( iu2, iv2 );
1489 *p_data++ = GS_SETREG_UV( iu3, iv3 );
1493 *p_data++ = GS_SETREG_UV( iu4, iv4 );
void dmaKit_wait_fast(void)
void dmaKit_send_chain(u16 channel, void *data, u32 size)
void gsKit_set_texfilter(GSGLOBAL *gsGlobal, u8 FilterMode)
Sets the Texture Filtering Parameters.
#define GS_FILTER_NEAREST
Use simple filtering (nearest neighbor).
#define GS_GIF_BLOCKSIZE
GS GIF Data Transfer Blocksize.
#define GIF_TAG_AD(NLOOP)
A+D GIFTAG.
#define GS_PRIM
GS Primitive.
#define GS_PSM_CT32
R8 G8 B8 A8 (RGBA32) Texture.
#define GS_PSM_T8
8 Bit Texture with CLUT
#define GS_TRXDIR
GS Activation for Transmission Between Buffers.
#define GIF_TAG_SPRITE_TEXTURED_REGS(ctx)
Textured Sprite Primitive REGLIST.
#define GS_PSM_CT16S
RGBA16 Texture ?
#define GIF_TAG_QUAD_GORAUD_TEXTURED(NLOOP)
Textured Quad Goraud Primitive GIFTAG.
#define GS_SETREG_XYZ2
GS Vertex Value Object Creation Macro.
#define GS_XYZ2
GS Vertex Coordinate Value.
#define GS_PSM_T4
4 Bit Texture with CLUT
#define GS_PRIM_PRIM_TRIANGLE
GS Triangle Primitive.
#define GS_RGBAQ
GS Color in RGBAQ Format.
#define GIF_TAG_TRIANGLE_GORAUD_TEXTURED(NLOOP)
Textured Triangle Goraud Primitive GIFTAG.
#define GS_TRXREG
GS Specificiation for Transmission Area in Buffers.
#define GIF_TAG(NLOOP, EOP, PRE, PRIM, FLG, NREG)
DMA Packet Header "GIF Tag" For Packets Sent To GIF.
#define GIF_TAG_TRIANGLE_TEXTURED(NLOOP)
Textured Triangle Primitive GIFTAG.
#define GS_PSM_CT24
R8 G8 B8 (RGB24) Texture.
#define GS_BITBLTBUF
GS Setting for Transmission Between Buffers.
#define GS_UV
GS Texture Coordinate Value in Texel Coordinates.
#define GS_TEX0_1
GS Texture Information Settings (Context 1).
#define GIF_TAG_TRIANGLE_GORAUD_TEXTURED_REGS(ctx)
Textured Triangle Goraud Primitive REGLIST.
#define GS_TRXPOS
GS Specificiation for Transmission Area in Buffers.
#define GIF_AD
GIF_TAG Address+Data Setting. (Used after GIF_TAG).
#define GS_TEXFLUSH
GS Texture Page Buffer.
#define GIF_TAG_SPRITE_TEXTURED(NLOOP)
Textured Sprite Primitive GIFTAG.
#define GIF_TAG_TRIANGLE_TEXTURED_REGS(ctx)
Textured Triangle Primitive REGLIST.
#define GIF_TAG_QUAD_GORAUD_TEXTURED_REGS(ctx)
Textured Quad Goraud Primitive REGLIST.
#define GIF_TAG_QUAD_TEXTURED_REGS(ctx)
Textured Quad Primitive REGLIST.
#define GS_PRIM_PRIM_SPRITE
GS Sprite Primitive.
#define GIF_TAG_QUAD_TEXTURED(NLOOP)
Textured Quad Primitive GIFTAG.
#define GS_PRIM_PRIM_TRIFAN
GS Triangle Fan Primitive.
#define GS_PRIM_PRIM_TRISTRIP
GS Triangle Strip Primitive.
#define GS_PSM_CT16
RGBA16 Texture.
#define GSKIT_GIF_FLG_PACKED
gsKit GIFTAG data format "FLG"
int PrimAlphaEnable
Primitive Alpha Blending Enable.
int PrimContext
Primitive Context.
GSQUEUE * CurQueue
Draw Queue (Current).
int OffsetX
X Window Offset.
int PrimFogEnable
Primitive Fog Enable.
int PrimAAEnable
Primitive AntiAlaising Enable.
void * last_tag
Pointer to the GIF_TAG of the last object in this draw queue.
u32 * Clut
EE CLUT Memory Pointer.
u32 TBW
Texture Base Width.
u32 * Mem
EE Memory Pointer.
u8 ClutStorageMode
CLUT Storage Mode.
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.
u32 Filter
NEAREST or LINEAR.