add some missing license headers
[pcsx_rearmed.git] / plugins / gpu_unai / gpu_command.h
1 /***************************************************************************
2 *   Copyright (C) 2010 PCSX4ALL Team                                      *
3 *   Copyright (C) 2010 Unai                                               *
4 *                                                                         *
5 *   This program is free software; you can redistribute it and/or modify  *
6 *   it under the terms of the GNU General Public License as published by  *
7 *   the Free Software Foundation; either version 2 of the License, or     *
8 *   (at your option) any later version.                                   *
9 *                                                                         *
10 *   This program is distributed in the hope that it will be useful,       *
11 *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
12 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
13 *   GNU General Public License for more details.                          *
14 *                                                                         *
15 *   You should have received a copy of the GNU General Public License     *
16 *   along with this program; if not, write to the                         *
17 *   Free Software Foundation, Inc.,                                       *
18 *   51 Franklin Street, Fifth Floor, Boston, MA 02111-1307 USA.           *
19 ***************************************************************************/
20
21 ///////////////////////////////////////////////////////////////////////////////
22 INLINE void gpuSetTexture(u16 tpage)
23 {
24         u32 tp;
25         u32 tx, ty;
26         GPU_GP1 = (GPU_GP1 & ~0x1FF) | (tpage & 0x1FF);
27
28         TextureWindow[0]&= ~TextureWindow[2];
29         TextureWindow[1]&= ~TextureWindow[3];
30
31         tp = (tpage >> 7) & 3;
32         tx = (tpage & 0x0F) << 6;
33         ty = (tpage & 0x10) << 4;
34         if (tp == 3) tp = 2;
35
36         tx += (TextureWindow[0] >> (2 - tp));
37         ty += TextureWindow[1];
38         
39         BLEND_MODE  = (((tpage>>5)&0x3)     ) << 3;
40         TEXT_MODE   = (((tpage>>7)&0x3) + 1 ) << 5; // +1 el cero no lo usamos
41
42         TBA = &((u16*)GPU_FrameBuffer)[FRAME_OFFSET(tx, ty)];
43
44 }
45
46 ///////////////////////////////////////////////////////////////////////////////
47 INLINE void gpuSetCLUT(u16 clut)
48 {
49         CBA = &((u16*)GPU_FrameBuffer)[(clut & 0x7FFF) << 4];
50 }
51
52 #ifdef  ENABLE_GPU_NULL_SUPPORT
53 #define NULL_GPU() break
54 #else
55 #define NULL_GPU()
56 #endif
57
58 #ifdef  ENABLE_GPU_LOG_SUPPORT
59 #define DO_LOG(expr) printf expr
60 #else
61 #define DO_LOG(expr) {}
62 #endif
63
64 #define Blending (((PRIM&0x2)&&(blend))?(PRIM&0x2):0)
65 #define Blending_Mode (((PRIM&0x2)&&(blend))?BLEND_MODE:0)
66 #define Lighting (((~PRIM)&0x1)&&(light))
67
68 void gpuSendPacketFunction(const int PRIM)
69 {
70         //printf("0x%x\n",PRIM);
71
72         switch (PRIM)
73         {
74                 case 0x02:
75                         NULL_GPU();
76                         gpuClearImage();    //  prim handles updateLace && skip
77                         DO_LOG(("gpuClearImage(0x%x)\n",PRIM));
78                         break;
79                 case 0x20:
80                 case 0x21:
81                 case 0x22:
82                 case 0x23:
83                         if (!isSkip)
84                         {
85                                 NULL_GPU();
86                                 gpuDrawF3(gpuPolySpanDrivers [Blending_Mode | Masking | Blending | PixelMSB]);
87                                 DO_LOG(("gpuDrawF3(0x%x)\n",PRIM));
88                         }
89                         break;
90                 case 0x24:
91                 case 0x25:
92                 case 0x26:
93                 case 0x27:
94                         if (!isSkip)
95                         {
96                                 NULL_GPU();
97                                 gpuSetCLUT    (PacketBuffer.U4[2] >> 16);
98                                 gpuSetTexture (PacketBuffer.U4[4] >> 16);
99                                 if ((PacketBuffer.U1[0]>0x5F) && (PacketBuffer.U1[1]>0x5F) && (PacketBuffer.U1[2]>0x5F))
100                                         gpuDrawFT3(gpuPolySpanDrivers [Blending_Mode | TEXT_MODE | Masking | Blending | PixelMSB]);
101                                 else
102                                         gpuDrawFT3(gpuPolySpanDrivers [Blending_Mode | TEXT_MODE | Masking | Blending | Lighting | PixelMSB]);
103                                 DO_LOG(("gpuDrawFT3(0x%x)\n",PRIM));
104                         }
105                         break;
106                 case 0x28:
107                 case 0x29:
108                 case 0x2A:
109                 case 0x2B:
110                         if (!isSkip)
111                         {
112                                 NULL_GPU();
113                                 const PP gpuPolySpanDriver  = gpuPolySpanDrivers [Blending_Mode | Masking | Blending | PixelMSB];
114                                 //--PacketBuffer.S2[6];
115                                 gpuDrawF3(gpuPolySpanDriver);
116                                 PacketBuffer.U4[1] = PacketBuffer.U4[4];
117                                 //--PacketBuffer.S2[2];
118                                 gpuDrawF3(gpuPolySpanDriver);
119                                 DO_LOG(("gpuDrawF4(0x%x)\n",PRIM));
120                         }
121                         break;
122                 case 0x2C:
123                 case 0x2D:
124                 case 0x2E:
125                 case 0x2F:
126                         if (!isSkip)
127                         {
128                                 NULL_GPU();
129                                 gpuSetCLUT    (PacketBuffer.U4[2] >> 16);
130                                 gpuSetTexture (PacketBuffer.U4[4] >> 16);
131                                 PP gpuPolySpanDriver;
132                                 if ((PacketBuffer.U1[0]>0x5F) && (PacketBuffer.U1[1]>0x5F) && (PacketBuffer.U1[2]>0x5F))
133                                         gpuPolySpanDriver = gpuPolySpanDrivers [Blending_Mode | TEXT_MODE | Masking | Blending | PixelMSB];
134                                 else
135                                         gpuPolySpanDriver = gpuPolySpanDrivers [Blending_Mode | TEXT_MODE | Masking | Blending | Lighting | PixelMSB];
136                                 //--PacketBuffer.S2[6];
137                                 gpuDrawFT3(gpuPolySpanDriver);
138                                 PacketBuffer.U4[1] = PacketBuffer.U4[7];
139                                 PacketBuffer.U4[2] = PacketBuffer.U4[8];
140                                 //--PacketBuffer.S2[2];
141                                 gpuDrawFT3(gpuPolySpanDriver);
142                                 DO_LOG(("gpuDrawFT4(0x%x)\n",PRIM));
143                         }
144                         break;
145                 case 0x30:
146                 case 0x31:
147                 case 0x32:
148                 case 0x33:
149                         if (!isSkip)
150                         {
151                                 NULL_GPU();
152                                 gpuDrawG3(gpuPolySpanDrivers [Blending_Mode | Masking | Blending | 129 | PixelMSB]);
153                                 DO_LOG(("gpuDrawG3(0x%x)\n",PRIM));
154                         }
155                         break;
156                 case 0x34:
157                 case 0x35:
158                 case 0x36:
159                 case 0x37:
160                         if (!isSkip)
161                         {
162                                 NULL_GPU();
163                                 gpuSetCLUT    (PacketBuffer.U4[2] >> 16);
164                                 gpuSetTexture (PacketBuffer.U4[5] >> 16);
165                                 gpuDrawGT3(gpuPolySpanDrivers [Blending_Mode | TEXT_MODE | Masking | Blending | ((Lighting)?129:0) | PixelMSB]);
166                                 DO_LOG(("gpuDrawGT3(0x%x)\n",PRIM));
167                         }
168                         break;
169                 case 0x38:
170                 case 0x39:
171                 case 0x3A:
172                 case 0x3B:
173                         if (!isSkip)
174                         {
175                                 NULL_GPU();
176                                 const PP gpuPolySpanDriver  = gpuPolySpanDrivers [Blending_Mode | Masking | Blending | 129 | PixelMSB];
177                                 //--PacketBuffer.S2[6];
178                                 gpuDrawG3(gpuPolySpanDriver);
179                                 PacketBuffer.U4[0] = PacketBuffer.U4[6];
180                                 PacketBuffer.U4[1] = PacketBuffer.U4[7];
181                                 //--PacketBuffer.S2[2];
182                                 gpuDrawG3(gpuPolySpanDriver);
183                                 DO_LOG(("gpuDrawG4(0x%x)\n",PRIM));
184                         }
185                         break;
186                 case 0x3C:
187                 case 0x3D:
188                 case 0x3E:
189                 case 0x3F:
190                         if (!isSkip)
191                         {
192                                 NULL_GPU();
193                                 gpuSetCLUT    (PacketBuffer.U4[2] >> 16);
194                                 gpuSetTexture (PacketBuffer.U4[5] >> 16);
195                                 const PP gpuPolySpanDriver  = gpuPolySpanDrivers [Blending_Mode | TEXT_MODE | Masking | Blending | ((Lighting)?129:0) | PixelMSB];
196                                 //--PacketBuffer.S2[6];
197                                 gpuDrawGT3(gpuPolySpanDriver);
198                                 PacketBuffer.U4[0] = PacketBuffer.U4[9];
199                                 PacketBuffer.U4[1] = PacketBuffer.U4[10];
200                                 PacketBuffer.U4[2] = PacketBuffer.U4[11];
201                                 //--PacketBuffer.S2[2];
202                                 gpuDrawGT3(gpuPolySpanDriver);
203                                 DO_LOG(("gpuDrawGT4(0x%x)\n",PRIM));
204                         }
205                         break;
206                 case 0x40:
207                 case 0x41:
208                 case 0x42:
209                 case 0x43:
210                         if (!isSkip)
211                         {
212                                 NULL_GPU();
213                                 gpuDrawLF(gpuPixelDrivers [ (Blending_Mode | Masking | Blending | (PixelMSB>>3)) >> 1]);
214                                 DO_LOG(("gpuDrawLF(0x%x)\n",PRIM));
215                         }
216                         break;
217                 case 0x48:
218                 case 0x49:
219                 case 0x4A:
220                 case 0x4B:
221                 case 0x4C:
222                 case 0x4D:
223                 case 0x4E:
224                 case 0x4F:
225                         if (!isSkip)
226                         {
227                                 NULL_GPU();
228                                 gpuDrawLF(gpuPixelDrivers [ (Blending_Mode | Masking | Blending | (PixelMSB>>3)) >> 1]);
229                                 DO_LOG(("gpuDrawLF(0x%x)\n",PRIM));
230                         }
231                         if ((PacketBuffer.U4[3] & 0xF000F000) != 0x50005000)
232                         {
233                                 PacketBuffer.U4[1] = PacketBuffer.U4[2];
234                                 PacketBuffer.U4[2] = PacketBuffer.U4[3];
235                                 PacketCount = 1;
236                                 PacketIndex = 3;
237                         }
238                         break;
239                 case 0x50:
240                 case 0x51:
241                 case 0x52:
242                 case 0x53:
243                         if (!isSkip)
244                         {
245                                 NULL_GPU();
246                                 gpuDrawLG(gpuPixelDrivers [ (Blending_Mode | Masking | Blending | (PixelMSB>>3)) >> 1]);
247                                 DO_LOG(("gpuDrawLG(0x%x)\n",PRIM));
248                         }
249                         break;
250                 case 0x58:
251                 case 0x59:
252                 case 0x5A:
253                 case 0x5B:
254                 case 0x5C:
255                 case 0x5D:
256                 case 0x5E:
257                 case 0x5F:
258                         if (!isSkip)
259                         {
260                                 NULL_GPU();
261                                 gpuDrawLG(gpuPixelDrivers [ (Blending_Mode | Masking | Blending | (PixelMSB>>3)) >> 1]);
262                                 DO_LOG(("gpuDrawLG(0x%x)\n",PRIM));
263                         }
264                         if ((PacketBuffer.U4[4] & 0xF000F000) != 0x50005000)
265                         {
266                                 PacketBuffer.U1[3 + (2 * 4)] = PacketBuffer.U1[3 + (0 * 4)];
267                                 PacketBuffer.U4[0] = PacketBuffer.U4[2];
268                                 PacketBuffer.U4[1] = PacketBuffer.U4[3];
269                                 PacketBuffer.U4[2] = PacketBuffer.U4[4];
270                                 PacketCount = 2;
271                                 PacketIndex = 3;
272                         }
273                         break;
274                 case 0x60:
275                 case 0x61:
276                 case 0x62:
277                 case 0x63:
278                         if (!isSkip)
279                         {
280                                 NULL_GPU();
281                                 gpuDrawT(gpuTileSpanDrivers [Blending_Mode | Masking | Blending | (PixelMSB>>3)]);
282                                 DO_LOG(("gpuDrawT(0x%x)\n",PRIM));
283                         }
284                         break;
285                 case 0x64:
286                 case 0x65:
287                 case 0x66:
288                 case 0x67:
289                         if (!isSkip)
290                         {
291                                 NULL_GPU();
292                                 gpuSetCLUT    (PacketBuffer.U4[2] >> 16);
293                                 gpuSetTexture (GPU_GP1);
294                                 if ((PacketBuffer.U1[0]>0x5F) && (PacketBuffer.U1[1]>0x5F) && (PacketBuffer.U1[2]>0x5F))
295                                         gpuDrawS(gpuSpriteSpanDrivers [Blending_Mode | TEXT_MODE | Masking | Blending | (enableAbbeyHack<<7)  | PixelMSB]);
296                                 else
297                                         gpuDrawS(gpuSpriteSpanDrivers [Blending_Mode | TEXT_MODE | Masking | Blending | Lighting | (enableAbbeyHack<<7)  | PixelMSB]);
298                                 DO_LOG(("gpuDrawS(0x%x)\n",PRIM));
299                         }
300                         break;
301                 case 0x68:
302                 case 0x69:
303                 case 0x6A:
304                 case 0x6B:
305                         if (!isSkip)
306                         {
307                                 NULL_GPU();
308                                 PacketBuffer.U4[2] = 0x00010001;
309                                 gpuDrawT(gpuTileSpanDrivers [Blending_Mode | Masking | Blending | (PixelMSB>>3)]);
310                                 DO_LOG(("gpuDrawT(0x%x)\n",PRIM));
311                         }
312                         break;
313                 case 0x70:
314                 case 0x71:
315                 case 0x72:
316                 case 0x73:
317                         if (!isSkip)
318                         {
319                                 NULL_GPU();
320                                 PacketBuffer.U4[2] = 0x00080008;
321                                 gpuDrawT(gpuTileSpanDrivers [Blending_Mode | Masking | Blending | (PixelMSB>>3)]);
322                                 DO_LOG(("gpuDrawT(0x%x)\n",PRIM));
323                         }
324                         break;
325                 case 0x74:
326                 case 0x75:
327                 case 0x76:
328                 case 0x77:
329                         if (!isSkip)
330                         {
331                                 NULL_GPU();
332                                 PacketBuffer.U4[3] = 0x00080008;
333                                 gpuSetCLUT    (PacketBuffer.U4[2] >> 16);
334                                 gpuSetTexture (GPU_GP1);
335                                 if ((PacketBuffer.U1[0]>0x5F) && (PacketBuffer.U1[1]>0x5F) && (PacketBuffer.U1[2]>0x5F))
336                                         gpuDrawS(gpuSpriteSpanDrivers [Blending_Mode | TEXT_MODE | Masking | Blending | (enableAbbeyHack<<7)  | PixelMSB]);
337                                 else
338                                         gpuDrawS(gpuSpriteSpanDrivers [Blending_Mode | TEXT_MODE | Masking | Blending | Lighting | (enableAbbeyHack<<7)  | PixelMSB]);
339                                 DO_LOG(("gpuDrawS(0x%x)\n",PRIM));
340                         }
341                         break;
342                 case 0x78:
343                 case 0x79:
344                 case 0x7A:
345                 case 0x7B:
346                         if (!isSkip)
347                         {
348                                 NULL_GPU();
349                                 PacketBuffer.U4[2] = 0x00100010;
350                                 gpuDrawT(gpuTileSpanDrivers [Blending_Mode | Masking | Blending | (PixelMSB>>3)]);
351                                 DO_LOG(("gpuDrawT(0x%x)\n",PRIM));
352                         }
353                         break;
354                 case 0x7C:
355                 case 0x7D:
356 #ifdef __arm__
357                         if ((GPU_GP1 & 0x180) == 0 && (Masking | PixelMSB) == 0)
358                         {
359                                 gpuSetCLUT    (PacketBuffer.U4[2] >> 16);
360                                 gpuSetTexture (GPU_GP1);
361                                 gpuDrawS16();
362                                 break;
363                         }
364                         // fallthrough
365 #endif
366                 case 0x7E:
367                 case 0x7F:
368                         if (!isSkip)
369                         {
370                                 NULL_GPU();
371                                 PacketBuffer.U4[3] = 0x00100010;
372                                 gpuSetCLUT    (PacketBuffer.U4[2] >> 16);
373                                 gpuSetTexture (GPU_GP1);
374                                 if ((PacketBuffer.U1[0]>0x5F) && (PacketBuffer.U1[1]>0x5F) && (PacketBuffer.U1[2]>0x5F))
375                                         gpuDrawS(gpuSpriteSpanDrivers [Blending_Mode | TEXT_MODE | Masking | Blending | (enableAbbeyHack<<7)  | PixelMSB]);
376                                 else
377                                         gpuDrawS(gpuSpriteSpanDrivers [Blending_Mode | TEXT_MODE | Masking | Blending | Lighting | (enableAbbeyHack<<7)  | PixelMSB]);
378                                 DO_LOG(("gpuDrawS(0x%x)\n",PRIM));
379                         }
380                         break;
381                 case 0x80:          //  vid -> vid
382                         gpuMoveImage();   //  prim handles updateLace && skip
383                         DO_LOG(("gpuMoveImage(0x%x)\n",PRIM));
384                         break;
385                 case 0xA0:          //  sys ->vid
386                         gpuLoadImage();   //  prim handles updateLace && skip
387 #ifndef isSkip // not a define
388                         if (alt_fps) isSkip=false;
389 #endif
390                         DO_LOG(("gpuLoadImage(0x%x)\n",PRIM));
391                         break;
392                 case 0xC0:          //  vid -> sys
393                         gpuStoreImage();  //  prim handles updateLace && skip
394                         DO_LOG(("gpuStoreImage(0x%x)\n",PRIM));
395                         break;
396                 case 0xE1:
397                         {
398                                 const u32 temp = PacketBuffer.U4[0];
399                                 GPU_GP1 = (GPU_GP1 & ~0x000007FF) | (temp & 0x000007FF);
400                                 gpuSetTexture(temp);
401                                 DO_LOG(("gpuSetTexture(0x%x)\n",PRIM));
402                         }
403                         break;
404                 case 0xE2:        
405                         {
406                                 static const u8  TextureMask[32] = {
407                                         255, 7, 15, 7, 31, 7, 15, 7, 63, 7, 15, 7, 31, 7, 15, 7,        //
408                                         127, 7, 15, 7, 31, 7, 15, 7, 63, 7, 15, 7, 31, 7, 15, 7   //
409                                 };
410                                 const u32 temp = PacketBuffer.U4[0];
411                                 TextureWindow[0] = ((temp >> 10) & 0x1F) << 3;
412                                 TextureWindow[1] = ((temp >> 15) & 0x1F) << 3;
413                                 TextureWindow[2] = TextureMask[(temp >> 0) & 0x1F];
414                                 TextureWindow[3] = TextureMask[(temp >> 5) & 0x1F];
415                                 gpuSetTexture(GPU_GP1);
416                                 //isSkip = false;
417                                 DO_LOG(("TextureWindow(0x%x)\n",PRIM));
418                         }
419                         break;
420                 case 0xE3:
421                         {
422                                 const u32 temp = PacketBuffer.U4[0];
423                                 DrawingArea[0] = temp         & 0x3FF;
424                                 DrawingArea[1] = (temp >> 10) & 0x3FF;
425                                 //isSkip = false;
426                                 DO_LOG(("DrawingArea_Pos(0x%x)\n",PRIM));
427                         }
428                         break;
429                 case 0xE4:
430                         {
431                                 const u32 temp = PacketBuffer.U4[0];
432                                 DrawingArea[2] = (temp         & 0x3FF) + 1;
433                                 DrawingArea[3] = ((temp >> 10) & 0x3FF) + 1;
434                                 //isSkip = false;
435                                 DO_LOG(("DrawingArea_Size(0x%x)\n",PRIM));
436                         }
437                         break;
438                 case 0xE5:
439                         {
440                                 const u32 temp = PacketBuffer.U4[0];
441                                 DrawingOffset[0] = ((s32)temp<<(32-11))>>(32-11);
442                                 DrawingOffset[1] = ((s32)temp<<(32-22))>>(32-11);
443                                 //isSkip = false;
444                                 DO_LOG(("DrawingOffset(0x%x)\n",PRIM));
445                         }
446                         break;
447                 case 0xE6:
448                         {
449                                 const u32 temp = PacketBuffer.U4[0];
450                                 //GPU_GP1 = (GPU_GP1 & ~0x00001800) | ((temp&3) << 11);
451                                 Masking = (temp & 0x2) <<  1;
452                                 PixelMSB =(temp & 0x1) <<  8;
453                                 DO_LOG(("SetMask(0x%x)\n",PRIM));
454                         }
455                         break;
456         }
457 }