sstglide.c 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  1. /*=============================================================================
  2. Name : sstglide.c
  3. Purpose : 3Dfx-specific support
  4. Created 2/19/1999 by khent
  5. Copyright Relic Entertainment, Inc. All rights reserved.
  6. =============================================================================*/
  7. #include <windows.h>
  8. #include <string.h>
  9. #include <glide.h>
  10. #include "sstglide.h"
  11. static bool sstHaveGlide = FALSE;
  12. typedef void (__stdcall * ALPHAFUNCproc)(GLenum, GLclampf);
  13. typedef FxBool (__stdcall * GRLFBLOCKproc)(GrLock_t, GrBuffer_t, GrLfbWriteMode_t,
  14. GrOriginLocation_t, FxBool, GrLfbInfo_t*);
  15. typedef FxBool (__stdcall * GRLFBUNLOCKproc)(GrLock_t, GrBuffer_t);
  16. typedef void (__stdcall * GRBUFFERSWAPproc)(int);
  17. typedef void (__stdcall * GRSSTIDLEproc)(void);
  18. typedef void (__stdcall * GRSSTQUERYBOARDSproc)(GrHwConfiguration*);
  19. GRLFBLOCKproc sstLfbLock = NULL;
  20. GRLFBUNLOCKproc sstLfbUnlock = NULL;
  21. GRBUFFERSWAPproc sstBufferSwap = NULL;
  22. GRSSTIDLEproc sstSstIdle = NULL;
  23. GRSSTQUERYBOARDSproc sstQueryBoards = NULL;
  24. bool sstHardwareExists(sdword* type)
  25. {
  26. HINSTANCE lib;
  27. GrHwConfiguration hwconfig;
  28. bool rval;
  29. lib = GetModuleHandle("glide2x.dll");
  30. if (lib == NULL)
  31. {
  32. lib = LoadLibrary("glide2x.dll");
  33. if (lib == NULL)
  34. {
  35. return FALSE;
  36. }
  37. }
  38. sstQueryBoards = (GRSSTQUERYBOARDSproc)GetProcAddress(lib, "_grSstQueryBoards@4");
  39. if (sstQueryBoards == NULL)
  40. {
  41. return FALSE;
  42. }
  43. sstQueryBoards(&hwconfig);
  44. if (hwconfig.num_sst > 0)
  45. {
  46. if (type != NULL)
  47. {
  48. #if 1
  49. *type = SST_VOODOO2;
  50. #else
  51. if (hwconfig.SSTs[0].type == GR_SSTTYPE_VOODOO ||
  52. hwconfig.SSTs[0].type == GR_SSTTYPE_Voodoo2)
  53. {
  54. if (hwconfig.SSTs[0].sstBoard.VoodooConfig.fbiRev & 0x100)
  55. {
  56. *type = SST_VOODOO2;
  57. }
  58. else
  59. {
  60. *type = SST_VOODOO;
  61. }
  62. }
  63. else
  64. {
  65. *type == SST_OTHER;
  66. }
  67. #endif
  68. }
  69. rval = TRUE;
  70. }
  71. else
  72. {
  73. rval = FALSE;
  74. }
  75. while (FreeLibrary(lib)) ;
  76. return rval;
  77. }
  78. static void sstFreeHandle(void)
  79. {
  80. HINSTANCE lib;
  81. lib = GetModuleHandle("glide2x.dll");
  82. if (lib != NULL)
  83. {
  84. while (FreeLibrary(lib)) ;
  85. }
  86. }
  87. bool sstLoaded(void)
  88. {
  89. return sstHaveGlide;
  90. }
  91. void sstStartup(void)
  92. {
  93. HINSTANCE lib;
  94. //locate Glide .DLL and grab func pointers
  95. lib = GetModuleHandle("glide2x.dll");
  96. if (lib == NULL)
  97. {
  98. lib = LoadLibrary("glide2x.dll");
  99. if (lib == NULL)
  100. {
  101. sstHaveGlide = FALSE;
  102. return;
  103. }
  104. }
  105. sstLfbLock = (GRLFBLOCKproc)GetProcAddress(lib, "_grLfbLock@24");
  106. sstLfbUnlock = (GRLFBUNLOCKproc)GetProcAddress(lib, "_grLfbUnlock@8");
  107. sstBufferSwap = (GRBUFFERSWAPproc)GetProcAddress(lib, "_grBufferSwap@4");
  108. sstSstIdle = (GRSSTIDLEproc)GetProcAddress(lib, "_grSstIdle@0");
  109. sstQueryBoards = (GRSSTQUERYBOARDSproc)GetProcAddress(lib, "_grSstQueryBoards@4");
  110. if (sstLfbLock == NULL ||
  111. sstLfbUnlock == NULL ||
  112. sstBufferSwap == NULL ||
  113. sstQueryBoards == NULL)
  114. {
  115. sstFreeHandle();
  116. sstHaveGlide = FALSE;
  117. }
  118. else
  119. {
  120. sstHaveGlide = TRUE;
  121. }
  122. }
  123. void sstShutdown(void)
  124. {
  125. //release Glide .DLL reference
  126. sstFreeHandle();
  127. sstHaveGlide = FALSE;
  128. }
  129. uword* sstGetFramebuffer(sdword* pitch)
  130. {
  131. GrLfbInfo_t info;
  132. if (!sstHaveGlide)
  133. {
  134. if (pitch != NULL)
  135. {
  136. *pitch = 0;
  137. }
  138. return NULL;
  139. }
  140. if (pitch == NULL)
  141. {
  142. sstLfbUnlock(GR_LFB_WRITE_ONLY, GR_BUFFER_BACKBUFFER);
  143. return NULL;
  144. }
  145. memset(&info, 0, sizeof(info));
  146. info.size = sizeof(info);
  147. if (!sstLfbLock(GR_LFB_WRITE_ONLY,
  148. GR_BUFFER_BACKBUFFER,
  149. GR_LFBWRITEMODE_565,
  150. GR_ORIGIN_UPPER_LEFT,
  151. FXFALSE, &info))
  152. {
  153. if (pitch != NULL)
  154. {
  155. *pitch = 0;
  156. }
  157. return NULL;
  158. }
  159. *pitch = info.strideInBytes;
  160. return (uword*)info.lfbPtr;
  161. }
  162. void sstFlush(void)
  163. {
  164. if (sstHaveGlide)
  165. {
  166. sstBufferSwap(1);
  167. }
  168. }
  169. void sstFinish(void)
  170. {
  171. if (sstHaveGlide)
  172. {
  173. sstSstIdle();
  174. }
  175. }