/[pcsx2_0.9.7]/trunk/plugins/zzogl-pg/opengl/ZZoglFlushHack.cpp
ViewVC logotype

Contents of /trunk/plugins/zzogl-pg/opengl/ZZoglFlushHack.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 280 - (show annotations) (download)
Thu Dec 23 12:02:12 2010 UTC (9 years, 2 months ago) by william
File size: 15519 byte(s)
re-commit (had local access denied errors when committing)
1 /* ZZ Open GL graphics plugin
2 * Copyright (c)2010 gregory.hainaut@gmail.com, zeydlitz@gmail.com
3 * Based on GSdx Copyright (C) 2007-2009 Gabest
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 Free Software
17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
18 */
19
20 /* This file is a collection of hack for removing the blur effect on some games
21 * The blur renders very badly on high screen flat panel.
22 *
23 * To avoid severals combo-box, the hack detects the game based on crc
24 */
25
26 #include "ZZoglFlushHack.h"
27
28 inline bool GABEST_HAS_SHARED_BITS (int fbp, int fpsm, int tbp, int tpsm)
29 {
30 if ( !PSMT_HAS_SHARED_BITS (fpsm, tpsm) )
31 return ((fbp ^ tbp) == 0);
32 else
33 return false;
34 }
35
36
37 // GSC_... function has been imported from GSdx
38 void GSC_Okami(const GSFrameInfo& fi, int& skip)
39 {
40 if(skip == 0)
41 {
42 if(fi.TME && fi.FBP == 0x00e00 && fi.FPSM == PSMCT32 && fi.TBP0 == 0x00000 && fi.TPSM == PSMCT32)
43 skip = 1000;
44 }
45 else
46 {
47 if(fi.TME && fi.FBP == 0x00e00 && fi.FPSM == PSMCT32 && fi.TBP0 == 0x03800 && fi.TPSM == PSMT4)
48 skip = 0;
49 }
50 }
51
52 void GSC_MetalGearSolid3(const GSFrameInfo& fi, int& skip)
53 {
54 if(skip == 0)
55 {
56 if(fi.TME && fi.FBP == 0x02000 && fi.FPSM == PSMCT32 && (fi.TBP0 == 0x00000 || fi.TBP0 == 0x01000) && fi.TPSM == PSMCT24)
57 skip = 1000; // 76, 79
58 else if(fi.TME && fi.FBP == 0x02800 && fi.FPSM == PSMCT24 && (fi.TBP0 == 0x00000 || fi.TBP0 == 0x01000) && fi.TPSM == PSMCT32)
59 skip = 1000; // 69
60 }
61 else
62 {
63 if(!fi.TME && (fi.FBP == 0x00000 || fi.FBP == 0x01000) && fi.FPSM == PSMCT32)
64 skip = 0;
65 }
66 }
67
68 void GSC_DBZBT2(const GSFrameInfo& fi, int& skip)
69 {
70 if(skip == 0)
71 {
72 if(fi.TME && /*fi.FBP == 0x00000 && fi.FPSM == PSMCT16 &&*/ fi.TBP0 == 0x02000 && fi.TPSM == PSMT16Z)
73 skip = 27;
74 else if(!fi.TME && fi.FBP == 0x03000 && fi.FPSM == PSMCT16)
75 skip = 10;
76 }
77 }
78
79 void GSC_DBZBT3(const GSFrameInfo& fi, int& skip)
80 {
81 if(skip == 0)
82 {
83 if(fi.TME && fi.FBP == 0x01c00 && fi.FPSM == PSMCT32 && (fi.TBP0 == 0x00000 || fi.TBP0 == 0x00e00) && fi.TPSM == PSMT8H)
84 skip = 24; // blur
85 else if(fi.TME && (fi.FBP == 0x00000 || fi.FBP == 0x00e00) && fi.FPSM == PSMCT32 && fi.TPSM == PSMT8H)
86 skip = 28; // outline
87 }
88 }
89
90 void GSC_SFEX3(const GSFrameInfo& fi, int& skip)
91 {
92 if(skip == 0)
93 {
94 if(fi.TME && fi.FBP == 0x00500 && fi.FPSM == PSMCT16 && fi.TBP0 == 0x00f00 && fi.TPSM == PSMCT16)
95 skip = 2; // blur
96 }
97 }
98
99 void GSC_Bully(const GSFrameInfo& fi, int& skip)
100 {
101 if(skip == 0)
102 {
103 // Test is useless !
104 // if(fi.TME && (fi.FBP == 0x00000 || fi.FBP == 0x01180) && (fi.TBP0 == 0x00000 || fi.TBP0 == 0x01180) && fi.FBP == fi.TBP0 && fi.FPSM == PSMCT32 && fi.FPSM == fi.TPSM)
105 // return; // allowed
106 if(fi.TME && (fi.FBP == 0x00000 || fi.FBP == 0x01180) && fi.FPSM == PSMCT16S && fi.TBP0 == 0x02300 && fi.TPSM == PSMT16SZ)
107 skip = 6;
108 }
109 else
110 {
111 if(!fi.TME && (fi.FBP == 0x00000 || fi.FBP == 0x01180) && fi.FPSM == PSMCT32)
112 skip = 0;
113 }
114 }
115
116 void GSC_BullyCC(const GSFrameInfo& fi, int& skip)
117 {
118 if(skip == 0)
119 {
120 // Test is useless !
121 // if(fi.TME && (fi.FBP == 0x00000 || fi.FBP == 0x01180) && (fi.TBP0 == 0x00000 || fi.TBP0 == 0x01180) && fi.FBP == fi.TBP0 && fi.FPSM == PSMCT32 && fi.FPSM == fi.TPSM)
122 // return; // allowed
123
124 if(!fi.TME && fi.FBP == 0x02800 && fi.FPSM == PSMCT24)
125 skip = 9;
126 }
127 }
128
129 void GSC_SoTC(const GSFrameInfo& fi, int& skip)
130 {
131 // Not needed anymore? What did it fix anyway? (rama)
132 /*if(skip == 0)
133 {
134 if(fi.TME && fi.FBP == 0x02b80 && fi.FPSM == PSMCT24 && fi.TBP0 == 0x01e80 && fi.TPSM == PSMCT24)
135 skip = 9;
136 else if(fi.TME && fi.FBP == 0x01c00 && fi.FPSM == PSMCT32 && fi.TBP0 == 0x03800 && fi.TPSM == PSMCT32)
137 skip = 8;
138 else if(fi.TME && fi.FBP == 0x01e80 && fi.FPSM == PSMCT32 && fi.TBP0 == 0x03880 && fi.TPSM == PSMCT32)
139 skip = 8;
140 }*/
141 }
142
143 void GSC_OnePieceGrandAdventure(const GSFrameInfo& fi, int& skip)
144 {
145 if(skip == 0)
146 {
147 if(fi.TME && fi.FBP == 0x02d00 && fi.FPSM == PSMCT16 && (fi.TBP0 == 0x00000 || fi.TBP0 == 0x00e00 || fi.TBP0 == 0x00f00) && fi.TPSM == PSMCT16)
148 skip = 4;
149 }
150 }
151
152 void GSC_OnePieceGrandBattle(const GSFrameInfo& fi, int& skip)
153 {
154 if(skip == 0)
155 {
156 if(fi.TME && fi.FBP == 0x02d00 && fi.FPSM == PSMCT16 && (fi.TBP0 == 0x00000 || fi.TBP0 == 0x00f00) && fi.TPSM == PSMCT16)
157 skip = 4;
158 }
159 }
160
161 void GSC_ICO(const GSFrameInfo& fi, int& skip)
162 {
163 if(skip == 0)
164 {
165 if(fi.TME && fi.FBP == 0x00800 && fi.FPSM == PSMCT32 && fi.TBP0 == 0x03d00 && fi.TPSM == PSMCT32)
166 skip = 3;
167 else if(fi.TME && fi.FBP == 0x00800 && fi.FPSM == PSMCT32 && fi.TBP0 == 0x02800 && fi.TPSM == PSMT8H)
168 skip = 1;
169 }
170 else
171 {
172 if(fi.TME && fi.TBP0 == 0x00800 && fi.TPSM == PSMCT32)
173 skip = 0;
174 }
175 }
176
177 void GSC_GT4(const GSFrameInfo& fi, int& skip)
178 {
179 if(skip == 0)
180 {
181 if(fi.TME && (fi.FBP == 0x03440 || fi.FBP >= 0x03e00) && fi.FPSM == PSMCT32 && (fi.TBP0 == 0x00000 || fi.TBP0 == 0x01400) && fi.TPSM == PSMT8)
182 skip = 880;
183 else if(fi.TME && (fi.FBP == 0x00000 || fi.FBP == 0x01400) && fi.FPSM == PSMCT24 && fi.TBP0 >= 0x03420 && fi.TPSM == PSMT8)
184 {
185 // TODO: removes gfx from where it is not supposed to (garage)
186 // skip = 58;
187 }
188 }
189 }
190
191 void GSC_WildArms4(const GSFrameInfo& fi, int& skip)
192 {
193 if(skip == 0)
194 {
195 if(fi.TME && fi.FBP == 0x03100 && fi.FPSM == PSMT32Z && fi.TBP0 == 0x01c00 && fi.TPSM == PSMT32Z)
196 skip = 100;
197 }
198 else
199 {
200 if(fi.TME && fi.FBP == 0x00e00 && fi.FPSM == PSMCT32 && fi.TBP0 == 0x02a00 && fi.TPSM == PSMCT32)
201 skip = 1;
202 }
203 }
204
205 void GSC_WildArms5(const GSFrameInfo& fi, int& skip)
206 {
207 if(skip == 0)
208 {
209 if(fi.TME && fi.FBP == 0x03100 && fi.FPSM == PSMT32Z && fi.TBP0 == 0x01c00 && fi.TPSM == PSMT32Z)
210 skip = 100;
211 }
212 else
213 {
214 if(fi.TME && fi.FBP == 0x00e00 && fi.FPSM == PSMCT32 && fi.TBP0 == 0x02a00 && fi.TPSM == PSMCT32)
215 skip = 1;
216 }
217 }
218
219 void GSC_Manhunt2(const GSFrameInfo& fi, int& skip)
220 {
221 if(skip == 0)
222 {
223 if(fi.TME && fi.FBP == 0x03c20 && fi.FPSM == PSMCT32 && fi.TBP0 == 0x01400 && fi.TPSM == PSMT8)
224 skip = 640;
225 }
226 }
227
228 void GSC_CrashBandicootWoC(const GSFrameInfo& fi, int& skip)
229 {
230 if(skip == 0)
231 {
232 // Test is useless !
233 // if(fi.TME && (fi.FBP == 0x00000 || fi.FBP == 0x00a00) && (fi.TBP0 == 0x00000 || fi.TBP0 == 0x00a00) && fi.FBP == fi.TBP0 && fi.FPSM == PSMCT32 && fi.FPSM == fi.TPSM)
234 // return false; // allowed
235
236 if(fi.TME && fi.FBP == 0x02200 && fi.FPSM == PSMT24Z && fi.TBP0 == 0x01400 && fi.TPSM == PSMT24Z)
237 skip = 41;
238 }
239 else
240 {
241 if(fi.TME && (fi.FBP == 0x00000 || fi.FBP == 0x00a00) && fi.FPSM == PSMCT32 && fi.TBP0 == 0x03c00 && fi.TPSM == PSMCT32)
242 skip = 0;
243 else if(!fi.TME && (fi.FBP == 0x00000 || fi.FBP == 0x00a00))
244 skip = 0;
245 }
246 }
247
248 void GSC_ResidentEvil4(const GSFrameInfo& fi, int& skip)
249 {
250 if(skip == 0)
251 {
252 if(fi.TME && fi.FBP == 0x03100 && fi.FPSM == PSMCT32 && fi.TBP0 == 0x01c00 && fi.TPSM == PSMT24Z)
253 skip = 176;
254 }
255 }
256
257 void GSC_Spartan(const GSFrameInfo& fi, int& skip)
258 {
259 if(skip == 0)
260 {
261 if(fi.TME && fi.FBP == 0x02000 && fi.FPSM == PSMCT32 && fi.TBP0 == 0x00000 && fi.TPSM == PSMCT32)
262 skip = 107;
263 }
264 }
265
266 void GSC_AceCombat4(const GSFrameInfo& fi, int& skip)
267 {
268 if(skip == 0)
269 {
270 if(fi.TME && fi.FBP == 0x02a00 && fi.FPSM == PSMT24Z && fi.TBP0 == 0x01600 && fi.TPSM == PSMT24Z)
271 skip = 71; // clouds (z, 16-bit)
272 else if(fi.TME && fi.FBP == 0x02900 && fi.FPSM == PSMCT32 && fi.TBP0 == 0x00000 && fi.TPSM == PSMCT24)
273 skip = 28; // blur
274 }
275 }
276
277 void GSC_Drakengard2(const GSFrameInfo& fi, int& skip)
278 {
279 if(skip == 0)
280 {
281 if(fi.TME && fi.FBP == 0x026c0 && fi.FPSM == PSMCT32 && fi.TBP0 == 0x00a00 && fi.TPSM == PSMCT32)
282 skip = 64;
283 }
284 }
285
286 void GSC_Tekken5(const GSFrameInfo& fi, int& skip)
287 {
288 if(skip == 0)
289 {
290 if(fi.TME && fi.FBP == 0x02ea0 && fi.FPSM == PSMCT32 && fi.TBP0 == 0x00000 && fi.TPSM == PSMCT32)
291 skip = 95;
292 }
293 }
294
295 void GSC_IkkiTousen(const GSFrameInfo& fi, int& skip)
296 {
297 if(skip == 0)
298 {
299 if(fi.TME && fi.FBP == 0x00a80 && fi.FPSM == PSMT24Z && fi.TBP0 == 0x01180 && fi.TPSM == PSMT24Z)
300 skip = 1000; // shadow (result is broken without depth copy, also includes 16 bit)
301 else if(fi.TME && fi.FBP == 0x00700 && fi.FPSM == PSMT24Z && fi.TBP0 == 0x01180 && fi.TPSM == PSMT24Z)
302 skip = 11; // blur
303 }
304 else if(skip > 7)
305 {
306 if(fi.TME && fi.FBP == 0x00700 && fi.FPSM == PSMCT16 && fi.TBP0 == 0x00700 && fi.TPSM == PSMCT16)
307 skip = 7; // the last steps of shadow drawing
308 }
309 }
310
311 void GSC_GodOfWar(const GSFrameInfo& fi, int& skip)
312 {
313 if(skip == 0)
314 {
315 if(fi.TME && fi.FBP == 0x00000 && fi.FPSM == PSMCT16 && fi.TBP0 == 0x00000 && fi.TPSM == PSMCT16)
316 {
317 // skip = 30; //GSdx
318 skip = 4; // 23 or 4 need more testing
319 }
320 else if(fi.TME && fi.FBP == 0x00000 && fi.FPSM == PSMCT32 && fi.TBP0 == 0x00000 && fi.TPSM == PSMCT32 && fi.FBMSK == 0xff000000)
321 skip = 1; // blur
322 else if(fi.FBP == 0x00000 && fi.FPSM == PSMCT32 && fi.TPSM == PSMT8
323 && ((fi.TZTST == 2 && fi.FBMSK == 0x00FFFFFF) || (fi.TZTST == 1 && fi.FBMSK == 0x00FFFFFF) || (fi.TZTST == 3 && fi.FBMSK == 0xFF000000)))
324 skip = 1; // wall of fog
325 }
326 }
327
328 void GSC_GodOfWar2(const GSFrameInfo& fi, int& skip)
329 {
330 if(skip == 0)
331 {
332 if(fi.TME)
333 {
334 if((fi.FBP == 0x00100 && fi.FPSM == PSMCT16 && fi.TBP0 == 0x00100 && fi.TPSM == PSMCT16) // ntsc
335 || (fi.FBP == 0x02100 && fi.FPSM == PSMCT16 && fi.TBP0 == 0x02100 && fi.TPSM == PSMCT16)) // pal
336 skip = 29; // shadows
337 if(fi.FBP == 0x00100 && fi.FPSM == PSMCT32 && (fi.TBP0 & 0x03000) == 0x03000
338 && (fi.TPSM == PSMT8 || fi.TPSM == PSMT4)
339 && ((fi.TZTST == 2 && fi.FBMSK == 0x00FFFFFF) || (fi.TZTST == 1 && fi.FBMSK == 0x00FFFFFF) || (fi.TZTST == 3 && fi.FBMSK == 0xFF000000)))
340 skip = 1; // wall of fog
341 }
342 }
343 }
344
345 void GSC_GiTS(const GSFrameInfo& fi, int& skip)
346 {
347 if(skip == 0)
348 {
349 if(fi.TME && fi.FBP == 0x01400 && fi.FPSM == PSMCT16 && fi.TBP0 == 0x02e40 && fi.TPSM == PSMCT16)
350 skip = 1315;
351 }
352 }
353
354 void GSC_Onimusha3(const GSFrameInfo& fi, int& skip)
355 {
356 if(fi.TME /*&& (fi.FBP == 0x00000 || fi.FBP == 0x00700)*/ && (fi.TBP0 == 0x01180 || fi.TBP0 == 0x00e00 || fi.TBP0 == 0x01000 || fi.TBP0 == 0x01200) && (fi.TPSM == PSMCT32 || fi.TPSM == PSMCT24))
357 skip = 1;
358 }
359
360 void GSC_TalesOfAbyss(const GSFrameInfo& fi, int& skip)
361 {
362 if(skip == 0)
363 {
364 if(fi.TME && (fi.FBP == 0x00000 || fi.FBP == 0x00e00) && fi.TBP0 == 0x01c00 && fi.TPSM == PSMT8) // copies the z buffer to the alpha channel of the fb
365 skip = 1000;
366 else if(fi.TME && (fi.FBP == 0x00000 || fi.FBP == 0x00e00) && (fi.TBP0 == 0x03560 || fi.TBP0 == 0x038e0) && fi.TPSM == PSMCT32)
367 skip = 1;
368 }
369 else
370 {
371 if(fi.TME && fi.TPSM != PSMT8)
372 skip = 0;
373 }
374 }
375
376 void GSC_SonicUnleashed(const GSFrameInfo& fi, int& skip)
377 {
378 if(skip == 0)
379 {
380 if(fi.TME && fi.FBP == 0x02200 && fi.FPSM == PSMCT16S && fi.TBP0 == 0x00000 && fi.TPSM == PSMCT16)
381 skip = 1000; // shadow
382 }
383 else
384 {
385 if(fi.TME && fi.FBP == 0x00000 && fi.FPSM == PSMCT16 && fi.TBP0 == 0x02200 && fi.TPSM == PSMCT16S)
386 skip = 2;
387 }
388 }
389
390 void GSC_Genji(const GSFrameInfo& fi, int& skip)
391 {
392 if(skip == 0)
393 {
394 if(fi.TME && fi.FBP == 0x01500 && fi.FPSM == PSMCT16 && fi.TBP0 == 0x00e00 && fi.TPSM == PSMT16Z)
395 skip = 6; //
396 }
397 }
398
399 void GSC_StarOcean3(const GSFrameInfo& fi, int& skip)
400 {
401 if(skip == 0)
402 {
403 if(fi.TME && fi.FBP == fi.TBP0 && fi.FPSM == PSMCT32 && fi.TPSM == PSMT4HH)
404 skip = 1000; //
405 }
406 else
407 {
408 if(!(fi.TME && fi.FBP == fi.TBP0 && fi.FPSM == PSMCT32 && fi.TPSM == PSMT4HH))
409 skip = 0;
410 }
411 }
412
413 void GSC_ValkyrieProfile2(const GSFrameInfo& fi, int& skip)
414 {
415 if(skip == 0)
416 {
417 if(fi.TME && fi.FBP == fi.TBP0 && fi.FPSM == PSMCT32 && fi.TPSM == PSMT4HH)
418 skip = 1000; //
419 }
420 else
421 {
422 if(!(fi.TME && fi.FBP == fi.TBP0 && fi.FPSM == PSMCT32 && fi.TPSM == PSMT4HH))
423 skip = 0;
424 }
425 }
426
427 void GSC_RadiataStories(const GSFrameInfo& fi, int& skip)
428 {
429 if(skip == 0)
430 {
431 if(fi.TME && fi.FBP == fi.TBP0 && fi.FPSM == PSMCT32 && fi.TPSM == PSMT4HH)
432 skip = 1000; // Shadows
433 else if (fi.TME && fi.FBP == fi.TBP0 && (fi.TBP0 == 0x3700 || fi.TBP0 == 0x3400) && fi.TZTST == 1)
434 skip = 1; // Start manu issue;
435 }
436 else
437 {
438 if(!(fi.TME && fi.FBP == fi.TBP0 && fi.FPSM == PSMCT32 && fi.TPSM == PSMT4HH))
439 skip = 0;
440 }
441 }
442
443 bool GSC_HauntingGround(const GSFrameInfo& fi, int& skip)
444 {
445 // Note GSdx seems to use invert somewhere FBMSK. So values were inverted
446 if(skip == 0)
447 {
448 if(fi.TME && fi.FPSM == fi.TPSM && fi.TPSM == PSMCT16S && fi.FBMSK == ~(0x03FFF))
449 skip = 1;
450 else if(fi.TME && fi.FBP == 0x3000 && fi.TBP0 == 0x3380)
451 skip = 1; // bloom
452 else if(fi.TME && fi.FBP == fi.TBP0 && fi.TBP0 == 0x3000 && fi.FBMSK == ~(0xFFFFFF) &&
453 GABEST_HAS_SHARED_BITS(fi.FBP, fi.FPSM, fi.TBP0, fi.TPSM))
454 skip = 1;
455 }
456
457 return true;
458 }
459
460 // Record skipped frame to allow better analysis
461 // #define FRAME_RECORDING_ON 1
462 #ifdef FRAME_RECORDING_ON
463 static const u32 MAX_FRAMES = 500;
464 static GSFrameInfo FrameAppear[MAX_FRAMES];
465 static u32 Rec_Numbers = 0;
466
467 void RecordNewFrames(VB& curvb, GSFrameInfo fi) {
468 if (Rec_Numbers >= MAX_FRAMES)
469 return;
470
471 u32 i;
472 bool was_recorded = false;
473 for (i = 0; i < Rec_Numbers; i++ ) {
474 if (FrameAppear[i].FBP == fi.FBP && FrameAppear[i].FPSM == fi.FPSM
475 && FrameAppear[i].TBP0 == fi.TBP0 && FrameAppear[i].TPSM == fi.TPSM) {
476 was_recorded = true;
477 break;
478 }
479 }
480 if (!was_recorded) {
481 FrameAppear[Rec_Numbers] = fi;
482 Rec_Numbers++;
483 ZZLog::Print( "New frame %d, skip %d | fpb: %x fpsm: %d fpmsk: %x tme: %x tbp0: %x tpsm: %d tztst: %x | bits %d\n", \
484 Rec_Numbers, g_SkipFlushFrame, fi.FBP, fi.FPSM, fi.FBMSK, fi.TME, fi.TBP0, fi.TPSM, fi.TZTST, GABEST_HAS_SHARED_BITS(fi.FBP, fi.FPSM, fi.TBP0, fi.TPSM) );
485
486 // Dump a nice picture of the frame
487 char filename[255];
488 sprintf(filename, "SkipFlushFrame_%d__%d.tga", g_SkipFlushFrame, Rec_Numbers);
489 SaveRenderTarget(filename, curvb.prndr->fbw, curvb.prndr->fbh, 0);
490 }
491 }
492 #endif
493
494 __forceinline bool IsBadFrame(VB& curvb)
495 {
496 GSFrameInfo fi;
497
498 // Keep GSdx naming convention to ease sharing code
499 fi.FBP = curvb.frame.fbp;
500 fi.FPSM = curvb.frame.psm;
501 fi.FBMSK = ~curvb.frame.fbm;
502 fi.TME = curvb.curprim.tme;
503 fi.TBP0 = curvb.tex0.tbp0;
504 fi.TPSM = curvb.tex0.psm;
505 fi.TZTST = curvb.test.ztst;
506
507 if (GetSkipCount_Handler && conf.settings().automatic_skip_draw)
508 GetSkipCount_Handler(fi, g_SkipFlushFrame);
509
510 if(g_SkipFlushFrame == 0 && (conf.SkipDraw > 0))
511 {
512 if(fi.TME)
513 {
514 // depth textures (bully, mgs3s1 intro, Front Mission 5)
515 // Or General, often problematic post processing
516 if (PSMT_ISZTEX(fi.TPSM) || (GABEST_HAS_SHARED_BITS(fi.FBP, fi.FPSM, fi.TBP0, fi.TPSM)))
517 g_SkipFlushFrame = conf.SkipDraw;
518 }
519 }
520
521 if(g_SkipFlushFrame > 0)
522 {
523 #ifdef FRAME_RECORDING_ON
524 RecordNewFrames(curvb, fi);
525 #endif
526 g_SkipFlushFrame--;
527 return true;
528 }
529
530 return false;
531 }

  ViewVC Help
Powered by ViewVC 1.1.22