mirror of
https://github.com/ClassiCube/ClassiCube.git
synced 2025-09-14 10:05:44 -04:00
Direct3D9Ex: Avoid having to recreate resources if possible when resizing window/toggling vsync
This commit is contained in:
parent
417f58f5ce
commit
a141e7e4ce
@ -20,6 +20,7 @@ static DWORD d3d9_formatMappings[2] = { D3DFVF_XYZ | D3DFVF_DIFFUSE, D3DFVF_XYZ
|
|||||||
/* Current format and size of vertices */
|
/* Current format and size of vertices */
|
||||||
static int gfx_stride, gfx_format = -1;
|
static int gfx_stride, gfx_format = -1;
|
||||||
|
|
||||||
|
static cc_bool using_d3d9Ex;
|
||||||
static IDirect3D9* d3d;
|
static IDirect3D9* d3d;
|
||||||
static IDirect3DDevice9* device;
|
static IDirect3DDevice9* device;
|
||||||
static DWORD createFlags;
|
static DWORD createFlags;
|
||||||
@ -73,6 +74,7 @@ static void CreateD3D9Instance(void) {
|
|||||||
res = _Direct3DCreate9Ex(D3D_SDK_VERSION, &d3d);
|
res = _Direct3DCreate9Ex(D3D_SDK_VERSION, &d3d);
|
||||||
if (res) Logger_Abort2(res, "Direct3D9Create9Ex failed");
|
if (res) Logger_Abort2(res, "Direct3D9Create9Ex failed");
|
||||||
/* Extended Direct3D9 does not support managed textures */
|
/* Extended Direct3D9 does not support managed textures */
|
||||||
|
using_d3d9Ex = true;
|
||||||
} else {
|
} else {
|
||||||
d3d = _Direct3DCreate9(D3D_SDK_VERSION);
|
d3d = _Direct3DCreate9(D3D_SDK_VERSION);
|
||||||
/* Normal Direct3D9 supports POOL_MANAGED textures */
|
/* Normal Direct3D9 supports POOL_MANAGED textures */
|
||||||
@ -326,7 +328,7 @@ GfxResourceID Gfx_CreateTexture(struct Bitmap* bmp, cc_uint8 flags, cc_bool mipm
|
|||||||
}
|
}
|
||||||
if (Gfx.LostContext) return 0;
|
if (Gfx.LostContext) return 0;
|
||||||
|
|
||||||
if ((flags & TEXTURE_FLAG_MANAGED) && Gfx.ManagedTextures) {
|
if ((flags & TEXTURE_FLAG_MANAGED) && !using_d3d9Ex) {
|
||||||
for (;;) {
|
for (;;) {
|
||||||
res = IDirect3DDevice9_CreateTexture(device, bmp->width, bmp->height, levels,
|
res = IDirect3DDevice9_CreateTexture(device, bmp->width, bmp->height, levels,
|
||||||
0, D3DFMT_A8R8G8B8, D3DPOOL_MANAGED, &tex, NULL);
|
0, D3DFMT_A8R8G8B8, D3DPOOL_MANAGED, &tex, NULL);
|
||||||
@ -336,8 +338,8 @@ GfxResourceID Gfx_CreateTexture(struct Bitmap* bmp, cc_uint8 flags, cc_bool mipm
|
|||||||
D3D9_SetTextureData(tex, bmp, 0);
|
D3D9_SetTextureData(tex, bmp, 0);
|
||||||
if (mipmaps) D3D9_DoMipmaps(tex, 0, 0, bmp, bmp->width, false);
|
if (mipmaps) D3D9_DoMipmaps(tex, 0, 0, bmp, bmp->width, false);
|
||||||
} else {
|
} else {
|
||||||
/* Direct3D9ex doesn't support dynamic textures */
|
/* Direct3D9Ex doesn't support dynamic textures */
|
||||||
if ((flags & TEXTURE_FLAG_DYNAMIC) && !Gfx.ManagedTextures) usage = D3DUSAGE_DYNAMIC;
|
if ((flags & TEXTURE_FLAG_DYNAMIC) && using_d3d9Ex) usage = D3DUSAGE_DYNAMIC;
|
||||||
|
|
||||||
for (;;) {
|
for (;;) {
|
||||||
res = IDirect3DDevice9_CreateTexture(device, bmp->width, bmp->height, levels,
|
res = IDirect3DDevice9_CreateTexture(device, bmp->width, bmp->height, levels,
|
||||||
@ -754,12 +756,23 @@ finished:
|
|||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void UpdateSwapchain(const char* reason) {
|
||||||
|
D3DPRESENT_PARAMETERS args = { 0 };
|
||||||
|
if (using_d3d9Ex) {
|
||||||
|
/* Try to use ResetEx first to avoid resetting resources */
|
||||||
|
IDirect3DDevice9Ex* dev = (IDirect3DDevice9Ex*)device;
|
||||||
|
D3D9_FillPresentArgs(&args);
|
||||||
|
if (!IDirect3DDevice9Ex_ResetEx(dev, &args, NULL)) return;
|
||||||
|
}
|
||||||
|
Gfx_LoseContext(reason);
|
||||||
|
}
|
||||||
|
|
||||||
void Gfx_SetFpsLimit(cc_bool vsync, float minFrameMs) {
|
void Gfx_SetFpsLimit(cc_bool vsync, float minFrameMs) {
|
||||||
gfx_minFrameMs = minFrameMs;
|
gfx_minFrameMs = minFrameMs;
|
||||||
if (gfx_vsync == vsync) return;
|
if (gfx_vsync == vsync) return;
|
||||||
|
|
||||||
gfx_vsync = vsync;
|
gfx_vsync = vsync;
|
||||||
if (device) Gfx_LoseContext(" (toggling VSync)");
|
if (device) UpdateSwapchain(" (toggling VSync)");
|
||||||
}
|
}
|
||||||
|
|
||||||
void Gfx_BeginFrame(void) {
|
void Gfx_BeginFrame(void) {
|
||||||
@ -813,6 +826,6 @@ void Gfx_GetApiInfo(cc_string* info) {
|
|||||||
void Gfx_OnWindowResize(void) {
|
void Gfx_OnWindowResize(void) {
|
||||||
if (Game.Width == cachedWidth && Game.Height == cachedHeight) return;
|
if (Game.Width == cachedWidth && Game.Height == cachedHeight) return;
|
||||||
/* Only resize when necessary */
|
/* Only resize when necessary */
|
||||||
Gfx_LoseContext(" (resizing window)");
|
UpdateSwapchain(" (resizing window)");
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
x
Reference in New Issue
Block a user