Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

644 lines
20 KiB

  1. /******************************************************************************\
  2. *
  3. * $Workfile: LAGUNA.H $
  4. *
  5. * This file to be included by all host programs.
  6. *
  7. * Copyright (c) 1995,1997 Cirrus Logic, Inc.
  8. *
  9. * $Log: X:/log/laguna/nt35/displays/cl546x/LAGUNA.H $
  10. *
  11. * Rev 1.38 Mar 04 1998 16:13:30 frido
  12. * Removed a warning message for the 5462/5464 chips in the REQUIRE
  13. * macro.
  14. *
  15. * Rev 1.37 Mar 04 1998 16:08:50 frido
  16. * Removed an invalid break.
  17. *
  18. * Rev 1.36 Mar 04 1998 14:54:48 frido
  19. * Added contional REQUIRE in the new shadow macros.
  20. *
  21. * Rev 1.35 Mar 04 1998 14:52:54 frido
  22. * Added new shadowing macros.
  23. *
  24. * Rev 1.34 Feb 27 1998 17:02:16 frido
  25. * Changed REQUIRE and WRITE_STRING macros for new
  26. * shadowQFREE register.
  27. *
  28. * Rev 1.33 Jan 20 1998 11:42:46 frido
  29. * Changed REQUIRE and WRITESTRING macros to support the new
  30. * scheme for GBP on.
  31. * Added shadowing of BGCOLOR and DRAWBLTDEF registers.
  32. *
  33. * Rev 1.32 Jan 16 1998 09:50:38 frido
  34. * Changed the way the GBP OFF handles WRITE_STRING macros.
  35. *
  36. * Rev 1.31 Dec 10 1997 13:24:58 frido
  37. * Merged from 1.62 branch.
  38. *
  39. * Rev 1.30.1.0 Nov 18 1997 18:09:00 frido
  40. * Changed WRITE_STRING macro so it will work when
  41. * DATASTREAMING is turned of.
  42. * Changed FUDGE to 0, we are not using DMA inside NT.
  43. *
  44. * Rev 1.30 Nov 04 1997 19:01:18 frido
  45. * Changed HOSTDATA size from 0x800 DWORDs into 0x800 BYTEs. Silly me!
  46. *
  47. * Rev 1.29 Nov 04 1997 09:17:30 frido
  48. * Added Data Streaming macros (REQUIRE and WRITE_STRING).
  49. *
  50. \******************************************************************************/
  51. #ifndef _LAGUNA_H
  52. #define _LAGUNA_H
  53. #include "optimize.h"
  54. #include "config.h"
  55. #include "lgregs.h"
  56. //
  57. // PCI ID for Laguna chips.
  58. //
  59. #define CL_GD5462 0x00D0 // 5462
  60. #define CL_GD5464 0x00D4 // 5464
  61. #define CL_GD5464_BD 0x00D5 // 5464 BD
  62. #define CL_GD5465 0x00D6 // 5465
  63. //
  64. // These chips don't exist yet, but we're FORWARD COMPATIBLE
  65. // so we'll define them anyway. I've been GUARENTEED that they
  66. // will look and feel just like 5465 chips.
  67. //
  68. #define CL_GD546x_F7 0x00D7
  69. #define CL_GD546x_F8 0x00D8
  70. #define CL_GD546x_F9 0x00D9
  71. #define CL_GD546x_FA 0x00DA
  72. #define CL_GD546x_FB 0x00DB
  73. #define CL_GD546x_FC 0x00DC
  74. #define CL_GD546x_FD 0x00DD
  75. #define CL_GD546x_FE 0x00DE
  76. #define CL_GD546x_FF 0x00DF
  77. //
  78. // CHIP BUG: For certian values in PRESET register cursor enable/disable
  79. // causes scanlines to be duplicated at the cursor hot spot. (Seen
  80. // as screen jump.) There are lots of ways around this. The easiest
  81. // is to turn the cursor on and leave it on. Enable/Disable is handled by
  82. // moving the cursor on/off the visable screen.
  83. //
  84. #define HW_PRESET_BUG 1
  85. // The 5465 (to at least AC) has a problem when PCI configuration space
  86. // is accessible in memory space. On 16-bit writes, a 32-bit write is
  87. // actually performed, so the next register has garbage written to it.
  88. // We get around this problem by clearing bit 0 of the Vendor Specific
  89. // Control register in PCI configuration space. When this bit is set
  90. // to 0, PCI configuration registers are not available through memory
  91. // mapped I/O. Since some functions, such as power management, require
  92. // access to PCI registers, the display driver must post a message to
  93. // the miniport to enable this bit when needed.
  94. //
  95. #define VS_CONTROL_HACK 1
  96. #if ENABLE_LOG_FILE
  97. extern long lg_i;
  98. extern char lg_buf[256];
  99. #endif
  100. #if POINTER_SWITCH_ENABLED
  101. extern int pointer_switch;
  102. #endif
  103. // The definitions are not portable. 486 / PC only !!!
  104. typedef struct {
  105. BYTE b;
  106. BYTE g;
  107. BYTE r;
  108. } pix24;
  109. typedef struct {
  110. BYTE u;
  111. BYTE y1;
  112. BYTE v;
  113. BYTE y2;
  114. } yuv_422;
  115. typedef struct {
  116. unsigned int v : 6;
  117. unsigned int u : 6;
  118. unsigned int y0: 5;
  119. unsigned int y1: 5;
  120. unsigned int y2: 5;
  121. unsigned int y3: 5;
  122. } yuv_411;
  123. typedef struct {
  124. unsigned int b : 5;
  125. unsigned int g : 5;
  126. unsigned int r : 5;
  127. } rgb_555;
  128. typedef struct {
  129. unsigned int b : 5;
  130. unsigned int g : 6;
  131. unsigned int r : 5;
  132. } rgb_565;
  133. typedef union {
  134. DWORD p32;
  135. yuv_422 yuv422;
  136. yuv_411 yuv411;
  137. pix24 p24;
  138. rgb_555 rgb555;
  139. rgb_565 rgb565;
  140. WORD p16[2];
  141. BYTE p8[4];
  142. } pixel;
  143. #define FALSE 0
  144. #ifndef TRUE
  145. #define TRUE (~FALSE)
  146. #endif
  147. /* from struct.h */
  148. #define fldoff(str, fld) ((int)&(((struct str *)0)->fld))
  149. #define fldsiz(str, fld) (sizeof(((struct str *)0)->fld))
  150. #define HPRR(pr_reg) (_AP_direct_read(PADDR(pr_reg),fldsiz(PLUTOREGS,pr_reg), (ul)0))
  151. #define RPR(pr_reg) HPRR(pr_reg)
  152. #define EHIST (*(EXHIST*)excepttion) /* Exception History buffer */
  153. #define STAMP (*(bytearray*)0x0) /* time date stamp */
  154. #define HISTORYBUFFERADDR (ul)&history /* 34020 address of recording */
  155. /* External functions the host program can call */
  156. /*-------------------------------------------------------------------------*/
  157. /* Function prototypes for emulator. Functions defined in host_if.c */
  158. int _cdecl _AP_init(int mode, void * frame_buf);
  159. void _cdecl _AP_write(ul addr, int size, ul data);
  160. ul _cdecl _AP_read(ul addr,int size);
  161. void _cdecl _AP_run(void);
  162. boolean _cdecl _AP_busy();
  163. boolean _cdecl _AP_done();
  164. boolean _cdecl _AP_rfifo_empty();
  165. boolean _cdecl _AP_require(int size);
  166. ul _cdecl _AP_direct_read(ul addr,int size);
  167. void _cdecl _AP_fb_write(ul offset, pixel data, ul size);
  168. pixel _cdecl _AP_fb_read(ul offset, ul size);
  169. #if LOG_QFREE
  170. #define START_OF_BLT() \
  171. do{ \
  172. CHECK_QFREE(); \
  173. } while(0)
  174. #define END_OF_BLT() \
  175. do{ \
  176. } while(0)
  177. #else
  178. #define START_OF_BLT()
  179. #define END_OF_BLT()
  180. #endif
  181. //
  182. // This waits for the chip to go idle
  183. //
  184. #define WAIT_FOR_IDLE() \
  185. do { \
  186. while (LLDR_SZ (grSTATUS) != 0); \
  187. } while (0)
  188. //
  189. // Macro to require a certian number of free queue entries.
  190. //
  191. #if DATASTREAMING
  192. #define FUDGE 2
  193. #define REQUIRE(n) \
  194. { \
  195. if (ppdev->dwDataStreaming & 0x80000000) \
  196. { \
  197. if (ppdev->shadowQFREE < ((n) + FUDGE)) \
  198. { \
  199. while (ppdev->shadowQFREE < (n) + FUDGE) \
  200. { \
  201. ppdev->shadowQFREE = LLDR_SZ(grQFREE); \
  202. } \
  203. } \
  204. ppdev->shadowQFREE -= (BYTE) n; \
  205. } \
  206. else if (ppdev->dwDataStreaming) \
  207. { \
  208. if (LLDR_SZ(grQFREE) < ((n) + FUDGE)) \
  209. { \
  210. while (LLDR_SZ(grSTATUS) & 0x8005) ; \
  211. ppdev->dwDataStreaming = 0; \
  212. } \
  213. } \
  214. }
  215. #define ENDREQUIRE() \
  216. { \
  217. ppdev->dwDataStreaming |= 1; \
  218. }
  219. #define WRITE_STRING(src, dwords) \
  220. { \
  221. ULONG nDwords, nTotal = (ULONG) (dwords); \
  222. PULONG data = (PULONG) (src); \
  223. if (ppdev->dwDataStreaming & 0x80000000) \
  224. { \
  225. while (nTotal > 0) \
  226. { \
  227. nDwords = (ULONG) ppdev->shadowQFREE; \
  228. if (nDwords > FUDGE) \
  229. { \
  230. nDwords = min(nDwords - FUDGE, nTotal); \
  231. memcpy((LPVOID) ppdev->pLgREGS->grHOSTDATA, data, nDwords * 4); \
  232. data += nDwords; \
  233. nTotal -= nDwords; \
  234. } \
  235. ppdev->shadowQFREE = LLDR_SZ(grQFREE); \
  236. } \
  237. } \
  238. else \
  239. { \
  240. if ( ppdev->dwDataStreaming && (LLDR_SZ(grQFREE) < nTotal) ) \
  241. { \
  242. while (LLDR_SZ(grSTATUS) & 0x8005) ; \
  243. ppdev->dwDataStreaming = 0; \
  244. } \
  245. while (nTotal > 0) \
  246. { \
  247. nDwords = min(nTotal, 0x200); \
  248. memcpy((LPVOID) ppdev->pLgREGS->grHOSTDATA, data, nDwords * 4); \
  249. data += nDwords; \
  250. nTotal -= nDwords; \
  251. } \
  252. } \
  253. }
  254. #else
  255. #define REQUIRE(n)
  256. #define ENDREQUIRE()
  257. #define WRITE_STRING(src, dwords) \
  258. { \
  259. ULONG nDwords, nTotal = (ULONG) (dwords); \
  260. PULONG data = (PULONG) (src); \
  261. while (nTotal > 0) \
  262. { \
  263. nDwords = min(nTotal, 0x200); \
  264. memcpy((LPVOID) ppdev->pLgREGS->grHOSTDATA, data, nDwords * 4); \
  265. data += nDwords; \
  266. nTotal -= nDwords; \
  267. } \
  268. }
  269. #endif
  270. //
  271. // Macros to read Laguna registers.
  272. //
  273. #define LADDR(pr_reg) fldoff(GAR,pr_reg)
  274. // #define LLDR(pr_reg,pr_siz) _AP_direct_read((ul)LADDR(pr_reg),pr_siz)
  275. #define LLDR(pr_reg,pr_siz) (ppdev->pLgREGS_real->pr_reg)
  276. #define LLDR_SZ(pr_reg) LLDR(pr_reg, fldsiz(GAR,pr_reg))
  277. // #define LLR(pr_reg,pr_siz) _AP_read((ul)LADDR(pr_reg),pr_siz)
  278. #define LLR(pr_reg,pr_siz) LLDR(pr_reg,pr_siz)
  279. #define LLR_SZ(pr_reg) LLR(pr_reg, fldsiz(GAR,pr_reg))
  280. #if LOG_WRITES
  281. #define LG_LOG(reg,val) \
  282. do { \
  283. lg_i = sprintf(lg_buf,"LL\t%4X\t%08X\r\n", \
  284. ((DWORD)(&ppdev->pLgREGS->reg) - (DWORD)(&ppdev->pLgREGS->grCR0)), \
  285. (val)); \
  286. WriteLogFile(ppdev->pmfile, lg_buf, lg_i, ppdev->TxtBuff, &ppdev->TxtBuffIndex); \
  287. } while(0)
  288. #else
  289. #define LG_LOG(reg,val)
  290. #endif
  291. //
  292. // Macros to write Laguna registers.
  293. //
  294. // This is an amazingly, incredibly hairy macro that, believe it or not,
  295. // will be greatly reduced by a good compiler. The "if" can be
  296. // pre-determined by the compiler.
  297. // The purpose of this is to ensure that exactly the right number of bytes
  298. // is written to the chip. If the programmer writes, say, a BYTE to a
  299. // DWORD sized register, we need to be sure that the byte is zero extended
  300. // and that a full DWORD gets written.
  301. //
  302. #define LRWRITE(pr_reg,pr_siz,value) \
  303. do { \
  304. LG_LOG(pr_reg,(value)); \
  305. if (sizeof(ppdev->pLgREGS->pr_reg) == sizeof(BYTE)) \
  306. { \
  307. *(volatile BYTE *)(&ppdev->pLgREGS->pr_reg) = (BYTE)(value); \
  308. } \
  309. else if (sizeof(ppdev->pLgREGS->pr_reg) == sizeof(WORD)) \
  310. { \
  311. *(volatile WORD *)(&ppdev->pLgREGS->pr_reg) = (WORD)(value); \
  312. *(volatile WORD *)(&ppdev->pLgREGS->grBOGUS) = (WORD)(value); \
  313. LG_LOG(grBOGUS,(value)); \
  314. } \
  315. else \
  316. { \
  317. *(volatile DWORD *)(&ppdev->pLgREGS->pr_reg) = (DWORD)(value); \
  318. } \
  319. } while(0)
  320. #define LL(pr_reg,value) LRWRITE(pr_reg, fldsiz(GAR,pr_reg), value)
  321. // ----------------------------------------------------------------------------
  322. //
  323. // Certian registers have been giving us problems. We provide special
  324. // write macros for them.
  325. //
  326. //
  327. // Writes any 8 bit register.
  328. //
  329. #define LL8(pr_reg,value) \
  330. do { \
  331. LG_LOG(pr_reg,(value)); \
  332. (*(volatile BYTE *)(&ppdev->pLgREGS->pr_reg) = (BYTE)(value)); \
  333. } while(0)
  334. //
  335. // Writes any 16 bit register.
  336. //
  337. #define LL16(pr_reg,value) \
  338. do { \
  339. LG_LOG(pr_reg,(value)); \
  340. (*(volatile WORD *)(&ppdev->pLgREGS->pr_reg) = (WORD)(value)); \
  341. } while(0)
  342. //
  343. // Double writes any 16 bit register.
  344. //
  345. #define LL16d(pr_reg,value) \
  346. do { \
  347. (*(volatile WORD *)(&ppdev->pLgREGS->pr_reg) = (WORD)(value)); \
  348. LG_LOG(pr_reg,(value)); \
  349. (*(volatile WORD *)(&ppdev->pLgREGS->grBOGUS) = (WORD)(value)); \
  350. LG_LOG(grBOGUS,(value)); \
  351. } while(0)
  352. //
  353. // Writes any 32 bit register.
  354. //
  355. #define LL32(pr_reg,value) \
  356. { \
  357. *(volatile DWORD *)(&ppdev->pLgREGS->pr_reg) = (DWORD)(value); \
  358. }
  359. //
  360. // MACROS FOR BLTEXT REGISTER.
  361. //
  362. #define LL_BLTEXT(x,y) \
  363. LL32 (grBLTEXT_EX.dw, (((DWORD)(y) << 16) | ((DWORD)(x))))
  364. #if ! DRIVER_5465
  365. #define LL_MBLTEXT(x,y) \
  366. do { \
  367. LL16 (grMBLTEXT_EX.pt.X, x); \
  368. LL16 (grBLTEXT_EX.pt.Y, y); \
  369. } while(0)
  370. #else
  371. #define LL_MBLTEXT(x,y) \
  372. LL32 (grMBLTEXT_EX.dw, (((DWORD)(y) << 16) | ((DWORD)(x))))
  373. #endif
  374. #define LL_BLTEXTR(x,y) \
  375. LL32 (grBLTEXTR_EX.dw, (((DWORD)(y) << 16) | ((DWORD)(x))))
  376. #define LL_BLTEXT_EXT(x,y) \
  377. LL32 (grBLTEXT.dw, (((DWORD)(y) << 16) | ((DWORD)(x))))
  378. #define LL_MBLTEXT_EXT(x,y) \
  379. LL32 (grMBLTEXT.dw, (((DWORD)(y) << 16) | ((DWORD)(x))))
  380. // Launch a BLT using the color translation features of the
  381. // resize engine. (1:1 resize)
  382. #define LL_BLTEXT_XLATE(src_bpp, x, y) \
  383. do {\
  384. LL16 (grMIN_X, (~((x)-1)));\
  385. LL16 (grMAJ_X, (x));\
  386. LL16 (grACCUM_X, ((x)-1));\
  387. LL16 (grMIN_Y, (~((y)-1)));\
  388. LL16 (grMAJ_Y, (y));\
  389. LL16 (grACCUM_Y, ((y)-1));\
  390. LL16 (grSRCX, (((x)*(src_bpp)) >> 3) );\
  391. LL_BLTEXTR((x), (y));\
  392. } while(0)
  393. //
  394. // MACROS FOR CLIPULE/CLIPLOR REGISTERS.
  395. //
  396. #define LL_CLIPULE(x,y) \
  397. LL32 (grCLIPULE.dw, (((DWORD)(y) << 16) | ((DWORD)(x))));
  398. #define LL_MCLIPULE(x,y) \
  399. LL32 (grMCLIPULE.dw, (((DWORD)(y) << 16) | ((DWORD)(x))));
  400. #define LL_CLIPLOR(x,y) \
  401. LL32 (grCLIPLOR.dw, (((DWORD)(y) << 16) | ((DWORD)(x))));
  402. #define LL_MCLIPLOR(x,y) \
  403. LL32 (grMCLIPLOR.dw, (((DWORD)(y) << 16) | ((DWORD)(x))));
  404. #define LL_CLIPULE_EX(x,y) \
  405. LL32 (grCLIPULE_EX.dw, (((DWORD)(y) << 16) | ((DWORD)(x))));
  406. #define LL_MCLIPULE_EX(x,y) \
  407. LL32 (grMCLIPULE_EX.dw, (((DWORD)(y) << 16) | ((DWORD)(x))));
  408. #define LL_CLIPLOR_EX(x,y) \
  409. LL32 (grCLIPLOR_EX.dw, (((DWORD)(y) << 16) | ((DWORD)(x))));
  410. #define LL_MCLIPLOR_EX(x,y) \
  411. LL32 (grMCLIPLOR_EX.dw, (((DWORD)(y) << 16) | ((DWORD)(x))));
  412. //
  413. // MACROS FOR OP0_opRDRAM REGISTER.
  414. //
  415. #define LL_OP0(x,y) \
  416. LL32 (grOP0_opRDRAM.dw, (((DWORD)(y) << 16) | ((DWORD)(x))))
  417. #define LL_OP0_MONO(x,y) \
  418. LL32 (grOP0_opMRDRAM.dw, (((DWORD)(y) << 16) | ((DWORD)(x))))
  419. //
  420. // MACROS FOR OP1_opRDRAM REGISTER.
  421. //
  422. #define LL_OP1(x,y) \
  423. LL32 (grOP1_opRDRAM.dw, (((DWORD)(y) << 16) | ((DWORD)(x))))
  424. #define LL_OP1_MONO(x,y) \
  425. LL32 (grOP1_opMRDRAM.dw, (((DWORD)(y) << 16) | ((DWORD)(x))))
  426. //
  427. // MACROS FOR OP2_opRDRAM REGISTER.
  428. //
  429. #define LL_OP2(x,y) \
  430. LL32 (grOP2_opRDRAM.dw, (((DWORD)(y) << 16) | ((DWORD)(x))))
  431. #define LL_OP2_MONO(x,y) \
  432. LL32 (grOP2_opMRDRAM.dw, (((DWORD)(y) << 16) | ((DWORD)(x))))
  433. //
  434. // -- End of special write macros --------------------------------------------
  435. //
  436. /* HPR is the copy of REGISTER_STRUCTURE that the host reads and writes from.
  437. PR is the actual register state after the information has gone
  438. through the FIFO. Immediate registers are kept up-to-date in HPR.
  439. These structures are allocated in the link file. */
  440. extern GAR PR; /* the emulator working copy */
  441. extern GAR HPR[4]; /* the "host" copy */
  442. #define LAGUNA_SRAM_SIZE 32 /* dwords */
  443. #define IS_SRC 0x03 /* Source mask. */
  444. struct _vid_mode {
  445. BYTE Bpp; // Bytes per pixel (8 / 16 / 24 / 32)
  446. WORD Xextent; // Display rsolution in pixels eg 1280
  447. WORD Yextent; // Vertical display resolution
  448. WORD Xpitch; // Offset in bytes from line 0 to line 1
  449. int Vesa_Mode; // Mode number for VESA ( if supported by S3 )
  450. };
  451. typedef struct _vid_mode vid_mode;
  452. typedef vid_mode *vid_ptr;
  453. /***************************************************************************
  454. *
  455. * MACRO: SYNC_W_3D
  456. *
  457. * DESCRIPTION: If 3d context(s) active, wait until 3d engine idle
  458. * or until 1,000,000 checks have failed
  459. *
  460. ****************************************************************************/
  461. #if WINNT_VER40 && DRIVER_5465 // WINNT_VER40
  462. #define SYNC_3D_CONDITIONS (ST_POLY_ENG_BUSY|ST_EXEC_ENG_3D_BUSY|ST_XY_ENG_BUSY|/*ST_BLT_ENG_BUSY|*/ST_BLT_WF_EMPTY)
  463. #define ENSURE_3D_IDLE(ppdev) \
  464. { \
  465. if (ppdev->pLgREGS != NULL) \
  466. { \
  467. int num_syncs=2; \
  468. /* there is a slight chance of a window in which all bits go off while engine fetching */ \
  469. /* next command - double read should catch that */ \
  470. while (num_syncs--) \
  471. { \
  472. int status; \
  473. volatile int wait_count=0; \
  474. do \
  475. { \
  476. status = (*((volatile *)((DWORD *)(ppdev->pLgREGS) + PF_STATUS_3D)) & 0x3FF) ^ SYNC_3D_CONDITIONS; \
  477. /* do something to give bus a breather, and to prevent eternal stall */ \
  478. wait_count++; \
  479. } while(((status & SYNC_3D_CONDITIONS) != SYNC_3D_CONDITIONS) && wait_count<1000000); \
  480. } \
  481. } \
  482. }
  483. #define SYNC_W_3D(ppdev) \
  484. { \
  485. if (ppdev->NumMCDContexts > 0) \
  486. { \
  487. ENSURE_3D_IDLE(ppdev); \
  488. } \
  489. }
  490. #else // WINNT_VER40 && DRIVER_5465
  491. // no 3D on NT before NT4.0. No 3D on 62 and not used on 64.
  492. #define ENSURE_3D_IDLE(ppdev) {}
  493. #define SYNC_W_3D(ppdev) {}
  494. #endif // WINNT_VER40
  495. //
  496. // New shadowing macros.
  497. //
  498. #define LL_FGCOLOR(color, r) \
  499. { \
  500. if ((DWORD) (color) != ppdev->shadowFGCOLOR) \
  501. { \
  502. if (r) REQUIRE(r); \
  503. LL32(grOP_opFGCOLOR, ppdev->shadowFGCOLOR = (DWORD) (color)); \
  504. } \
  505. }
  506. #define LL_BGCOLOR(color, r) \
  507. { \
  508. if ((DWORD) (color) != ppdev->shadowBGCOLOR) \
  509. { \
  510. if (r) REQUIRE(r); \
  511. LL32(grOP_opBGCOLOR, ppdev->shadowBGCOLOR = (DWORD) (color)); \
  512. } \
  513. }
  514. #define LL_DRAWBLTDEF(drawbltdef, r) \
  515. { \
  516. if ((DWORD) (drawbltdef) != ppdev->shadowDRAWBLTDEF) \
  517. { \
  518. if (r) REQUIRE(r); \
  519. LL32(grDRAWBLTDEF, ppdev->shadowDRAWBLTDEF = (DWORD) (drawbltdef)); \
  520. } \
  521. }
  522. #endif /* ndef _LAGUNA_H */