frontend: enable SPUIRQWait by default
[pcsx_rearmed.git] / plugins / gpu_unai / gpu_raster_image.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 gpuLoadImage(void)
23 {
24         u16 x0, y0, w0, h0;
25         x0 = PacketBuffer.U2[2] & 1023;
26         y0 = PacketBuffer.U2[3] & 511;
27         w0 = PacketBuffer.U2[4];
28         h0 = PacketBuffer.U2[5];
29
30         if ((y0 + h0) > FRAME_HEIGHT)
31         {
32                 h0 = FRAME_HEIGHT - y0;
33         }
34
35         FrameToWrite = ((w0)&&(h0));
36
37         px = 0;
38         py = 0;
39         x_end = w0;
40         y_end = h0;
41         pvram = &((u16*)GPU_FrameBuffer)[x0+(y0*1024)];
42
43         GPU_GP1 |= 0x08000000;
44 }
45
46 ///////////////////////////////////////////////////////////////////////////////
47 INLINE void gpuStoreImage(void)
48 {
49         u16 x0, y0, w0, h0;
50         x0 = PacketBuffer.U2[2] & 1023;
51         y0 = PacketBuffer.U2[3] & 511;
52         w0 = PacketBuffer.U2[4];
53         h0 = PacketBuffer.U2[5];
54
55         if ((y0 + h0) > FRAME_HEIGHT)
56         {
57                 h0 = FRAME_HEIGHT - y0;
58         }
59         FrameToRead = ((w0)&&(h0));
60
61         px = 0;
62         py = 0;
63         x_end = w0;
64         y_end = h0;
65         pvram = &((u16*)GPU_FrameBuffer)[x0+(y0*1024)];
66         
67         GPU_GP1 |= 0x08000000;
68 }
69
70 INLINE void gpuMoveImage(void)
71 {
72         u32 x0, y0, x1, y1;
73         s32 w0, h0;
74         x0 = PacketBuffer.U2[2] & 1023;
75         y0 = PacketBuffer.U2[3] & 511;
76         x1 = PacketBuffer.U2[4] & 1023;
77         y1 = PacketBuffer.U2[5] & 511;
78         w0 = PacketBuffer.U2[6];
79         h0 = PacketBuffer.U2[7];
80
81         if( (x0==x1) && (y0==y1) ) return;
82         if ((w0<=0) || (h0<=0)) return;
83         
84         if (((y0+h0)>512)||((x0+w0)>1024)||((y1+h0)>512)||((x1+w0)>1024))
85         {
86                 u16 *psxVuw=GPU_FrameBuffer;
87                 s32 i,j;
88             for(j=0;j<h0;j++)
89                  for(i=0;i<w0;i++)
90                   psxVuw [(1024*((y1+j)&511))+((x1+i)&0x3ff)]=
91                    psxVuw[(1024*((y0+j)&511))+((x0+i)&0x3ff)];
92         }
93         else if ((x0&1)||(x1&1))
94         {
95                 u16 *lpDst, *lpSrc;
96                 lpDst = lpSrc = (u16*)GPU_FrameBuffer;
97                 lpSrc += FRAME_OFFSET(x0, y0);
98                 lpDst += FRAME_OFFSET(x1, y1);
99                 x1 = FRAME_WIDTH - w0;
100                 do {
101                         x0=w0;
102                         do { *lpDst++ = *lpSrc++; } while (--x0);
103                         lpDst += x1;
104                         lpSrc += x1;
105                 } while (--h0);
106         }
107         else
108         {
109                 u32 *lpDst, *lpSrc;
110                 lpDst = lpSrc = (u32*)(void*)GPU_FrameBuffer;
111                 lpSrc += ((FRAME_OFFSET(x0, y0))>>1);
112                 lpDst += ((FRAME_OFFSET(x1, y1))>>1);
113                 if (w0&1)
114                 {
115                         x1 = (FRAME_WIDTH - w0 +1)>>1;
116                         w0>>=1;
117                         if (!w0) {
118                                 do {
119                                         *((u16*)lpDst) = *((u16*)lpSrc);
120                                         lpDst += x1;
121                                         lpSrc += x1;
122                                 } while (--h0);
123                         } else
124                         do {
125                                 x0=w0;
126                                 do { *lpDst++ = *lpSrc++; } while (--x0);
127                                 *((u16*)lpDst) = *((u16*)lpSrc);
128                                 lpDst += x1;
129                                 lpSrc += x1;
130                         } while (--h0);
131                 }
132                 else
133                 {
134                         x1 = (FRAME_WIDTH - w0)>>1;
135                         w0>>=1;
136                         do {
137                                 x0=w0;
138                                 do { *lpDst++ = *lpSrc++; } while (--x0);
139                                 lpDst += x1;
140                                 lpSrc += x1;
141                         } while (--h0);
142                 }
143         }
144 }
145
146 INLINE void gpuClearImage(void)
147 {
148         s32   x0, y0, w0, h0;
149         x0 = PacketBuffer.S2[2];
150         y0 = PacketBuffer.S2[3];
151         w0 = PacketBuffer.S2[4] & 0x3ff;
152         h0 = PacketBuffer.S2[5] & 0x3ff;
153          
154         w0 += x0;
155         if (x0 < 0) x0 = 0;
156         if (w0 > FRAME_WIDTH) w0 = FRAME_WIDTH;
157         w0 -= x0;
158         if (w0 <= 0) return;
159         h0 += y0;
160         if (y0 < 0) y0 = 0;
161         if (h0 > FRAME_HEIGHT) h0 = FRAME_HEIGHT;
162         h0 -= y0;
163         if (h0 <= 0) return;
164
165         if (x0&1)
166         {
167                 u16* pixel = (u16*)GPU_FrameBuffer + FRAME_OFFSET(x0, y0);
168                 u16 rgb = GPU_RGB16(PacketBuffer.S4[0]);
169                 y0 = FRAME_WIDTH - w0;
170                 do {
171                         x0=w0;
172                         do { *pixel++ = rgb; } while (--x0);
173                         pixel += y0;
174                 } while (--h0);
175         }
176         else
177         {
178                 u32* pixel = (u32*)(void*)GPU_FrameBuffer + ((FRAME_OFFSET(x0, y0))>>1);
179                 u32 rgb = GPU_RGB16(PacketBuffer.S4[0]);
180                 rgb |= (rgb<<16);
181                 if (w0&1)
182                 {
183                         y0 = (FRAME_WIDTH - w0 +1)>>1;
184                         w0>>=1;
185                         do {
186                                 x0=w0;
187                                 do { *pixel++ = rgb; } while (--x0);
188                                 *((u16*)pixel) = (u16)rgb;
189                                 pixel += y0;
190                         } while (--h0);
191                 }
192                 else
193                 {
194                         y0 = (FRAME_WIDTH - w0)>>1;
195                         w0>>=1;
196                         do {
197                                 x0=w0;
198                                 do { *pixel++ = rgb; } while (--x0);
199                                 pixel += y0;
200                         } while (--h0);
201                 }
202         }
203 }