diff --git a/Sources/Plasma/PubUtilLib/plPipeline/CMakeLists.txt b/Sources/Plasma/PubUtilLib/plPipeline/CMakeLists.txt
index 45a5fa6c..2f7012f0 100644
--- a/Sources/Plasma/PubUtilLib/plPipeline/CMakeLists.txt
+++ b/Sources/Plasma/PubUtilLib/plPipeline/CMakeLists.txt
@@ -32,6 +32,7 @@ set(plPipeline_SOURCES
)
set(plDXPipeline_SOURCES
+ DX/hsGDirect3D.cpp
DX/plDXDeviceRefs.cpp
DX/plDXEnumerate.cpp
DX/plDXPipeline.cpp
@@ -73,6 +74,7 @@ set(plPipeline_HEADERS
)
set(plDXPipeline_HEADERS
+ DX/hsGDirect3D.h
DX/plDXBufferRefs.h
DX/plDXDeviceRef.h
DX/plDXEnumerate.h
diff --git a/Sources/Plasma/PubUtilLib/plPipeline/DX/hsGDirect3D.cpp b/Sources/Plasma/PubUtilLib/plPipeline/DX/hsGDirect3D.cpp
new file mode 100644
index 00000000..75e27227
--- /dev/null
+++ b/Sources/Plasma/PubUtilLib/plPipeline/DX/hsGDirect3D.cpp
@@ -0,0 +1,82 @@
+/*==LICENSE==*
+
+CyanWorlds.com Engine - MMOG client, server and tools
+Copyright (C) 2011 Cyan Worlds, Inc.
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see .
+
+Additional permissions under GNU GPL version 3 section 7
+
+If you modify this Program, or any covered work, by linking or
+combining it with any of RAD Game Tools Bink SDK, Autodesk 3ds Max SDK,
+NVIDIA PhysX SDK, Microsoft DirectX SDK, OpenSSL library, Independent
+JPEG Group JPEG library, Microsoft Windows Media SDK, or Apple QuickTime SDK
+(or a modified version of those libraries),
+containing parts covered by the terms of the Bink SDK EULA, 3ds Max EULA,
+PhysX SDK EULA, DirectX SDK EULA, OpenSSL and SSLeay licenses, IJG
+JPEG Library README, Windows Media SDK EULA, or QuickTime SDK EULA, the
+licensors of this Program grant you additional
+permission to convey the resulting work. Corresponding Source for a
+non-source form of such a combination shall include the source code for
+the parts of OpenSSL and IJG JPEG Library used as well as that of the covered
+work.
+
+You can contact Cyan Worlds, Inc. by email legal@cyan.com
+ or by snail mail at:
+ Cyan Worlds, Inc.
+ 14617 N Newport Hwy
+ Mead, WA 99021
+
+*==LICENSE==*/
+
+#include "hsGDirect3D.h"
+#include "plDXEnumerate.h"
+
+#include
+#include
+#include
+
+static std::unique_ptr s_tnlEnum;
+hsGDirect3DTnLEnumerate& hsGDirect3D::EnumerateTnL(bool reenum)
+{
+ if (reenum || !s_tnlEnum.get())
+ s_tnlEnum.reset(new hsGDirect3DTnLEnumerate());
+
+ // Be nice to legacy code and return a reference...
+ hsGDirect3DTnLEnumerate* ptr = s_tnlEnum.get();
+ return *ptr;
+}
+
+void hsGDirect3D::ReleaseTnLEnum()
+{
+ s_tnlEnum.release();
+}
+
+static void IDeleteDirect3D(IDirect3D9* d3d)
+{
+ while (d3d->Release()) { }
+}
+
+static std::unique_ptr> s_direct3d(nullptr, IDeleteDirect3D);
+IDirect3D9* hsGDirect3D::GetDirect3D(bool recreate)
+{
+ if (recreate || !s_direct3d.get()) {
+ IDirect3D9* ptr = Direct3DCreate9(D3D_SDK_VERSION);
+ hsAssert(ptr, "failed to create Direct3D");
+
+ s_direct3d.reset(ptr);
+ }
+ return s_direct3d.get();
+}
+
diff --git a/Sources/Plasma/PubUtilLib/plPipeline/DX/hsGDirect3D.h b/Sources/Plasma/PubUtilLib/plPipeline/DX/hsGDirect3D.h
new file mode 100644
index 00000000..4088514c
--- /dev/null
+++ b/Sources/Plasma/PubUtilLib/plPipeline/DX/hsGDirect3D.h
@@ -0,0 +1,60 @@
+/*==LICENSE==*
+
+CyanWorlds.com Engine - MMOG client, server and tools
+Copyright (C) 2011 Cyan Worlds, Inc.
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see .
+
+Additional permissions under GNU GPL version 3 section 7
+
+If you modify this Program, or any covered work, by linking or
+combining it with any of RAD Game Tools Bink SDK, Autodesk 3ds Max SDK,
+NVIDIA PhysX SDK, Microsoft DirectX SDK, OpenSSL library, Independent
+JPEG Group JPEG library, Microsoft Windows Media SDK, or Apple QuickTime SDK
+(or a modified version of those libraries),
+containing parts covered by the terms of the Bink SDK EULA, 3ds Max EULA,
+PhysX SDK EULA, DirectX SDK EULA, OpenSSL and SSLeay licenses, IJG
+JPEG Library README, Windows Media SDK EULA, or QuickTime SDK EULA, the
+licensors of this Program grant you additional
+permission to convey the resulting work. Corresponding Source for a
+non-source form of such a combination shall include the source code for
+the parts of OpenSSL and IJG JPEG Library used as well as that of the covered
+work.
+
+You can contact Cyan Worlds, Inc. by email legal@cyan.com
+ or by snail mail at:
+ Cyan Worlds, Inc.
+ 14617 N Newport Hwy
+ Mead, WA 99021
+
+*==LICENSE==*/
+
+#ifndef _hsGDirect3D_inc_
+#define _hsGDirect3D_inc_
+
+class hsGDirect3DTnLEnumerate;
+struct IDirect3D9;
+
+namespace hsGDirect3D
+{
+ hsGDirect3DTnLEnumerate& EnumerateTnL(bool reenum=false);
+ void ReleaseTnLEnum();
+
+ /** Get a root Direct3D object.
+ * \remarks You should not hold this pointer.
+ */
+ IDirect3D9* GetDirect3D(bool recreate=false);
+}
+
+#endif // _hsGDirect3D_inc_
diff --git a/Sources/Plasma/PubUtilLib/plPipeline/DX/plDXEnumerate.cpp b/Sources/Plasma/PubUtilLib/plPipeline/DX/plDXEnumerate.cpp
index 8588b545..de401b52 100644
--- a/Sources/Plasma/PubUtilLib/plPipeline/DX/plDXEnumerate.cpp
+++ b/Sources/Plasma/PubUtilLib/plPipeline/DX/plDXEnumerate.cpp
@@ -42,6 +42,7 @@ You can contact Cyan Worlds, Inc. by email legal@cyan.com
#include "plDXEnumerate.h"
#include "plPipeline/hsG3DDeviceSelector.h"
+#include "hsGDirect3D.h"
//// Local Typedefs ///////////////////////////////////////////////////////////
@@ -281,8 +282,8 @@ hsGDirect3DTnLEnumerate::hsGDirect3DTnLEnumerate()
fDrivers.Reset(); // List of DD drivers
// Create a D3D object to use
- IDirect3D9 *pD3D = Direct3DCreate9( D3D_SDK_VERSION );
- if( pD3D == nil )
+ IDirect3D9* pD3D = hsGDirect3D::GetDirect3D();
+ if (!pD3D)
{
strcpy( fEnumeErrorStr, "Cannot load DirectX!" );
return;
@@ -309,9 +310,6 @@ hsGDirect3DTnLEnumerate::hsGDirect3DTnLEnumerate()
/// Do the mode and device enumeration for this adapter
IEnumAdapterDevices( pD3D, iAdapter, newDriver );
}
-
- // Cleanup
- pD3D->Release();
}
//// IEnumAdapterDevices //////////////////////////////////////////////////////
@@ -645,7 +643,7 @@ bool hsG3DDeviceSelector::IGetD3DCardInfo( hsG3DDeviceRecord &record,
void hsG3DDeviceSelector::ITryDirect3DTnL(hsWinRef winRef)
{
- hsGDirect3DTnLEnumerate d3dEnum;
+ hsGDirect3DTnLEnumerate& d3dEnum = hsGDirect3D::EnumerateTnL();
int i;
for( i = 0; i < d3dEnum.GetNumDrivers(); i++ )
diff --git a/Sources/Plasma/PubUtilLib/plPipeline/DX/plDXEnumerate.h b/Sources/Plasma/PubUtilLib/plPipeline/DX/plDXEnumerate.h
index 5a65803f..0a1e0e18 100644
--- a/Sources/Plasma/PubUtilLib/plPipeline/DX/plDXEnumerate.h
+++ b/Sources/Plasma/PubUtilLib/plPipeline/DX/plDXEnumerate.h
@@ -121,8 +121,6 @@ class hsG3DDeviceMode;
class hsGDirect3DTnLEnumerate
{
protected:
- HMODULE fDDrawDLL;
-
char fEnumeErrorStr[128]; // ドライバ、デバイス列挙エラーメッセージ格納バッファ
hsTArray fDrivers;
diff --git a/Sources/Plasma/PubUtilLib/plPipeline/DX/plDXPipeline.cpp b/Sources/Plasma/PubUtilLib/plPipeline/DX/plDXPipeline.cpp
index 496cc6cf..7fee0784 100644
--- a/Sources/Plasma/PubUtilLib/plPipeline/DX/plDXPipeline.cpp
+++ b/Sources/Plasma/PubUtilLib/plPipeline/DX/plDXPipeline.cpp
@@ -56,6 +56,7 @@ You can contact Cyan Worlds, Inc. by email legal@cyan.com
#include
#include
+#include "hsGDirect3D.h"
#if defined(DX_OLD_SDK) || defined(__MINGW32__)
#include
@@ -623,7 +624,7 @@ plDXPipeline::plDXPipeline( hsWinRef hWnd, const hsG3DDeviceModeRecord *devModeR
else
fSettings.fNumAASamples = devMode->GetFSAAType( devRec->GetAASetting() - 1 );
- hsGDirect3DTnLEnumerate d3dEnum;
+ hsGDirect3DTnLEnumerate& d3dEnum = hsGDirect3D::EnumerateTnL();
if( d3dEnum.GetEnumeErrorStr()[ 0 ] )
{
IShowErrorMessage( (char *)d3dEnum.GetEnumeErrorStr() );
@@ -636,16 +637,6 @@ plDXPipeline::plDXPipeline( hsWinRef hWnd, const hsG3DDeviceModeRecord *devModeR
return;
}
- // Gotta create this very first, so that the device/driver init works
- if( !fD3DObject )
- {
- if( ICreateMaster() )
- {
- IShowErrorMessage( "Cannot create D3D master object" );
- return;
- }
- }
-
// Record the requested mode/setup.
ISetCurrentDriver( d3dEnum.GetCurrentDriver() );
ISetCurrentDevice( d3dEnum.GetCurrentDevice() );
@@ -693,6 +684,8 @@ plDXPipeline::plDXPipeline( hsWinRef hWnd, const hsG3DDeviceModeRecord *devModeR
plStatusLog::AddLineS("pipeline.log", "%d, %d, %d", temp[i].Width, temp[i].Height, 32);
}*/
+ // We don't need the TnL enumeration for the lifetime of the game, so say goodbye!
+ hsGDirect3D::ReleaseTnLEnum();
}
// Cleanup - Most happens in IReleaseDeviceObject().
@@ -720,7 +713,7 @@ plDXPipeline::~plDXPipeline()
// built from. For example, the fD3DObject pointer is set to nil so that it's safe
// to delete or set to a valid pointer. It must be set to a valid pointer
// before the pipeline can be used for much.
-// After the core initialization is done (in ICreateMaster and ICreateDeviceObjects)
+// After the core initialization is done (in ICreateDeviceObjects)
// render state will be initialized in IInitDeviceState.
void plDXPipeline::IClearMembers()
@@ -772,7 +765,6 @@ void plDXPipeline::IClearMembers()
fBlurVBuffers[i] = nil;
fBlurVSHandle = 0;
- fD3DObject = nil;
fD3DDevice = nil;
fD3DBackBuff = nil;
fD3DDepthSurface = nil;
@@ -1388,11 +1380,13 @@ void plDXPipeline::ISetCurrentDriver( D3DEnum_DriverInfo *driv )
fCurrentDriver->fCurrentDevice = nil;
/// Go looking for an adapter to match this one
+ IDirect3D9* d3d = hsGDirect3D::GetDirect3D();
UINT iAdapter;
- for( fCurrentAdapter = 0, iAdapter = 0; iAdapter < fD3DObject->GetAdapterCount(); iAdapter++ )
+
+ for( fCurrentAdapter = 0, iAdapter = 0; iAdapter < d3d->GetAdapterCount(); iAdapter++ )
{
D3DADAPTER_IDENTIFIER9 adapterInfo;
- fD3DObject->GetAdapterIdentifier( iAdapter, 0, &adapterInfo );
+ d3d->GetAdapterIdentifier( iAdapter, 0, &adapterInfo );
if( adapterInfo.DeviceIdentifier == fCurrentDriver->fAdapterInfo.DeviceIdentifier )
{
@@ -1469,9 +1463,9 @@ bool plDXPipeline::IFindCompressedFormats()
for( i = 0; toCheckFor[ i ] != D3DFMT_UNKNOWN; i++ )
{
- if( FAILED( fD3DObject->CheckDeviceFormat( fCurrentAdapter, fCurrentDevice->fDDType,
- fCurrentMode->fDDmode.Format,
- 0, D3DRTYPE_TEXTURE, toCheckFor[ i ] ) ) )
+ if( FAILED( hsGDirect3D::GetDirect3D()->CheckDeviceFormat( fCurrentAdapter, fCurrentDevice->fDDType,
+ fCurrentMode->fDDmode.Format,
+ 0, D3DRTYPE_TEXTURE, toCheckFor[ i ] ) ) )
return false;
}
@@ -1491,9 +1485,9 @@ bool plDXPipeline::IFindLuminanceFormats()
for( i = 0; toCheckFor[ i ] != D3DFMT_UNKNOWN; i++ )
{
- if( FAILED( fD3DObject->CheckDeviceFormat( fCurrentAdapter, fCurrentDevice->fDDType,
- fCurrentMode->fDDmode.Format,
- 0, D3DRTYPE_TEXTURE, toCheckFor[ i ] ) ) )
+ if (FAILED(hsGDirect3D::GetDirect3D()->CheckDeviceFormat(fCurrentAdapter, fCurrentDevice->fDDType,
+ fCurrentMode->fDDmode.Format,
+ 0, D3DRTYPE_TEXTURE, toCheckFor[ i ] ) ) )
return false;
}
@@ -1508,9 +1502,9 @@ bool plDXPipeline::IFindLuminanceFormats()
bool plDXPipeline::ITextureFormatAllowed( D3DFORMAT format )
{
- if( FAILED( fD3DObject->CheckDeviceFormat( fCurrentAdapter, fCurrentDevice->fDDType,
- fCurrentMode->fDDmode.Format,
- 0, D3DRTYPE_TEXTURE, format ) ) )
+ if (FAILED( hsGDirect3D::GetDirect3D()->CheckDeviceFormat(fCurrentAdapter, fCurrentDevice->fDDType,
+ fCurrentMode->fDDmode.Format,
+ 0, D3DRTYPE_TEXTURE, format ) ) )
return false;
return true;
@@ -1555,23 +1549,6 @@ bool plDXPipeline::IsDebugFlagSet( uint32_t flag ) const
//// Device Creation //////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
-//// ICreateMaster ////////////////////////////////////////////////////////////
-// Creates the master Direct3D objects. I guess just in case you want
-// multiple Direct3D devices.... :~
-
-bool plDXPipeline::ICreateMaster()
-{
- hsAssert( !fD3DObject, "ICreateMaster() should only be called for Master Direct3DDevice" );
-
- /// The new DirectX Way: Create a Direct3D object, out of which everything else springs
- fD3DObject = Direct3DCreate9( D3D_SDK_VERSION );
-
- if( fD3DObject == nil )
- return ICreateFail( "Cannot create Direct3D object" );
-
- return false;
-}
-
//// ICreateDevice ////////////////////////////////////////////////////
//
// Creates the device. Surfaces, buffers, etc. created separately (in case of lost device).
@@ -1587,7 +1564,11 @@ bool plDXPipeline::ICreateDevice(bool windowed)
char msg[ 256 ];
#endif // DBG_WRITE_FORMATS
- INIT_ERROR_CHECK( fD3DObject->GetAdapterDisplayMode( fCurrentAdapter, &dispMode ),
+ IDirect3D9* d3d = hsGDirect3D::GetDirect3D();
+ if (!d3d)
+ return ICreateFail("Failed to get Direct3D Object");
+
+ INIT_ERROR_CHECK( d3d->GetAdapterDisplayMode( fCurrentAdapter, &dispMode ),
"Cannot get desktop display mode" );
// save desktop properties
@@ -1684,10 +1665,10 @@ bool plDXPipeline::ICreateDevice(bool windowed)
#ifndef PLASMA_EXTERNAL_RELEASE
UINT adapter;
- for (adapter = 0; adapter < fD3DObject->GetAdapterCount(); adapter++)
+ for (adapter = 0; adapter < d3d->GetAdapterCount(); adapter++)
{
D3DADAPTER_IDENTIFIER9 id;
- fD3DObject->GetAdapterIdentifier(adapter, 0, &id);
+ d3d->GetAdapterIdentifier(adapter, 0, &id);
// We should be matching against "NVIDIA NVPerfHUD", but the space
// in the description seems to be bogus. This seems to be a fair
@@ -1705,9 +1686,9 @@ bool plDXPipeline::ICreateDevice(bool windowed)
}
#endif // PLASMA_EXTERNAL_RELEASE
- INIT_ERROR_CHECK( fD3DObject->CreateDevice( fCurrentAdapter, fCurrentDevice->fDDType,
- fSettings.fHWnd, fCurrentMode->fDDBehavior,
- ¶ms, &fD3DDevice ),
+ INIT_ERROR_CHECK( d3d->CreateDevice( fCurrentAdapter, fCurrentDevice->fDDType,
+ fSettings.fHWnd, fCurrentMode->fDDBehavior,
+ ¶ms, &fD3DDevice ),
"Cannot create primary display surface via CreateDevice()" );
fSettings.fPresentParams = params;
@@ -1736,6 +1717,8 @@ bool plDXPipeline::ICreateDevice(bool windowed)
// will work.
bool plDXPipeline::IFindDepthFormat(D3DPRESENT_PARAMETERS& params)
{
+ IDirect3D9* d3d = hsGDirect3D::GetDirect3D();
+
// Okay, we're not using the stencil buffer right now, and it's bringing out
// some painful driver bugs on the GeForce2. So rather than go out of our way
// looking for trouble, we're going to look for a depth buffer with NO STENCIL.
@@ -1747,11 +1730,11 @@ bool plDXPipeline::IFindDepthFormat(D3DPRESENT_PARAMETERS& params)
||(fmt == D3DFMT_D24X8)
||(fmt == D3DFMT_D16) )
{
- HRESULT hr = fD3DObject->CheckDeviceMultiSampleType(fCurrentAdapter,
- fCurrentDevice->fDDType,
- fmt,
- fCurrentMode->fWindowed ? TRUE : FALSE,
- params.MultiSampleType, NULL);
+ HRESULT hr = d3d->CheckDeviceMultiSampleType(fCurrentAdapter,
+ fCurrentDevice->fDDType,
+ fmt,
+ fCurrentMode->fWindowed ? TRUE : FALSE,
+ params.MultiSampleType, NULL);
if( !FAILED(hr) )
{
params.AutoDepthStencilFormat = fmt;
@@ -1767,11 +1750,11 @@ bool plDXPipeline::IFindDepthFormat(D3DPRESENT_PARAMETERS& params)
D3DFORMAT fmt = fCurrentMode->fDepthFormats[ i ];
if( fmt == D3DFMT_D15S1 || fmt == D3DFMT_D24X4S4 || fmt == D3DFMT_D24S8 )
{
- HRESULT hr = fD3DObject->CheckDeviceMultiSampleType(fCurrentAdapter,
- fCurrentDevice->fDDType,
- fmt,
- fCurrentMode->fWindowed ? TRUE : FALSE,
- params.MultiSampleType, NULL);
+ HRESULT hr = d3d->CheckDeviceMultiSampleType(fCurrentAdapter,
+ fCurrentDevice->fDDType,
+ fmt,
+ fCurrentMode->fWindowed ? TRUE : FALSE,
+ params.MultiSampleType, NULL);
if( !FAILED(hr) )
{
params.AutoDepthStencilFormat = fmt;
@@ -2033,16 +2016,6 @@ void plDXPipeline::IReleaseDeviceObjects()
fD3DDevice = nil;
}
- if( fD3DObject != nil )
- {
- LONG ret;
- while( ret = fD3DObject->Release() )
- {
- hsStatusMessageF("%d - Error releasing Direct3D Object", ret);
- }
- fD3DObject = nil;
- }
-
fManagedAlloced = false;
fAllocUnManaged = false;
}
@@ -2541,13 +2514,10 @@ void plDXPipeline::Resize( uint32_t width, uint32_t height )
}
// Recreate
- if( !fD3DObject )
+ if( hsGDirect3D::GetDirect3D(true) )
{
- if( ICreateMaster() )
- {
- IShowErrorMessage( "Cannot create D3D master object" );
- return;
- }
+ IShowErrorMessage( "Cannot create D3D master object" );
+ return;
}
// Go recreate surfaces and DX-dependent objects
@@ -4780,6 +4750,7 @@ bool plDXPipeline::IPrepRenderTargetInfo( plRenderTarget *owner, D3DFORMAT &sur
uint16_t flags, width, height;
int8_t bitDepth, zDepth, stencilDepth, stencilIndex;
D3DFORMAT depthFormats[] = { D3DFMT_D24X8, D3DFMT_D24X4S4, D3DFMT_D24S8 };
+ IDirect3D9* d3d = hsGDirect3D::GetDirect3D();
flags = owner->GetFlags();
@@ -4846,8 +4817,8 @@ bool plDXPipeline::IPrepRenderTargetInfo( plRenderTarget *owner, D3DFORMAT &sur
}
/// Check the device format
- if( FAILED( fSettings.fDXError = fD3DObject->CheckDeviceFormat( fCurrentAdapter, fCurrentDevice->fDDType, fCurrentMode->fDDmode.Format,
- D3DUSAGE_RENDERTARGET, resType, surfFormat ) ) )
+ if( FAILED( fSettings.fDXError = d3d->CheckDeviceFormat( fCurrentAdapter, fCurrentDevice->fDDType, fCurrentMode->fDDmode.Format,
+ D3DUSAGE_RENDERTARGET, resType, surfFormat ) ) )
{
if( bitDepth == 16 )
{
@@ -4859,8 +4830,8 @@ bool plDXPipeline::IPrepRenderTargetInfo( plRenderTarget *owner, D3DFORMAT &sur
bitDepth = 16;
surfFormat = D3DFMT_A4R4G4B4;
}
- if( FAILED( fSettings.fDXError = fD3DObject->CheckDeviceFormat( fCurrentAdapter, fCurrentDevice->fDDType, fCurrentMode->fDDmode.Format,
- D3DUSAGE_RENDERTARGET, resType, surfFormat ) ) )
+ if( FAILED( fSettings.fDXError = d3d->CheckDeviceFormat( fCurrentAdapter, fCurrentDevice->fDDType, fCurrentMode->fDDmode.Format,
+ D3DUSAGE_RENDERTARGET, resType, surfFormat ) ) )
{
IGetD3DError();
return false;
@@ -4869,8 +4840,8 @@ bool plDXPipeline::IPrepRenderTargetInfo( plRenderTarget *owner, D3DFORMAT &sur
if( zDepth )
{
- while( FAILED( fSettings.fDXError = fD3DObject->CheckDeviceFormat( fCurrentAdapter, fCurrentDevice->fDDType, fCurrentMode->fDDmode.Format,
- D3DUSAGE_DEPTHSTENCIL, D3DRTYPE_SURFACE, depthFormat ) ) )
+ while( FAILED( fSettings.fDXError = d3d->CheckDeviceFormat( fCurrentAdapter, fCurrentDevice->fDDType, fCurrentMode->fDDmode.Format,
+ D3DUSAGE_DEPTHSTENCIL, D3DRTYPE_SURFACE, depthFormat ) ) )
{
if( stencilIndex < sizeof( depthFormats ) / sizeof( depthFormats[ 0 ] ) - 1 )
{
@@ -4884,8 +4855,8 @@ bool plDXPipeline::IPrepRenderTargetInfo( plRenderTarget *owner, D3DFORMAT &sur
}
}
- if( FAILED( fSettings.fDXError = fD3DObject->CheckDepthStencilMatch( fCurrentAdapter, fCurrentDevice->fDDType, fCurrentMode->fDDmode.Format,
- surfFormat, depthFormat ) ) )
+ if( FAILED( fSettings.fDXError = d3d->CheckDepthStencilMatch( fCurrentAdapter, fCurrentDevice->fDDType, fCurrentMode->fDDmode.Format,
+ surfFormat, depthFormat ) ) )
{
IGetD3DError();
return false;
@@ -4912,6 +4883,7 @@ bool plDXPipeline::IFindRenderTargetInfo( plRenderTarget *owner, D3DFORMAT &sur
height = owner->GetHeight();
bitDepth = owner->GetPixelSize();
+ IDirect3D9* d3d = hsGDirect3D::GetDirect3D();
if( flags != 0 )
{
if( flags & plRenderTarget::kIsTexture )
@@ -4932,8 +4904,8 @@ bool plDXPipeline::IFindRenderTargetInfo( plRenderTarget *owner, D3DFORMAT &sur
}
/// Check the device format
- if( FAILED( fSettings.fDXError = fD3DObject->CheckDeviceFormat( fCurrentAdapter, fCurrentDevice->fDDType, fCurrentMode->fDDmode.Format,
- D3DUSAGE_RENDERTARGET, resType, surfFormat ) ) )
+ if( FAILED( fSettings.fDXError = d3d->CheckDeviceFormat( fCurrentAdapter, fCurrentDevice->fDDType, fCurrentMode->fDDmode.Format,
+ D3DUSAGE_RENDERTARGET, resType, surfFormat ) ) )
{
if( bitDepth == 16 )
{
@@ -4945,8 +4917,8 @@ bool plDXPipeline::IFindRenderTargetInfo( plRenderTarget *owner, D3DFORMAT &sur
bitDepth = 16;
surfFormat = D3DFMT_A4R4G4B4;
}
- if( FAILED( fSettings.fDXError = fD3DObject->CheckDeviceFormat( fCurrentAdapter, fCurrentDevice->fDDType, fCurrentMode->fDDmode.Format,
- D3DUSAGE_RENDERTARGET, resType, surfFormat ) ) )
+ if( FAILED( fSettings.fDXError = d3d->CheckDeviceFormat( fCurrentAdapter, fCurrentDevice->fDDType, fCurrentMode->fDDmode.Format,
+ D3DUSAGE_RENDERTARGET, resType, surfFormat ) ) )
{
IGetD3DError();
return false;
diff --git a/Sources/Plasma/PubUtilLib/plPipeline/DX/plDXPipeline.h b/Sources/Plasma/PubUtilLib/plPipeline/DX/plDXPipeline.h
index d0f933fe..46d40412 100644
--- a/Sources/Plasma/PubUtilLib/plPipeline/DX/plDXPipeline.h
+++ b/Sources/Plasma/PubUtilLib/plPipeline/DX/plDXPipeline.h
@@ -208,7 +208,6 @@ protected:
plDXPlateManager* fPlateMgr;
// The main D3D interfaces
- LPDIRECT3D9 fD3DObject; // The main D3D object
LPDIRECT3DDEVICE9 fD3DDevice; // The D3D rendering device
IDirect3DSurface9* fD3DMainSurface;
IDirect3DSurface9* fD3DDepthSurface;
@@ -502,7 +501,6 @@ protected:
void ISetCurrentDevice( D3DEnum_DeviceInfo *dev );
void ISetCurrentMode( D3DEnum_ModeInfo *mode );
- bool ICreateMaster();
bool ICreateDevice(bool windowed);
bool ICreateNormalSurfaces();