2015-05-23 22:55:12 -06:00
// Copyright 2010 Dolphin Emulator Project
2015-05-17 17:08:10 -06:00
// Licensed under GPLv2+
2013-04-17 21:29:41 -06:00
// Refer to the license.txt file included.
2010-06-13 13:50:06 -06:00
2015-12-21 12:11:01 -07:00
# include <memory>
2014-02-17 03:18:15 -07:00
# include "Core/HW/Memmap.h"
# include "VideoBackends/D3D/D3DBase.h"
2015-11-28 04:33:47 -07:00
# include "VideoBackends/D3D/D3DState.h"
2014-02-17 03:18:15 -07:00
# include "VideoBackends/D3D/D3DUtil.h"
# include "VideoBackends/D3D/FramebufferManager.h"
2014-12-20 10:20:49 -07:00
# include "VideoBackends/D3D/GeometryShaderCache.h"
2014-02-17 03:18:15 -07:00
# include "VideoBackends/D3D/PixelShaderCache.h"
# include "VideoBackends/D3D/Render.h"
# include "VideoBackends/D3D/VertexShaderCache.h"
# include "VideoBackends/D3D/XFBEncoder.h"
# include "VideoCommon/VideoConfig.h"
2010-06-13 13:50:06 -06:00
2015-12-21 12:11:01 -07:00
namespace DX11
{
2011-06-11 13:37:21 -06:00
static XFBEncoder s_xfbEncoder ;
2011-03-08 00:39:36 -07:00
2010-11-14 16:31:53 -07:00
FramebufferManager : : Efb FramebufferManager : : m_efb ;
2014-12-24 16:57:52 -07:00
unsigned int FramebufferManager : : m_target_width ;
unsigned int FramebufferManager : : m_target_height ;
2010-06-13 13:50:06 -06:00
2011-06-11 13:37:21 -06:00
D3DTexture2D * & FramebufferManager : : GetEFBColorTexture ( ) { return m_efb . color_tex ; }
2016-05-01 08:29:36 -06:00
D3DTexture2D * & FramebufferManager : : GetEFBColorReadTexture ( ) { return m_efb . color_read_texture ; }
2011-06-11 13:37:21 -06:00
ID3D11Texture2D * & FramebufferManager : : GetEFBColorStagingBuffer ( ) { return m_efb . color_staging_buf ; }
D3DTexture2D * & FramebufferManager : : GetEFBDepthTexture ( ) { return m_efb . depth_tex ; }
D3DTexture2D * & FramebufferManager : : GetEFBDepthReadTexture ( ) { return m_efb . depth_read_texture ; }
ID3D11Texture2D * & FramebufferManager : : GetEFBDepthStagingBuffer ( ) { return m_efb . depth_staging_buf ; }
D3DTexture2D * & FramebufferManager : : GetResolvedEFBColorTexture ( )
2010-11-23 12:58:02 -07:00
{
2015-12-12 05:00:08 -07:00
if ( g_ActiveConfig . iMultisamples > 1 )
2010-11-23 12:58:02 -07:00
{
2014-12-19 07:51:14 -07:00
for ( int i = 0 ; i < m_efb . slices ; i + + )
D3D : : context - > ResolveSubresource ( m_efb . resolved_color_tex - > GetTex ( ) , D3D11CalcSubresource ( 0 , i , 1 ) , m_efb . color_tex - > GetTex ( ) , D3D11CalcSubresource ( 0 , i , 1 ) , DXGI_FORMAT_R8G8B8A8_UNORM ) ;
2011-06-11 13:37:21 -06:00
return m_efb . resolved_color_tex ;
2010-11-23 12:58:02 -07:00
}
else
2016-02-18 02:50:26 -07:00
{
2011-06-11 13:37:21 -06:00
return m_efb . color_tex ;
2016-02-18 02:50:26 -07:00
}
2010-11-23 12:58:02 -07:00
}
2011-06-11 13:37:21 -06:00
D3DTexture2D * & FramebufferManager : : GetResolvedEFBDepthTexture ( )
2010-06-13 13:50:06 -06:00
{
2015-12-12 05:00:08 -07:00
if ( g_ActiveConfig . iMultisamples > 1 )
2010-11-23 12:58:02 -07:00
{
2015-11-28 04:33:47 -07:00
// ResolveSubresource does not work with depth textures.
// Instead, we use a shader that selects the minimum depth from all samples.
g_renderer - > ResetAPIState ( ) ;
2016-02-18 02:50:26 -07:00
CD3D11_VIEWPORT viewport ( 0.f , 0.f , ( float ) m_target_width , ( float ) m_target_height ) ;
2015-11-28 04:33:47 -07:00
D3D : : context - > RSSetViewports ( 1 , & viewport ) ;
2016-02-18 02:50:26 -07:00
D3D : : context - > OMSetRenderTargets ( 1 , & m_efb . resolved_depth_tex - > GetRTV ( ) , nullptr ) ;
2015-11-28 04:33:47 -07:00
const D3D11_RECT source_rect = CD3D11_RECT ( 0 , 0 , m_target_width , m_target_height ) ;
D3D : : drawShadedTexQuad ( m_efb . depth_tex - > GetSRV ( ) , & source_rect , m_target_width , m_target_height ,
PixelShaderCache : : GetDepthResolveProgram ( ) , VertexShaderCache : : GetSimpleVertexShader ( ) ,
VertexShaderCache : : GetSimpleInputLayout ( ) , GeometryShaderCache : : GetCopyGeometryShader ( ) ) ;
D3D : : context - > OMSetRenderTargets ( 1 , & FramebufferManager : : GetEFBColorTexture ( ) - > GetRTV ( ) , FramebufferManager : : GetEFBDepthTexture ( ) - > GetDSV ( ) ) ;
g_renderer - > RestoreAPIState ( ) ;
2014-12-19 07:02:17 -07:00
return m_efb . resolved_depth_tex ;
2010-11-23 12:58:02 -07:00
}
else
2016-02-18 02:50:26 -07:00
{
2011-06-11 13:37:21 -06:00
return m_efb . depth_tex ;
2016-02-18 02:50:26 -07:00
}
2010-11-23 12:58:02 -07:00
}
2010-11-14 16:31:53 -07:00
2010-11-23 12:58:02 -07:00
FramebufferManager : : FramebufferManager ( )
{
2014-12-24 16:57:52 -07:00
m_target_width = Renderer : : GetTargetWidth ( ) ;
m_target_height = Renderer : : GetTargetHeight ( ) ;
2015-07-29 19:48:08 -06:00
if ( m_target_height < 1 )
2015-07-20 18:12:29 -06:00
{
m_target_height = 1 ;
}
2015-07-29 19:48:08 -06:00
if ( m_target_width < 1 )
2015-07-20 18:12:29 -06:00
{
m_target_width = 1 ;
}
2015-12-12 05:00:08 -07:00
DXGI_SAMPLE_DESC sample_desc ;
sample_desc . Count = g_ActiveConfig . iMultisamples ;
sample_desc . Quality = 0 ;
2010-11-14 16:31:53 -07:00
2011-06-11 13:37:21 -06:00
ID3D11Texture2D * buf ;
D3D11_TEXTURE2D_DESC texdesc ;
HRESULT hr ;
2014-11-14 03:16:54 -07:00
m_EFBLayers = m_efb . slices = ( g_ActiveConfig . iStereoMode > 0 ) ? 2 : 1 ;
2014-11-02 06:51:12 -07:00
2011-01-03 07:35:07 -07:00
// EFB color texture - primary render target
2014-12-24 16:57:52 -07:00
texdesc = CD3D11_TEXTURE2D_DESC ( DXGI_FORMAT_R8G8B8A8_UNORM , m_target_width , m_target_height , m_efb . slices , 1 , D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_RENDER_TARGET , D3D11_USAGE_DEFAULT , 0 , sample_desc . Count , sample_desc . Quality ) ;
2014-03-09 14:14:26 -06:00
hr = D3D : : device - > CreateTexture2D ( & texdesc , nullptr , & buf ) ;
2014-12-24 16:57:52 -07:00
CHECK ( hr = = S_OK , " create EFB color texture (size: %dx%d; hr=%#x) " , m_target_width , m_target_height , hr ) ;
2011-06-11 13:37:21 -06:00
m_efb . color_tex = new D3DTexture2D ( buf , ( D3D11_BIND_FLAG ) ( D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_RENDER_TARGET ) , DXGI_FORMAT_R8G8B8A8_UNORM , DXGI_FORMAT_UNKNOWN , DXGI_FORMAT_R8G8B8A8_UNORM , ( sample_desc . Count > 1 ) ) ;
SAFE_RELEASE ( buf ) ;
D3D : : SetDebugObjectName ( ( ID3D11DeviceChild * ) m_efb . color_tex - > GetTex ( ) , " EFB color texture " ) ;
D3D : : SetDebugObjectName ( ( ID3D11DeviceChild * ) m_efb . color_tex - > GetSRV ( ) , " EFB color texture shader resource view " ) ;
D3D : : SetDebugObjectName ( ( ID3D11DeviceChild * ) m_efb . color_tex - > GetRTV ( ) , " EFB color texture render target view " ) ;
2010-06-13 13:50:06 -06:00
2011-02-04 10:00:34 -07:00
// Temporary EFB color texture - used in ReinterpretPixelData
2014-12-24 16:57:52 -07:00
texdesc = CD3D11_TEXTURE2D_DESC ( DXGI_FORMAT_R8G8B8A8_UNORM , m_target_width , m_target_height , m_efb . slices , 1 , D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_RENDER_TARGET , D3D11_USAGE_DEFAULT , 0 , sample_desc . Count , sample_desc . Quality ) ;
2014-03-09 14:14:26 -06:00
hr = D3D : : device - > CreateTexture2D ( & texdesc , nullptr , & buf ) ;
2014-12-24 16:57:52 -07:00
CHECK ( hr = = S_OK , " create EFB color temp texture (size: %dx%d; hr=%#x) " , m_target_width , m_target_height , hr ) ;
2013-09-21 21:34:58 -06:00
m_efb . color_temp_tex = new D3DTexture2D ( buf , ( D3D11_BIND_FLAG ) ( D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_RENDER_TARGET ) , DXGI_FORMAT_R8G8B8A8_UNORM , DXGI_FORMAT_UNKNOWN , DXGI_FORMAT_R8G8B8A8_UNORM , ( sample_desc . Count > 1 ) ) ;
2011-06-11 13:37:21 -06:00
SAFE_RELEASE ( buf ) ;
D3D : : SetDebugObjectName ( ( ID3D11DeviceChild * ) m_efb . color_temp_tex - > GetTex ( ) , " EFB color temp texture " ) ;
D3D : : SetDebugObjectName ( ( ID3D11DeviceChild * ) m_efb . color_temp_tex - > GetSRV ( ) , " EFB color temp texture shader resource view " ) ;
D3D : : SetDebugObjectName ( ( ID3D11DeviceChild * ) m_efb . color_temp_tex - > GetRTV ( ) , " EFB color temp texture render target view " ) ;
2011-02-04 10:00:34 -07:00
2016-05-01 08:29:36 -06:00
// Render buffer for AccessEFB (color data)
texdesc = CD3D11_TEXTURE2D_DESC ( DXGI_FORMAT_R8G8B8A8_UNORM , 1 , 1 , 1 , 1 , D3D11_BIND_RENDER_TARGET ) ;
hr = D3D : : device - > CreateTexture2D ( & texdesc , nullptr , & buf ) ;
CHECK ( hr = = S_OK , " create EFB color read texture (hr=%#x) " , hr ) ;
m_efb . color_read_texture = new D3DTexture2D ( buf , D3D11_BIND_RENDER_TARGET ) ;
SAFE_RELEASE ( buf ) ;
D3D : : SetDebugObjectName ( ( ID3D11DeviceChild * ) m_efb . depth_read_texture - > GetTex ( ) , " EFB color read texture (used in Renderer::AccessEFB) " ) ;
D3D : : SetDebugObjectName ( ( ID3D11DeviceChild * ) m_efb . depth_read_texture - > GetRTV ( ) , " EFB color read texture render target view (used in Renderer::AccessEFB) " ) ;
// AccessEFB - Sysmem buffer used to retrieve the pixel data from depth_read_texture
texdesc = CD3D11_TEXTURE2D_DESC ( DXGI_FORMAT_R8G8B8A8_UNORM , 1 , 1 , 1 , 1 , 0 , D3D11_USAGE_STAGING , D3D11_CPU_ACCESS_READ ) ;
2014-03-09 14:14:26 -06:00
hr = D3D : : device - > CreateTexture2D ( & texdesc , nullptr , & m_efb . color_staging_buf ) ;
2011-06-11 13:37:21 -06:00
CHECK ( hr = = S_OK , " create EFB color staging buffer (hr=%#x) " , hr ) ;
D3D : : SetDebugObjectName ( ( ID3D11DeviceChild * ) m_efb . color_staging_buf , " EFB color staging texture (used for Renderer::AccessEFB) " ) ;
2010-06-13 13:50:06 -06:00
2011-01-03 07:35:07 -07:00
// EFB depth buffer - primary depth buffer
2016-01-10 17:30:11 -07:00
texdesc = CD3D11_TEXTURE2D_DESC ( DXGI_FORMAT_R32_TYPELESS , m_target_width , m_target_height , m_efb . slices , 1 , D3D11_BIND_DEPTH_STENCIL | D3D11_BIND_SHADER_RESOURCE , D3D11_USAGE_DEFAULT , 0 , sample_desc . Count , sample_desc . Quality ) ;
2014-03-09 14:14:26 -06:00
hr = D3D : : device - > CreateTexture2D ( & texdesc , nullptr , & buf ) ;
2014-12-24 16:57:52 -07:00
CHECK ( hr = = S_OK , " create EFB depth texture (size: %dx%d; hr=%#x) " , m_target_width , m_target_height , hr ) ;
2016-01-10 17:30:11 -07:00
m_efb . depth_tex = new D3DTexture2D ( buf , ( D3D11_BIND_FLAG ) ( D3D11_BIND_DEPTH_STENCIL | D3D11_BIND_SHADER_RESOURCE ) , DXGI_FORMAT_R32_FLOAT , DXGI_FORMAT_D32_FLOAT , DXGI_FORMAT_UNKNOWN , ( sample_desc . Count > 1 ) ) ;
2011-06-11 13:37:21 -06:00
SAFE_RELEASE ( buf ) ;
D3D : : SetDebugObjectName ( ( ID3D11DeviceChild * ) m_efb . depth_tex - > GetTex ( ) , " EFB depth texture " ) ;
D3D : : SetDebugObjectName ( ( ID3D11DeviceChild * ) m_efb . depth_tex - > GetDSV ( ) , " EFB depth texture depth stencil view " ) ;
D3D : : SetDebugObjectName ( ( ID3D11DeviceChild * ) m_efb . depth_tex - > GetSRV ( ) , " EFB depth texture shader resource view " ) ;
2010-06-13 13:50:06 -06:00
2011-01-03 07:35:07 -07:00
// Render buffer for AccessEFB (depth data)
2016-05-01 08:29:36 -06:00
texdesc = CD3D11_TEXTURE2D_DESC ( DXGI_FORMAT_R32_FLOAT , 1 , 1 , 1 , 1 , D3D11_BIND_RENDER_TARGET ) ;
2014-03-09 14:14:26 -06:00
hr = D3D : : device - > CreateTexture2D ( & texdesc , nullptr , & buf ) ;
2011-06-11 13:37:21 -06:00
CHECK ( hr = = S_OK , " create EFB depth read texture (hr=%#x) " , hr ) ;
m_efb . depth_read_texture = new D3DTexture2D ( buf , D3D11_BIND_RENDER_TARGET ) ;
SAFE_RELEASE ( buf ) ;
D3D : : SetDebugObjectName ( ( ID3D11DeviceChild * ) m_efb . depth_read_texture - > GetTex ( ) , " EFB depth read texture (used in Renderer::AccessEFB) " ) ;
D3D : : SetDebugObjectName ( ( ID3D11DeviceChild * ) m_efb . depth_read_texture - > GetRTV ( ) , " EFB depth read texture render target view (used in Renderer::AccessEFB) " ) ;
2010-06-13 13:50:06 -06:00
2011-01-03 07:35:07 -07:00
// AccessEFB - Sysmem buffer used to retrieve the pixel data from depth_read_texture
2016-05-01 08:29:36 -06:00
texdesc = CD3D11_TEXTURE2D_DESC ( DXGI_FORMAT_R32_FLOAT , 1 , 1 , 1 , 1 , 0 , D3D11_USAGE_STAGING , D3D11_CPU_ACCESS_READ ) ;
2014-03-09 14:14:26 -06:00
hr = D3D : : device - > CreateTexture2D ( & texdesc , nullptr , & m_efb . depth_staging_buf ) ;
2011-06-11 13:37:21 -06:00
CHECK ( hr = = S_OK , " create EFB depth staging buffer (hr=%#x) " , hr ) ;
D3D : : SetDebugObjectName ( ( ID3D11DeviceChild * ) m_efb . depth_staging_buf , " EFB depth staging texture (used for Renderer::AccessEFB) " ) ;
2010-11-23 12:58:02 -07:00
2015-12-12 05:00:08 -07:00
if ( g_ActiveConfig . iMultisamples > 1 )
2010-11-23 12:58:02 -07:00
{
2011-01-03 07:35:07 -07:00
// Framebuffer resolve textures (color+depth)
2014-12-24 16:57:52 -07:00
texdesc = CD3D11_TEXTURE2D_DESC ( DXGI_FORMAT_R8G8B8A8_UNORM , m_target_width , m_target_height , m_efb . slices , 1 , D3D11_BIND_SHADER_RESOURCE , D3D11_USAGE_DEFAULT , 0 , 1 ) ;
2014-03-09 14:14:26 -06:00
hr = D3D : : device - > CreateTexture2D ( & texdesc , nullptr , & buf ) ;
2015-11-28 04:33:47 -07:00
CHECK ( hr = = S_OK , " create EFB color resolve texture (size: %dx%d; hr=%#x) " , m_target_width , m_target_height , hr ) ;
2011-06-11 13:37:21 -06:00
m_efb . resolved_color_tex = new D3DTexture2D ( buf , D3D11_BIND_SHADER_RESOURCE , DXGI_FORMAT_R8G8B8A8_UNORM ) ;
SAFE_RELEASE ( buf ) ;
D3D : : SetDebugObjectName ( ( ID3D11DeviceChild * ) m_efb . resolved_color_tex - > GetTex ( ) , " EFB color resolve texture " ) ;
D3D : : SetDebugObjectName ( ( ID3D11DeviceChild * ) m_efb . resolved_color_tex - > GetSRV ( ) , " EFB color resolve texture shader resource view " ) ;
2016-02-18 02:50:26 -07:00
texdesc = CD3D11_TEXTURE2D_DESC ( DXGI_FORMAT_R32_FLOAT , m_target_width , m_target_height , m_efb . slices , 1 , D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_RENDER_TARGET ) ;
2014-03-09 14:14:26 -06:00
hr = D3D : : device - > CreateTexture2D ( & texdesc , nullptr , & buf ) ;
2014-12-24 16:57:52 -07:00
CHECK ( hr = = S_OK , " create EFB depth resolve texture (size: %dx%d; hr=%#x) " , m_target_width , m_target_height , hr ) ;
2016-02-18 02:50:26 -07:00
m_efb . resolved_depth_tex = new D3DTexture2D ( buf , ( D3D11_BIND_FLAG ) ( D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_RENDER_TARGET ) , DXGI_FORMAT_R32_FLOAT , DXGI_FORMAT_UNKNOWN , DXGI_FORMAT_R32_FLOAT ) ;
2011-06-11 13:37:21 -06:00
SAFE_RELEASE ( buf ) ;
D3D : : SetDebugObjectName ( ( ID3D11DeviceChild * ) m_efb . resolved_depth_tex - > GetTex ( ) , " EFB depth resolve texture " ) ;
D3D : : SetDebugObjectName ( ( ID3D11DeviceChild * ) m_efb . resolved_depth_tex - > GetSRV ( ) , " EFB depth resolve texture shader resource view " ) ;
2010-11-23 12:58:02 -07:00
}
2010-11-28 10:25:19 -07:00
else
{
2014-03-09 14:14:26 -06:00
m_efb . resolved_color_tex = nullptr ;
m_efb . resolved_depth_tex = nullptr ;
2010-11-28 10:25:19 -07:00
}
2011-06-11 13:37:21 -06:00
s_xfbEncoder . Init ( ) ;
2010-06-13 13:50:06 -06:00
}
2010-11-14 16:31:53 -07:00
FramebufferManager : : ~ FramebufferManager ( )
2010-06-13 13:50:06 -06:00
{
2011-06-11 13:37:21 -06:00
s_xfbEncoder . Shutdown ( ) ;
SAFE_RELEASE ( m_efb . color_tex ) ;
SAFE_RELEASE ( m_efb . color_temp_tex ) ;
SAFE_RELEASE ( m_efb . color_staging_buf ) ;
2016-05-01 08:29:36 -06:00
SAFE_RELEASE ( m_efb . color_read_texture ) ;
2011-06-11 13:37:21 -06:00
SAFE_RELEASE ( m_efb . resolved_color_tex ) ;
SAFE_RELEASE ( m_efb . depth_tex ) ;
SAFE_RELEASE ( m_efb . depth_staging_buf ) ;
SAFE_RELEASE ( m_efb . depth_read_texture ) ;
SAFE_RELEASE ( m_efb . resolved_depth_tex ) ;
2010-06-13 13:50:06 -06:00
}
2015-07-07 07:09:25 -06:00
void FramebufferManager : : CopyToRealXFB ( u32 xfbAddr , u32 fbStride , u32 fbHeight , const EFBRectangle & sourceRc , float Gamma )
2010-06-13 13:50:06 -06:00
{
2011-03-08 00:39:36 -07:00
u8 * dst = Memory : : GetPointer ( xfbAddr ) ;
2015-07-25 10:59:00 -06:00
// below div2 due to dx using pixel width
s_xfbEncoder . Encode ( dst , fbStride / 2 , fbHeight , sourceRc , Gamma ) ;
2010-06-13 13:50:06 -06:00
}
2015-12-21 12:11:01 -07:00
std : : unique_ptr < XFBSourceBase > FramebufferManager : : CreateXFBSource ( unsigned int target_width , unsigned int target_height , unsigned int layers )
2010-06-13 13:50:06 -06:00
{
2015-12-21 12:11:01 -07:00
return std : : make_unique < XFBSource > ( D3DTexture2D : : Create ( target_width , target_height ,
2010-11-14 16:31:53 -07:00
( D3D11_BIND_FLAG ) ( D3D11_BIND_RENDER_TARGET | D3D11_BIND_SHADER_RESOURCE ) ,
2014-12-20 09:24:35 -07:00
D3D11_USAGE_DEFAULT , DXGI_FORMAT_R8G8B8A8_UNORM , 1 , layers ) , layers ) ;
2010-06-13 13:50:06 -06:00
}
2014-12-24 16:58:16 -07:00
void FramebufferManager : : GetTargetSize ( unsigned int * width , unsigned int * height )
2010-06-13 13:50:06 -06:00
{
2014-12-24 16:57:52 -07:00
* width = m_target_width ;
* height = m_target_height ;
2010-06-13 13:50:06 -06:00
}
2010-11-14 16:31:53 -07:00
void XFBSource : : DecodeToTexture ( u32 xfbAddr , u32 fbWidth , u32 fbHeight )
2010-06-13 13:50:06 -06:00
{
2011-03-08 00:39:36 -07:00
// DX11's XFB decoder does not use this function.
// YUYV data is decoded in Render::Swap.
2010-06-13 13:50:06 -06:00
}
2010-12-26 20:18:01 -07:00
void XFBSource : : CopyEFB ( float Gamma )
2010-06-13 13:50:06 -06:00
{
2013-01-28 10:16:03 -07:00
g_renderer - > ResetAPIState ( ) ; // reset any game specific settings
2013-10-28 23:23:17 -06:00
2010-09-27 20:15:02 -06:00
// Copy EFB data to XFB and restore render target again
2010-11-14 16:31:53 -07:00
const D3D11_VIEWPORT vp = CD3D11_VIEWPORT ( 0.f , 0.f , ( float ) texWidth , ( float ) texHeight ) ;
2015-11-28 03:04:36 -07:00
const D3D11_RECT rect = CD3D11_RECT ( 0 , 0 , texWidth , texHeight ) ;
2010-11-14 16:31:53 -07:00
2011-06-11 13:37:21 -06:00
D3D : : context - > RSSetViewports ( 1 , & vp ) ;
2014-03-09 14:14:26 -06:00
D3D : : context - > OMSetRenderTargets ( 1 , & tex - > GetRTV ( ) , nullptr ) ;
2015-11-28 03:04:36 -07:00
D3D : : SetPointCopySampler ( ) ;
2010-11-21 07:47:28 -07:00
2015-11-28 03:04:36 -07:00
D3D : : drawShadedTexQuad ( FramebufferManager : : GetEFBColorTexture ( ) - > GetSRV ( ) , & rect ,
2014-12-20 09:55:27 -07:00
Renderer : : GetTargetWidth ( ) , Renderer : : GetTargetHeight ( ) , PixelShaderCache : : GetColorCopyProgram ( true ) ,
VertexShaderCache : : GetSimpleVertexShader ( ) , VertexShaderCache : : GetSimpleInputLayout ( ) ,
GeometryShaderCache : : GetCopyGeometryShader ( ) , Gamma ) ;
2010-11-14 16:31:53 -07:00
2011-06-11 13:37:21 -06:00
D3D : : context - > OMSetRenderTargets ( 1 , & FramebufferManager : : GetEFBColorTexture ( ) - > GetRTV ( ) ,
2010-11-14 16:31:53 -07:00
FramebufferManager : : GetEFBDepthTexture ( ) - > GetDSV ( ) ) ;
2013-10-28 23:23:17 -06:00
2013-01-28 10:16:03 -07:00
g_renderer - > RestoreAPIState ( ) ;
2010-06-13 13:50:06 -06:00
}
2011-01-29 13:16:51 -07:00
2014-12-20 09:24:35 -07:00
} // namespace DX11