2010-04-25 00:31:27 +00:00
/*
2009-02-09 21:15:56 +00:00
* Copyright ( C ) 2007 - 2009 Gabest
* http : //www.gabest.org
*
* This Program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation ; either version 2 , or ( at your option )
* any later version .
2010-04-25 00:31:27 +00:00
*
2009-02-09 21:15:56 +00:00
* This Program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
2010-04-25 00:31:27 +00:00
*
2009-02-09 21:15:56 +00:00
* You should have received a copy of the GNU General Public License
* along with GNU Make ; see the file COPYING . If not , write to
2012-09-09 18:16:11 +00:00
* the Free Software Foundation , Inc . , 51 Franklin Street , Fifth Floor , Boston , MA 02110 - 1301 , USA USA .
2009-02-09 21:15:56 +00:00
* http : //www.gnu.org/copyleft/gpl.html
*
*/
2011-02-19 03:36:30 +00:00
# include "stdafx.h"
2009-02-09 21:15:56 +00:00
# include "GSRenderer.h"
2014-12-15 18:14:30 +00:00
# ifdef __linux__
2013-06-16 08:43:50 +00:00
# include <X11/keysym.h>
# endif
2009-05-22 01:22:52 +00:00
2015-10-25 20:44:20 +00:00
const unsigned int s_interlace_nb = 8 ;
const unsigned int s_post_shader_nb = 5 ;
const unsigned int s_aspect_ratio_nb = 3 ;
2012-01-19 04:53:36 +00:00
GSRenderer : : GSRenderer ( )
2013-06-28 17:32:37 +00:00
: m_shader ( 0 )
2012-01-06 07:20:37 +00:00
, m_shift_key ( false )
, m_control_key ( false )
2015-09-11 10:19:49 +00:00
, m_framelimit ( false )
, m_texture_shuffle ( false )
2013-06-28 17:32:37 +00:00
, m_wnd ( NULL )
, m_dev ( NULL )
2009-05-22 01:22:52 +00:00
{
2010-12-03 03:04:55 +00:00
m_GStitleInfoBuffer [ 0 ] = 0 ;
2015-10-25 20:44:20 +00:00
m_interlace = theApp . GetConfig ( " interlace " , 7 ) % s_interlace_nb ;
m_aspectratio = theApp . GetConfig ( " aspectratio " , 1 ) % s_aspect_ratio_nb ;
m_shader = theApp . GetConfig ( " TVShader " , 0 ) % s_post_shader_nb ;
2009-05-22 23:23:38 +00:00
m_filter = theApp . GetConfig ( " filter " , 1 ) ;
m_vsync = ! ! theApp . GetConfig ( " vsync " , 0 ) ;
m_aa1 = ! ! theApp . GetConfig ( " aa1 " , 0 ) ;
2011-07-25 11:16:01 +00:00
m_fxaa = ! ! theApp . GetConfig ( " fxaa " , 0 ) ;
2014-01-17 10:17:24 +00:00
m_shaderfx = ! ! theApp . GetConfig ( " shaderfx " , 0 ) ;
2012-02-29 00:29:29 +00:00
m_shadeboost = ! ! theApp . GetConfig ( " ShadeBoost " , 0 ) ;
2009-05-22 01:22:52 +00:00
}
GSRenderer : : ~ GSRenderer ( )
{
2010-05-23 17:26:37 +00:00
/*if(m_dev)
2009-07-04 22:54:57 +00:00
{
2010-05-23 17:26:37 +00:00
m_dev - > Reset ( 1 , 1 , GSDevice : : Windowed ) ;
} */
delete m_dev ;
2013-06-16 16:33:08 +00:00
if ( m_wnd )
{
delete m_wnd ;
}
2009-05-22 01:22:52 +00:00
}
2009-09-17 07:40:38 +00:00
bool GSRenderer : : CreateWnd ( const string & title , int w , int h )
2009-05-22 01:22:52 +00:00
{
2013-01-04 11:41:51 +00:00
return m_wnd - > Create ( title . c_str ( ) , w , h ) ;
2009-09-17 07:40:38 +00:00
}
2009-05-22 01:22:52 +00:00
2009-09-17 07:40:38 +00:00
bool GSRenderer : : CreateDevice ( GSDevice * dev )
{
ASSERT ( dev ) ;
ASSERT ( ! m_dev ) ;
2009-05-22 01:22:52 +00:00
2013-01-04 11:41:51 +00:00
if ( ! dev - > Create ( m_wnd ) )
2009-05-22 01:22:52 +00:00
{
return false ;
}
2009-09-17 07:40:38 +00:00
m_dev = dev ;
2011-02-19 03:36:30 +00:00
m_dev - > SetVSync ( m_vsync & & m_framelimit ) ;
2009-05-22 01:22:52 +00:00
return true ;
}
2011-02-19 03:36:30 +00:00
void GSRenderer : : ResetDevice ( )
{
if ( m_dev ) m_dev - > Reset ( 1 , 1 ) ;
}
2009-05-22 01:22:52 +00:00
bool GSRenderer : : Merge ( int field )
{
bool en [ 2 ] ;
GSVector4i fr [ 2 ] ;
2015-08-04 01:34:46 +00:00
GSVector4i dr [ 2 ] ;
2009-05-22 01:22:52 +00:00
int baseline = INT_MAX ;
for ( int i = 0 ; i < 2 ; i + + )
{
en [ i ] = IsEnabled ( i ) ;
if ( en [ i ] )
{
fr [ i ] = GetFrameRect ( i ) ;
2015-08-04 01:34:46 +00:00
dr [ i ] = GetDisplayRect ( i ) ;
2009-05-22 01:22:52 +00:00
2015-08-04 01:34:46 +00:00
baseline = min ( dr [ i ] . top , baseline ) ;
2009-05-22 01:22:52 +00:00
2015-08-04 01:34:46 +00:00
//printf("[%d]: %d %d %d %d, %d %d %d %d\n", i, fr[i].x,fr[i].y,fr[i].z,fr[i].w , dr[i].x,dr[i].y,dr[i].z,dr[i].w);
2009-05-22 01:22:52 +00:00
}
}
if ( ! en [ 0 ] & & ! en [ 1 ] )
{
return false ;
}
2016-03-20 11:51:23 +00:00
GL_PUSH ( " Renderer Merge %d " , s_n ) ;
2015-05-15 13:12:49 +00:00
2009-05-22 01:22:52 +00:00
// try to avoid fullscreen blur, could be nice on tv but on a monitor it's like double vision, hurts my eyes (persona 4, guitar hero)
//
// NOTE: probably the technique explained in graphtip.pdf (Antialiasing by Supersampling / 4. Reading Odd/Even Scan Lines Separately with the PCRTC then Blending)
2010-04-25 00:31:27 +00:00
bool samesrc =
en [ 0 ] & & en [ 1 ] & &
m_regs - > DISP [ 0 ] . DISPFB . FBP = = m_regs - > DISP [ 1 ] . DISPFB . FBP & &
m_regs - > DISP [ 0 ] . DISPFB . FBW = = m_regs - > DISP [ 1 ] . DISPFB . FBW & &
2009-05-22 01:22:52 +00:00
m_regs - > DISP [ 0 ] . DISPFB . PSM = = m_regs - > DISP [ 1 ] . DISPFB . PSM ;
2014-04-14 18:25:02 +00:00
// bool blurdetected = false;
2009-05-22 01:22:52 +00:00
2009-11-10 13:05:56 +00:00
if ( samesrc /*&& m_regs->PMODE.SLBG == 0 && m_regs->PMODE.MMOD == 1 && m_regs->PMODE.ALP == 0x80*/ )
2009-05-22 01:22:52 +00:00
{
2015-08-04 01:34:46 +00:00
if ( fr [ 0 ] . eq ( fr [ 1 ] + GSVector4i ( 0 , - 1 , 0 , 0 ) ) & & dr [ 0 ] . eq ( dr [ 1 ] + GSVector4i ( 0 , 0 , 0 , 1 ) )
| | fr [ 1 ] . eq ( fr [ 0 ] + GSVector4i ( 0 , - 1 , 0 , 0 ) ) & & dr [ 1 ] . eq ( dr [ 0 ] + GSVector4i ( 0 , 0 , 0 , 1 ) ) )
2009-05-22 01:22:52 +00:00
{
// persona 4:
//
// fr[0] = 0 0 640 448
// fr[1] = 0 1 640 448
2015-08-04 01:34:46 +00:00
// dr[0] = 159 50 779 498
// dr[1] = 159 50 779 497
2009-05-22 01:22:52 +00:00
//
// second image shifted up by 1 pixel and blended over itself
//
// god of war:
//
// fr[0] = 0 1 512 448
// fr[1] = 0 0 512 448
2015-08-04 01:34:46 +00:00
// dr[0] = 127 50 639 497
// dr[1] = 127 50 639 498
2009-05-22 01:22:52 +00:00
//
// same just the first image shifted
int top = min ( fr [ 0 ] . top , fr [ 1 ] . top ) ;
2015-08-04 01:34:46 +00:00
int bottom = max ( dr [ 0 ] . bottom , dr [ 1 ] . bottom ) ;
2009-05-22 01:22:52 +00:00
fr [ 0 ] . top = top ;
fr [ 1 ] . top = top ;
2015-08-04 01:34:46 +00:00
dr [ 0 ] . bottom = bottom ;
dr [ 1 ] . bottom = bottom ;
2009-05-22 01:22:52 +00:00
2014-04-14 18:25:02 +00:00
// blurdetected = true;
2009-05-22 01:22:52 +00:00
}
2015-08-04 01:34:46 +00:00
else if ( dr [ 0 ] . eq ( dr [ 1 ] ) & & ( fr [ 0 ] . eq ( fr [ 1 ] + GSVector4i ( 0 , 1 , 0 , 1 ) ) | | fr [ 1 ] . eq ( fr [ 0 ] + GSVector4i ( 0 , 1 , 0 , 1 ) ) ) )
2009-05-22 01:22:52 +00:00
{
// dq5:
//
// fr[0] = 0 1 512 445
// fr[1] = 0 0 512 444
2015-08-04 01:34:46 +00:00
// dr[0] = 127 50 639 494
// dr[1] = 127 50 639 494
2009-05-22 01:22:52 +00:00
int top = min ( fr [ 0 ] . top , fr [ 1 ] . top ) ;
int bottom = min ( fr [ 0 ] . bottom , fr [ 1 ] . bottom ) ;
fr [ 0 ] . top = fr [ 1 ] . top = top ;
fr [ 0 ] . bottom = fr [ 1 ] . bottom = bottom ;
2014-04-14 18:25:02 +00:00
// blurdetected = true;
2009-05-22 01:22:52 +00:00
}
2009-11-10 13:05:56 +00:00
//printf("samesrc = %d blurdetected = %d\n",samesrc,blurdetected);
2009-05-22 01:22:52 +00:00
}
GSVector2i fs ( 0 , 0 ) ;
GSVector2i ds ( 0 , 0 ) ;
GSTexture * tex [ 2 ] = { NULL , NULL } ;
2016-03-19 11:37:25 +00:00
int y_offset [ 2 ] = { 0 , 0 } ;
2009-05-22 01:22:52 +00:00
if ( samesrc & & fr [ 0 ] . bottom = = fr [ 1 ] . bottom )
{
2016-03-19 11:37:25 +00:00
tex [ 0 ] = GetOutput ( 0 , y_offset [ 0 ] ) ;
tex [ 1 ] = tex [ 0 ] ; // saves one texture fetch
y_offset [ 1 ] = y_offset [ 0 ] ;
2009-05-22 01:22:52 +00:00
}
else
{
2016-03-19 11:37:25 +00:00
if ( en [ 0 ] ) tex [ 0 ] = GetOutput ( 0 , y_offset [ 0 ] ) ;
if ( en [ 1 ] ) tex [ 1 ] = GetOutput ( 1 , y_offset [ 1 ] ) ;
2009-05-22 01:22:52 +00:00
}
GSVector4 src [ 2 ] ;
2016-03-19 11:37:25 +00:00
GSVector4 src_hw [ 2 ] ;
2009-05-22 01:22:52 +00:00
GSVector4 dst [ 2 ] ;
for ( int i = 0 ; i < 2 ; i + + )
{
if ( ! en [ i ] | | ! tex [ i ] ) continue ;
GSVector4i r = fr [ i ] ;
2009-08-02 23:07:30 +00:00
GSVector4 scale = GSVector4 ( tex [ i ] - > GetScale ( ) ) . xyxy ( ) ;
2009-05-22 01:22:52 +00:00
src [ i ] = GSVector4 ( r ) * scale / GSVector4 ( tex [ i ] - > GetSize ( ) ) . xyxy ( ) ;
2016-03-19 11:37:25 +00:00
src_hw [ i ] = ( GSVector4 ( r ) + GSVector4 ( 0 , y_offset [ i ] , 0 , y_offset [ i ] ) ) * scale / GSVector4 ( tex [ i ] - > GetSize ( ) ) . xyxy ( ) ;
2010-04-25 00:31:27 +00:00
2015-05-15 18:40:09 +00:00
GSVector2 off ( 0 , 0 ) ;
2010-04-25 00:31:27 +00:00
2015-08-04 01:34:46 +00:00
if ( dr [ i ] . top - baseline > = 4 ) // 2?
2009-05-22 01:22:52 +00:00
{
2015-08-04 01:34:46 +00:00
off . y = tex [ i ] - > GetScale ( ) . y * ( dr [ i ] . top - baseline ) ;
2009-05-22 01:22:52 +00:00
if ( m_regs - > SMODE2 . INT & & m_regs - > SMODE2 . FFMD )
{
2015-05-15 18:40:09 +00:00
off . y / = 2 ;
2009-05-22 01:22:52 +00:00
}
}
2015-05-15 18:40:09 +00:00
dst [ i ] = GSVector4 ( off ) . xyxy ( ) + scale * GSVector4 ( r . rsize ( ) ) ;
2009-05-22 01:22:52 +00:00
fs . x = max ( fs . x , ( int ) ( dst [ i ] . z + 0.5f ) ) ;
fs . y = max ( fs . y , ( int ) ( dst [ i ] . w + 0.5f ) ) ;
}
ds = fs ;
if ( m_regs - > SMODE2 . INT & & m_regs - > SMODE2 . FFMD )
{
ds . y * = 2 ;
}
bool slbg = m_regs - > PMODE . SLBG ;
bool mmod = m_regs - > PMODE . MMOD ;
if ( tex [ 0 ] | | tex [ 1 ] )
{
2011-02-20 22:33:22 +00:00
if ( tex [ 0 ] = = tex [ 1 ] & & ! slbg & & ( src [ 0 ] = = src [ 1 ] & dst [ 0 ] = = dst [ 1 ] ) . alltrue ( ) )
{
// the two outputs are identical, skip drawing one of them (the one that is alpha blended)
tex [ 0 ] = NULL ;
}
2009-05-22 01:22:52 +00:00
GSVector4 c = GSVector4 ( ( int ) m_regs - > BGCOLOR . R , ( int ) m_regs - > BGCOLOR . G , ( int ) m_regs - > BGCOLOR . B , ( int ) m_regs - > PMODE . ALP ) / 255 ;
2016-03-19 11:37:25 +00:00
m_dev - > Merge ( tex , src_hw , dst , fs , slbg , mmod , c ) ;
2009-05-22 01:22:52 +00:00
if ( m_regs - > SMODE2 . INT & & m_interlace > 0 )
{
2012-04-25 08:46:51 +00:00
if ( m_interlace = = 7 & & m_regs - > SMODE2 . FFMD = = 1 ) // Auto interlace enabled / Odd frame interlace setting
{
int field2 = 0 ;
int mode = 2 ;
m_dev - > Interlace ( ds , field ^ field2 , mode , tex [ 1 ] ? tex [ 1 ] - > GetScale ( ) . y : tex [ 0 ] - > GetScale ( ) . y ) ;
}
else
{
int field2 = 1 - ( ( m_interlace - 1 ) & 1 ) ;
int mode = ( m_interlace - 1 ) > > 1 ;
m_dev - > Interlace ( ds , field ^ field2 , mode , tex [ 1 ] ? tex [ 1 ] - > GetScale ( ) . y : tex [ 0 ] - > GetScale ( ) . y ) ;
}
2009-05-22 01:22:52 +00:00
}
2011-07-25 11:16:01 +00:00
2012-02-29 00:29:29 +00:00
if ( m_shadeboost )
{
m_dev - > ShadeBoost ( ) ;
}
2014-01-17 10:17:24 +00:00
if ( m_shaderfx )
{
m_dev - > ExternalFX ( ) ;
}
2011-07-25 11:16:01 +00:00
if ( m_fxaa )
{
m_dev - > FXAA ( ) ;
}
2009-05-22 01:22:52 +00:00
}
2015-05-15 13:12:49 +00:00
GL_POP ( ) ;
2009-05-22 01:22:52 +00:00
return true ;
}
2009-10-31 01:06:23 +00:00
void GSRenderer : : SetFrameLimit ( bool limit )
{
m_framelimit = limit ;
2011-02-19 03:36:30 +00:00
if ( m_dev ) m_dev - > SetVSync ( m_vsync & & m_framelimit ) ;
2009-10-31 01:06:23 +00:00
}
2011-02-19 03:36:30 +00:00
void GSRenderer : : SetVSync ( bool enabled )
2009-12-01 05:59:43 +00:00
{
m_vsync = enabled ;
2011-02-19 03:36:30 +00:00
if ( m_dev ) m_dev - > SetVSync ( m_vsync ) ;
}
2009-12-01 05:59:43 +00:00
2009-05-22 01:22:52 +00:00
void GSRenderer : : VSync ( int field )
{
2011-12-22 01:48:16 +00:00
GSPerfMonAutoTimer pmat ( & m_perfmon ) ;
2009-05-22 01:22:52 +00:00
m_perfmon . Put ( GSPerfMon : : Frame ) ;
Flush ( ) ;
2009-07-04 15:14:04 +00:00
if ( ! m_dev - > IsLost ( true ) )
{
if ( ! Merge ( field ? 1 : 0 ) )
{
return ;
}
}
else
{
ResetDevice ( ) ;
}
2009-05-22 01:22:52 +00:00
2012-01-18 11:47:31 +00:00
m_dev - > AgePool ( ) ;
2010-04-25 00:31:27 +00:00
// osd
2009-05-22 01:22:52 +00:00
Avih (of Firefox plugin "Smoothwheel" fame ;) ) worked on bringing back that extended GSdx information we lost in the merge to the new WX Gui.
Here's his changelog:
GSdx, PCSX2: Fixed broken GS info at the title bar
* If the plugin doesn't support the API, PCSX2 will display only the image mode (progressive/interlaced field/frame), NON i18n!
* If the plugin does support the API, PCSX2 will not display the image mode, and instead display the info from the plugin
* GSdx now properly sends title info: resolution, image mode, deinterlace mode (weave - bff, etc)
* To enable the full GSdx title info as it used to work before it got broken: uncomment //#define GSTITLEINFO_API_FORCE_VERBOSE at GS.h of GSdx.
NOTE: When using an older pcsx2.exe with newer GS plugin, the title would contain duplicate image mode info. All other combos work fine.
* PCSX2 still displays the performance info, etc in the title bar.
Thanks a bunch for bringing this information back, Avih! :)
git-svn-id: http://pcsx2.googlecode.com/svn/trunk@4070 96395faa-99c1-11dd-bbfe-3dabce05a288
2010-12-02 22:48:56 +00:00
if ( ( m_perfmon . GetFrame ( ) & 0x1f ) = = 0 )
2009-05-22 01:22:52 +00:00
{
m_perfmon . Update ( ) ;
double fps = 1000.0f / m_perfmon . Get ( GSPerfMon : : Frame ) ;
Avih (of Firefox plugin "Smoothwheel" fame ;) ) worked on bringing back that extended GSdx information we lost in the merge to the new WX Gui.
Here's his changelog:
GSdx, PCSX2: Fixed broken GS info at the title bar
* If the plugin doesn't support the API, PCSX2 will display only the image mode (progressive/interlaced field/frame), NON i18n!
* If the plugin does support the API, PCSX2 will not display the image mode, and instead display the info from the plugin
* GSdx now properly sends title info: resolution, image mode, deinterlace mode (weave - bff, etc)
* To enable the full GSdx title info as it used to work before it got broken: uncomment //#define GSTITLEINFO_API_FORCE_VERBOSE at GS.h of GSdx.
NOTE: When using an older pcsx2.exe with newer GS plugin, the title would contain duplicate image mode info. All other combos work fine.
* PCSX2 still displays the performance info, etc in the title bar.
Thanks a bunch for bringing this information back, Avih! :)
git-svn-id: http://pcsx2.googlecode.com/svn/trunk@4070 96395faa-99c1-11dd-bbfe-3dabce05a288
2010-12-02 22:48:56 +00:00
string s ;
# ifdef GSTITLEINFO_API_FORCE_VERBOSE
if ( 1 ) //force verbose reply
# else
2013-01-04 11:41:51 +00:00
if ( m_wnd - > IsManaged ( ) )
Avih (of Firefox plugin "Smoothwheel" fame ;) ) worked on bringing back that extended GSdx information we lost in the merge to the new WX Gui.
Here's his changelog:
GSdx, PCSX2: Fixed broken GS info at the title bar
* If the plugin doesn't support the API, PCSX2 will display only the image mode (progressive/interlaced field/frame), NON i18n!
* If the plugin does support the API, PCSX2 will not display the image mode, and instead display the info from the plugin
* GSdx now properly sends title info: resolution, image mode, deinterlace mode (weave - bff, etc)
* To enable the full GSdx title info as it used to work before it got broken: uncomment //#define GSTITLEINFO_API_FORCE_VERBOSE at GS.h of GSdx.
NOTE: When using an older pcsx2.exe with newer GS plugin, the title would contain duplicate image mode info. All other combos work fine.
* PCSX2 still displays the performance info, etc in the title bar.
Thanks a bunch for bringing this information back, Avih! :)
git-svn-id: http://pcsx2.googlecode.com/svn/trunk@4070 96395faa-99c1-11dd-bbfe-3dabce05a288
2010-12-02 22:48:56 +00:00
# endif
2011-02-24 23:46:26 +00:00
{
//GSdx owns the window's title, be verbose.
2010-12-03 03:04:55 +00:00
string s2 = m_regs - > SMODE2 . INT ? ( string ( " Interlaced " ) + ( m_regs - > SMODE2 . FFMD ? " (frame) " : " (field) " ) ) : " Progressive " ;
2011-02-24 23:46:26 +00:00
Avih (of Firefox plugin "Smoothwheel" fame ;) ) worked on bringing back that extended GSdx information we lost in the merge to the new WX Gui.
Here's his changelog:
GSdx, PCSX2: Fixed broken GS info at the title bar
* If the plugin doesn't support the API, PCSX2 will display only the image mode (progressive/interlaced field/frame), NON i18n!
* If the plugin does support the API, PCSX2 will not display the image mode, and instead display the info from the plugin
* GSdx now properly sends title info: resolution, image mode, deinterlace mode (weave - bff, etc)
* To enable the full GSdx title info as it used to work before it got broken: uncomment //#define GSTITLEINFO_API_FORCE_VERBOSE at GS.h of GSdx.
NOTE: When using an older pcsx2.exe with newer GS plugin, the title would contain duplicate image mode info. All other combos work fine.
* PCSX2 still displays the performance info, etc in the title bar.
Thanks a bunch for bringing this information back, Avih! :)
git-svn-id: http://pcsx2.googlecode.com/svn/trunk@4070 96395faa-99c1-11dd-bbfe-3dabce05a288
2010-12-02 22:48:56 +00:00
s = format (
2015-04-24 15:13:56 +00:00
" %lld | %d x %d | %.2f fps (%d%%) | %s - %s | %s | %d S/%d P/%d D | %d%% CPU | %.2f | %.2f " ,
2016-02-12 00:34:02 +00:00
m_perfmon . GetFrame ( ) , GetInternalResolution ( ) . x , GetInternalResolution ( ) . y , fps , ( int ) ( 100.0 * fps / GetTvRefreshRate ( ) ) ,
Avih (of Firefox plugin "Smoothwheel" fame ;) ) worked on bringing back that extended GSdx information we lost in the merge to the new WX Gui.
Here's his changelog:
GSdx, PCSX2: Fixed broken GS info at the title bar
* If the plugin doesn't support the API, PCSX2 will display only the image mode (progressive/interlaced field/frame), NON i18n!
* If the plugin does support the API, PCSX2 will not display the image mode, and instead display the info from the plugin
* GSdx now properly sends title info: resolution, image mode, deinterlace mode (weave - bff, etc)
* To enable the full GSdx title info as it used to work before it got broken: uncomment //#define GSTITLEINFO_API_FORCE_VERBOSE at GS.h of GSdx.
NOTE: When using an older pcsx2.exe with newer GS plugin, the title would contain duplicate image mode info. All other combos work fine.
* PCSX2 still displays the performance info, etc in the title bar.
Thanks a bunch for bringing this information back, Avih! :)
git-svn-id: http://pcsx2.googlecode.com/svn/trunk@4070 96395faa-99c1-11dd-bbfe-3dabce05a288
2010-12-02 22:48:56 +00:00
s2 . c_str ( ) ,
2011-02-19 03:36:30 +00:00
theApp . m_gs_interlace [ m_interlace ] . name . c_str ( ) ,
theApp . m_gs_aspectratio [ m_aspectratio ] . name . c_str ( ) ,
2012-01-18 11:47:31 +00:00
( int ) m_perfmon . Get ( GSPerfMon : : SyncPoint ) ,
2012-01-06 00:17:52 +00:00
( int ) m_perfmon . Get ( GSPerfMon : : Prim ) ,
Avih (of Firefox plugin "Smoothwheel" fame ;) ) worked on bringing back that extended GSdx information we lost in the merge to the new WX Gui.
Here's his changelog:
GSdx, PCSX2: Fixed broken GS info at the title bar
* If the plugin doesn't support the API, PCSX2 will display only the image mode (progressive/interlaced field/frame), NON i18n!
* If the plugin does support the API, PCSX2 will not display the image mode, and instead display the info from the plugin
* GSdx now properly sends title info: resolution, image mode, deinterlace mode (weave - bff, etc)
* To enable the full GSdx title info as it used to work before it got broken: uncomment //#define GSTITLEINFO_API_FORCE_VERBOSE at GS.h of GSdx.
NOTE: When using an older pcsx2.exe with newer GS plugin, the title would contain duplicate image mode info. All other combos work fine.
* PCSX2 still displays the performance info, etc in the title bar.
Thanks a bunch for bringing this information back, Avih! :)
git-svn-id: http://pcsx2.googlecode.com/svn/trunk@4070 96395faa-99c1-11dd-bbfe-3dabce05a288
2010-12-02 22:48:56 +00:00
( int ) m_perfmon . Get ( GSPerfMon : : Draw ) ,
m_perfmon . CPU ( ) ,
m_perfmon . Get ( GSPerfMon : : Swizzle ) / 1024 ,
m_perfmon . Get ( GSPerfMon : : Unswizzle ) / 1024
) ;
double fillrate = m_perfmon . Get ( GSPerfMon : : Fillrate ) ;
if ( fillrate > 0 )
{
s + = format ( " | %.2f mpps " , fps * fillrate / ( 1024 * 1024 ) ) ;
2012-01-08 21:02:42 +00:00
int sum = 0 ;
for ( int i = 0 ; i < 16 ; i + + )
{
sum + = m_perfmon . CPU ( GSPerfMon : : WorkerDraw0 + i ) ;
}
s + = format ( " | %d%% CPU " , sum ) ;
}
Avih (of Firefox plugin "Smoothwheel" fame ;) ) worked on bringing back that extended GSdx information we lost in the merge to the new WX Gui.
Here's his changelog:
GSdx, PCSX2: Fixed broken GS info at the title bar
* If the plugin doesn't support the API, PCSX2 will display only the image mode (progressive/interlaced field/frame), NON i18n!
* If the plugin does support the API, PCSX2 will not display the image mode, and instead display the info from the plugin
* GSdx now properly sends title info: resolution, image mode, deinterlace mode (weave - bff, etc)
* To enable the full GSdx title info as it used to work before it got broken: uncomment //#define GSTITLEINFO_API_FORCE_VERBOSE at GS.h of GSdx.
NOTE: When using an older pcsx2.exe with newer GS plugin, the title would contain duplicate image mode info. All other combos work fine.
* PCSX2 still displays the performance info, etc in the title bar.
Thanks a bunch for bringing this information back, Avih! :)
git-svn-id: http://pcsx2.googlecode.com/svn/trunk@4070 96395faa-99c1-11dd-bbfe-3dabce05a288
2010-12-02 22:48:56 +00:00
}
else
2010-12-03 03:04:55 +00:00
{
2011-02-19 03:36:30 +00:00
// Satisfy PCSX2's request for title info: minimal verbosity due to more external title text
2009-05-22 01:22:52 +00:00
2016-02-12 00:34:02 +00:00
s = format ( " %dx%d | %s " , GetInternalResolution ( ) . x , GetInternalResolution ( ) . y , theApp . m_gs_interlace [ m_interlace ] . name . c_str ( ) ) ;
2011-02-19 03:36:30 +00:00
}
Avih (of Firefox plugin "Smoothwheel" fame ;) ) worked on bringing back that extended GSdx information we lost in the merge to the new WX Gui.
Here's his changelog:
GSdx, PCSX2: Fixed broken GS info at the title bar
* If the plugin doesn't support the API, PCSX2 will display only the image mode (progressive/interlaced field/frame), NON i18n!
* If the plugin does support the API, PCSX2 will not display the image mode, and instead display the info from the plugin
* GSdx now properly sends title info: resolution, image mode, deinterlace mode (weave - bff, etc)
* To enable the full GSdx title info as it used to work before it got broken: uncomment //#define GSTITLEINFO_API_FORCE_VERBOSE at GS.h of GSdx.
NOTE: When using an older pcsx2.exe with newer GS plugin, the title would contain duplicate image mode info. All other combos work fine.
* PCSX2 still displays the performance info, etc in the title bar.
Thanks a bunch for bringing this information back, Avih! :)
git-svn-id: http://pcsx2.googlecode.com/svn/trunk@4070 96395faa-99c1-11dd-bbfe-3dabce05a288
2010-12-02 22:48:56 +00:00
2009-05-22 01:22:52 +00:00
if ( m_capture . IsCapturing ( ) )
{
2009-06-03 12:09:04 +00:00
s + = " | Recording... " ;
2009-05-22 01:22:52 +00:00
}
2013-01-04 11:41:51 +00:00
if ( m_wnd - > IsManaged ( ) )
Avih (of Firefox plugin "Smoothwheel" fame ;) ) worked on bringing back that extended GSdx information we lost in the merge to the new WX Gui.
Here's his changelog:
GSdx, PCSX2: Fixed broken GS info at the title bar
* If the plugin doesn't support the API, PCSX2 will display only the image mode (progressive/interlaced field/frame), NON i18n!
* If the plugin does support the API, PCSX2 will not display the image mode, and instead display the info from the plugin
* GSdx now properly sends title info: resolution, image mode, deinterlace mode (weave - bff, etc)
* To enable the full GSdx title info as it used to work before it got broken: uncomment //#define GSTITLEINFO_API_FORCE_VERBOSE at GS.h of GSdx.
NOTE: When using an older pcsx2.exe with newer GS plugin, the title would contain duplicate image mode info. All other combos work fine.
* PCSX2 still displays the performance info, etc in the title bar.
Thanks a bunch for bringing this information back, Avih! :)
git-svn-id: http://pcsx2.googlecode.com/svn/trunk@4070 96395faa-99c1-11dd-bbfe-3dabce05a288
2010-12-02 22:48:56 +00:00
{
2013-01-04 11:41:51 +00:00
m_wnd - > SetWindowText ( s . c_str ( ) ) ;
Avih (of Firefox plugin "Smoothwheel" fame ;) ) worked on bringing back that extended GSdx information we lost in the merge to the new WX Gui.
Here's his changelog:
GSdx, PCSX2: Fixed broken GS info at the title bar
* If the plugin doesn't support the API, PCSX2 will display only the image mode (progressive/interlaced field/frame), NON i18n!
* If the plugin does support the API, PCSX2 will not display the image mode, and instead display the info from the plugin
* GSdx now properly sends title info: resolution, image mode, deinterlace mode (weave - bff, etc)
* To enable the full GSdx title info as it used to work before it got broken: uncomment //#define GSTITLEINFO_API_FORCE_VERBOSE at GS.h of GSdx.
NOTE: When using an older pcsx2.exe with newer GS plugin, the title would contain duplicate image mode info. All other combos work fine.
* PCSX2 still displays the performance info, etc in the title bar.
Thanks a bunch for bringing this information back, Avih! :)
git-svn-id: http://pcsx2.googlecode.com/svn/trunk@4070 96395faa-99c1-11dd-bbfe-3dabce05a288
2010-12-02 22:48:56 +00:00
}
else
{
2010-12-03 03:04:55 +00:00
// note: do not use TryEnterCriticalSection. It is unnecessary code complication in
// an area that absolutely does not matter (even if it were 100 times slower, it wouldn't
// be noticeable). Besides, these locks are extremely short -- overhead of conditional
// is way more expensive than just waiting for the CriticalSection in 1 of 10,000,000 tries. --air
2015-03-03 17:29:21 +00:00
std : : lock_guard < std : : mutex > lock ( m_pGSsetTitle_Crit ) ;
Avih (of Firefox plugin "Smoothwheel" fame ;) ) worked on bringing back that extended GSdx information we lost in the merge to the new WX Gui.
Here's his changelog:
GSdx, PCSX2: Fixed broken GS info at the title bar
* If the plugin doesn't support the API, PCSX2 will display only the image mode (progressive/interlaced field/frame), NON i18n!
* If the plugin does support the API, PCSX2 will not display the image mode, and instead display the info from the plugin
* GSdx now properly sends title info: resolution, image mode, deinterlace mode (weave - bff, etc)
* To enable the full GSdx title info as it used to work before it got broken: uncomment //#define GSTITLEINFO_API_FORCE_VERBOSE at GS.h of GSdx.
NOTE: When using an older pcsx2.exe with newer GS plugin, the title would contain duplicate image mode info. All other combos work fine.
* PCSX2 still displays the performance info, etc in the title bar.
Thanks a bunch for bringing this information back, Avih! :)
git-svn-id: http://pcsx2.googlecode.com/svn/trunk@4070 96395faa-99c1-11dd-bbfe-3dabce05a288
2010-12-02 22:48:56 +00:00
2011-02-07 01:59:05 +00:00
strncpy ( m_GStitleInfoBuffer , s . c_str ( ) , countof ( m_GStitleInfoBuffer ) - 1 ) ;
Avih (of Firefox plugin "Smoothwheel" fame ;) ) worked on bringing back that extended GSdx information we lost in the merge to the new WX Gui.
Here's his changelog:
GSdx, PCSX2: Fixed broken GS info at the title bar
* If the plugin doesn't support the API, PCSX2 will display only the image mode (progressive/interlaced field/frame), NON i18n!
* If the plugin does support the API, PCSX2 will not display the image mode, and instead display the info from the plugin
* GSdx now properly sends title info: resolution, image mode, deinterlace mode (weave - bff, etc)
* To enable the full GSdx title info as it used to work before it got broken: uncomment //#define GSTITLEINFO_API_FORCE_VERBOSE at GS.h of GSdx.
NOTE: When using an older pcsx2.exe with newer GS plugin, the title would contain duplicate image mode info. All other combos work fine.
* PCSX2 still displays the performance info, etc in the title bar.
Thanks a bunch for bringing this information back, Avih! :)
git-svn-id: http://pcsx2.googlecode.com/svn/trunk@4070 96395faa-99c1-11dd-bbfe-3dabce05a288
2010-12-02 22:48:56 +00:00
2011-02-19 03:36:30 +00:00
m_GStitleInfoBuffer [ sizeof ( m_GStitleInfoBuffer ) - 1 ] = 0 ; // make sure null terminated even if text overflows
Avih (of Firefox plugin "Smoothwheel" fame ;) ) worked on bringing back that extended GSdx information we lost in the merge to the new WX Gui.
Here's his changelog:
GSdx, PCSX2: Fixed broken GS info at the title bar
* If the plugin doesn't support the API, PCSX2 will display only the image mode (progressive/interlaced field/frame), NON i18n!
* If the plugin does support the API, PCSX2 will not display the image mode, and instead display the info from the plugin
* GSdx now properly sends title info: resolution, image mode, deinterlace mode (weave - bff, etc)
* To enable the full GSdx title info as it used to work before it got broken: uncomment //#define GSTITLEINFO_API_FORCE_VERBOSE at GS.h of GSdx.
NOTE: When using an older pcsx2.exe with newer GS plugin, the title would contain duplicate image mode info. All other combos work fine.
* PCSX2 still displays the performance info, etc in the title bar.
Thanks a bunch for bringing this information back, Avih! :)
git-svn-id: http://pcsx2.googlecode.com/svn/trunk@4070 96395faa-99c1-11dd-bbfe-3dabce05a288
2010-12-02 22:48:56 +00:00
}
2010-01-28 02:53:10 +00:00
}
else
{
// [TODO]
// We don't have window title rights, or the window has no title,
// so let's use actual OSD!
2009-05-22 01:22:52 +00:00
}
if ( m_frameskip )
{
return ;
}
// present
2013-01-04 11:41:51 +00:00
m_dev - > Present ( m_wnd - > GetClientRect ( ) . fit ( m_aspectratio ) , m_shader ) ;
2009-05-22 01:22:52 +00:00
// snapshot
if ( ! m_snapshot . empty ( ) )
{
2011-02-19 23:41:52 +00:00
bool shift = false ;
2011-02-19 03:36:30 +00:00
2016-01-27 15:33:10 +00:00
# ifdef _WIN32
2011-02-19 03:36:30 +00:00
2011-02-19 23:41:52 +00:00
shift = ! ! ( : : GetAsyncKeyState ( VK_SHIFT ) & 0x8000 ) ;
2011-02-19 03:36:30 +00:00
2012-01-06 07:20:37 +00:00
# else
shift = m_shift_key ;
2011-02-19 23:41:52 +00:00
# endif
2011-02-19 03:36:30 +00:00
if ( ! m_dump & & shift )
2009-05-22 01:22:52 +00:00
{
GSFreezeData fd ;
fd . size = 0 ;
fd . data = NULL ;
Freeze ( & fd , true ) ;
fd . data = new uint8 [ fd . size ] ;
Freeze ( & fd , false ) ;
m_dump . Open ( m_snapshot , m_crc , fd , m_regs ) ;
delete [ ] fd . data ;
}
if ( GSTexture * t = m_dev - > GetCurrent ( ) )
{
2016-02-24 21:52:17 +00:00
t - > Save ( m_snapshot + " .bmp " , true ) ;
2009-05-22 01:22:52 +00:00
}
m_snapshot . clear ( ) ;
}
else
{
if ( m_dump )
{
2011-02-19 03:36:30 +00:00
bool control = false ;
2016-01-27 15:33:10 +00:00
# ifdef _WIN32
2011-02-19 03:36:30 +00:00
control = ! ! ( : : GetAsyncKeyState ( VK_CONTROL ) & 0x8000 ) ;
2012-01-06 07:20:37 +00:00
# else
control = m_control_key ;
2011-02-19 03:36:30 +00:00
# endif
m_dump . VSync ( field , ! control , m_regs ) ;
2009-05-22 01:22:52 +00:00
}
}
// capture
if ( m_capture . IsCapturing ( ) )
{
if ( GSTexture * current = m_dev - > GetCurrent ( ) )
{
GSVector2i size = m_capture . GetSize ( ) ;
if ( GSTexture * offscreen = m_dev - > CopyOffscreen ( current , GSVector4 ( 0 , 0 , 1 , 1 ) , size . x , size . y ) )
{
2009-06-12 19:09:17 +00:00
GSTexture : : GSMap m ;
2009-05-22 01:22:52 +00:00
2009-06-12 19:09:17 +00:00
if ( offscreen - > Map ( m ) )
2009-05-22 01:22:52 +00:00
{
2009-08-16 16:45:26 +00:00
m_capture . DeliverFrame ( m . bits , m . pitch , ! m_dev - > IsRBSwapped ( ) ) ;
2009-05-22 01:22:52 +00:00
offscreen - > Unmap ( ) ;
}
m_dev - > Recycle ( offscreen ) ;
}
}
}
}
2009-06-03 12:09:04 +00:00
bool GSRenderer : : MakeSnapshot ( const string & path )
{
if ( m_snapshot . empty ( ) )
{
time_t t = time ( NULL ) ;
char buff [ 16 ] ;
if ( strftime ( buff , sizeof ( buff ) , " %Y%m%d%H%M%S " , localtime ( & t ) ) )
{
m_snapshot = format ( " %s_%s " , path . c_str ( ) , buff ) ;
}
}
return true ;
}
2009-12-30 13:29:24 +00:00
2011-08-30 07:11:36 +00:00
bool GSRenderer : : BeginCapture ( )
2010-06-24 20:25:33 +00:00
{
2015-09-21 01:42:21 +00:00
GSVector4i disp = m_wnd - > GetClientRect ( ) . fit ( m_aspectratio ) ;
float aspect = ( float ) disp . width ( ) / max ( 1 , disp . height ( ) ) ;
return m_capture . BeginCapture ( GetTvRefreshRate ( ) , GetInternalResolution ( ) , aspect ) ;
2010-06-24 20:25:33 +00:00
}
void GSRenderer : : EndCapture ( )
{
m_capture . EndCapture ( ) ;
}
void GSRenderer : : KeyEvent ( GSKeyEventData * e )
2009-05-22 01:22:52 +00:00
{
2016-01-27 15:33:10 +00:00
# ifdef _WIN32
2009-05-22 01:22:52 +00:00
if ( e - > type = = KEYPRESS )
{
int step = ( : : GetAsyncKeyState ( VK_SHIFT ) & 0x8000 ) ? - 1 : 1 ;
switch ( e - > key )
{
case VK_F5 :
2015-10-25 20:44:20 +00:00
m_interlace = ( m_interlace + s_interlace_nb + step ) % s_interlace_nb ;
2011-04-05 11:30:07 +00:00
printf ( " GSdx: Set deinterlace mode to %d (%s). \n " , ( int ) m_interlace , theApp . m_gs_interlace . at ( m_interlace ) . name . c_str ( ) ) ;
2009-05-22 01:22:52 +00:00
return ;
case VK_F6 :
2013-01-04 11:41:51 +00:00
if ( m_wnd - > IsManaged ( ) )
2015-10-25 20:44:20 +00:00
m_aspectratio = ( m_aspectratio + s_aspect_ratio_nb + step ) % s_aspect_ratio_nb ;
2009-05-22 01:22:52 +00:00
return ;
case VK_F7 :
2015-10-25 20:44:20 +00:00
m_shader = ( m_shader + s_post_shader_nb + step ) % s_post_shader_nb ;
2014-02-02 20:40:28 +00:00
printf ( " GSdx: Set shader to: %d. \n " , ( int ) m_shader ) ;
2009-05-22 01:22:52 +00:00
return ;
case VK_DELETE :
m_aa1 = ! m_aa1 ;
2015-11-03 14:42:41 +00:00
printf ( " GSdx: (Software) Edge anti-aliasing is now %s. \n " , m_aa1 ? " enabled " : " disabled " ) ;
2009-05-22 01:22:52 +00:00
return ;
2011-03-12 22:10:58 +00:00
case VK_INSERT :
m_mipmap = ! m_mipmap ;
2015-11-03 14:42:41 +00:00
printf ( " GSdx: (Software) Mipmapping is now %s. \n " , m_mipmap ? " enabled " : " disabled " ) ;
2011-03-12 22:10:58 +00:00
return ;
2011-07-25 11:16:01 +00:00
case VK_PRIOR :
m_fxaa = ! m_fxaa ;
2014-01-17 10:17:24 +00:00
printf ( " GSdx: FXAA anti-aliasing is now %s. \n " , m_fxaa ? " enabled " : " disabled " ) ;
return ;
case VK_HOME :
m_shaderfx = ! m_shaderfx ;
printf ( " GSdx: External post-processing is now %s. \n " , m_shaderfx ? " enabled " : " disabled " ) ;
2011-07-25 11:16:01 +00:00
return ;
2009-05-22 01:22:52 +00:00
}
2011-02-19 03:36:30 +00:00
2012-01-06 07:20:37 +00:00
}
2014-12-15 18:14:30 +00:00
# elif defined(__linux__)
2012-01-06 07:20:37 +00:00
if ( e - > type = = KEYPRESS )
{
int step = m_shift_key ? - 1 : 1 ;
2011-02-19 03:36:30 +00:00
2012-01-06 07:20:37 +00:00
switch ( e - > key )
{
case XK_F5 :
2015-10-25 20:44:20 +00:00
m_interlace = ( m_interlace + s_interlace_nb + step ) % s_interlace_nb ;
2015-11-03 14:42:41 +00:00
printf ( " GSdx: Set deinterlace mode to %d (%s). \n " , ( int ) m_interlace , theApp . m_gs_interlace . at ( m_interlace ) . name . c_str ( ) ) ;
2012-01-06 07:20:37 +00:00
return ;
case XK_F6 :
2013-01-04 11:41:51 +00:00
if ( m_wnd - > IsManaged ( ) )
2015-10-25 20:44:20 +00:00
m_aspectratio = ( m_aspectratio + s_aspect_ratio_nb + step ) % s_aspect_ratio_nb ;
2012-01-06 07:20:37 +00:00
return ;
case XK_F7 :
2015-10-25 20:44:20 +00:00
m_shader = ( m_shader + s_post_shader_nb + step ) % s_post_shader_nb ;
2015-11-03 14:42:41 +00:00
printf ( " GSdx: Set shader %d. \n " , ( int ) m_shader ) ;
2012-01-06 07:20:37 +00:00
return ;
case XK_Delete :
m_aa1 = ! m_aa1 ;
2015-11-03 14:42:41 +00:00
printf ( " GSdx: (Software) Edge anti-aliasing is now %s. \n " , m_aa1 ? " enabled " : " disabled " ) ;
2012-01-06 07:20:37 +00:00
return ;
case XK_Insert :
m_mipmap = ! m_mipmap ;
2015-11-03 14:42:41 +00:00
printf ( " GSdx: (Software) Mipmapping is now %s. \n " , m_mipmap ? " enabled " : " disabled " ) ;
2012-01-06 07:20:37 +00:00
return ;
case XK_Prior :
m_fxaa = ! m_fxaa ;
2015-11-03 14:42:41 +00:00
printf ( " GSdx: FXAA anti-aliasing is now %s. \n " , m_fxaa ? " enabled " : " disabled " ) ;
2012-01-06 07:20:37 +00:00
return ;
2014-11-09 14:27:24 +00:00
case XK_Home :
m_shaderfx = ! m_shaderfx ;
printf ( " GSdx: External post-processing is now %s. \n " , m_shaderfx ? " enabled " : " disabled " ) ;
return ;
2012-01-06 07:20:37 +00:00
case XK_Shift_L :
case XK_Shift_R :
m_shift_key = true ;
return ;
case XK_Control_L :
case XK_Control_R :
m_control_key = true ;
return ;
}
2011-02-19 03:36:30 +00:00
2009-05-22 01:22:52 +00:00
}
2012-04-28 15:24:02 +00:00
else if ( e - > type = = KEYRELEASE )
2012-01-06 07:20:37 +00:00
{
switch ( e - > key )
{
case XK_Shift_L :
case XK_Shift_R :
m_shift_key = false ;
return ;
case XK_Control_L :
case XK_Control_R :
m_control_key = false ;
return ;
}
2009-05-22 01:22:52 +00:00
}
2012-01-06 07:20:37 +00:00
# endif
2009-05-22 01:22:52 +00:00
}