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
3031namespace cinder { namespace app {
3132
3233RendererImplD3d11::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
204191bool 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
256251void 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
274258void 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
295272void RendererImplD3d11::prepareToggleFullScreen ()
@@ -360,18 +337,19 @@ void RendererImplD3d11::swapBuffers() const
360337void 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
367345void 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