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()); 
}
Пример #2
0
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; 

}