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