DX9/DX11: Fixing some maybe possible crashes if a game was started, the config dialog opened and the game closed again. Due to other issues this still happens quite often though...
Various warning fixes. git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@6684 8ced0084-cf51-0410-be5f-012b33b47a6e
This commit is contained in:
parent
603c99f64f
commit
07d947c834
|
@ -158,7 +158,7 @@ void CMixer::PushSamples(short *samples, unsigned int num_samples)
|
||||||
if (m_sampleRate == 32000)
|
if (m_sampleRate == 32000)
|
||||||
Common::AtomicAdd(m_numSamples, num_samples);
|
Common::AtomicAdd(m_numSamples, num_samples);
|
||||||
else if (m_sampleRate == 48000)
|
else if (m_sampleRate == 48000)
|
||||||
Common::AtomicAdd(m_numSamples, num_samples * 1.5);
|
Common::AtomicAdd(m_numSamples, num_samples * 3 / 2);
|
||||||
else
|
else
|
||||||
PanicAlert("Mixer: Unsupported sample rate.");
|
PanicAlert("Mixer: Unsupported sample rate.");
|
||||||
|
|
||||||
|
|
|
@ -158,7 +158,7 @@ bool XAudio2::Start()
|
||||||
void XAudio2::SetVolume(int volume)
|
void XAudio2::SetVolume(int volume)
|
||||||
{
|
{
|
||||||
//linear 1- .01
|
//linear 1- .01
|
||||||
m_volume = (float)volume / 100.0;
|
m_volume = (float)volume / 100.f;
|
||||||
|
|
||||||
if (pMasteringVoice)
|
if (pMasteringVoice)
|
||||||
pMasteringVoice->SetVolume(m_volume);
|
pMasteringVoice->SetVolume(m_volume);
|
||||||
|
|
|
@ -29,14 +29,17 @@ D3DX11COMPILEFROMMEMORYTYPE PD3DX11CompileFromMemory = NULL;
|
||||||
D3DX11FILTERTEXTURETYPE PD3DX11FilterTexture = NULL;
|
D3DX11FILTERTEXTURETYPE PD3DX11FilterTexture = NULL;
|
||||||
D3DX11SAVETEXTURETOFILEATYPE PD3DX11SaveTextureToFileA = NULL;
|
D3DX11SAVETEXTURETOFILEATYPE PD3DX11SaveTextureToFileA = NULL;
|
||||||
D3DX11SAVETEXTURETOFILEWTYPE PD3DX11SaveTextureToFileW = NULL;
|
D3DX11SAVETEXTURETOFILEWTYPE PD3DX11SaveTextureToFileW = NULL;
|
||||||
|
int d3dx_dll_ref = 0;
|
||||||
|
|
||||||
CREATEDXGIFACTORY PCreateDXGIFactory = NULL;
|
CREATEDXGIFACTORY PCreateDXGIFactory = NULL;
|
||||||
HINSTANCE hDXGIDll = NULL;
|
HINSTANCE hDXGIDll = NULL;
|
||||||
|
int dxgi_dll_ref = 0;
|
||||||
|
|
||||||
typedef HRESULT (WINAPI* D3D11CREATEDEVICEANDSWAPCHAIN)(IDXGIAdapter*, D3D_DRIVER_TYPE, HMODULE, UINT, CONST D3D_FEATURE_LEVEL*, UINT, UINT, CONST DXGI_SWAP_CHAIN_DESC*, IDXGISwapChain**, ID3D11Device**, D3D_FEATURE_LEVEL*, ID3D11DeviceContext**);
|
typedef HRESULT (WINAPI* D3D11CREATEDEVICEANDSWAPCHAIN)(IDXGIAdapter*, D3D_DRIVER_TYPE, HMODULE, UINT, CONST D3D_FEATURE_LEVEL*, UINT, UINT, CONST DXGI_SWAP_CHAIN_DESC*, IDXGISwapChain**, ID3D11Device**, D3D_FEATURE_LEVEL*, ID3D11DeviceContext**);
|
||||||
D3D11CREATEDEVICE PD3D11CreateDevice = NULL;
|
D3D11CREATEDEVICE PD3D11CreateDevice = NULL;
|
||||||
D3D11CREATEDEVICEANDSWAPCHAIN PD3D11CreateDeviceAndSwapChain = NULL;
|
D3D11CREATEDEVICEANDSWAPCHAIN PD3D11CreateDeviceAndSwapChain = NULL;
|
||||||
HINSTANCE hD3DDll = NULL;
|
HINSTANCE hD3DDll = NULL;
|
||||||
|
int d3d_dll_ref = 0;
|
||||||
|
|
||||||
namespace D3D
|
namespace D3D
|
||||||
{
|
{
|
||||||
|
@ -65,11 +68,14 @@ bool bFrameInProgress = false;
|
||||||
|
|
||||||
HRESULT LoadDXGI()
|
HRESULT LoadDXGI()
|
||||||
{
|
{
|
||||||
|
if (dxgi_dll_ref++ > 0) return S_OK;
|
||||||
|
|
||||||
if (hDXGIDll) return S_OK;
|
if (hDXGIDll) return S_OK;
|
||||||
hDXGIDll = LoadLibraryA("dxgi.dll");
|
hDXGIDll = LoadLibraryA("dxgi.dll");
|
||||||
if (!hDXGIDll)
|
if (!hDXGIDll)
|
||||||
{
|
{
|
||||||
MessageBoxA(NULL, "Failed to load dxgi.dll", "Critical error", MB_OK | MB_ICONERROR);
|
MessageBoxA(NULL, "Failed to load dxgi.dll", "Critical error", MB_OK | MB_ICONERROR);
|
||||||
|
--dxgi_dll_ref;
|
||||||
return E_FAIL;
|
return E_FAIL;
|
||||||
}
|
}
|
||||||
PCreateDXGIFactory = (CREATEDXGIFACTORY)GetProcAddress(hDXGIDll, "CreateDXGIFactory");
|
PCreateDXGIFactory = (CREATEDXGIFACTORY)GetProcAddress(hDXGIDll, "CreateDXGIFactory");
|
||||||
|
@ -80,11 +86,14 @@ HRESULT LoadDXGI()
|
||||||
|
|
||||||
HRESULT LoadD3D()
|
HRESULT LoadD3D()
|
||||||
{
|
{
|
||||||
|
if (d3d_dll_ref++ > 0) return S_OK;
|
||||||
|
|
||||||
if (hD3DDll) return S_OK;
|
if (hD3DDll) return S_OK;
|
||||||
hD3DDll = LoadLibraryA("d3d11.dll");
|
hD3DDll = LoadLibraryA("d3d11.dll");
|
||||||
if (!hD3DDll)
|
if (!hD3DDll)
|
||||||
{
|
{
|
||||||
MessageBoxA(NULL, "Failed to load d3d11.dll", "Critical error", MB_OK | MB_ICONERROR);
|
MessageBoxA(NULL, "Failed to load d3d11.dll", "Critical error", MB_OK | MB_ICONERROR);
|
||||||
|
--d3d_dll_ref;
|
||||||
return E_FAIL;
|
return E_FAIL;
|
||||||
}
|
}
|
||||||
PD3D11CreateDevice = (D3D11CREATEDEVICE)GetProcAddress(hD3DDll, "D3D11CreateDevice");
|
PD3D11CreateDevice = (D3D11CREATEDEVICE)GetProcAddress(hD3DDll, "D3D11CreateDevice");
|
||||||
|
@ -98,6 +107,7 @@ HRESULT LoadD3D()
|
||||||
|
|
||||||
HRESULT LoadD3DX()
|
HRESULT LoadD3DX()
|
||||||
{
|
{
|
||||||
|
if (d3dx_dll_ref++ > 0) return S_OK;
|
||||||
if (hD3DXDll) return S_OK;
|
if (hD3DXDll) return S_OK;
|
||||||
|
|
||||||
// try to load D3DX11 first to check whether we have proper runtime support
|
// try to load D3DX11 first to check whether we have proper runtime support
|
||||||
|
@ -135,6 +145,9 @@ HRESULT LoadD3DX()
|
||||||
|
|
||||||
void UnloadDXGI()
|
void UnloadDXGI()
|
||||||
{
|
{
|
||||||
|
if (!dxgi_dll_ref) return;
|
||||||
|
if (--dxgi_dll_ref != 0) return;
|
||||||
|
|
||||||
if(hDXGIDll) FreeLibrary(hDXGIDll);
|
if(hDXGIDll) FreeLibrary(hDXGIDll);
|
||||||
hDXGIDll = NULL;
|
hDXGIDll = NULL;
|
||||||
PCreateDXGIFactory = NULL;
|
PCreateDXGIFactory = NULL;
|
||||||
|
@ -142,6 +155,9 @@ void UnloadDXGI()
|
||||||
|
|
||||||
void UnloadD3DX()
|
void UnloadD3DX()
|
||||||
{
|
{
|
||||||
|
if (!d3dx_dll_ref) return;
|
||||||
|
if (--d3dx_dll_ref != 0) return;
|
||||||
|
|
||||||
if(hD3DXDll) FreeLibrary(hD3DXDll);
|
if(hD3DXDll) FreeLibrary(hD3DXDll);
|
||||||
hD3DXDll = NULL;
|
hD3DXDll = NULL;
|
||||||
PD3DX11FilterTexture = NULL;
|
PD3DX11FilterTexture = NULL;
|
||||||
|
@ -151,6 +167,9 @@ void UnloadD3DX()
|
||||||
|
|
||||||
void UnloadD3D()
|
void UnloadD3D()
|
||||||
{
|
{
|
||||||
|
if (!d3d_dll_ref) return;
|
||||||
|
if (--d3d_dll_ref != 0) return;
|
||||||
|
|
||||||
if(hD3DDll) FreeLibrary(hD3DDll);
|
if(hD3DDll) FreeLibrary(hD3DDll);
|
||||||
hD3DDll = NULL;
|
hD3DDll = NULL;
|
||||||
PD3D11CreateDevice = NULL;
|
PD3D11CreateDevice = NULL;
|
||||||
|
|
|
@ -27,7 +27,7 @@ D3DBlob::D3DBlob(ID3D10Blob* d3dblob) : ref(1)
|
||||||
{
|
{
|
||||||
blob = d3dblob;
|
blob = d3dblob;
|
||||||
data = (u8*)blob->GetBufferPointer();
|
data = (u8*)blob->GetBufferPointer();
|
||||||
size = blob->GetBufferSize();
|
size = (unsigned int)blob->GetBufferSize();
|
||||||
d3dblob->AddRef();
|
d3dblob->AddRef();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -167,7 +167,7 @@ void DllConfig(void *_hParent)
|
||||||
if (SUCCEEDED(hr)) hr = D3D::LoadD3D();
|
if (SUCCEEDED(hr)) hr = D3D::LoadD3D();
|
||||||
if (FAILED(hr))
|
if (FAILED(hr))
|
||||||
{
|
{
|
||||||
if (!s_PluginInitialized) D3D::UnloadDXGI();
|
D3D::UnloadDXGI();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -212,11 +212,8 @@ void DllConfig(void *_hParent)
|
||||||
diag->ShowModal();
|
diag->ShowModal();
|
||||||
diag->Destroy();
|
diag->Destroy();
|
||||||
|
|
||||||
if (!s_PluginInitialized)
|
|
||||||
{
|
|
||||||
D3D::UnloadDXGI();
|
D3D::UnloadDXGI();
|
||||||
D3D::UnloadD3D();
|
D3D::UnloadD3D();
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -26,10 +26,12 @@ HINSTANCE hD3DXDll = NULL;
|
||||||
D3DXSAVESURFACETOFILEATYPE PD3DXSaveSurfaceToFileA = NULL;
|
D3DXSAVESURFACETOFILEATYPE PD3DXSaveSurfaceToFileA = NULL;
|
||||||
D3DXSAVETEXTURETOFILEATYPE PD3DXSaveTextureToFileA = NULL;
|
D3DXSAVETEXTURETOFILEATYPE PD3DXSaveTextureToFileA = NULL;
|
||||||
D3DXCOMPILESHADERTYPE PD3DXCompileShader = NULL;
|
D3DXCOMPILESHADERTYPE PD3DXCompileShader = NULL;
|
||||||
|
int d3dx_dll_ref = 0;
|
||||||
|
|
||||||
typedef IDirect3D9* (WINAPI* DIRECT3DCREATE9)(UINT);
|
typedef IDirect3D9* (WINAPI* DIRECT3DCREATE9)(UINT);
|
||||||
DIRECT3DCREATE9 PDirect3DCreate9 = NULL;
|
DIRECT3DCREATE9 PDirect3DCreate9 = NULL;
|
||||||
HINSTANCE hD3DDll = NULL;
|
HINSTANCE hD3DDll = NULL;
|
||||||
|
int d3d_dll_ref = 0;
|
||||||
|
|
||||||
namespace D3D
|
namespace D3D
|
||||||
{
|
{
|
||||||
|
@ -93,6 +95,8 @@ bool IsATIDevice()
|
||||||
|
|
||||||
HRESULT Init()
|
HRESULT Init()
|
||||||
{
|
{
|
||||||
|
if (d3d_dll_ref++ > 0) return S_OK;
|
||||||
|
|
||||||
hD3DDll = LoadLibraryA("d3d9.dll");
|
hD3DDll = LoadLibraryA("d3d9.dll");
|
||||||
if (!hD3DDll)
|
if (!hD3DDll)
|
||||||
{
|
{
|
||||||
|
@ -105,15 +109,20 @@ HRESULT Init()
|
||||||
// Create the D3D object, which is needed to create the D3DDevice.
|
// Create the D3D object, which is needed to create the D3DDevice.
|
||||||
D3D = PDirect3DCreate9(D3D_SDK_VERSION);
|
D3D = PDirect3DCreate9(D3D_SDK_VERSION);
|
||||||
if (!D3D)
|
if (!D3D)
|
||||||
|
{
|
||||||
|
--d3d_dll_ref;
|
||||||
return E_FAIL;
|
return E_FAIL;
|
||||||
|
}
|
||||||
Enumerate();
|
Enumerate();
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Shutdown()
|
void Shutdown()
|
||||||
{
|
{
|
||||||
if(D3D)
|
if (!d3d_dll_ref) return;
|
||||||
D3D->Release();
|
if (--d3d_dll_ref != 0) return;
|
||||||
|
|
||||||
|
if (D3D) D3D->Release();
|
||||||
D3D = NULL;
|
D3D = NULL;
|
||||||
|
|
||||||
if (hD3DDll) FreeLibrary(hD3DDll);
|
if (hD3DDll) FreeLibrary(hD3DDll);
|
||||||
|
@ -278,6 +287,8 @@ void Enumerate()
|
||||||
// we're first trying to load the dll Dolphin was compiled with, otherwise the most up-to-date one
|
// we're first trying to load the dll Dolphin was compiled with, otherwise the most up-to-date one
|
||||||
HRESULT LoadD3DX9()
|
HRESULT LoadD3DX9()
|
||||||
{
|
{
|
||||||
|
if (d3dx_dll_ref++ > 0) return S_OK;
|
||||||
|
|
||||||
HRESULT hr = E_FAIL;
|
HRESULT hr = E_FAIL;
|
||||||
hD3DXDll = LoadLibraryA(StringFromFormat("d3dx9_%d.dll", D3DX_SDK_VERSION).c_str());
|
hD3DXDll = LoadLibraryA(StringFromFormat("d3dx9_%d.dll", D3DX_SDK_VERSION).c_str());
|
||||||
if (hD3DXDll != NULL)
|
if (hD3DXDll != NULL)
|
||||||
|
@ -326,6 +337,7 @@ HRESULT LoadD3DX9()
|
||||||
return S_OK;
|
return S_OK;
|
||||||
|
|
||||||
fail:
|
fail:
|
||||||
|
--d3dx_dll_ref;
|
||||||
FreeLibrary(hD3DXDll);
|
FreeLibrary(hD3DXDll);
|
||||||
PD3DXCompileShader = NULL;
|
PD3DXCompileShader = NULL;
|
||||||
PD3DXSaveSurfaceToFileA = NULL;
|
PD3DXSaveSurfaceToFileA = NULL;
|
||||||
|
@ -335,6 +347,9 @@ fail:
|
||||||
|
|
||||||
void UnloadD3DX9()
|
void UnloadD3DX9()
|
||||||
{
|
{
|
||||||
|
if (!d3dx_dll_ref) return;
|
||||||
|
if (--d3dx_dll_ref != 0) return;
|
||||||
|
|
||||||
FreeLibrary(hD3DXDll);
|
FreeLibrary(hD3DXDll);
|
||||||
PD3DXCompileShader = NULL;
|
PD3DXCompileShader = NULL;
|
||||||
PD3DXSaveSurfaceToFileA = NULL;
|
PD3DXSaveSurfaceToFileA = NULL;
|
||||||
|
|
|
@ -165,9 +165,6 @@ void DllConfig(void *_hParent)
|
||||||
{
|
{
|
||||||
#if defined(HAVE_WX) && HAVE_WX
|
#if defined(HAVE_WX) && HAVE_WX
|
||||||
InitBackendInfo();
|
InitBackendInfo();
|
||||||
|
|
||||||
// If not initialized, only init D3D so we can enumerate resolutions.
|
|
||||||
if (!s_PluginInitialized)
|
|
||||||
D3D::Init();
|
D3D::Init();
|
||||||
|
|
||||||
// adapters
|
// adapters
|
||||||
|
@ -190,7 +187,6 @@ void DllConfig(void *_hParent)
|
||||||
diag->ShowModal();
|
diag->ShowModal();
|
||||||
diag->Destroy();
|
diag->Destroy();
|
||||||
|
|
||||||
if (!s_PluginInitialized)
|
|
||||||
D3D::Shutdown();
|
D3D::Shutdown();
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue