source: golgotha/src/render/dx5/ddraw_init.cc

Last change on this file was 80, checked in by Sam Hocevar, 13 years ago
  • Adding the Golgotha source code. Not sure what's going to be interesting in there, but since it's all public domain, there's certainly stuff to pick up.
File size: 5.0 KB
Line 
1/********************************************************************** <BR>
2  This file is part of Crack dot Com's free source code release of
3  Golgotha. <a href="http://www.crack.com/golgotha_release"> <BR> for
4  information about compiling & licensing issues visit this URL</a>
5  <PRE> If that doesn't help, contact Jonathan Clark at
6  golgotha_source@usa.net (Subject should have "GOLG" in it)
7***********************************************************************/
8
9#include "arch.hh"
10#include <ddraw.h>
11#include <windows.h>
12#include "dx5/r1_dx5.hh"
13
14i4_bool ddraw_check(HRESULT res);
15
16typedef struct
17{
18  LPGUID lpGuid;
19  LPSTR  lpDriverName;
20} dd_device;
21
22dd_device dd_device_list[32];
23sw32      num_dd_devices = 0;
24
25BOOL WINAPI dd_device_callback(LPGUID lpGuid,   LPSTR lpDeviceDescription,
26                                   LPSTR lpDriverName, LPVOID lpUserArg)
27{
28  //quit the enumeration if we've found everything
29  for (sw32 i=0;i<num_dd_devices;i++)
30    if (dd_device_list[i].lpGuid==lpGuid) return DDENUMRET_CANCEL;
31
32  dd_device_list[num_dd_devices].lpGuid       = lpGuid;
33  dd_device_list[num_dd_devices].lpDriverName = lpDriverName;
34  num_dd_devices++;
35
36  if (num_dd_devices==31) return DDENUMRET_CANCEL;
37
38  return DDENUMRET_OK; 
39}
40
41BOOL WINAPI dd_create_callback(LPGUID lpGuid,   LPSTR lpDeviceDescription,
42                               LPSTR lpDriverName, LPVOID lpUserArg)
43{
44  char *desired_driver = (char *)lpUserArg;
45
46  if (!stricmp(desired_driver,lpDriverName))
47  {
48    HRESULT res = DirectDrawCreate(lpGuid,i4_dx5_display->ddraw,0);
49    return DDENUMRET_CANCEL;
50  }
51
52  return DDENUMRET_OK; 
53}
54
55i4_bool r1_dx5_class::init_ddraw(HWND main_hwnd)
56
57  HRESULT res;
58 
59  res = DirectDrawEnumerate(dd_device_callback,0);
60  if (res != DD_OK)
61    return i4_F;
62 
63  for (sw32 i=0;i<num_dd_devices;i++)
64  {
65    if (!stricmp(dd_device_list[i].lpDriverName,dd_driver_name)) break;
66  }
67  if (i==num_dd_devices) i=0;
68
69  //create the direct draw object within the callback. GUID's are apparently not reliable outside
70  //of it??
71  DirectDrawEnumerate(dd_create_callback,(void *)dd_device_list[i].lpDriverName);
72
73  //if it didnt get set, something fucked up
74  if (ddraw==0)
75    return i4_F;
76 
77  if (use_page_flip)
78    res = ddraw->SetCooperativeLevel(main_hwnd,DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN);
79  else
80    res = ddraw->SetCooperativeLevel(main_hwnd,DDSCL_NORMAL);
81
82  if (res != DD_OK) return i4_F;
83 
84  res = ddraw->QueryInterface(IID_IDirectDraw2,(void **)&ddraw2);
85  if(res != DD_OK) return i4_F;
86
87  res = ddraw2->SetDisplayMode(640,480,16,0,0);
88  ddraw_check(res);
89  if (res != DD_OK) return i4_F;
90
91  if (!create_ddraw_surfaces()) return i4_F;
92
93  return i4_T;
94}
95
96void r1_dx5_class::uninit_ddraw()
97{
98  if (back_surface)
99    back_surface->Release();
100  if (primary_surface)
101    primary_surface->Release();
102  if (ddraw2)
103    ddraw2->Release();
104  if (ddraw)
105    ddraw->Release();
106}
107
108i4_bool r1_dx5_class::create_ddraw_surfaces()
109{
110  HRESULT res;
111  DDSURFACEDESC ddsd;
112
113  if (use_page_flip)
114  {
115    //if we're page flipping, its a whole different ball game as far as creating the primary and secondary surfaces go
116    ZeroMemory(&ddsd, sizeof(ddsd));
117    ddsd.dwSize = sizeof(ddsd);
118    ddsd.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT;
119    ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE |
120                          DDSCAPS_FLIP |
121                          DDSCAPS_COMPLEX |
122                          DDSCAPS_3DDEVICE |
123                          DDSCAPS_VIDEOMEMORY;
124 
125    ddsd.dwBackBufferCount = 1;
126
127    //get the primary surface
128    res = ddraw->CreateSurface(&ddsd, &primary_surface, NULL);
129    if (!ddraw_check(res))
130      return i4_F;
131
132    // get the back buffer surface
133    DDSCAPS caps;
134    caps.dwCaps = DDSCAPS_BACKBUFFER;
135    res = primary_surface->GetAttachedSurface(&caps, &back_surface); 
136    if (!ddraw_check(res))
137      return i4_F;     
138  }
139  else
140  { 
141 
142    //this will be non-page flipped (aka blitted)
143
144    // Create the primary surface   
145    memset(&ddsd,0,sizeof(DDSURFACEDESC)); 
146    ddsd.dwSize  = sizeof(ddsd);
147    ddsd.dwFlags = DDSD_CAPS;
148    ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;
149
150
151    res = ddraw2->CreateSurface(&ddsd,&primary_surface,0);
152    if (res != DD_OK) return i4_F; 
153   
154    primary_surface->GetSurfaceDesc(&ddsd);
155
156    ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH;
157    ddsd.dwWidth = 640;
158    ddsd.dwHeight = 480;
159    ddsd.ddsCaps.dwCaps = DDSCAPS_3DDEVICE;
160 
161    res = ddraw2->CreateSurface(&ddsd,&back_surface,0);
162    if (res != DD_OK) return i4_F;     
163  }
164 
165  memset(&ddsd,0,sizeof(DDSURFACEDESC));
166  ddsd.dwSize = sizeof(DDSURFACEDESC);
167  primary_surface->GetSurfaceDesc(&ddsd);
168
169  i4_pixel_format fmt;
170
171  fmt.pixel_depth = I4_16BIT; 
172  fmt.red_mask    = ddsd.ddpfPixelFormat.dwRBitMask;
173  fmt.green_mask  = ddsd.ddpfPixelFormat.dwGBitMask;
174  fmt.blue_mask   = ddsd.ddpfPixelFormat.dwBBitMask;
175  fmt.calc_shift();
176
177  screen_palette = i4_pal_man.register_pal(&fmt);
178
179  return i4_T;
180}
Note: See TracBrowser for help on using the repository browser.