Quantcast
Channel: GameDev.net
Viewing all articles
Browse latest Browse all 17560

Guideline for CComPtr and D3D11?

$
0
0

Hi all,

I've been reading through some articles on the usage CComPtr, in combination with the D3D11 API.

From this, I've concluded the following principle:

 

- use a CComPtr for D3D objects, when you expect that the lifetime will vary during runtime.

I.e. will point to something else then initially assigned, thus needing 'reference management'.

 

This means that there's not much use in using a CComPtr for the D3D11 device and context.

I've applied this as pasted below.

 

Question; would you say this is a safe assumption/ principle to follow?

class CD3d11
{
public:
	CD3d11();
	~CD3d11();

// more stuf

private:
	bool CreateSwapchain(HWND pHwnd);
	bool CreateRenderTarget();
	bool CreateDepthStencilBuffer();

	ID3D11Device					*mDevice;				// feature support, resource mgmt
	ID3D11DeviceContext				*mImmediateContext;		// everything else
	IDXGISwapChain					*mSwapChain;

	CComPtr<ID3D11Texture2D>		mDepthStencilBuffer;
	CComPtr<ID3D11Texture2D>		mRenderTargetTex;

	CComPtr<ID3D11RenderTargetView>	mRenderTargetView;
	CComPtr<ID3D11DepthStencilView>	mDepthStencilView;

	D3D_DRIVER_TYPE					mDriverType;
};

CD3d11::CD3d11() : 	
	mDriverType(D3D_DRIVER_TYPE_HARDWARE), mMSAAQuality(0),
	mDevice(nullptr), mImmediateContext(nullptr), mSwapChain(nullptr), mDepthStencilBuffer(nullptr), mRenderTargetTex(nullptr), mRenderTargetView(nullptr), mDepthStencilView(nullptr)
{
	// nothing yet, no ZeroMemory for viewport etc. (add later)
}

CD3d11::~CD3d11()
{
	if(!mSettings.GetWindowed() && mSwapChain) mSwapChain->SetFullscreenState(false, nullptr);
	
	ReleaseCOM(mSwapChain);

	// Restore all default settings.
	if(mImmediateContext) mImmediateContext->ClearState();

	ReleaseCOM(mImmediateContext);
	ReleaseCOM(mDevice);

	// CComPtr's
	mDepthStencilBuffer = nullptr;
	mRenderTargetTex	= nullptr;
	mRenderTargetView	= nullptr;
	mDepthStencilView	= nullptr;
}

// when reusing a CComPtr object
	mRenderTargetTex = nullptr;
	mRenderTargetView = nullptr;

	if(FAILED(mDevice->CreateTexture2D(&renderTargetTexDesc, 0, &mRenderTargetTex))) return false;
	if(FAILED(mDevice->CreateRenderTargetView(mRenderTargetTex, 0, &mRenderTargetView))) return false;


Viewing all articles
Browse latest Browse all 17560

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>