Skip to content

Commit 9bab8f2

Browse files
committed
RendererD3d11 using msw::ComPtr<>
1 parent ddb48e7 commit 9bab8f2

File tree

3 files changed

+64
-89
lines changed

3 files changed

+64
-89
lines changed

include/cinder/app/msw/RendererImplD3d11.h

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
#include "cinder/app/AppBase.h"
2727
#include "cinder/app/msw/RendererImplMsw.h"
2828
#include "cinder/app/RendererD3d11.h"
29+
#include "cinder/msw/CinderMsw.h"
2930
#include <d3d11_1.h>
3031
#include <dxgi1_2.h>
3132

@@ -68,22 +69,22 @@ class RendererImplD3d11 : public RendererImplMsw {
6869
Surface8u copyWindowSurface( const Area &area );
6970

7071
//! D3D11 device
71-
ID3D11Device1 *mDevice;
72+
msw::ComPtr<ID3D11Device1> mDevice;
7273

7374
//! D3D11 device context
74-
ID3D11DeviceContext1 *mDeviceContext;
75+
msw::ComPtr<ID3D11DeviceContext1> mDeviceContext;
7576

7677
//! DXGI swap chain
77-
IDXGISwapChain1 *mSwapChain;
78+
msw::ComPtr<IDXGISwapChain1> mSwapChain;
7879

7980
//! Render target view for the back buffer
80-
ID3D11RenderTargetView *mRenderTargetView;
81+
msw::ComPtr<ID3D11RenderTargetView> mRenderTargetView;
8182

8283
//! Depth stencil texture
83-
ID3D11Texture2D *mDepthStencilTexture;
84+
msw::ComPtr<ID3D11Texture2D> mDepthStencilTexture;
8485

8586
//! Depth stencil view
86-
ID3D11DepthStencilView *mDepthStencilView;
87+
msw::ComPtr<ID3D11DepthStencilView> mDepthStencilView;
8788

8889
protected:
8990
RendererD3d11 *mRenderer;

src/cinder/app/RendererD3d11.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -112,14 +112,14 @@ void RendererD3d11::clear( const ColorA &color )
112112
void* RendererD3d11::getDevice()
113113
{
114114
if( mImpl )
115-
return mImpl->mDevice;
115+
return mImpl->mDevice.get();
116116
return nullptr;
117117
}
118118

119119
void* RendererD3d11::getDeviceContext()
120120
{
121121
if( mImpl )
122-
return mImpl->mDeviceContext;
122+
return mImpl->mDeviceContext.get();
123123
return nullptr;
124124
}
125125

src/cinder/app/msw/RendererImplD3d11.cpp

Lines changed: 55 additions & 81 deletions
Original file line numberDiff line numberDiff line change
@@ -25,19 +25,14 @@
2525
#include "cinder/app/msw/AppImplMsw.h"
2626
#include "cinder/app/App.h"
2727
#include "cinder/Log.h"
28+
#include "cinder/msw/CinderMsw.h"
2829
#include <windows.h>
2930

3031
namespace cinder { namespace app {
3132

3233
RendererImplD3d11::RendererImplD3d11( WindowImplMsw* windowImpl, RendererD3d11* renderer )
3334
: mRenderer( renderer )
3435
, mWnd( nullptr )
35-
, mDevice( nullptr )
36-
, mDeviceContext( nullptr )
37-
, mSwapChain( nullptr )
38-
, mRenderTargetView( nullptr )
39-
, mDepthStencilTexture( nullptr )
40-
, mDepthStencilView( nullptr )
4136
, mFullScreen( false )
4237
{
4338
}
@@ -99,9 +94,9 @@ bool RendererImplD3d11::createDevice()
9994

10095
D3D_FEATURE_LEVEL featureLevels[] = { D3D_FEATURE_LEVEL_11_1, D3D_FEATURE_LEVEL_11_0, D3D_FEATURE_LEVEL_10_1, D3D_FEATURE_LEVEL_10_0 };
10196

102-
D3D_FEATURE_LEVEL featureLevel;
103-
ID3D11Device* device = nullptr;
104-
ID3D11DeviceContext* context = nullptr;
97+
D3D_FEATURE_LEVEL featureLevel;
98+
msw::ComPtr<ID3D11Device> device;
99+
msw::ComPtr<ID3D11DeviceContext> context;
105100

106101
HRESULT hr = D3D11CreateDevice( nullptr, // adapter
107102
D3D_DRIVER_TYPE_HARDWARE, // driver type
@@ -110,40 +105,36 @@ bool RendererImplD3d11::createDevice()
110105
featureLevels, // feature levels
111106
ARRAYSIZE( featureLevels ), // num feature levels
112107
D3D11_SDK_VERSION, // SDK version
113-
&device, // device output
108+
device.releaseAndGetAddressOf(), // device output
114109
&featureLevel, // feature level output
115-
&context // context output
110+
context.releaseAndGetAddressOf() // context output
116111
);
117112

118113
if( FAILED( hr ) ) {
119114
// Try again without debug flag if it failed
120115
createDeviceFlags &= ~D3D11_CREATE_DEVICE_DEBUG;
121-
hr = D3D11CreateDevice( nullptr, D3D_DRIVER_TYPE_HARDWARE, nullptr, createDeviceFlags, featureLevels, ARRAYSIZE( featureLevels ), D3D11_SDK_VERSION, &device, &featureLevel, &context );
116+
hr = D3D11CreateDevice( nullptr, D3D_DRIVER_TYPE_HARDWARE, nullptr, createDeviceFlags, featureLevels, ARRAYSIZE( featureLevels ), D3D11_SDK_VERSION, device.releaseAndGetAddressOf(), &featureLevel, context.releaseAndGetAddressOf() );
122117

123118
if( FAILED( hr ) )
124119
return false;
125120
}
126121

127122
// Query for ID3D11Device1
128-
hr = device->QueryInterface( __uuidof( ID3D11Device1 ), (void**)&mDevice );
123+
msw::ComPtr<ID3D11Device1> device1;
124+
hr = device->QueryInterface( __uuidof( ID3D11Device1 ), (void**)device1.releaseAndGetAddressOf() );
129125
if( FAILED( hr ) ) {
130-
device->Release();
131-
context->Release();
132126
return false;
133127
}
128+
mDevice = device1.detach(); // Transfer ownership to member (adopts without AddRef)
134129

135130
// Query for ID3D11DeviceContext1
136-
hr = context->QueryInterface( __uuidof( ID3D11DeviceContext1 ), (void**)&mDeviceContext );
131+
msw::ComPtr<ID3D11DeviceContext1> context1;
132+
hr = context->QueryInterface( __uuidof( ID3D11DeviceContext1 ), (void**)context1.releaseAndGetAddressOf() );
137133
if( FAILED( hr ) ) {
138-
mDevice->Release();
139-
mDevice = nullptr;
140-
device->Release();
141-
context->Release();
134+
mDevice.reset();
142135
return false;
143136
}
144-
145-
device->Release();
146-
context->Release();
137+
mDeviceContext = context1.detach(); // Transfer ownership to member (adopts without AddRef)
147138

148139
return true;
149140
}
@@ -157,23 +148,20 @@ bool RendererImplD3d11::createSwapChain()
157148
UINT height = rect.bottom - rect.top;
158149

159150
// Get the DXGI factory
160-
IDXGIDevice1* dxgiDevice = nullptr;
161-
HRESULT hr = mDevice->QueryInterface( __uuidof( IDXGIDevice1 ), (void**)&dxgiDevice );
151+
msw::ComPtr<IDXGIDevice1> dxgiDevice;
152+
HRESULT hr = mDevice->QueryInterface( __uuidof( IDXGIDevice1 ), (void**)dxgiDevice.releaseAndGetAddressOf() );
162153
if( FAILED( hr ) )
163154
return false;
164155

165-
IDXGIAdapter* dxgiAdapter = nullptr;
166-
hr = dxgiDevice->GetAdapter( &dxgiAdapter );
156+
msw::ComPtr<IDXGIAdapter> dxgiAdapter;
157+
hr = dxgiDevice->GetAdapter( dxgiAdapter.releaseAndGetAddressOf() );
167158
if( FAILED( hr ) ) {
168-
dxgiDevice->Release();
169159
return false;
170160
}
171161

172-
IDXGIFactory2* dxgiFactory = nullptr;
173-
hr = dxgiAdapter->GetParent( __uuidof( IDXGIFactory2 ), (void**)&dxgiFactory );
162+
msw::ComPtr<IDXGIFactory2> dxgiFactory;
163+
hr = dxgiAdapter->GetParent( __uuidof( IDXGIFactory2 ), (void**)dxgiFactory.releaseAndGetAddressOf() );
174164
if( FAILED( hr ) ) {
175-
dxgiAdapter->Release();
176-
dxgiDevice->Release();
177165
return false;
178166
}
179167

@@ -192,26 +180,28 @@ bool RendererImplD3d11::createSwapChain()
192180
swapChainDesc.Flags = DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH;
193181

194182
// Create the swap chain
195-
hr = dxgiFactory->CreateSwapChainForHwnd( mDevice, mWnd, &swapChainDesc, nullptr, nullptr, &mSwapChain );
196-
197-
dxgiFactory->Release();
198-
dxgiAdapter->Release();
199-
dxgiDevice->Release();
183+
msw::ComPtr<IDXGISwapChain1> swapChain;
184+
hr = dxgiFactory->CreateSwapChainForHwnd( mDevice.get(), mWnd, &swapChainDesc, nullptr, nullptr, swapChain.releaseAndGetAddressOf() );
185+
if( SUCCEEDED( hr ) )
186+
mSwapChain = swapChain.detach(); // Transfer ownership to member (adopts without AddRef)
200187

201188
return SUCCEEDED( hr );
202189
}
203190

204191
bool RendererImplD3d11::createRenderTarget()
205192
{
206193
// Get the back buffer
207-
ID3D11Texture2D* backBuffer = nullptr;
208-
HRESULT hr = mSwapChain->GetBuffer( 0, __uuidof( ID3D11Texture2D ), (void**)&backBuffer );
194+
msw::ComPtr<ID3D11Texture2D> backBuffer;
195+
HRESULT hr = mSwapChain->GetBuffer( 0, __uuidof( ID3D11Texture2D ), (void**)backBuffer.releaseAndGetAddressOf() );
209196
if( FAILED( hr ) )
210197
return false;
211198

212199
// Create the render target view
213-
hr = mDevice->CreateRenderTargetView( backBuffer, nullptr, &mRenderTargetView );
214-
backBuffer->Release();
200+
msw::ComPtr<ID3D11RenderTargetView> rtv;
201+
hr = mDevice->CreateRenderTargetView( backBuffer.get(), nullptr, rtv.releaseAndGetAddressOf() );
202+
203+
if( SUCCEEDED( hr ) )
204+
mRenderTargetView = rtv.detach(); // Transfer ownership to member (adopts without AddRef)
215205

216206
return SUCCEEDED( hr );
217207
}
@@ -238,58 +228,45 @@ bool RendererImplD3d11::createDepthStencil()
238228
depthDesc.CPUAccessFlags = 0;
239229
depthDesc.MiscFlags = 0;
240230

241-
HRESULT hr = mDevice->CreateTexture2D( &depthDesc, nullptr, &mDepthStencilTexture );
231+
msw::ComPtr<ID3D11Texture2D> depthTex;
232+
HRESULT hr = mDevice->CreateTexture2D( &depthDesc, nullptr, depthTex.releaseAndGetAddressOf() );
242233
if( FAILED( hr ) )
243234
return false;
235+
mDepthStencilTexture = depthTex.detach(); // Transfer ownership to member (adopts without AddRef)
244236

245237
// Create depth stencil view
246238
D3D11_DEPTH_STENCIL_VIEW_DESC dsvDesc = {};
247239
dsvDesc.Format = depthDesc.Format;
248240
dsvDesc.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2D;
249241
dsvDesc.Texture2D.MipSlice = 0;
250242

251-
hr = mDevice->CreateDepthStencilView( mDepthStencilTexture, &dsvDesc, &mDepthStencilView );
243+
msw::ComPtr<ID3D11DepthStencilView> dsv;
244+
hr = mDevice->CreateDepthStencilView( mDepthStencilTexture.get(), &dsvDesc, dsv.releaseAndGetAddressOf() );
245+
if( SUCCEEDED( hr ) )
246+
mDepthStencilView = dsv.detach(); // Transfer ownership to member (adopts without AddRef)
252247

253248
return SUCCEEDED( hr );
254249
}
255250

256251
void RendererImplD3d11::releaseFramebufferResources()
257252
{
258-
if( mRenderTargetView ) {
259-
mRenderTargetView->Release();
260-
mRenderTargetView = nullptr;
261-
}
262-
263-
if( mDepthStencilView ) {
264-
mDepthStencilView->Release();
265-
mDepthStencilView = nullptr;
266-
}
267-
268-
if( mDepthStencilTexture ) {
269-
mDepthStencilTexture->Release();
270-
mDepthStencilTexture = nullptr;
271-
}
253+
mRenderTargetView.reset();
254+
mDepthStencilView.reset();
255+
mDepthStencilTexture.reset();
272256
}
273257

274258
void RendererImplD3d11::kill()
275259
{
276260
releaseFramebufferResources();
277261

278-
if( mSwapChain ) {
279-
mSwapChain->Release();
280-
mSwapChain = nullptr;
281-
}
262+
mSwapChain.reset();
282263

283264
if( mDeviceContext ) {
284265
mDeviceContext->ClearState();
285-
mDeviceContext->Release();
286-
mDeviceContext = nullptr;
266+
mDeviceContext.reset();
287267
}
288268

289-
if( mDevice ) {
290-
mDevice->Release();
291-
mDevice = nullptr;
292-
}
269+
mDevice.reset();
293270
}
294271

295272
void RendererImplD3d11::prepareToggleFullScreen()
@@ -360,18 +337,19 @@ void RendererImplD3d11::swapBuffers() const
360337
void RendererImplD3d11::makeCurrentContext( bool force )
361338
{
362339
if( mDeviceContext && mRenderTargetView ) {
363-
mDeviceContext->OMSetRenderTargets( 1, &mRenderTargetView, mDepthStencilView );
340+
ID3D11RenderTargetView* rtv = mRenderTargetView.get();
341+
mDeviceContext->OMSetRenderTargets( 1, &rtv, mDepthStencilView.get() );
364342
}
365343
}
366344

367345
void RendererImplD3d11::clear( const ColorA& color )
368346
{
369347
if( mDeviceContext && mRenderTargetView ) {
370348
float clearColor[4] = { color.r, color.g, color.b, color.a };
371-
mDeviceContext->ClearRenderTargetView( mRenderTargetView, clearColor );
349+
mDeviceContext->ClearRenderTargetView( mRenderTargetView.get(), clearColor );
372350

373351
if( mDepthStencilView ) {
374-
mDeviceContext->ClearDepthStencilView( mDepthStencilView, D3D11_CLEAR_DEPTH | D3D11_CLEAR_STENCIL, 1.0f, 0 );
352+
mDeviceContext->ClearDepthStencilView( mDepthStencilView.get(), D3D11_CLEAR_DEPTH | D3D11_CLEAR_STENCIL, 1.0f, 0 );
375353
}
376354
}
377355
}
@@ -384,8 +362,8 @@ Surface8u RendererImplD3d11::copyWindowSurface( const Area& area )
384362
return surface;
385363

386364
// Get the back buffer
387-
ID3D11Texture2D* backBuffer = nullptr;
388-
HRESULT hr = mSwapChain->GetBuffer( 0, __uuidof( ID3D11Texture2D ), (void**)&backBuffer );
365+
msw::ComPtr<ID3D11Texture2D> backBuffer;
366+
HRESULT hr = mSwapChain->GetBuffer( 0, __uuidof( ID3D11Texture2D ), (void**)backBuffer.releaseAndGetAddressOf() );
389367
if( FAILED( hr ) )
390368
return surface;
391369

@@ -404,10 +382,9 @@ Surface8u RendererImplD3d11::copyWindowSurface( const Area& area )
404382
desc.CPUAccessFlags = D3D11_CPU_ACCESS_READ;
405383
desc.MiscFlags = 0;
406384

407-
ID3D11Texture2D* stagingTexture = nullptr;
408-
hr = mDevice->CreateTexture2D( &desc, nullptr, &stagingTexture );
385+
msw::ComPtr<ID3D11Texture2D> stagingTexture;
386+
hr = mDevice->CreateTexture2D( &desc, nullptr, stagingTexture.releaseAndGetAddressOf() );
409387
if( FAILED( hr ) ) {
410-
backBuffer->Release();
411388
return surface;
412389
}
413390

@@ -420,11 +397,11 @@ Surface8u RendererImplD3d11::copyWindowSurface( const Area& area )
420397
box.front = 0;
421398
box.back = 1;
422399

423-
mDeviceContext->CopySubresourceRegion( stagingTexture, 0, 0, 0, 0, backBuffer, 0, &box );
400+
mDeviceContext->CopySubresourceRegion( stagingTexture.get(), 0, 0, 0, 0, backBuffer.get(), 0, &box );
424401

425402
// Map the staging texture
426403
D3D11_MAPPED_SUBRESOURCE mapped;
427-
hr = mDeviceContext->Map( stagingTexture, 0, D3D11_MAP_READ, 0, &mapped );
404+
hr = mDeviceContext->Map( stagingTexture.get(), 0, D3D11_MAP_READ, 0, &mapped );
428405
if( SUCCEEDED( hr ) ) {
429406
// Copy the data
430407
uint8_t* src = static_cast<uint8_t*>( mapped.pData );
@@ -437,12 +414,9 @@ Surface8u RendererImplD3d11::copyWindowSurface( const Area& area )
437414
dst += rowBytes;
438415
}
439416

440-
mDeviceContext->Unmap( stagingTexture, 0 );
417+
mDeviceContext->Unmap( stagingTexture.get(), 0 );
441418
}
442419

443-
stagingTexture->Release();
444-
backBuffer->Release();
445-
446420
return surface;
447421
}
448422

0 commit comments

Comments
 (0)