void CInvertModule::ProcessFrame(ID3D11Device *pDevice, ID3D11Texture2D *pInput, UINT uiInIndex, ID3D11Texture2D *pOutput, UINT uiOutIndex) { ComPtr<ID3D11DeviceContext> spd3dImmediateContext; // Render targets ComPtr<ID3D11RenderTargetView> rgpOrigRTV; ComPtr<ID3D11DepthStencilView> pOrigDSV; ComPtr<ID3D11RenderTargetView> spRTV; // Shader resources ComPtr<ID3D11ShaderResourceView> rgpOrigSRV; ComPtr<ID3D11ShaderResourceView> spSRV; // Vertex buffers ID3D11Buffer *pBuffers[1] = { m_spScreenQuadVB.Get() }; UINT vbStrides = sizeof( ScreenVertex ); UINT vbOffsets = 0; // Samplers ID3D11SamplerState *pSamplers[1] = { m_spSampleStateLinear.Get() }; // View port D3D11_VIEWPORT vpOld[D3D11_VIEWPORT_AND_SCISSORRECT_MAX_INDEX]; UINT nViewPorts = 1; D3D11_VIEWPORT vp; // Get the context pDevice->GetImmediateContext(&spd3dImmediateContext); // Get the resource views ThrowIfError(CreateShaderInputView(pInput, uiInIndex, pDevice, &spSRV)); ThrowIfError(CreateShaderOutputView(pOutput, uiOutIndex, pDevice, &spRTV)); // Setup the Draw call spd3dImmediateContext->IASetInputLayout(m_spQuadLayout.Get()); spd3dImmediateContext->IASetVertexBuffers(0, 1, pBuffers, &vbStrides, &vbOffsets); spd3dImmediateContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP); spd3dImmediateContext->PSSetSamplers(0, 1, pSamplers); spd3dImmediateContext->OMGetRenderTargets(1, &rgpOrigRTV, &pOrigDSV); spd3dImmediateContext->OMSetRenderTargets(1, spRTV.GetAddressOf(), nullptr); spd3dImmediateContext->PSGetShaderResources(0, 1, &rgpOrigSRV); spd3dImmediateContext->PSSetShaderResources(0, 1, spSRV.GetAddressOf()); spd3dImmediateContext->RSGetViewports(&nViewPorts, vpOld); // Setup the viewport to match the backbuffer vp.Width = (float)m_uiWidth; vp.Height = (float)m_uiHeight; vp.MinDepth = 0.0f; vp.MaxDepth = 1.0f; vp.TopLeftX = 0.0f; vp.TopLeftY = 0.0f; spd3dImmediateContext->RSSetViewports(1, &vp); spd3dImmediateContext->VSSetShader(m_spVertexShader.Get(), nullptr, 0); spd3dImmediateContext->PSSetShader(m_spPixelShader.Get(), nullptr, 0); spd3dImmediateContext->Draw(4, 0); // Restore the Old spd3dImmediateContext->RSSetViewports(nViewPorts, vpOld); spd3dImmediateContext->PSSetShaderResources(0, 1, rgpOrigSRV.GetAddressOf()); spd3dImmediateContext->OMSetRenderTargets(1, rgpOrigRTV.GetAddressOf(), pOrigDSV.Get()); }
HRESULT CInvertModule::ProcessFrame(ID3D11Device *pDevice, ID3D11Texture2D *pInput, UINT uiInIndex, ID3D11Texture2D *pOutput, UINT uiOutIndex) { HRESULT hr = S_OK; ComPtr<ID3D11DeviceContext> pd3dImmediateContext; // Render targets ComPtr<ID3D11RenderTargetView> rgpOrigRTV; ComPtr<ID3D11DepthStencilView> pOrigDSV; ID3D11RenderTargetView *pRTVs[1] = { nullptr }; // Shader resources ComPtr<ID3D11ShaderResourceView> rgpOrigSRV; ID3D11ShaderResourceView *pSRVs[1] = { nullptr }; // Vertex buffers ID3D11Buffer *pBuffers[1] = { m_pScreenQuadVB.Get() }; UINT vbStrides = sizeof( ScreenVertex ); UINT vbOffsets = 0; // Samplers ID3D11SamplerState *pSamplers[1] = { m_pSampleStateLinear.Get() }; // View port D3D11_VIEWPORT vpOld[D3D11_VIEWPORT_AND_SCISSORRECT_MAX_INDEX]; UINT nViewPorts = 1; D3D11_VIEWPORT vp; // Get the context pDevice->GetImmediateContext(&pd3dImmediateContext); // Get the resource views hr = CreateShaderInputView(pInput, uiInIndex, pDevice, &(pSRVs[0])); if( FAILED(hr) ) { goto done; } hr = CreateShaderOutputView(pOutput, uiOutIndex, pDevice, &(pRTVs[0])); if( FAILED(hr) ) { goto done; } // Setup the Draw call pd3dImmediateContext->IASetInputLayout(m_spQuadLayout.Get()); pd3dImmediateContext->IASetVertexBuffers(0, 1, pBuffers, &vbStrides, &vbOffsets); pd3dImmediateContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP); pd3dImmediateContext->PSSetSamplers(0, 1, pSamplers); pd3dImmediateContext->OMGetRenderTargets(1, &rgpOrigRTV, &pOrigDSV); pd3dImmediateContext->OMSetRenderTargets(1, pRTVs, NULL); pd3dImmediateContext->PSGetShaderResources(0, 1, &rgpOrigSRV); pd3dImmediateContext->PSSetShaderResources(0, 1, pSRVs); pd3dImmediateContext->RSGetViewports( &nViewPorts, vpOld ); // Setup the viewport to match the backbuffer vp.Width = (float)m_uiWidth; vp.Height = (float)m_uiHeight; vp.MinDepth = 0.0f; vp.MaxDepth = 1.0f; vp.TopLeftX = 0.0f; vp.TopLeftY = 0.0f; pd3dImmediateContext->RSSetViewports( 1, &vp ); pd3dImmediateContext->VSSetShader( m_pVertexShader.Get(), NULL, 0 ); pd3dImmediateContext->PSSetShader( m_pPixelShader.Get(), NULL, 0 ); pd3dImmediateContext->Draw( 4, 0 ); // Restore the Old pd3dImmediateContext->RSSetViewports( nViewPorts, vpOld ); pd3dImmediateContext->PSSetShaderResources(0, 1, rgpOrigSRV.GetAddressOf()); pd3dImmediateContext->OMSetRenderTargets( 1, rgpOrigRTV.GetAddressOf(), pOrigDSV.Get() ); done: if(nullptr != pSRVs[0]) { pSRVs[0]->Release(); } if(nullptr != pRTVs[0]) { pRTVs[0]->Release(); } return hr; }