mirror of
https://github.com/FunkyFr3sh/cnc-ddraw.git
synced 2025-03-24 17:49:52 +01:00
fix d3d9 alt+enter - use d3d9 on xp/vista/7 even with dwm enabled
This commit is contained in:
parent
c0a26ce858
commit
24b0e5cf24
35
src/main.c
35
src/main.c
@ -18,8 +18,8 @@
|
|||||||
#include <windowsx.h>
|
#include <windowsx.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
|
#include <d3d9.h>
|
||||||
#include "ddraw.h"
|
#include "ddraw.h"
|
||||||
|
|
||||||
#include "main.h"
|
#include "main.h"
|
||||||
#include "palette.h"
|
#include "palette.h"
|
||||||
#include "surface.h"
|
#include "surface.h"
|
||||||
@ -38,6 +38,9 @@ void mouse_unlock();
|
|||||||
BOOL screenshot(struct IDirectDrawSurfaceImpl *);
|
BOOL screenshot(struct IDirectDrawSurfaceImpl *);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
extern HMODULE hD3D9;
|
||||||
|
extern D3DPRESENT_PARAMETERS D3dpp;
|
||||||
|
|
||||||
IDirectDrawImpl *ddraw = NULL;
|
IDirectDrawImpl *ddraw = NULL;
|
||||||
|
|
||||||
DWORD WINAPI render_main(void);
|
DWORD WINAPI render_main(void);
|
||||||
@ -237,6 +240,7 @@ HRESULT __stdcall ddraw_RestoreDisplayMode(IDirectDrawImpl *This)
|
|||||||
if(!ddraw->windowed)
|
if(!ddraw->windowed)
|
||||||
{
|
{
|
||||||
ChangeDisplaySettings(&This->mode, 0);
|
ChangeDisplaySettings(&This->mode, 0);
|
||||||
|
InterlockedExchange(&ddraw->resetDirect3D9, TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
return DD_OK;
|
return DD_OK;
|
||||||
@ -504,11 +508,12 @@ void ToggleFullscreen()
|
|||||||
mouse_unlock();
|
mouse_unlock();
|
||||||
if(ChangeDisplaySettings(&ddraw->render.mode, CDS_FULLSCREEN) == DISP_CHANGE_SUCCESSFUL)
|
if(ChangeDisplaySettings(&ddraw->render.mode, CDS_FULLSCREEN) == DISP_CHANGE_SUCCESSFUL)
|
||||||
{
|
{
|
||||||
ddraw->windowed = FALSE;
|
D3dpp.Windowed = ddraw->windowed = FALSE;
|
||||||
|
|
||||||
SetWindowLong(ddraw->hWnd, GWL_STYLE, GetWindowLong(ddraw->hWnd, GWL_STYLE) & ~(WS_CAPTION | WS_THICKFRAME | WS_MINIMIZE | WS_MAXIMIZE | WS_SYSMENU));
|
SetWindowLong(ddraw->hWnd, GWL_STYLE, GetWindowLong(ddraw->hWnd, GWL_STYLE) & ~(WS_CAPTION | WS_THICKFRAME | WS_MINIMIZE | WS_MAXIMIZE | WS_SYSMENU));
|
||||||
SetWindowPos(ddraw->hWnd, HWND_TOPMOST, 0, 0, ddraw->render.width, ddraw->render.height, SWP_SHOWWINDOW);
|
SetWindowPos(ddraw->hWnd, HWND_TOPMOST, 0, 0, ddraw->render.width, ddraw->render.height, SWP_SHOWWINDOW);
|
||||||
LastSetWindowPosTick = timeGetTime();
|
LastSetWindowPosTick = timeGetTime();
|
||||||
|
InterlockedExchange(&ddraw->resetDirect3D9, TRUE);
|
||||||
}
|
}
|
||||||
mouse_lock();
|
mouse_lock();
|
||||||
}
|
}
|
||||||
@ -534,8 +539,9 @@ void ToggleFullscreen()
|
|||||||
SetWindowPos(ddraw->hWnd, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
|
SetWindowPos(ddraw->hWnd, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
|
||||||
MoveWindow(ddraw->hWnd, dst.left, dst.top, (dst.right - dst.left), (dst.bottom - dst.top), TRUE);
|
MoveWindow(ddraw->hWnd, dst.left, dst.top, (dst.right - dst.left), (dst.bottom - dst.top), TRUE);
|
||||||
|
|
||||||
ddraw->windowed = TRUE;
|
D3dpp.Windowed = ddraw->windowed = TRUE;
|
||||||
ddraw->windowed_init = TRUE;
|
ddraw->windowed_init = TRUE;
|
||||||
|
InterlockedExchange(&ddraw->resetDirect3D9, TRUE);
|
||||||
}
|
}
|
||||||
mouse_lock();
|
mouse_lock();
|
||||||
}
|
}
|
||||||
@ -1224,28 +1230,9 @@ HRESULT WINAPI DirectDrawCreate(GUID FAR* lpGUID, LPDIRECTDRAW FAR* lplpDD, IUnk
|
|||||||
DWORD version = GetVersion();
|
DWORD version = GetVersion();
|
||||||
DWORD major = (DWORD)(LOBYTE(LOWORD(version)));
|
DWORD major = (DWORD)(LOBYTE(LOWORD(version)));
|
||||||
DWORD minor = (DWORD)(HIBYTE(LOWORD(version)));
|
DWORD minor = (DWORD)(HIBYTE(LOWORD(version)));
|
||||||
BOOL useDirect3D = FALSE;
|
|
||||||
|
|
||||||
if (!This->wine && (major < 6 || (major == 6 && minor <= 1)))
|
// Win 7 and below use Direct3D 9 - Win 8/10 and wine use OpenGL
|
||||||
{
|
if (!This->wine && (major < 6 || (major == 6 && minor <= 1)) && (hD3D9 = LoadLibrary("d3d9.dll")))
|
||||||
BOOL dwmEnabled = TRUE;
|
|
||||||
|
|
||||||
HMODULE hDwmapi = LoadLibrary("Dwmapi.dll");
|
|
||||||
if (hDwmapi)
|
|
||||||
{
|
|
||||||
HRESULT(WINAPI *DwmIsCompositionEnabled)(BOOL*) =
|
|
||||||
(HRESULT(WINAPI *)(BOOL*))GetProcAddress(hDwmapi, "DwmIsCompositionEnabled");
|
|
||||||
|
|
||||||
if (DwmIsCompositionEnabled)
|
|
||||||
DwmIsCompositionEnabled(&dwmEnabled);
|
|
||||||
|
|
||||||
FreeLibrary(hDwmapi);
|
|
||||||
}
|
|
||||||
|
|
||||||
useDirect3D = !hDwmapi || !dwmEnabled;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (useDirect3D && FreeLibrary(LoadLibrary("d3d9.dll")))
|
|
||||||
This->renderer = render_d3d9_main;
|
This->renderer = render_d3d9_main;
|
||||||
else
|
else
|
||||||
This->renderer = render_main;
|
This->renderer = render_main;
|
||||||
|
@ -7,14 +7,14 @@
|
|||||||
|
|
||||||
typedef struct CUSTOMVERTEX { float x, y, z, rhw, u, v; } CUSTOMVERTEX;
|
typedef struct CUSTOMVERTEX { float x, y, z, rhw, u, v; } CUSTOMVERTEX;
|
||||||
|
|
||||||
static HMODULE hD3D9;
|
HMODULE hD3D9;
|
||||||
|
D3DPRESENT_PARAMETERS D3dpp;
|
||||||
static LPDIRECT3D9 D3d;
|
static LPDIRECT3D9 D3d;
|
||||||
static LPDIRECT3DDEVICE9 D3ddev;
|
static LPDIRECT3DDEVICE9 D3ddev;
|
||||||
static LPDIRECT3DVERTEXBUFFER9 D3dvb;
|
static LPDIRECT3DVERTEXBUFFER9 D3dvb;
|
||||||
static IDirect3DTexture9 *SurfaceTex;
|
static IDirect3DTexture9 *SurfaceTex;
|
||||||
static IDirect3DTexture9 *PaletteTex;
|
static IDirect3DTexture9 *PaletteTex;
|
||||||
static IDirect3DPixelShader9 *PixelShader;
|
static IDirect3DPixelShader9 *PixelShader;
|
||||||
static D3DPRESENT_PARAMETERS D3dpp;
|
|
||||||
static float ScaleW;
|
static float ScaleW;
|
||||||
static float ScaleH;
|
static float ScaleH;
|
||||||
static int MaxFPS;
|
static int MaxFPS;
|
||||||
@ -246,6 +246,7 @@ static void Render()
|
|||||||
if (InterlockedExchange(&ddraw->render.surfaceUpdated, FALSE))
|
if (InterlockedExchange(&ddraw->render.surfaceUpdated, FALSE))
|
||||||
{
|
{
|
||||||
RECT rc = { 0,0,ddraw->width,ddraw->height };
|
RECT rc = { 0,0,ddraw->width,ddraw->height };
|
||||||
|
|
||||||
if (SUCCEEDED(SurfaceTex->lpVtbl->LockRect(SurfaceTex, 0, &lock_rc, &rc, 0)))
|
if (SUCCEEDED(SurfaceTex->lpVtbl->LockRect(SurfaceTex, 0, &lock_rc, &rc, 0)))
|
||||||
{
|
{
|
||||||
unsigned char *src = (unsigned char *)ddraw->primary->surface;
|
unsigned char *src = (unsigned char *)ddraw->primary->surface;
|
||||||
@ -267,9 +268,11 @@ static void Render()
|
|||||||
if (InterlockedExchange(&ddraw->render.paletteUpdated, FALSE))
|
if (InterlockedExchange(&ddraw->render.paletteUpdated, FALSE))
|
||||||
{
|
{
|
||||||
RECT rc = { 0,0,256,1 };
|
RECT rc = { 0,0,256,1 };
|
||||||
|
|
||||||
if (SUCCEEDED(PaletteTex->lpVtbl->LockRect(PaletteTex, 0, &lock_rc, &rc, 0)))
|
if (SUCCEEDED(PaletteTex->lpVtbl->LockRect(PaletteTex, 0, &lock_rc, &rc, 0)))
|
||||||
{
|
{
|
||||||
memcpy(lock_rc.pBits, ddraw->primary->palette->data_rgb, 4 * 256);
|
memcpy(lock_rc.pBits, ddraw->primary->palette->data_rgb, 4 * 256);
|
||||||
|
|
||||||
PaletteTex->lpVtbl->UnlockRect(PaletteTex, 0);
|
PaletteTex->lpVtbl->UnlockRect(PaletteTex, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user