2009-07-28 21:32:10 +00:00
|
|
|
// Copyright (C) 2003 Dolphin Project.
|
2008-12-08 05:25:12 +00:00
|
|
|
|
|
|
|
// 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, version 2.0.
|
|
|
|
|
|
|
|
// 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 2.0 for more details.
|
|
|
|
|
|
|
|
// A copy of the GPL 2.0 should have been included with the program.
|
|
|
|
// If not, see http://www.gnu.org/licenses/
|
|
|
|
|
|
|
|
// Official SVN repository and contact information can be found at
|
|
|
|
// http://code.google.com/p/dolphin-emu/
|
|
|
|
|
2009-02-28 22:10:38 +00:00
|
|
|
#include <list>
|
2008-12-08 05:25:12 +00:00
|
|
|
#include <d3dx9.h>
|
2009-11-28 05:59:46 +00:00
|
|
|
#include <strsafe.h>
|
2008-12-08 05:25:12 +00:00
|
|
|
|
|
|
|
#include "Common.h"
|
2010-01-27 22:07:59 +00:00
|
|
|
#include "Thread.h"
|
2010-01-21 21:27:52 +00:00
|
|
|
#include "Timer.h"
|
2008-12-08 05:25:12 +00:00
|
|
|
#include "Statistics.h"
|
|
|
|
|
2009-09-13 09:23:30 +00:00
|
|
|
#include "VideoConfig.h"
|
2008-12-08 05:25:12 +00:00
|
|
|
#include "main.h"
|
|
|
|
#include "VertexManager.h"
|
|
|
|
#include "Render.h"
|
|
|
|
#include "OpcodeDecoding.h"
|
2009-06-22 09:31:30 +00:00
|
|
|
#include "BPStructs.h"
|
2008-12-08 05:25:12 +00:00
|
|
|
#include "XFStructs.h"
|
|
|
|
#include "D3DUtil.h"
|
2008-12-25 15:56:36 +00:00
|
|
|
#include "VertexShaderManager.h"
|
|
|
|
#include "PixelShaderManager.h"
|
2009-02-28 22:10:38 +00:00
|
|
|
#include "VertexShaderCache.h"
|
2008-12-26 19:39:12 +00:00
|
|
|
#include "PixelShaderCache.h"
|
2009-09-13 17:46:33 +00:00
|
|
|
#include "VertexLoaderManager.h"
|
2008-12-08 05:25:12 +00:00
|
|
|
#include "TextureCache.h"
|
|
|
|
#include "Utils.h"
|
|
|
|
#include "EmuWindow.h"
|
2009-03-28 21:07:16 +00:00
|
|
|
#include "AVIDump.h"
|
2009-09-03 20:37:35 +00:00
|
|
|
#include "OnScreenDisplay.h"
|
2009-09-13 17:46:33 +00:00
|
|
|
#include "FramebufferManager.h"
|
2009-09-04 06:09:21 +00:00
|
|
|
#include "Fifo.h"
|
Well this commit has 2 parts:
first part if fixing, fixed, i thing, the flickering that everyone has reported, at least in my case i only have flickering in the one texture in one game and now is fixed. The other fix is not for an reported issue, is more a correctness fix, running dolphin with pix to review debug errors, result in a ton of warnings and error, now with this commit, at least for ati, there no more error or warnings, this means, correct management and state change, no accurate emulation, for this still a lot of work to do.
for this part of the commit please give me feedback and let me know of remaining issues
Te second part is the partial implementation of efb to ram copy in d3d, this won't brake anything because is commented but i commit this to ask for help from ector and donko in some errors remaining in the implementation related to differences between opengl an d3d.
if you want to test this you have to uncomment line 150 to 155 of bpstruct.cpp
git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@4594 8ced0084-cf51-0410-be5f-012b33b47a6e
2009-11-20 18:46:30 +00:00
|
|
|
#include "TextureConverter.h"
|
2008-12-08 05:25:12 +00:00
|
|
|
|
2009-09-02 06:33:41 +00:00
|
|
|
#include "debugger/debugger.h"
|
|
|
|
|
2009-09-13 17:46:33 +00:00
|
|
|
static int s_target_width;
|
|
|
|
static int s_target_height;
|
2009-09-13 08:21:35 +00:00
|
|
|
|
ok big changes here:
in videocommon little fix for the alpha test values, return to the original values as they are more accurate.
in D3D:
huge change in state management, now all the state management is centralized and redundant state changes are eliminated.
Fixed the overlapped viewport error in non ati cards:
the error was caused by this: when a viewport is defined larger than the current rendertarget, an error is thrown and the last valid viewport is used, this is the reference behavior, in ati cards if a larger viewport is defined, no eror is returned, the rendering is valid and is rendered using the projection defined by the viewport but limited to the rendertarget are, exactly like opengl or the GC hardware.
to solve this in reference drivers defined a large rendertarget (2x the size of the original) and proceed to render in a centered quad insithe the larger rendertarget, in this way larger viewports always falls inside a valid rendertarget size, the drawback of this is the waste of resources. it can be dynamized, depending or games or changed at runtime when a oversized viewport is detected, but i live that to future commits.
please test this and let me know the results.
git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@4841 8ced0084-cf51-0410-be5f-012b33b47a6e
2010-01-15 15:52:08 +00:00
|
|
|
static int s_Fulltarget_width;
|
|
|
|
static int s_Fulltarget_height;
|
|
|
|
|
2009-09-13 08:21:35 +00:00
|
|
|
static int s_backbuffer_width;
|
|
|
|
static int s_backbuffer_height;
|
|
|
|
|
2009-09-03 20:37:35 +00:00
|
|
|
static float xScale;
|
|
|
|
static float yScale;
|
2008-12-08 05:25:12 +00:00
|
|
|
|
2010-01-19 15:00:45 +00:00
|
|
|
static bool AUTO_ADJUST_RENDERTARGET_SIZE = false;
|
ok big changes here:
in videocommon little fix for the alpha test values, return to the original values as they are more accurate.
in D3D:
huge change in state management, now all the state management is centralized and redundant state changes are eliminated.
Fixed the overlapped viewport error in non ati cards:
the error was caused by this: when a viewport is defined larger than the current rendertarget, an error is thrown and the last valid viewport is used, this is the reference behavior, in ati cards if a larger viewport is defined, no eror is returned, the rendering is valid and is rendered using the projection defined by the viewport but limited to the rendertarget are, exactly like opengl or the GC hardware.
to solve this in reference drivers defined a large rendertarget (2x the size of the original) and proceed to render in a centered quad insithe the larger rendertarget, in this way larger viewports always falls inside a valid rendertarget size, the drawback of this is the waste of resources. it can be dynamized, depending or games or changed at runtime when a oversized viewport is detected, but i live that to future commits.
please test this and let me know the results.
git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@4841 8ced0084-cf51-0410-be5f-012b33b47a6e
2010-01-15 15:52:08 +00:00
|
|
|
|
2009-09-13 08:21:35 +00:00
|
|
|
static int s_recordWidth;
|
|
|
|
static int s_recordHeight;
|
2009-03-28 21:07:16 +00:00
|
|
|
|
2009-09-13 08:21:35 +00:00
|
|
|
static bool s_LastFrameDumped;
|
|
|
|
static bool s_AVIDumping;
|
2009-03-28 21:07:16 +00:00
|
|
|
|
2009-10-10 23:36:18 +00:00
|
|
|
static u32 s_blendMode;
|
|
|
|
|
2009-09-13 21:18:04 +00:00
|
|
|
char st[32768];
|
2008-12-08 05:25:12 +00:00
|
|
|
|
2010-01-27 22:07:59 +00:00
|
|
|
static bool s_bScreenshot = false;
|
|
|
|
static Common::CriticalSection s_criticalScreenshot;
|
|
|
|
static char s_sScreenshotName[1024];
|
|
|
|
static LPDIRECT3DTEXTURE9 ScreenShootTexture = NULL;
|
|
|
|
static LPDIRECT3DSURFACE9 ScreenShootSurface = NULL;
|
|
|
|
static LPDIRECT3DSURFACE9 ScreenShootMEMSurface = NULL;
|
|
|
|
|
2009-11-08 20:35:11 +00:00
|
|
|
|
2009-10-10 23:36:18 +00:00
|
|
|
// State translation lookup tables
|
|
|
|
static const D3DBLEND d3dSrcFactors[8] =
|
|
|
|
{
|
|
|
|
D3DBLEND_ZERO,
|
|
|
|
D3DBLEND_ONE,
|
|
|
|
D3DBLEND_DESTCOLOR,
|
|
|
|
D3DBLEND_INVDESTCOLOR,
|
|
|
|
D3DBLEND_SRCALPHA,
|
|
|
|
D3DBLEND_INVSRCALPHA,
|
|
|
|
D3DBLEND_DESTALPHA,
|
|
|
|
D3DBLEND_INVDESTALPHA
|
|
|
|
};
|
|
|
|
|
|
|
|
static const D3DBLEND d3dDestFactors[8] =
|
|
|
|
{
|
|
|
|
D3DBLEND_ZERO,
|
|
|
|
D3DBLEND_ONE,
|
|
|
|
D3DBLEND_SRCCOLOR,
|
|
|
|
D3DBLEND_INVSRCCOLOR,
|
|
|
|
D3DBLEND_SRCALPHA,
|
|
|
|
D3DBLEND_INVSRCALPHA,
|
|
|
|
D3DBLEND_DESTALPHA,
|
|
|
|
D3DBLEND_INVDESTALPHA
|
|
|
|
};
|
|
|
|
|
2009-12-07 18:48:31 +00:00
|
|
|
// 0 0x00
|
|
|
|
// 1 Source & destination
|
|
|
|
// 2 Source & ~destination
|
|
|
|
// 3 Source
|
|
|
|
// 4 ~Source & destination
|
|
|
|
// 5 Destination
|
|
|
|
// 6 Source ^ destination = Source & ~destination | ~Source & destination
|
|
|
|
// 7 Source | destination
|
|
|
|
|
|
|
|
// 8 ~(Source | destination)
|
|
|
|
// 9 ~(Source ^ destination) = ~Source & ~destination | Source & destination
|
|
|
|
// 10 ~Destination
|
|
|
|
// 11 Source | ~destination
|
|
|
|
// 12 ~Source
|
|
|
|
// 13 ~Source | destination
|
|
|
|
// 14 ~(Source & destination)
|
|
|
|
// 15 0xff
|
|
|
|
|
|
|
|
static const D3DBLENDOP d3dLogincOPop[16] =
|
|
|
|
{
|
2009-12-10 17:34:19 +00:00
|
|
|
D3DBLENDOP_ADD,//0
|
|
|
|
D3DBLENDOP_ADD,//1
|
|
|
|
D3DBLENDOP_SUBTRACT,//2
|
|
|
|
D3DBLENDOP_ADD,//3
|
|
|
|
D3DBLENDOP_REVSUBTRACT,//4
|
|
|
|
D3DBLENDOP_ADD,//5
|
|
|
|
D3DBLENDOP_MAX,//6
|
|
|
|
D3DBLENDOP_ADD,//7
|
2009-12-07 18:48:31 +00:00
|
|
|
|
2009-12-10 17:34:19 +00:00
|
|
|
D3DBLENDOP_MAX,//8
|
|
|
|
D3DBLENDOP_MAX,//9
|
|
|
|
D3DBLENDOP_ADD,//10
|
|
|
|
D3DBLENDOP_ADD,//11
|
|
|
|
D3DBLENDOP_ADD,//12
|
|
|
|
D3DBLENDOP_ADD,//13
|
|
|
|
D3DBLENDOP_ADD,//14
|
|
|
|
D3DBLENDOP_ADD//15
|
2009-12-07 18:48:31 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
static const D3DBLEND d3dLogicOpSrcFactors[16] =
|
|
|
|
{
|
2009-12-10 17:34:19 +00:00
|
|
|
D3DBLEND_ZERO,//0
|
|
|
|
D3DBLEND_DESTCOLOR,//1
|
|
|
|
D3DBLEND_ONE,//2
|
|
|
|
D3DBLEND_ONE,//3
|
|
|
|
D3DBLEND_DESTCOLOR,//4
|
|
|
|
D3DBLEND_ZERO,//5
|
|
|
|
D3DBLEND_INVDESTCOLOR,//6
|
|
|
|
D3DBLEND_INVDESTCOLOR,//7
|
|
|
|
|
|
|
|
D3DBLEND_INVSRCCOLOR,//8
|
|
|
|
D3DBLEND_INVSRCCOLOR,//9
|
|
|
|
D3DBLEND_INVDESTCOLOR,//10
|
|
|
|
D3DBLEND_ONE,//11
|
|
|
|
D3DBLEND_INVSRCCOLOR,//12
|
|
|
|
D3DBLEND_INVSRCCOLOR,//13
|
|
|
|
D3DBLEND_INVDESTCOLOR,//14
|
|
|
|
D3DBLEND_ONE//15
|
2009-12-07 18:48:31 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
static const D3DBLEND d3dLogicOpDestFactors[16] =
|
|
|
|
{
|
2009-12-10 17:34:19 +00:00
|
|
|
D3DBLEND_ZERO,//0
|
|
|
|
D3DBLEND_ZERO,//1
|
|
|
|
D3DBLEND_INVSRCCOLOR,//2
|
|
|
|
D3DBLEND_ZERO,//3
|
|
|
|
D3DBLEND_ONE,//4
|
|
|
|
D3DBLEND_ONE,//5
|
|
|
|
D3DBLEND_INVSRCCOLOR,//6
|
|
|
|
D3DBLEND_ONE,//7
|
|
|
|
|
|
|
|
D3DBLEND_INVDESTCOLOR,//8
|
|
|
|
D3DBLEND_SRCCOLOR,//9
|
|
|
|
D3DBLEND_INVDESTCOLOR,//10
|
|
|
|
D3DBLEND_INVDESTCOLOR,//11
|
|
|
|
D3DBLEND_INVSRCCOLOR,//12
|
|
|
|
D3DBLEND_ONE,//13
|
|
|
|
D3DBLEND_INVSRCCOLOR,//14
|
|
|
|
D3DBLEND_ONE//15
|
2009-12-07 18:48:31 +00:00
|
|
|
};
|
2009-11-23 14:08:08 +00:00
|
|
|
|
|
|
|
static const D3DCULL d3dCullModes[4] =
|
|
|
|
{
|
|
|
|
D3DCULL_NONE,
|
|
|
|
D3DCULL_CCW,
|
|
|
|
D3DCULL_CW,
|
|
|
|
D3DCULL_CCW
|
|
|
|
};
|
|
|
|
|
|
|
|
static const D3DCMPFUNC d3dCmpFuncs[8] =
|
|
|
|
{
|
|
|
|
D3DCMP_NEVER,
|
|
|
|
D3DCMP_LESS,
|
|
|
|
D3DCMP_EQUAL,
|
|
|
|
D3DCMP_LESSEQUAL,
|
|
|
|
D3DCMP_GREATER,
|
|
|
|
D3DCMP_NOTEQUAL,
|
|
|
|
D3DCMP_GREATEREQUAL,
|
|
|
|
D3DCMP_ALWAYS
|
|
|
|
};
|
|
|
|
|
2009-11-27 19:42:27 +00:00
|
|
|
static const D3DTEXTUREFILTERTYPE d3dMipFilters[4] =
|
|
|
|
{
|
|
|
|
D3DTEXF_NONE,
|
|
|
|
D3DTEXF_POINT,
|
|
|
|
D3DTEXF_LINEAR,
|
|
|
|
D3DTEXF_LINEAR, //reserved
|
|
|
|
};
|
2009-11-23 14:08:08 +00:00
|
|
|
|
2009-11-27 19:42:27 +00:00
|
|
|
static const D3DTEXTUREADDRESS d3dClamps[4] =
|
|
|
|
{
|
|
|
|
D3DTADDRESS_CLAMP,
|
|
|
|
D3DTADDRESS_WRAP,
|
|
|
|
D3DTADDRESS_MIRROR,
|
|
|
|
D3DTADDRESS_WRAP //reserved
|
|
|
|
};
|
2009-11-23 14:08:08 +00:00
|
|
|
|
2009-09-13 17:46:33 +00:00
|
|
|
void SetupDeviceObjects()
|
|
|
|
{
|
|
|
|
D3D::font.Init();
|
|
|
|
VertexLoaderManager::Init();
|
|
|
|
FBManager::Create();
|
2009-09-15 21:05:31 +00:00
|
|
|
|
2009-09-15 21:49:15 +00:00
|
|
|
VertexShaderManager::Dirty();
|
|
|
|
PixelShaderManager::Dirty();
|
Well this commit has 2 parts:
first part if fixing, fixed, i thing, the flickering that everyone has reported, at least in my case i only have flickering in the one texture in one game and now is fixed. The other fix is not for an reported issue, is more a correctness fix, running dolphin with pix to review debug errors, result in a ton of warnings and error, now with this commit, at least for ati, there no more error or warnings, this means, correct management and state change, no accurate emulation, for this still a lot of work to do.
for this part of the commit please give me feedback and let me know of remaining issues
Te second part is the partial implementation of efb to ram copy in d3d, this won't brake anything because is commented but i commit this to ask for help from ector and donko in some errors remaining in the implementation related to differences between opengl an d3d.
if you want to test this you have to uncomment line 150 to 155 of bpstruct.cpp
git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@4594 8ced0084-cf51-0410-be5f-012b33b47a6e
2009-11-20 18:46:30 +00:00
|
|
|
TextureConverter::Init();
|
2009-09-15 19:53:22 +00:00
|
|
|
// Tex and shader caches will recreate themselves over time.
|
2009-11-08 20:35:11 +00:00
|
|
|
|
2009-09-13 17:46:33 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// Kill off all POOL_DEFAULT device objects.
|
|
|
|
void TeardownDeviceObjects()
|
|
|
|
{
|
2010-01-28 04:30:07 +00:00
|
|
|
if(ScreenShootMEMSurface)
|
|
|
|
ScreenShootMEMSurface->Release();
|
|
|
|
ScreenShootMEMSurface = NULL;
|
|
|
|
if(ScreenShootSurface)
|
|
|
|
ScreenShootSurface->Release();
|
|
|
|
ScreenShootSurface = NULL;
|
|
|
|
if(ScreenShootTexture)
|
|
|
|
ScreenShootTexture->Release();
|
|
|
|
ScreenShootTexture = NULL;
|
2009-09-15 19:53:22 +00:00
|
|
|
D3D::dev->SetRenderTarget(0, D3D::GetBackBufferSurface());
|
|
|
|
D3D::dev->SetDepthStencilSurface(D3D::GetBackBufferDepthSurface());
|
2009-09-13 17:46:33 +00:00
|
|
|
FBManager::Destroy();
|
|
|
|
D3D::font.Shutdown();
|
|
|
|
TextureCache::Invalidate(false);
|
|
|
|
VertexManager::DestroyDeviceObjects();
|
|
|
|
VertexLoaderManager::Shutdown();
|
|
|
|
VertexShaderCache::Clear();
|
|
|
|
PixelShaderCache::Clear();
|
Well this commit has 2 parts:
first part if fixing, fixed, i thing, the flickering that everyone has reported, at least in my case i only have flickering in the one texture in one game and now is fixed. The other fix is not for an reported issue, is more a correctness fix, running dolphin with pix to review debug errors, result in a ton of warnings and error, now with this commit, at least for ati, there no more error or warnings, this means, correct management and state change, no accurate emulation, for this still a lot of work to do.
for this part of the commit please give me feedback and let me know of remaining issues
Te second part is the partial implementation of efb to ram copy in d3d, this won't brake anything because is commented but i commit this to ask for help from ector and donko in some errors remaining in the implementation related to differences between opengl an d3d.
if you want to test this you have to uncomment line 150 to 155 of bpstruct.cpp
git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@4594 8ced0084-cf51-0410-be5f-012b33b47a6e
2009-11-20 18:46:30 +00:00
|
|
|
TextureConverter::Shutdown();
|
2009-09-13 17:46:33 +00:00
|
|
|
}
|
|
|
|
|
2009-09-03 20:37:35 +00:00
|
|
|
bool Renderer::Init()
|
2008-12-08 05:25:12 +00:00
|
|
|
{
|
2009-09-13 08:21:35 +00:00
|
|
|
UpdateActiveConfig();
|
2009-09-15 18:00:16 +00:00
|
|
|
int fullScreenRes, w_temp, h_temp;
|
2009-12-07 18:48:31 +00:00
|
|
|
s_blendMode = 0;
|
2010-01-28 13:25:40 +00:00
|
|
|
int backbuffer_ms_mode = g_ActiveConfig.iMultisampleMode;
|
2009-09-15 08:13:45 +00:00
|
|
|
|
|
|
|
sscanf(g_Config.cFSResolution, "%dx%d", &w_temp, &h_temp);
|
|
|
|
|
2009-11-08 02:28:06 +00:00
|
|
|
for (fullScreenRes = 0; fullScreenRes < (int)D3D::GetAdapter(g_ActiveConfig.iAdapter).resolutions.size(); fullScreenRes++)
|
2009-09-15 08:13:45 +00:00
|
|
|
{
|
2009-09-17 05:07:16 +00:00
|
|
|
if ((D3D::GetAdapter(g_ActiveConfig.iAdapter).resolutions[fullScreenRes].xres == w_temp) &&
|
|
|
|
(D3D::GetAdapter(g_ActiveConfig.iAdapter).resolutions[fullScreenRes].yres == h_temp))
|
2009-09-15 08:13:45 +00:00
|
|
|
break;
|
|
|
|
}
|
2009-09-17 05:57:38 +00:00
|
|
|
if (fullScreenRes == D3D::GetAdapter(g_ActiveConfig.iAdapter).resolutions.size())
|
|
|
|
fullScreenRes = 0;
|
|
|
|
|
2010-01-20 07:47:41 +00:00
|
|
|
D3D::Create(g_ActiveConfig.iAdapter, EmuWindow::GetWnd(), false,
|
2009-09-15 19:53:22 +00:00
|
|
|
fullScreenRes, backbuffer_ms_mode, false);
|
2008-12-08 05:25:12 +00:00
|
|
|
|
2009-09-13 17:46:33 +00:00
|
|
|
s_backbuffer_width = D3D::GetBackBufferWidth();
|
|
|
|
s_backbuffer_height = D3D::GetBackBufferHeight();
|
2009-03-01 01:09:32 +00:00
|
|
|
|
2009-09-13 17:46:33 +00:00
|
|
|
// TODO: Grab target width from configured resolution?
|
2010-01-21 22:32:24 +00:00
|
|
|
s_target_width = s_backbuffer_width;
|
|
|
|
s_target_height = s_backbuffer_height * ((float)EFB_HEIGHT / 480.0f);
|
2009-03-01 12:07:34 +00:00
|
|
|
|
2009-09-13 17:46:33 +00:00
|
|
|
xScale = (float)s_target_width / (float)EFB_WIDTH;
|
|
|
|
yScale = (float)s_target_height / (float)EFB_HEIGHT;
|
2010-01-21 22:32:24 +00:00
|
|
|
s_Fulltarget_width = s_target_width;
|
|
|
|
s_Fulltarget_height = s_target_height;
|
2010-01-19 15:00:45 +00:00
|
|
|
//apply automatic resizing only is not an ati card, ati can handle large viewports :)
|
2010-01-27 22:07:59 +00:00
|
|
|
AUTO_ADJUST_RENDERTARGET_SIZE = true;//!D3D::IsATIDevice();
|
ok big changes here:
in videocommon little fix for the alpha test values, return to the original values as they are more accurate.
in D3D:
huge change in state management, now all the state management is centralized and redundant state changes are eliminated.
Fixed the overlapped viewport error in non ati cards:
the error was caused by this: when a viewport is defined larger than the current rendertarget, an error is thrown and the last valid viewport is used, this is the reference behavior, in ati cards if a larger viewport is defined, no eror is returned, the rendering is valid and is rendered using the projection defined by the viewport but limited to the rendertarget are, exactly like opengl or the GC hardware.
to solve this in reference drivers defined a large rendertarget (2x the size of the original) and proceed to render in a centered quad insithe the larger rendertarget, in this way larger viewports always falls inside a valid rendertarget size, the drawback of this is the waste of resources. it can be dynamized, depending or games or changed at runtime when a oversized viewport is detected, but i live that to future commits.
please test this and let me know the results.
git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@4841 8ced0084-cf51-0410-be5f-012b33b47a6e
2010-01-15 15:52:08 +00:00
|
|
|
|
2009-09-13 08:21:35 +00:00
|
|
|
s_LastFrameDumped = false;
|
|
|
|
s_AVIDumping = false;
|
2009-03-28 21:07:16 +00:00
|
|
|
|
2009-09-03 19:24:16 +00:00
|
|
|
// We're not using fixed function, except for some 2D.
|
|
|
|
// Let's just set the matrices to identity to be sure.
|
2009-02-28 22:10:38 +00:00
|
|
|
D3DXMATRIX mtx;
|
|
|
|
D3DXMatrixIdentity(&mtx);
|
|
|
|
D3D::dev->SetTransform(D3DTS_VIEW, &mtx);
|
|
|
|
D3D::dev->SetTransform(D3DTS_WORLD, &mtx);
|
2009-09-13 17:46:33 +00:00
|
|
|
|
|
|
|
SetupDeviceObjects();
|
2009-09-03 20:37:35 +00:00
|
|
|
|
2009-09-15 21:05:31 +00:00
|
|
|
for (int stage = 0; stage < 8; stage++)
|
|
|
|
D3D::SetSamplerState(stage, D3DSAMP_MAXANISOTROPY, g_ActiveConfig.iMaxAnisotropy);
|
2010-01-17 17:44:09 +00:00
|
|
|
|
2009-11-08 20:35:11 +00:00
|
|
|
D3DVIEWPORT9 vp;
|
|
|
|
vp.X = 0;
|
|
|
|
vp.Y = 0;
|
|
|
|
vp.Width = s_backbuffer_width;
|
|
|
|
vp.Height = s_backbuffer_height;
|
|
|
|
vp.MinZ = 0.0f;
|
Well this commit has 2 parts:
first part if fixing, fixed, i thing, the flickering that everyone has reported, at least in my case i only have flickering in the one texture in one game and now is fixed. The other fix is not for an reported issue, is more a correctness fix, running dolphin with pix to review debug errors, result in a ton of warnings and error, now with this commit, at least for ati, there no more error or warnings, this means, correct management and state change, no accurate emulation, for this still a lot of work to do.
for this part of the commit please give me feedback and let me know of remaining issues
Te second part is the partial implementation of efb to ram copy in d3d, this won't brake anything because is commented but i commit this to ask for help from ector and donko in some errors remaining in the implementation related to differences between opengl an d3d.
if you want to test this you have to uncomment line 150 to 155 of bpstruct.cpp
git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@4594 8ced0084-cf51-0410-be5f-012b33b47a6e
2009-11-20 18:46:30 +00:00
|
|
|
vp.MaxZ = 1.0f;
|
2009-11-08 20:35:11 +00:00
|
|
|
D3D::dev->SetViewport(&vp);
|
2009-09-13 17:46:33 +00:00
|
|
|
D3D::dev->Clear(0, NULL, D3DCLEAR_TARGET, 0x0, 0, 0);
|
2009-11-08 20:35:11 +00:00
|
|
|
|
2009-09-13 17:46:33 +00:00
|
|
|
D3D::dev->SetRenderTarget(0, FBManager::GetEFBColorRTSurface());
|
|
|
|
D3D::dev->SetDepthStencilSurface(FBManager::GetEFBDepthRTSurface());
|
ok big changes here:
in videocommon little fix for the alpha test values, return to the original values as they are more accurate.
in D3D:
huge change in state management, now all the state management is centralized and redundant state changes are eliminated.
Fixed the overlapped viewport error in non ati cards:
the error was caused by this: when a viewport is defined larger than the current rendertarget, an error is thrown and the last valid viewport is used, this is the reference behavior, in ati cards if a larger viewport is defined, no eror is returned, the rendering is valid and is rendered using the projection defined by the viewport but limited to the rendertarget are, exactly like opengl or the GC hardware.
to solve this in reference drivers defined a large rendertarget (2x the size of the original) and proceed to render in a centered quad insithe the larger rendertarget, in this way larger viewports always falls inside a valid rendertarget size, the drawback of this is the waste of resources. it can be dynamized, depending or games or changed at runtime when a oversized viewport is detected, but i live that to future commits.
please test this and let me know the results.
git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@4841 8ced0084-cf51-0410-be5f-012b33b47a6e
2010-01-15 15:52:08 +00:00
|
|
|
vp.X = (s_Fulltarget_width - s_target_width) / 2;
|
|
|
|
vp.Y = (s_Fulltarget_height - s_target_height) / 2;
|
2009-11-08 20:35:11 +00:00
|
|
|
vp.Width = s_target_width;
|
|
|
|
vp.Height = s_target_height;
|
|
|
|
D3D::dev->SetViewport(&vp);
|
2009-10-02 21:23:56 +00:00
|
|
|
D3D::dev->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, 0x0, 1.0f, 0);
|
2009-09-13 17:46:33 +00:00
|
|
|
D3D::BeginFrame();
|
2009-10-30 04:14:43 +00:00
|
|
|
D3D::SetRenderState(D3DRS_SCISSORTESTENABLE, true);
|
2010-01-27 22:07:59 +00:00
|
|
|
D3D::dev->CreateTexture(s_backbuffer_width, s_backbuffer_height, 1, D3DUSAGE_RENDERTARGET, FBManager::GetEFBColorRTSurfaceFormat(),
|
|
|
|
D3DPOOL_DEFAULT, &ScreenShootTexture, NULL);
|
|
|
|
if(ScreenShootTexture)
|
|
|
|
{
|
|
|
|
ScreenShootTexture->GetSurfaceLevel(0,&ScreenShootSurface);
|
|
|
|
}
|
|
|
|
D3D::dev->CreateOffscreenPlainSurface(s_backbuffer_width,s_backbuffer_height, FBManager::GetEFBColorRTSurfaceFormat(), D3DPOOL_SYSTEMMEM, &ScreenShootMEMSurface, NULL );
|
|
|
|
|
2009-09-03 20:37:35 +00:00
|
|
|
return true;
|
2008-12-08 05:25:12 +00:00
|
|
|
}
|
|
|
|
|
2009-02-28 22:10:38 +00:00
|
|
|
void Renderer::Shutdown()
|
2008-12-08 05:25:12 +00:00
|
|
|
{
|
2010-01-27 22:07:59 +00:00
|
|
|
|
|
|
|
|
2009-09-13 17:46:33 +00:00
|
|
|
TeardownDeviceObjects();
|
2008-12-08 05:25:12 +00:00
|
|
|
D3D::EndFrame();
|
2009-09-20 03:29:43 +00:00
|
|
|
D3D::Present();
|
2008-12-08 05:25:12 +00:00
|
|
|
D3D::Close();
|
2009-03-28 21:07:16 +00:00
|
|
|
|
2009-09-13 08:21:35 +00:00
|
|
|
if (s_AVIDumping)
|
2009-09-03 20:37:35 +00:00
|
|
|
{
|
2009-03-28 21:07:16 +00:00
|
|
|
AVIDump::Stop();
|
|
|
|
}
|
2008-12-08 05:25:12 +00:00
|
|
|
}
|
|
|
|
|
2009-09-13 17:46:33 +00:00
|
|
|
int Renderer::GetTargetWidth() { return s_target_width; }
|
|
|
|
int Renderer::GetTargetHeight() { return s_target_height; }
|
ok big changes here:
in videocommon little fix for the alpha test values, return to the original values as they are more accurate.
in D3D:
huge change in state management, now all the state management is centralized and redundant state changes are eliminated.
Fixed the overlapped viewport error in non ati cards:
the error was caused by this: when a viewport is defined larger than the current rendertarget, an error is thrown and the last valid viewport is used, this is the reference behavior, in ati cards if a larger viewport is defined, no eror is returned, the rendering is valid and is rendered using the projection defined by the viewport but limited to the rendertarget are, exactly like opengl or the GC hardware.
to solve this in reference drivers defined a large rendertarget (2x the size of the original) and proceed to render in a centered quad insithe the larger rendertarget, in this way larger viewports always falls inside a valid rendertarget size, the drawback of this is the waste of resources. it can be dynamized, depending or games or changed at runtime when a oversized viewport is detected, but i live that to future commits.
please test this and let me know the results.
git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@4841 8ced0084-cf51-0410-be5f-012b33b47a6e
2010-01-15 15:52:08 +00:00
|
|
|
int Renderer::GetFullTargetWidth() { return s_Fulltarget_width; }
|
|
|
|
int Renderer::GetFullTargetHeight() { return s_Fulltarget_height; }
|
2009-09-13 17:46:33 +00:00
|
|
|
float Renderer::GetTargetScaleX() { return xScale; }
|
|
|
|
float Renderer::GetTargetScaleY() { return yScale; }
|
2008-12-08 05:25:12 +00:00
|
|
|
|
2009-09-03 19:42:45 +00:00
|
|
|
void Renderer::RenderText(const char *text, int left, int top, u32 color)
|
2008-12-08 05:25:12 +00:00
|
|
|
{
|
2009-09-03 19:42:45 +00:00
|
|
|
D3D::font.DrawTextScaled((float)left, (float)top, 20, 20, 0.0f, color, text, false);
|
2008-12-08 05:25:12 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void dumpMatrix(D3DXMATRIX &mtx)
|
|
|
|
{
|
2009-03-01 12:07:34 +00:00
|
|
|
for (int y = 0; y < 4; y++)
|
2008-12-08 05:25:12 +00:00
|
|
|
{
|
|
|
|
char temp[256];
|
2010-01-17 17:44:09 +00:00
|
|
|
sprintf(temp,"%4.4f %4.4f %4.4f %4.4f", mtx.m[y][0], mtx.m[y][1], mtx.m[y][2], mtx.m[y][3]);
|
2008-12-08 05:25:12 +00:00
|
|
|
g_VideoInitialize.pLog(temp, FALSE);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2009-09-03 21:56:08 +00:00
|
|
|
TargetRectangle Renderer::ConvertEFBRectangle(const EFBRectangle& rc)
|
|
|
|
{
|
ok big changes here:
in videocommon little fix for the alpha test values, return to the original values as they are more accurate.
in D3D:
huge change in state management, now all the state management is centralized and redundant state changes are eliminated.
Fixed the overlapped viewport error in non ati cards:
the error was caused by this: when a viewport is defined larger than the current rendertarget, an error is thrown and the last valid viewport is used, this is the reference behavior, in ati cards if a larger viewport is defined, no eror is returned, the rendering is valid and is rendered using the projection defined by the viewport but limited to the rendertarget are, exactly like opengl or the GC hardware.
to solve this in reference drivers defined a large rendertarget (2x the size of the original) and proceed to render in a centered quad insithe the larger rendertarget, in this way larger viewports always falls inside a valid rendertarget size, the drawback of this is the waste of resources. it can be dynamized, depending or games or changed at runtime when a oversized viewport is detected, but i live that to future commits.
please test this and let me know the results.
git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@4841 8ced0084-cf51-0410-be5f-012b33b47a6e
2010-01-15 15:52:08 +00:00
|
|
|
int Xstride = (s_Fulltarget_width - s_target_width) / 2;
|
|
|
|
int Ystride = (s_Fulltarget_height - s_target_height) / 2;
|
2009-09-03 21:56:08 +00:00
|
|
|
TargetRectangle result;
|
2010-01-17 17:44:09 +00:00
|
|
|
result.left = (int)(rc.left * xScale) + Xstride;
|
2010-01-15 22:07:53 +00:00
|
|
|
result.top = (int)(rc.top * yScale) + Ystride;
|
2010-01-17 17:44:09 +00:00
|
|
|
result.right = (int)(rc.right * xScale) + Xstride;
|
ok big changes here:
in videocommon little fix for the alpha test values, return to the original values as they are more accurate.
in D3D:
huge change in state management, now all the state management is centralized and redundant state changes are eliminated.
Fixed the overlapped viewport error in non ati cards:
the error was caused by this: when a viewport is defined larger than the current rendertarget, an error is thrown and the last valid viewport is used, this is the reference behavior, in ati cards if a larger viewport is defined, no eror is returned, the rendering is valid and is rendered using the projection defined by the viewport but limited to the rendertarget are, exactly like opengl or the GC hardware.
to solve this in reference drivers defined a large rendertarget (2x the size of the original) and proceed to render in a centered quad insithe the larger rendertarget, in this way larger viewports always falls inside a valid rendertarget size, the drawback of this is the waste of resources. it can be dynamized, depending or games or changed at runtime when a oversized viewport is detected, but i live that to future commits.
please test this and let me know the results.
git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@4841 8ced0084-cf51-0410-be5f-012b33b47a6e
2010-01-15 15:52:08 +00:00
|
|
|
result.bottom = (int)(rc.bottom * yScale) + Ystride;
|
2009-09-03 21:56:08 +00:00
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
2009-09-03 19:24:16 +00:00
|
|
|
void formatBufferDump(const char *in, char *out, int w, int h, int p)
|
2009-03-28 21:07:16 +00:00
|
|
|
{
|
2009-09-03 21:56:08 +00:00
|
|
|
for (int y = 0; y < h; y++)
|
|
|
|
{
|
2009-09-03 19:24:16 +00:00
|
|
|
const char *line = in + (h - y - 1) * p;
|
2009-09-03 21:56:08 +00:00
|
|
|
for (int x = 0; x < w; x++)
|
|
|
|
{
|
2009-03-28 21:07:16 +00:00
|
|
|
memcpy(out, line, 3);
|
|
|
|
out += 3;
|
|
|
|
line += 4;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2009-09-15 19:53:22 +00:00
|
|
|
// With D3D, we have to resize the backbuffer if the window changed
|
|
|
|
// size.
|
|
|
|
void CheckForResize()
|
|
|
|
{
|
|
|
|
while (EmuWindow::IsSizing())
|
|
|
|
{
|
|
|
|
Sleep(10);
|
|
|
|
}
|
|
|
|
|
2010-01-28 04:30:07 +00:00
|
|
|
|
|
|
|
if (EmuWindow::GetParentWnd())
|
|
|
|
{
|
|
|
|
// Re-stretch window to parent window size again, if it has a parent window.
|
|
|
|
RECT rcParentWindow;
|
|
|
|
GetWindowRect(EmuWindow::GetParentWnd(), &rcParentWindow);
|
|
|
|
int width = rcParentWindow.right - rcParentWindow.left;
|
|
|
|
int height = rcParentWindow.bottom - rcParentWindow.top;
|
|
|
|
if (width != s_backbuffer_width || height != s_backbuffer_height)
|
|
|
|
::MoveWindow(EmuWindow::GetWnd(), 0, 0, width, height, FALSE);
|
|
|
|
}
|
2009-09-15 19:53:22 +00:00
|
|
|
RECT rcWindow;
|
|
|
|
GetClientRect(EmuWindow::GetWnd(), &rcWindow);
|
|
|
|
int client_width = rcWindow.right - rcWindow.left;
|
|
|
|
int client_height = rcWindow.bottom - rcWindow.top;
|
|
|
|
// Sanity check.
|
|
|
|
if ((client_width != s_backbuffer_width ||
|
|
|
|
client_height != s_backbuffer_height) &&
|
|
|
|
client_width >= 4 && client_height >= 4)
|
|
|
|
{
|
|
|
|
TeardownDeviceObjects();
|
|
|
|
|
|
|
|
D3D::Reset();
|
|
|
|
|
|
|
|
SetupDeviceObjects();
|
|
|
|
s_backbuffer_width = D3D::GetBackBufferWidth();
|
|
|
|
s_backbuffer_height = D3D::GetBackBufferHeight();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2009-09-20 05:04:45 +00:00
|
|
|
static void EFBTextureToD3DBackBuffer(const EFBRectangle& sourceRc)
|
2008-12-08 05:25:12 +00:00
|
|
|
{
|
2009-09-20 05:04:45 +00:00
|
|
|
TargetRectangle src_rect, dst_rect;
|
|
|
|
src_rect = Renderer::ConvertEFBRectangle(sourceRc);
|
|
|
|
ComputeDrawRectangle(s_backbuffer_width, s_backbuffer_height, false, &dst_rect);
|
2009-11-08 20:35:11 +00:00
|
|
|
D3DVIEWPORT9 vp;
|
|
|
|
vp.X = 0;
|
|
|
|
vp.Y = 0;
|
|
|
|
vp.Width = s_backbuffer_width;
|
|
|
|
vp.Height = s_backbuffer_height;
|
|
|
|
vp.MinZ = 0.0f;
|
Well this commit has 2 parts:
first part if fixing, fixed, i thing, the flickering that everyone has reported, at least in my case i only have flickering in the one texture in one game and now is fixed. The other fix is not for an reported issue, is more a correctness fix, running dolphin with pix to review debug errors, result in a ton of warnings and error, now with this commit, at least for ati, there no more error or warnings, this means, correct management and state change, no accurate emulation, for this still a lot of work to do.
for this part of the commit please give me feedback and let me know of remaining issues
Te second part is the partial implementation of efb to ram copy in d3d, this won't brake anything because is commented but i commit this to ask for help from ector and donko in some errors remaining in the implementation related to differences between opengl an d3d.
if you want to test this you have to uncomment line 150 to 155 of bpstruct.cpp
git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@4594 8ced0084-cf51-0410-be5f-012b33b47a6e
2009-11-20 18:46:30 +00:00
|
|
|
vp.MaxZ = 1.0f;
|
2009-11-08 20:35:11 +00:00
|
|
|
D3D::dev->SetViewport(&vp);
|
2009-09-20 05:04:45 +00:00
|
|
|
|
2009-10-28 02:00:13 +00:00
|
|
|
D3D::dev->Clear(0,NULL, D3DCLEAR_TARGET,D3DCOLOR_XRGB(0,0,0),1.0f,0);
|
Well this commit has 2 parts:
first part if fixing, fixed, i thing, the flickering that everyone has reported, at least in my case i only have flickering in the one texture in one game and now is fixed. The other fix is not for an reported issue, is more a correctness fix, running dolphin with pix to review debug errors, result in a ton of warnings and error, now with this commit, at least for ati, there no more error or warnings, this means, correct management and state change, no accurate emulation, for this still a lot of work to do.
for this part of the commit please give me feedback and let me know of remaining issues
Te second part is the partial implementation of efb to ram copy in d3d, this won't brake anything because is commented but i commit this to ask for help from ector and donko in some errors remaining in the implementation related to differences between opengl an d3d.
if you want to test this you have to uncomment line 150 to 155 of bpstruct.cpp
git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@4594 8ced0084-cf51-0410-be5f-012b33b47a6e
2009-11-20 18:46:30 +00:00
|
|
|
int X = dst_rect.left;
|
|
|
|
int Y = dst_rect.top;
|
|
|
|
int Width = dst_rect.right - dst_rect.left;
|
|
|
|
int Height = dst_rect.bottom - dst_rect.top;
|
|
|
|
|
2010-01-17 17:44:09 +00:00
|
|
|
if (X < 0) X = 0;
|
|
|
|
if (Y < 0) Y = 0;
|
|
|
|
if (X > s_backbuffer_width) X = s_backbuffer_width;
|
|
|
|
if (Y > s_backbuffer_height) Y = s_backbuffer_height;
|
|
|
|
if (Width < 0) Width = 0;
|
|
|
|
if (Height < 0) Height = 0;
|
|
|
|
if (Width > (s_backbuffer_width - X)) Width = s_backbuffer_width - X;
|
|
|
|
if (Height > (s_backbuffer_height - Y)) Height = s_backbuffer_height - Y;
|
Well this commit has 2 parts:
first part if fixing, fixed, i thing, the flickering that everyone has reported, at least in my case i only have flickering in the one texture in one game and now is fixed. The other fix is not for an reported issue, is more a correctness fix, running dolphin with pix to review debug errors, result in a ton of warnings and error, now with this commit, at least for ati, there no more error or warnings, this means, correct management and state change, no accurate emulation, for this still a lot of work to do.
for this part of the commit please give me feedback and let me know of remaining issues
Te second part is the partial implementation of efb to ram copy in d3d, this won't brake anything because is commented but i commit this to ask for help from ector and donko in some errors remaining in the implementation related to differences between opengl an d3d.
if you want to test this you have to uncomment line 150 to 155 of bpstruct.cpp
git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@4594 8ced0084-cf51-0410-be5f-012b33b47a6e
2009-11-20 18:46:30 +00:00
|
|
|
vp.X = X;
|
|
|
|
vp.Y = Y;
|
|
|
|
vp.Width = Width;
|
|
|
|
vp.Height = Height;
|
2009-11-08 20:35:11 +00:00
|
|
|
vp.MinZ = 0.0f;
|
Well this commit has 2 parts:
first part if fixing, fixed, i thing, the flickering that everyone has reported, at least in my case i only have flickering in the one texture in one game and now is fixed. The other fix is not for an reported issue, is more a correctness fix, running dolphin with pix to review debug errors, result in a ton of warnings and error, now with this commit, at least for ati, there no more error or warnings, this means, correct management and state change, no accurate emulation, for this still a lot of work to do.
for this part of the commit please give me feedback and let me know of remaining issues
Te second part is the partial implementation of efb to ram copy in d3d, this won't brake anything because is commented but i commit this to ask for help from ector and donko in some errors remaining in the implementation related to differences between opengl an d3d.
if you want to test this you have to uncomment line 150 to 155 of bpstruct.cpp
git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@4594 8ced0084-cf51-0410-be5f-012b33b47a6e
2009-11-20 18:46:30 +00:00
|
|
|
vp.MaxZ = 1.0f;
|
|
|
|
|
2009-11-08 20:35:11 +00:00
|
|
|
D3D::dev->SetViewport(&vp);
|
2009-09-20 05:04:45 +00:00
|
|
|
|
Well this commit has 2 parts:
first part if fixing, fixed, i thing, the flickering that everyone has reported, at least in my case i only have flickering in the one texture in one game and now is fixed. The other fix is not for an reported issue, is more a correctness fix, running dolphin with pix to review debug errors, result in a ton of warnings and error, now with this commit, at least for ati, there no more error or warnings, this means, correct management and state change, no accurate emulation, for this still a lot of work to do.
for this part of the commit please give me feedback and let me know of remaining issues
Te second part is the partial implementation of efb to ram copy in d3d, this won't brake anything because is commented but i commit this to ask for help from ector and donko in some errors remaining in the implementation related to differences between opengl an d3d.
if you want to test this you have to uncomment line 150 to 155 of bpstruct.cpp
git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@4594 8ced0084-cf51-0410-be5f-012b33b47a6e
2009-11-20 18:46:30 +00:00
|
|
|
EFBRectangle efbRect;
|
2009-11-08 20:35:11 +00:00
|
|
|
|
|
|
|
LPDIRECT3DTEXTURE9 read_texture = FBManager::GetEFBColorTexture(efbRect);
|
|
|
|
RECT destinationrect;
|
|
|
|
destinationrect.bottom = dst_rect.bottom;
|
|
|
|
destinationrect.left = dst_rect.left;
|
|
|
|
destinationrect.right = dst_rect.right;
|
|
|
|
destinationrect.top = dst_rect.top;
|
|
|
|
RECT sourcerect;
|
|
|
|
sourcerect.bottom = src_rect.bottom;
|
|
|
|
sourcerect.left = src_rect.left;
|
|
|
|
sourcerect.right = src_rect.right;
|
|
|
|
sourcerect.top = src_rect.top;
|
|
|
|
|
2010-01-21 20:26:07 +00:00
|
|
|
D3D::ChangeSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);
|
|
|
|
D3D::ChangeSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
|
2010-01-27 22:07:59 +00:00
|
|
|
|
ok big changes here:
in videocommon little fix for the alpha test values, return to the original values as they are more accurate.
in D3D:
huge change in state management, now all the state management is centralized and redundant state changes are eliminated.
Fixed the overlapped viewport error in non ati cards:
the error was caused by this: when a viewport is defined larger than the current rendertarget, an error is thrown and the last valid viewport is used, this is the reference behavior, in ati cards if a larger viewport is defined, no eror is returned, the rendering is valid and is rendered using the projection defined by the viewport but limited to the rendertarget are, exactly like opengl or the GC hardware.
to solve this in reference drivers defined a large rendertarget (2x the size of the original) and proceed to render in a centered quad insithe the larger rendertarget, in this way larger viewports always falls inside a valid rendertarget size, the drawback of this is the waste of resources. it can be dynamized, depending or games or changed at runtime when a oversized viewport is detected, but i live that to future commits.
please test this and let me know the results.
git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@4841 8ced0084-cf51-0410-be5f-012b33b47a6e
2010-01-15 15:52:08 +00:00
|
|
|
D3D::drawShadedTexQuad(read_texture,&sourcerect,Renderer::GetFullTargetWidth(),Renderer::GetFullTargetHeight(),&destinationrect,PixelShaderCache::GetColorCopyProgram(),VertexShaderCache::GetSimpleVertexShader());
|
2010-01-21 20:26:07 +00:00
|
|
|
D3D::RefreshSamplerState(0, D3DSAMP_MINFILTER);
|
|
|
|
D3D::RefreshSamplerState(0, D3DSAMP_MAGFILTER);
|
2009-11-08 20:35:11 +00:00
|
|
|
|
2010-01-26 15:19:57 +00:00
|
|
|
vp.X = 0;
|
|
|
|
vp.Y = 0;
|
|
|
|
vp.Width = s_backbuffer_width;
|
|
|
|
vp.Height = s_backbuffer_height;
|
|
|
|
vp.MinZ = 0.0f;
|
|
|
|
vp.MaxZ = 1.0f;
|
|
|
|
D3D::dev->SetViewport(&vp);
|
2010-01-27 22:07:59 +00:00
|
|
|
if(s_bScreenshot || g_ActiveConfig.bDumpFrames)
|
|
|
|
{
|
|
|
|
HRESULT hr = D3D::dev->StretchRect(FBManager::GetEFBColorRTSurface(),&sourcerect,ScreenShootSurface,&destinationrect,D3DTEXF_LINEAR);
|
|
|
|
hr = D3D::dev->GetRenderTargetData(ScreenShootSurface,ScreenShootMEMSurface);
|
|
|
|
if(s_bScreenshot)
|
|
|
|
{
|
|
|
|
s_criticalScreenshot.Enter();
|
|
|
|
hr = D3DXSaveSurfaceToFileA(s_sScreenshotName, D3DXIFF_JPG, ScreenShootMEMSurface, NULL, &destinationrect);
|
|
|
|
s_bScreenshot = false;
|
|
|
|
s_criticalScreenshot.Leave();
|
|
|
|
}
|
|
|
|
if (g_ActiveConfig.bDumpFrames)
|
|
|
|
{
|
|
|
|
if (!s_LastFrameDumped)
|
|
|
|
{
|
|
|
|
s_recordWidth = destinationrect.right - destinationrect.left;
|
|
|
|
s_recordHeight = destinationrect.bottom - destinationrect.top;
|
|
|
|
s_AVIDumping = AVIDump::Start(EmuWindow::GetParentWnd(), s_recordWidth, s_recordHeight);
|
|
|
|
if (!s_AVIDumping)
|
|
|
|
{
|
|
|
|
PanicAlert("Error dumping frames to AVI.");
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
char msg [255];
|
|
|
|
sprintf(msg, "Dumping Frames to \"%s/framedump0.avi\" (%dx%d RGB24)", FULL_FRAMES_DIR, s_recordWidth, s_recordHeight);
|
|
|
|
OSD::AddMessage(msg, 2000);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (s_AVIDumping)
|
|
|
|
{
|
|
|
|
D3DLOCKED_RECT rect;
|
|
|
|
if (SUCCEEDED(ScreenShootMEMSurface->LockRect(&rect, &destinationrect, D3DLOCK_NO_DIRTY_UPDATE | D3DLOCK_NOSYSLOCK | D3DLOCK_READONLY)))
|
|
|
|
{
|
|
|
|
char *data = (char *)malloc(3 * s_recordWidth * s_recordHeight);
|
|
|
|
formatBufferDump((const char *)rect.pBits, data, s_recordWidth, s_recordHeight, rect.Pitch);
|
|
|
|
AVIDump::AddFrame(data);
|
|
|
|
free(data);
|
|
|
|
ScreenShootMEMSurface->UnlockRect();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
s_LastFrameDumped = true;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if (s_LastFrameDumped && s_AVIDumping)
|
|
|
|
{
|
|
|
|
AVIDump::Stop();
|
|
|
|
s_AVIDumping = false;
|
|
|
|
}
|
|
|
|
s_LastFrameDumped = false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2009-09-20 05:04:45 +00:00
|
|
|
// Finish up the current frame, print some stats
|
2009-11-28 05:59:46 +00:00
|
|
|
if (g_ActiveConfig.bShowFPS)
|
|
|
|
{
|
|
|
|
char fps[20];
|
|
|
|
StringCchPrintfA(fps, 20, "FPS: %d\n", s_fps);
|
|
|
|
D3D::font.DrawTextScaled(0,30,20,20,0.0f,0xFF00FFFF,fps,false);
|
|
|
|
}
|
2009-09-20 05:04:45 +00:00
|
|
|
if (g_ActiveConfig.bOverlayStats)
|
2009-09-13 19:13:07 +00:00
|
|
|
{
|
2009-09-20 05:04:45 +00:00
|
|
|
Statistics::ToString(st);
|
|
|
|
D3D::font.DrawTextScaled(0,30,20,20,0.0f,0xFF00FFFF,st,false);
|
|
|
|
}
|
|
|
|
else if (g_ActiveConfig.bOverlayProjStats)
|
|
|
|
{
|
|
|
|
Statistics::ToStringProj(st);
|
|
|
|
D3D::font.DrawTextScaled(0,30,20,20,0.0f,0xFF00FFFF,st,false);
|
2009-09-13 19:13:07 +00:00
|
|
|
}
|
2009-09-04 06:09:21 +00:00
|
|
|
|
2009-09-20 05:04:45 +00:00
|
|
|
OSD::DrawMessages();
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2009-09-13 17:46:33 +00:00
|
|
|
|
2009-09-20 05:04:45 +00:00
|
|
|
void Renderer::RenderToXFB(u32 xfbAddr, u32 fbWidth, u32 fbHeight, const EFBRectangle& sourceRc)
|
|
|
|
{
|
|
|
|
if (g_bSkipCurrentFrame)
|
|
|
|
{
|
|
|
|
g_VideoInitialize.pCopiedToXFB(false);
|
|
|
|
DEBUGGER_PAUSE_LOG_AT(NEXT_XFB_CMD,false,{printf("RenderToXFB - disabled");});
|
|
|
|
return;
|
|
|
|
}
|
2010-01-07 20:01:41 +00:00
|
|
|
|
2009-11-08 20:35:11 +00:00
|
|
|
Renderer::ResetAPIState();
|
Well this commit has 2 parts:
first part if fixing, fixed, i thing, the flickering that everyone has reported, at least in my case i only have flickering in the one texture in one game and now is fixed. The other fix is not for an reported issue, is more a correctness fix, running dolphin with pix to review debug errors, result in a ton of warnings and error, now with this commit, at least for ati, there no more error or warnings, this means, correct management and state change, no accurate emulation, for this still a lot of work to do.
for this part of the commit please give me feedback and let me know of remaining issues
Te second part is the partial implementation of efb to ram copy in d3d, this won't brake anything because is commented but i commit this to ask for help from ector and donko in some errors remaining in the implementation related to differences between opengl an d3d.
if you want to test this you have to uncomment line 150 to 155 of bpstruct.cpp
git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@4594 8ced0084-cf51-0410-be5f-012b33b47a6e
2009-11-20 18:46:30 +00:00
|
|
|
// Set the backbuffer as the rendering target
|
|
|
|
D3D::dev->SetDepthStencilSurface(NULL);
|
|
|
|
D3D::dev->SetRenderTarget(0, D3D::GetBackBufferSurface());
|
2010-01-27 22:07:59 +00:00
|
|
|
|
2009-09-20 05:04:45 +00:00
|
|
|
EFBTextureToD3DBackBuffer(sourceRc);
|
2010-01-28 04:30:07 +00:00
|
|
|
|
2009-11-08 20:35:11 +00:00
|
|
|
D3D::EndFrame();
|
2009-09-20 05:04:45 +00:00
|
|
|
|
2009-09-20 03:29:43 +00:00
|
|
|
DEBUGGER_LOG_AT((NEXT_XFB_CMD|NEXT_EFB_CMD|NEXT_FRAME),
|
|
|
|
{printf("StretchRect, EFB->XFB\n");});
|
|
|
|
DEBUGGER_PAUSE_LOG_AT(
|
|
|
|
(NEXT_XFB_CMD),false,
|
|
|
|
{printf("RenderToXFB: addr = %08X, %d x %d, sourceRc = (%d,%d,%d,%d)\n",
|
|
|
|
xfbAddr, fbWidth, fbHeight,
|
|
|
|
sourceRc.left, sourceRc.top, sourceRc.right, sourceRc.bottom);}
|
|
|
|
);
|
2010-01-07 20:01:41 +00:00
|
|
|
|
2009-09-20 13:00:25 +00:00
|
|
|
Swap(0,FIELD_PROGRESSIVE,0,0); // we used to swap the buffer here, now we will wait
|
2009-11-08 20:35:11 +00:00
|
|
|
// until the XFB pointer is updated by VI
|
|
|
|
D3D::BeginFrame();
|
|
|
|
Renderer::RestoreAPIState();
|
Well this commit has 2 parts:
first part if fixing, fixed, i thing, the flickering that everyone has reported, at least in my case i only have flickering in the one texture in one game and now is fixed. The other fix is not for an reported issue, is more a correctness fix, running dolphin with pix to review debug errors, result in a ton of warnings and error, now with this commit, at least for ati, there no more error or warnings, this means, correct management and state change, no accurate emulation, for this still a lot of work to do.
for this part of the commit please give me feedback and let me know of remaining issues
Te second part is the partial implementation of efb to ram copy in d3d, this won't brake anything because is commented but i commit this to ask for help from ector and donko in some errors remaining in the implementation related to differences between opengl an d3d.
if you want to test this you have to uncomment line 150 to 155 of bpstruct.cpp
git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@4594 8ced0084-cf51-0410-be5f-012b33b47a6e
2009-11-20 18:46:30 +00:00
|
|
|
D3D::dev->SetRenderTarget(0, FBManager::GetEFBColorRTSurface());
|
|
|
|
D3D::dev->SetDepthStencilSurface(FBManager::GetEFBDepthRTSurface());
|
|
|
|
UpdateViewport();
|
|
|
|
VertexShaderManager::SetViewportChanged();
|
2008-12-08 05:25:12 +00:00
|
|
|
}
|
|
|
|
|
2009-09-03 19:42:45 +00:00
|
|
|
bool Renderer::SetScissorRect()
|
2008-12-08 05:25:12 +00:00
|
|
|
{
|
2009-06-22 09:31:30 +00:00
|
|
|
int xoff = bpmem.scissorOffset.x * 2 - 342;
|
|
|
|
int yoff = bpmem.scissorOffset.y * 2 - 342;
|
2009-03-08 18:45:39 +00:00
|
|
|
RECT rc;
|
2009-06-22 09:31:30 +00:00
|
|
|
rc.left = (int)((float)bpmem.scissorTL.x - xoff - 342);
|
|
|
|
rc.top = (int)((float)bpmem.scissorTL.y - yoff - 342);
|
|
|
|
rc.right = (int)((float)bpmem.scissorBR.x - xoff - 341);
|
|
|
|
rc.bottom = (int)((float)bpmem.scissorBR.y - yoff - 341);
|
2009-03-08 18:45:39 +00:00
|
|
|
|
ok big changes here:
in videocommon little fix for the alpha test values, return to the original values as they are more accurate.
in D3D:
huge change in state management, now all the state management is centralized and redundant state changes are eliminated.
Fixed the overlapped viewport error in non ati cards:
the error was caused by this: when a viewport is defined larger than the current rendertarget, an error is thrown and the last valid viewport is used, this is the reference behavior, in ati cards if a larger viewport is defined, no eror is returned, the rendering is valid and is rendered using the projection defined by the viewport but limited to the rendertarget are, exactly like opengl or the GC hardware.
to solve this in reference drivers defined a large rendertarget (2x the size of the original) and proceed to render in a centered quad insithe the larger rendertarget, in this way larger viewports always falls inside a valid rendertarget size, the drawback of this is the waste of resources. it can be dynamized, depending or games or changed at runtime when a oversized viewport is detected, but i live that to future commits.
please test this and let me know the results.
git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@4841 8ced0084-cf51-0410-be5f-012b33b47a6e
2010-01-15 15:52:08 +00:00
|
|
|
int Xstride = (s_Fulltarget_width - s_target_width) / 2;
|
|
|
|
int Ystride = (s_Fulltarget_height - s_target_height) / 2;
|
|
|
|
|
2010-01-15 22:07:53 +00:00
|
|
|
rc.left = (int)(rc.left * xScale) + Xstride;
|
ok big changes here:
in videocommon little fix for the alpha test values, return to the original values as they are more accurate.
in D3D:
huge change in state management, now all the state management is centralized and redundant state changes are eliminated.
Fixed the overlapped viewport error in non ati cards:
the error was caused by this: when a viewport is defined larger than the current rendertarget, an error is thrown and the last valid viewport is used, this is the reference behavior, in ati cards if a larger viewport is defined, no eror is returned, the rendering is valid and is rendered using the projection defined by the viewport but limited to the rendertarget are, exactly like opengl or the GC hardware.
to solve this in reference drivers defined a large rendertarget (2x the size of the original) and proceed to render in a centered quad insithe the larger rendertarget, in this way larger viewports always falls inside a valid rendertarget size, the drawback of this is the waste of resources. it can be dynamized, depending or games or changed at runtime when a oversized viewport is detected, but i live that to future commits.
please test this and let me know the results.
git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@4841 8ced0084-cf51-0410-be5f-012b33b47a6e
2010-01-15 15:52:08 +00:00
|
|
|
rc.top = (int)(rc.top * yScale) + Ystride;
|
2010-01-15 22:07:53 +00:00
|
|
|
rc.right = (int)(rc.right * xScale) + Xstride;
|
ok big changes here:
in videocommon little fix for the alpha test values, return to the original values as they are more accurate.
in D3D:
huge change in state management, now all the state management is centralized and redundant state changes are eliminated.
Fixed the overlapped viewport error in non ati cards:
the error was caused by this: when a viewport is defined larger than the current rendertarget, an error is thrown and the last valid viewport is used, this is the reference behavior, in ati cards if a larger viewport is defined, no eror is returned, the rendering is valid and is rendered using the projection defined by the viewport but limited to the rendertarget are, exactly like opengl or the GC hardware.
to solve this in reference drivers defined a large rendertarget (2x the size of the original) and proceed to render in a centered quad insithe the larger rendertarget, in this way larger viewports always falls inside a valid rendertarget size, the drawback of this is the waste of resources. it can be dynamized, depending or games or changed at runtime when a oversized viewport is detected, but i live that to future commits.
please test this and let me know the results.
git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@4841 8ced0084-cf51-0410-be5f-012b33b47a6e
2010-01-15 15:52:08 +00:00
|
|
|
rc.bottom = (int)(rc.bottom * yScale) + Ystride;
|
2009-09-13 17:46:33 +00:00
|
|
|
|
|
|
|
if (rc.left < 0) rc.left = 0;
|
2009-11-08 20:35:11 +00:00
|
|
|
if (rc.right < 0) rc.right = 0;
|
ok big changes here:
in videocommon little fix for the alpha test values, return to the original values as they are more accurate.
in D3D:
huge change in state management, now all the state management is centralized and redundant state changes are eliminated.
Fixed the overlapped viewport error in non ati cards:
the error was caused by this: when a viewport is defined larger than the current rendertarget, an error is thrown and the last valid viewport is used, this is the reference behavior, in ati cards if a larger viewport is defined, no eror is returned, the rendering is valid and is rendered using the projection defined by the viewport but limited to the rendertarget are, exactly like opengl or the GC hardware.
to solve this in reference drivers defined a large rendertarget (2x the size of the original) and proceed to render in a centered quad insithe the larger rendertarget, in this way larger viewports always falls inside a valid rendertarget size, the drawback of this is the waste of resources. it can be dynamized, depending or games or changed at runtime when a oversized viewport is detected, but i live that to future commits.
please test this and let me know the results.
git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@4841 8ced0084-cf51-0410-be5f-012b33b47a6e
2010-01-15 15:52:08 +00:00
|
|
|
if (rc.left > s_Fulltarget_width) rc.left = s_Fulltarget_width;
|
|
|
|
if (rc.right > s_Fulltarget_width) rc.right = s_Fulltarget_width;
|
2009-09-13 17:46:33 +00:00
|
|
|
if (rc.top < 0) rc.top = 0;
|
2009-11-08 20:35:11 +00:00
|
|
|
if (rc.bottom < 0) rc.bottom = 0;
|
ok big changes here:
in videocommon little fix for the alpha test values, return to the original values as they are more accurate.
in D3D:
huge change in state management, now all the state management is centralized and redundant state changes are eliminated.
Fixed the overlapped viewport error in non ati cards:
the error was caused by this: when a viewport is defined larger than the current rendertarget, an error is thrown and the last valid viewport is used, this is the reference behavior, in ati cards if a larger viewport is defined, no eror is returned, the rendering is valid and is rendered using the projection defined by the viewport but limited to the rendertarget are, exactly like opengl or the GC hardware.
to solve this in reference drivers defined a large rendertarget (2x the size of the original) and proceed to render in a centered quad insithe the larger rendertarget, in this way larger viewports always falls inside a valid rendertarget size, the drawback of this is the waste of resources. it can be dynamized, depending or games or changed at runtime when a oversized viewport is detected, but i live that to future commits.
please test this and let me know the results.
git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@4841 8ced0084-cf51-0410-be5f-012b33b47a6e
2010-01-15 15:52:08 +00:00
|
|
|
if (rc.top > s_Fulltarget_height) rc.top = s_Fulltarget_height;
|
|
|
|
if (rc.bottom > s_Fulltarget_height) rc.bottom = s_Fulltarget_height;
|
2010-01-17 17:44:09 +00:00
|
|
|
if (rc.left > rc.right)
|
2009-11-23 14:08:08 +00:00
|
|
|
{
|
|
|
|
int temp = rc.right;
|
|
|
|
rc.right = rc.left;
|
|
|
|
rc.left = temp;
|
|
|
|
}
|
2010-01-17 17:44:09 +00:00
|
|
|
if (rc.top > rc.bottom)
|
2009-11-23 14:08:08 +00:00
|
|
|
{
|
|
|
|
int temp = rc.bottom;
|
|
|
|
rc.bottom = rc.top;
|
|
|
|
rc.top = temp;
|
|
|
|
}
|
Well this commit has 2 parts:
first part if fixing, fixed, i thing, the flickering that everyone has reported, at least in my case i only have flickering in the one texture in one game and now is fixed. The other fix is not for an reported issue, is more a correctness fix, running dolphin with pix to review debug errors, result in a ton of warnings and error, now with this commit, at least for ati, there no more error or warnings, this means, correct management and state change, no accurate emulation, for this still a lot of work to do.
for this part of the commit please give me feedback and let me know of remaining issues
Te second part is the partial implementation of efb to ram copy in d3d, this won't brake anything because is commented but i commit this to ask for help from ector and donko in some errors remaining in the implementation related to differences between opengl an d3d.
if you want to test this you have to uncomment line 150 to 155 of bpstruct.cpp
git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@4594 8ced0084-cf51-0410-be5f-012b33b47a6e
2009-11-20 18:46:30 +00:00
|
|
|
|
2009-09-13 08:21:35 +00:00
|
|
|
if (rc.right >= rc.left && rc.bottom >= rc.top)
|
|
|
|
{
|
2008-12-08 05:25:12 +00:00
|
|
|
D3D::dev->SetScissorRect(&rc);
|
2009-09-03 19:42:45 +00:00
|
|
|
return true;
|
|
|
|
}
|
2008-12-08 05:25:12 +00:00
|
|
|
else
|
2009-09-03 19:42:45 +00:00
|
|
|
{
|
2009-11-23 14:08:08 +00:00
|
|
|
//WARN_LOG(VIDEO, "Bad scissor rectangle: %i %i %i %i", rc.left, rc.top, rc.right, rc.bottom);
|
ok big changes here:
in videocommon little fix for the alpha test values, return to the original values as they are more accurate.
in D3D:
huge change in state management, now all the state management is centralized and redundant state changes are eliminated.
Fixed the overlapped viewport error in non ati cards:
the error was caused by this: when a viewport is defined larger than the current rendertarget, an error is thrown and the last valid viewport is used, this is the reference behavior, in ati cards if a larger viewport is defined, no eror is returned, the rendering is valid and is rendered using the projection defined by the viewport but limited to the rendertarget are, exactly like opengl or the GC hardware.
to solve this in reference drivers defined a large rendertarget (2x the size of the original) and proceed to render in a centered quad insithe the larger rendertarget, in this way larger viewports always falls inside a valid rendertarget size, the drawback of this is the waste of resources. it can be dynamized, depending or games or changed at runtime when a oversized viewport is detected, but i live that to future commits.
please test this and let me know the results.
git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@4841 8ced0084-cf51-0410-be5f-012b33b47a6e
2010-01-15 15:52:08 +00:00
|
|
|
rc.left = Xstride;
|
|
|
|
rc.top = Ystride;
|
2010-01-15 22:07:53 +00:00
|
|
|
rc.right = Xstride + GetTargetWidth();
|
|
|
|
rc.bottom = Ystride + GetTargetHeight();
|
2009-11-22 02:37:00 +00:00
|
|
|
D3D::dev->SetScissorRect(&rc);
|
2009-09-03 19:42:45 +00:00
|
|
|
return false;
|
|
|
|
}
|
Well this commit has 2 parts:
first part if fixing, fixed, i thing, the flickering that everyone has reported, at least in my case i only have flickering in the one texture in one game and now is fixed. The other fix is not for an reported issue, is more a correctness fix, running dolphin with pix to review debug errors, result in a ton of warnings and error, now with this commit, at least for ati, there no more error or warnings, this means, correct management and state change, no accurate emulation, for this still a lot of work to do.
for this part of the commit please give me feedback and let me know of remaining issues
Te second part is the partial implementation of efb to ram copy in d3d, this won't brake anything because is commented but i commit this to ask for help from ector and donko in some errors remaining in the implementation related to differences between opengl an d3d.
if you want to test this you have to uncomment line 150 to 155 of bpstruct.cpp
git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@4594 8ced0084-cf51-0410-be5f-012b33b47a6e
2009-11-20 18:46:30 +00:00
|
|
|
return false;
|
2009-09-03 19:42:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void Renderer::SetColorMask()
|
|
|
|
{
|
2009-09-13 08:21:35 +00:00
|
|
|
DWORD color_mask = 0;
|
2009-09-03 19:42:45 +00:00
|
|
|
if (bpmem.blendmode.alphaupdate)
|
2009-09-13 08:21:35 +00:00
|
|
|
color_mask = D3DCOLORWRITEENABLE_ALPHA;
|
2009-09-03 19:42:45 +00:00
|
|
|
if (bpmem.blendmode.colorupdate)
|
2009-09-13 08:21:35 +00:00
|
|
|
color_mask |= D3DCOLORWRITEENABLE_RED | D3DCOLORWRITEENABLE_GREEN | D3DCOLORWRITEENABLE_BLUE;
|
|
|
|
D3D::SetRenderState(D3DRS_COLORWRITEENABLE, color_mask);
|
2008-12-08 05:25:12 +00:00
|
|
|
}
|
|
|
|
|
2009-09-04 17:29:16 +00:00
|
|
|
u32 Renderer::AccessEFB(EFBAccessType type, int x, int y)
|
|
|
|
{
|
2010-01-17 17:44:09 +00:00
|
|
|
if (!g_ActiveConfig.bEFBAccessEnable)
|
2009-12-28 19:13:06 +00:00
|
|
|
return 0;
|
|
|
|
|
2009-10-10 23:36:18 +00:00
|
|
|
//Get the working buffer
|
2009-10-06 14:24:10 +00:00
|
|
|
LPDIRECT3DSURFACE9 pBuffer = (type == PEEK_Z || type == POKE_Z) ?
|
2009-11-22 02:37:00 +00:00
|
|
|
FBManager::GetEFBDepthRTSurface() : FBManager::GetEFBColorRTSurface();
|
2009-10-10 23:36:18 +00:00
|
|
|
//get the temporal buffer to move 1pixel data
|
|
|
|
LPDIRECT3DSURFACE9 RBuffer = (type == PEEK_Z || type == POKE_Z) ?
|
|
|
|
FBManager::GetEFBDepthReadSurface() : FBManager::GetEFBColorReadSurface();
|
|
|
|
//get the memory buffer that can be locked
|
2009-10-08 00:35:47 +00:00
|
|
|
LPDIRECT3DSURFACE9 pOffScreenBuffer = (type == PEEK_Z || type == POKE_Z) ?
|
2009-10-10 23:36:18 +00:00
|
|
|
FBManager::GetEFBDepthOffScreenRTSurface() : FBManager::GetEFBColorOffScreenRTSurface();
|
|
|
|
//get the buffer format
|
2009-10-06 14:24:10 +00:00
|
|
|
D3DFORMAT BufferFormat = (type == PEEK_Z || type == POKE_Z) ?
|
|
|
|
FBManager::GetEFBDepthRTSurfaceFormat() : FBManager::GetEFBColorRTSurfaceFormat();
|
2009-11-22 02:37:00 +00:00
|
|
|
D3DFORMAT ReadBufferFormat = (type == PEEK_Z || type == POKE_Z) ?
|
|
|
|
FBManager::GetEFBDepthReadSurfaceFormat() : BufferFormat;
|
2009-10-10 23:36:18 +00:00
|
|
|
|
2010-01-17 17:44:09 +00:00
|
|
|
if (BufferFormat == D3DFMT_D24X8)
|
2009-11-10 12:45:03 +00:00
|
|
|
return 0;
|
2009-12-28 19:13:06 +00:00
|
|
|
|
|
|
|
D3DLOCKED_RECT drect;
|
2009-10-10 23:36:18 +00:00
|
|
|
|
2009-10-06 14:24:10 +00:00
|
|
|
//Buffer not found alert
|
2010-01-17 17:44:09 +00:00
|
|
|
if (!pBuffer) {
|
2009-10-06 14:24:10 +00:00
|
|
|
PanicAlert("No %s!", (type == PEEK_Z || type == POKE_Z) ? "Z-Buffer" : "Color EFB");
|
|
|
|
return 0;
|
|
|
|
}
|
2009-09-04 17:29:16 +00:00
|
|
|
// Get the rectangular target region covered by the EFB pixel.
|
2009-10-06 14:24:10 +00:00
|
|
|
|
2009-09-04 17:29:16 +00:00
|
|
|
EFBRectangle efbPixelRc;
|
|
|
|
efbPixelRc.left = x;
|
|
|
|
efbPixelRc.top = y;
|
|
|
|
efbPixelRc.right = x + 1;
|
|
|
|
efbPixelRc.bottom = y + 1;
|
|
|
|
|
|
|
|
TargetRectangle targetPixelRc = Renderer::ConvertEFBRectangle(efbPixelRc);
|
|
|
|
|
2009-10-03 02:12:24 +00:00
|
|
|
u32 z = 0;
|
|
|
|
float val = 0.0f;
|
|
|
|
HRESULT hr;
|
|
|
|
RECT RectToLock;
|
|
|
|
RectToLock.bottom = targetPixelRc.bottom;
|
|
|
|
RectToLock.left = targetPixelRc.left;
|
|
|
|
RectToLock.right = targetPixelRc.right;
|
2009-11-22 02:37:00 +00:00
|
|
|
RectToLock.top = targetPixelRc.top;
|
2010-01-17 17:44:09 +00:00
|
|
|
if (type == PEEK_Z)
|
2009-11-08 20:35:11 +00:00
|
|
|
{
|
2009-11-22 02:37:00 +00:00
|
|
|
RECT PixelRect;
|
|
|
|
PixelRect.bottom = 4;
|
|
|
|
PixelRect.left = 0;
|
|
|
|
PixelRect.right = 4;
|
|
|
|
PixelRect.top = 0;
|
|
|
|
RectToLock.bottom+=2;
|
|
|
|
RectToLock.right+=1;
|
|
|
|
RectToLock.top-=1;
|
|
|
|
RectToLock.left-=2;
|
2010-01-17 17:44:09 +00:00
|
|
|
if ((RectToLock.bottom - RectToLock.top) > 4)
|
2009-11-22 02:37:00 +00:00
|
|
|
RectToLock.bottom--;
|
2010-01-17 17:44:09 +00:00
|
|
|
if ((RectToLock.right - RectToLock.left) > 4)
|
2009-11-22 02:37:00 +00:00
|
|
|
RectToLock.left++;
|
|
|
|
ResetAPIState(); // reset any game specific settings
|
|
|
|
hr =D3D::dev->SetDepthStencilSurface(NULL);
|
|
|
|
hr = D3D::dev->SetRenderTarget(0, RBuffer);
|
2010-01-17 17:44:09 +00:00
|
|
|
if (FAILED(hr))
|
2009-11-10 12:45:03 +00:00
|
|
|
{
|
2009-11-22 02:37:00 +00:00
|
|
|
PanicAlert("unable to set pixel render buffer");
|
2009-11-10 12:45:03 +00:00
|
|
|
return 0;
|
|
|
|
}
|
2009-11-22 02:37:00 +00:00
|
|
|
D3DVIEWPORT9 vp;
|
|
|
|
// Stretch picture with increased internal resolution
|
|
|
|
vp.X = 0;
|
|
|
|
vp.Y = 0;
|
|
|
|
vp.Width = 4;
|
|
|
|
vp.Height = 4;
|
|
|
|
vp.MinZ = 0.0f;
|
|
|
|
vp.MaxZ = 1.0f;
|
|
|
|
hr = D3D::dev->SetViewport(&vp);
|
2010-01-17 17:44:09 +00:00
|
|
|
if (FAILED(hr))
|
2009-11-10 12:45:03 +00:00
|
|
|
{
|
2009-11-22 02:37:00 +00:00
|
|
|
PanicAlert("unable to set pixel viewport");
|
2009-11-10 12:45:03 +00:00
|
|
|
return 0;
|
|
|
|
}
|
2009-11-22 02:37:00 +00:00
|
|
|
float colmat[16]= {0.0f};
|
|
|
|
float fConstAdd[4] = {0.0f};
|
|
|
|
colmat[0] = colmat[5] = colmat[10] = 1.0f;
|
|
|
|
PixelShaderManager::SetColorMatrix(colmat, fConstAdd); // set transformation
|
|
|
|
EFBRectangle source_rect;
|
|
|
|
LPDIRECT3DTEXTURE9 read_texture = FBManager::GetEFBDepthTexture(source_rect);
|
|
|
|
|
ok big changes here:
in videocommon little fix for the alpha test values, return to the original values as they are more accurate.
in D3D:
huge change in state management, now all the state management is centralized and redundant state changes are eliminated.
Fixed the overlapped viewport error in non ati cards:
the error was caused by this: when a viewport is defined larger than the current rendertarget, an error is thrown and the last valid viewport is used, this is the reference behavior, in ati cards if a larger viewport is defined, no eror is returned, the rendering is valid and is rendered using the projection defined by the viewport but limited to the rendertarget are, exactly like opengl or the GC hardware.
to solve this in reference drivers defined a large rendertarget (2x the size of the original) and proceed to render in a centered quad insithe the larger rendertarget, in this way larger viewports always falls inside a valid rendertarget size, the drawback of this is the waste of resources. it can be dynamized, depending or games or changed at runtime when a oversized viewport is detected, but i live that to future commits.
please test this and let me know the results.
git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@4841 8ced0084-cf51-0410-be5f-012b33b47a6e
2010-01-15 15:52:08 +00:00
|
|
|
D3D::ChangeSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_POINT);
|
2009-11-22 02:37:00 +00:00
|
|
|
|
ok big changes here:
in videocommon little fix for the alpha test values, return to the original values as they are more accurate.
in D3D:
huge change in state management, now all the state management is centralized and redundant state changes are eliminated.
Fixed the overlapped viewport error in non ati cards:
the error was caused by this: when a viewport is defined larger than the current rendertarget, an error is thrown and the last valid viewport is used, this is the reference behavior, in ati cards if a larger viewport is defined, no eror is returned, the rendering is valid and is rendered using the projection defined by the viewport but limited to the rendertarget are, exactly like opengl or the GC hardware.
to solve this in reference drivers defined a large rendertarget (2x the size of the original) and proceed to render in a centered quad insithe the larger rendertarget, in this way larger viewports always falls inside a valid rendertarget size, the drawback of this is the waste of resources. it can be dynamized, depending or games or changed at runtime when a oversized viewport is detected, but i live that to future commits.
please test this and let me know the results.
git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@4841 8ced0084-cf51-0410-be5f-012b33b47a6e
2010-01-15 15:52:08 +00:00
|
|
|
D3D::drawShadedTexQuad(read_texture,&RectToLock, Renderer::GetFullTargetWidth() , Renderer::GetFullTargetHeight(),&PixelRect,(BufferFormat == FOURCC_RAWZ)?PixelShaderCache::GetColorMatrixProgram():PixelShaderCache::GetDepthMatrixProgram(),VertexShaderCache::GetSimpleVertexShader());
|
2009-11-22 02:37:00 +00:00
|
|
|
|
|
|
|
D3D::RefreshSamplerState(0, D3DSAMP_MINFILTER);
|
|
|
|
|
|
|
|
hr = D3D::dev->SetRenderTarget(0, FBManager::GetEFBColorRTSurface());
|
|
|
|
hr = D3D::dev->SetDepthStencilSurface(FBManager::GetEFBDepthRTSurface());
|
|
|
|
RestoreAPIState();
|
|
|
|
RectToLock.bottom = 4;
|
|
|
|
RectToLock.left = 0;
|
|
|
|
RectToLock.right = 4;
|
|
|
|
RectToLock.top = 0;
|
|
|
|
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
hr = D3D::dev->StretchRect(pBuffer,&RectToLock,RBuffer,NULL, D3DTEXF_NONE);
|
2009-11-10 12:45:03 +00:00
|
|
|
//change the rect to lock the entire one pixel buffer
|
|
|
|
RectToLock.bottom = 1;
|
|
|
|
RectToLock.left = 0;
|
|
|
|
RectToLock.right = 1;
|
|
|
|
RectToLock.top = 0;
|
2009-11-08 20:35:11 +00:00
|
|
|
}
|
2010-01-17 17:44:09 +00:00
|
|
|
if (FAILED(hr))
|
2009-11-22 02:37:00 +00:00
|
|
|
{
|
|
|
|
PanicAlert("Unable to stretch data to buffer");
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
//retriebe the pixel data to the local memory buffer
|
|
|
|
D3D::dev->GetRenderTargetData(RBuffer,pOffScreenBuffer);
|
2010-01-17 17:44:09 +00:00
|
|
|
if (FAILED(hr))
|
2009-11-22 02:37:00 +00:00
|
|
|
{
|
|
|
|
PanicAlert("Unable to copy data to mem buffer");
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
2009-11-08 20:35:11 +00:00
|
|
|
|
2009-10-10 23:36:18 +00:00
|
|
|
//the surface is good.. lock it
|
2010-01-17 17:44:09 +00:00
|
|
|
if ((hr = pOffScreenBuffer->LockRect(&drect, &RectToLock, D3DLOCK_READONLY)) != D3D_OK)
|
2009-10-10 23:36:18 +00:00
|
|
|
{
|
2009-10-03 02:12:24 +00:00
|
|
|
PanicAlert("ERROR: %s", hr == D3DERR_WASSTILLDRAWING ? "Still drawing" :
|
|
|
|
hr == D3DERR_INVALIDCALL ? "Invalid call" : "w00t");
|
2009-10-10 23:36:18 +00:00
|
|
|
return 0;
|
|
|
|
}
|
2009-10-02 14:03:07 +00:00
|
|
|
|
2009-10-03 02:12:24 +00:00
|
|
|
switch(type) {
|
|
|
|
case PEEK_Z:
|
2009-10-06 14:24:10 +00:00
|
|
|
{
|
2009-11-22 02:37:00 +00:00
|
|
|
switch (ReadBufferFormat)
|
2009-11-10 12:45:03 +00:00
|
|
|
{
|
|
|
|
case D3DFMT_R32F:
|
2009-11-22 02:37:00 +00:00
|
|
|
val = ((float *)drect.pBits)[6];
|
2009-11-10 12:45:03 +00:00
|
|
|
break;
|
|
|
|
default:
|
2009-11-22 02:37:00 +00:00
|
|
|
float ffrac = 1.0f/255.0f;
|
|
|
|
z = ((u32 *)drect.pBits)[6];
|
2009-11-10 12:45:03 +00:00
|
|
|
val = ((float)((z>>16) & 0xFF)) * ffrac;
|
|
|
|
ffrac*= 1 / 255.0f;
|
|
|
|
val += ((float)((z>>8) & 0xFF)) * ffrac;
|
|
|
|
ffrac*= 1 / 255.0f;
|
2009-11-22 02:37:00 +00:00
|
|
|
val += ((float)(z & 0xFF)) * ffrac;
|
2009-11-10 12:45:03 +00:00
|
|
|
break;
|
|
|
|
};
|
|
|
|
z = ((u32)(val * 0xffffff));
|
2009-10-06 14:24:10 +00:00
|
|
|
}
|
2009-11-08 20:35:11 +00:00
|
|
|
break;
|
2009-10-03 02:12:24 +00:00
|
|
|
case POKE_Z:
|
|
|
|
// TODO: Get that Z value to poke from somewhere
|
|
|
|
//((float *)drect.pBits)[0] = val;
|
|
|
|
PanicAlert("Poke Z-buffer not implemented");
|
|
|
|
break;
|
2009-09-24 13:52:45 +00:00
|
|
|
|
2009-10-03 02:12:24 +00:00
|
|
|
case PEEK_COLOR:
|
|
|
|
z = ((u32 *)drect.pBits)[0];
|
|
|
|
break;
|
|
|
|
case POKE_COLOR:
|
|
|
|
// TODO: Get that ARGB value to poke from somewhere
|
|
|
|
//((float *)drect.pBits)[0] = val;
|
|
|
|
PanicAlert("Poke color EFB not implemented");
|
|
|
|
break;
|
2009-09-04 17:29:16 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2009-11-08 20:35:11 +00:00
|
|
|
pOffScreenBuffer->UnlockRect();
|
2009-10-03 02:12:24 +00:00
|
|
|
// TODO: in RE0 this value is often off by one, which causes lighting to disappear
|
2009-10-10 23:36:18 +00:00
|
|
|
return z;
|
2009-10-03 02:12:24 +00:00
|
|
|
|
2009-09-04 17:29:16 +00:00
|
|
|
}
|
|
|
|
|
2009-02-28 22:10:38 +00:00
|
|
|
// Called from VertexShaderManager
|
|
|
|
void UpdateViewport()
|
|
|
|
{
|
2009-11-23 14:08:08 +00:00
|
|
|
// reversed gxsetviewport(xorig, yorig, width, height, nearz, farz)
|
|
|
|
// [0] = width/2
|
|
|
|
// [1] = height/2
|
|
|
|
// [2] = 16777215 * (farz - nearz)
|
|
|
|
// [3] = xorig + width/2 + 342
|
|
|
|
// [4] = yorig + height/2 + 342
|
|
|
|
// [5] = 16777215 * farz
|
2009-09-03 19:24:16 +00:00
|
|
|
int scissorXOff = bpmem.scissorOffset.x * 2;
|
|
|
|
int scissorYOff = bpmem.scissorOffset.y * 2;
|
2009-02-28 22:10:38 +00:00
|
|
|
|
2009-09-03 19:42:45 +00:00
|
|
|
float MValueX = Renderer::GetTargetScaleX();
|
|
|
|
float MValueY = Renderer::GetTargetScaleY();
|
ok big changes here:
in videocommon little fix for the alpha test values, return to the original values as they are more accurate.
in D3D:
huge change in state management, now all the state management is centralized and redundant state changes are eliminated.
Fixed the overlapped viewport error in non ati cards:
the error was caused by this: when a viewport is defined larger than the current rendertarget, an error is thrown and the last valid viewport is used, this is the reference behavior, in ati cards if a larger viewport is defined, no eror is returned, the rendering is valid and is rendered using the projection defined by the viewport but limited to the rendertarget are, exactly like opengl or the GC hardware.
to solve this in reference drivers defined a large rendertarget (2x the size of the original) and proceed to render in a centered quad insithe the larger rendertarget, in this way larger viewports always falls inside a valid rendertarget size, the drawback of this is the waste of resources. it can be dynamized, depending or games or changed at runtime when a oversized viewport is detected, but i live that to future commits.
please test this and let me know the results.
git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@4841 8ced0084-cf51-0410-be5f-012b33b47a6e
2010-01-15 15:52:08 +00:00
|
|
|
|
|
|
|
int Xstride = (s_Fulltarget_width - s_target_width) / 2;
|
|
|
|
int Ystride = (s_Fulltarget_height - s_target_height) / 2;
|
2009-09-02 04:10:40 +00:00
|
|
|
|
2009-09-03 19:24:16 +00:00
|
|
|
D3DVIEWPORT9 vp;
|
2009-02-28 22:10:38 +00:00
|
|
|
|
2009-09-03 19:24:16 +00:00
|
|
|
// Stretch picture with increased internal resolution
|
ok big changes here:
in videocommon little fix for the alpha test values, return to the original values as they are more accurate.
in D3D:
huge change in state management, now all the state management is centralized and redundant state changes are eliminated.
Fixed the overlapped viewport error in non ati cards:
the error was caused by this: when a viewport is defined larger than the current rendertarget, an error is thrown and the last valid viewport is used, this is the reference behavior, in ati cards if a larger viewport is defined, no eror is returned, the rendering is valid and is rendered using the projection defined by the viewport but limited to the rendertarget are, exactly like opengl or the GC hardware.
to solve this in reference drivers defined a large rendertarget (2x the size of the original) and proceed to render in a centered quad insithe the larger rendertarget, in this way larger viewports always falls inside a valid rendertarget size, the drawback of this is the waste of resources. it can be dynamized, depending or games or changed at runtime when a oversized viewport is detected, but i live that to future commits.
please test this and let me know the results.
git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@4841 8ced0084-cf51-0410-be5f-012b33b47a6e
2010-01-15 15:52:08 +00:00
|
|
|
int X = (int)(ceil(xfregs.rawViewport[3] - xfregs.rawViewport[0] - (scissorXOff)) * MValueX) + Xstride;
|
|
|
|
int Y = (int)(ceil(xfregs.rawViewport[4] + xfregs.rawViewport[1] - (scissorYOff)) * MValueY) + Ystride;
|
2009-11-23 14:08:08 +00:00
|
|
|
int Width = (int)ceil((int)(2 * xfregs.rawViewport[0]) * MValueX);
|
|
|
|
int Height = (int)ceil((int)(-2 * xfregs.rawViewport[1]) * MValueY);
|
2010-01-17 17:44:09 +00:00
|
|
|
if (Width < 0)
|
2009-11-23 14:08:08 +00:00
|
|
|
{
|
|
|
|
X += Width;
|
ok big changes here:
in videocommon little fix for the alpha test values, return to the original values as they are more accurate.
in D3D:
huge change in state management, now all the state management is centralized and redundant state changes are eliminated.
Fixed the overlapped viewport error in non ati cards:
the error was caused by this: when a viewport is defined larger than the current rendertarget, an error is thrown and the last valid viewport is used, this is the reference behavior, in ati cards if a larger viewport is defined, no eror is returned, the rendering is valid and is rendered using the projection defined by the viewport but limited to the rendertarget are, exactly like opengl or the GC hardware.
to solve this in reference drivers defined a large rendertarget (2x the size of the original) and proceed to render in a centered quad insithe the larger rendertarget, in this way larger viewports always falls inside a valid rendertarget size, the drawback of this is the waste of resources. it can be dynamized, depending or games or changed at runtime when a oversized viewport is detected, but i live that to future commits.
please test this and let me know the results.
git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@4841 8ced0084-cf51-0410-be5f-012b33b47a6e
2010-01-15 15:52:08 +00:00
|
|
|
Width*=-1;
|
2009-11-23 14:08:08 +00:00
|
|
|
}
|
2010-01-17 17:44:09 +00:00
|
|
|
if (Height < 0)
|
2009-11-23 14:08:08 +00:00
|
|
|
{
|
|
|
|
Y += Height;
|
ok big changes here:
in videocommon little fix for the alpha test values, return to the original values as they are more accurate.
in D3D:
huge change in state management, now all the state management is centralized and redundant state changes are eliminated.
Fixed the overlapped viewport error in non ati cards:
the error was caused by this: when a viewport is defined larger than the current rendertarget, an error is thrown and the last valid viewport is used, this is the reference behavior, in ati cards if a larger viewport is defined, no eror is returned, the rendering is valid and is rendered using the projection defined by the viewport but limited to the rendertarget are, exactly like opengl or the GC hardware.
to solve this in reference drivers defined a large rendertarget (2x the size of the original) and proceed to render in a centered quad insithe the larger rendertarget, in this way larger viewports always falls inside a valid rendertarget size, the drawback of this is the waste of resources. it can be dynamized, depending or games or changed at runtime when a oversized viewport is detected, but i live that to future commits.
please test this and let me know the results.
git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@4841 8ced0084-cf51-0410-be5f-012b33b47a6e
2010-01-15 15:52:08 +00:00
|
|
|
Height *= -1;
|
2009-11-23 14:08:08 +00:00
|
|
|
}
|
2010-01-19 15:00:45 +00:00
|
|
|
if(AUTO_ADJUST_RENDERTARGET_SIZE)
|
|
|
|
{
|
|
|
|
bool sizeChanged = false;
|
|
|
|
if(X < 0)
|
|
|
|
{
|
|
|
|
s_Fulltarget_width -= 2 * X;
|
|
|
|
X = 0;
|
|
|
|
sizeChanged=true;
|
|
|
|
}
|
|
|
|
if(Y < 0)
|
|
|
|
{
|
|
|
|
s_Fulltarget_height -= 2 * Y;
|
|
|
|
Y = 0;
|
|
|
|
sizeChanged=true;
|
|
|
|
}
|
|
|
|
if(X + Width > s_Fulltarget_width)
|
|
|
|
{
|
|
|
|
s_Fulltarget_width += (X + Width - s_Fulltarget_width) * 2;
|
|
|
|
sizeChanged=true;
|
|
|
|
}
|
|
|
|
if(Y + Height > s_Fulltarget_height)
|
|
|
|
{
|
|
|
|
s_Fulltarget_height += (Y + Height - s_Fulltarget_height) * 2;
|
|
|
|
sizeChanged=true;
|
|
|
|
}
|
|
|
|
if(sizeChanged)
|
|
|
|
{
|
|
|
|
D3D::dev->SetRenderTarget(0, D3D::GetBackBufferSurface());
|
|
|
|
D3D::dev->SetDepthStencilSurface(D3D::GetBackBufferDepthSurface());
|
|
|
|
FBManager::Destroy();
|
|
|
|
FBManager::Create();
|
|
|
|
D3D::dev->SetRenderTarget(0, FBManager::GetEFBColorRTSurface());
|
|
|
|
D3D::dev->SetDepthStencilSurface(FBManager::GetEFBDepthRTSurface());
|
|
|
|
}
|
|
|
|
}
|
Well this commit has 2 parts:
first part if fixing, fixed, i thing, the flickering that everyone has reported, at least in my case i only have flickering in the one texture in one game and now is fixed. The other fix is not for an reported issue, is more a correctness fix, running dolphin with pix to review debug errors, result in a ton of warnings and error, now with this commit, at least for ati, there no more error or warnings, this means, correct management and state change, no accurate emulation, for this still a lot of work to do.
for this part of the commit please give me feedback and let me know of remaining issues
Te second part is the partial implementation of efb to ram copy in d3d, this won't brake anything because is commented but i commit this to ask for help from ector and donko in some errors remaining in the implementation related to differences between opengl an d3d.
if you want to test this you have to uncomment line 150 to 155 of bpstruct.cpp
git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@4594 8ced0084-cf51-0410-be5f-012b33b47a6e
2009-11-20 18:46:30 +00:00
|
|
|
vp.X = X;
|
|
|
|
vp.Y = Y;
|
|
|
|
vp.Width = Width;
|
|
|
|
vp.Height = Height;
|
ok big changes here:
in videocommon little fix for the alpha test values, return to the original values as they are more accurate.
in D3D:
huge change in state management, now all the state management is centralized and redundant state changes are eliminated.
Fixed the overlapped viewport error in non ati cards:
the error was caused by this: when a viewport is defined larger than the current rendertarget, an error is thrown and the last valid viewport is used, this is the reference behavior, in ati cards if a larger viewport is defined, no eror is returned, the rendering is valid and is rendered using the projection defined by the viewport but limited to the rendertarget are, exactly like opengl or the GC hardware.
to solve this in reference drivers defined a large rendertarget (2x the size of the original) and proceed to render in a centered quad insithe the larger rendertarget, in this way larger viewports always falls inside a valid rendertarget size, the drawback of this is the waste of resources. it can be dynamized, depending or games or changed at runtime when a oversized viewport is detected, but i live that to future commits.
please test this and let me know the results.
git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@4841 8ced0084-cf51-0410-be5f-012b33b47a6e
2010-01-15 15:52:08 +00:00
|
|
|
|
2009-11-02 21:09:48 +00:00
|
|
|
//some games set invalids values for z min and z max so fix them to the max an min alowed and let the shaders do this work
|
2009-12-03 20:09:15 +00:00
|
|
|
vp.MinZ = 0.0f;//(xfregs.rawViewport[5] - xfregs.rawViewport[2]) / 16777216.0f;
|
|
|
|
vp.MaxZ =1.0f;// xfregs.rawViewport[5] / 16777216.0f;
|
2009-02-28 22:10:38 +00:00
|
|
|
D3D::dev->SetViewport(&vp);
|
2009-09-02 04:10:40 +00:00
|
|
|
}
|
2009-09-20 03:29:43 +00:00
|
|
|
|
2009-10-02 21:23:56 +00:00
|
|
|
void Renderer::ClearScreen(const EFBRectangle& rc, bool colorEnable, bool alphaEnable, bool zEnable, u32 color, u32 z)
|
2009-11-22 02:37:00 +00:00
|
|
|
{
|
|
|
|
// Update the view port for clearing the picture
|
ok big changes here:
in videocommon little fix for the alpha test values, return to the original values as they are more accurate.
in D3D:
huge change in state management, now all the state management is centralized and redundant state changes are eliminated.
Fixed the overlapped viewport error in non ati cards:
the error was caused by this: when a viewport is defined larger than the current rendertarget, an error is thrown and the last valid viewport is used, this is the reference behavior, in ati cards if a larger viewport is defined, no eror is returned, the rendering is valid and is rendered using the projection defined by the viewport but limited to the rendertarget are, exactly like opengl or the GC hardware.
to solve this in reference drivers defined a large rendertarget (2x the size of the original) and proceed to render in a centered quad insithe the larger rendertarget, in this way larger viewports always falls inside a valid rendertarget size, the drawback of this is the waste of resources. it can be dynamized, depending or games or changed at runtime when a oversized viewport is detected, but i live that to future commits.
please test this and let me know the results.
git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@4841 8ced0084-cf51-0410-be5f-012b33b47a6e
2010-01-15 15:52:08 +00:00
|
|
|
|
2009-11-22 02:37:00 +00:00
|
|
|
D3DVIEWPORT9 vp;
|
|
|
|
vp.X = 0;
|
|
|
|
vp.Y = 0;
|
ok big changes here:
in videocommon little fix for the alpha test values, return to the original values as they are more accurate.
in D3D:
huge change in state management, now all the state management is centralized and redundant state changes are eliminated.
Fixed the overlapped viewport error in non ati cards:
the error was caused by this: when a viewport is defined larger than the current rendertarget, an error is thrown and the last valid viewport is used, this is the reference behavior, in ati cards if a larger viewport is defined, no eror is returned, the rendering is valid and is rendered using the projection defined by the viewport but limited to the rendertarget are, exactly like opengl or the GC hardware.
to solve this in reference drivers defined a large rendertarget (2x the size of the original) and proceed to render in a centered quad insithe the larger rendertarget, in this way larger viewports always falls inside a valid rendertarget size, the drawback of this is the waste of resources. it can be dynamized, depending or games or changed at runtime when a oversized viewport is detected, but i live that to future commits.
please test this and let me know the results.
git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@4841 8ced0084-cf51-0410-be5f-012b33b47a6e
2010-01-15 15:52:08 +00:00
|
|
|
vp.Width = Renderer::GetFullTargetWidth();
|
|
|
|
vp.Height = Renderer::GetFullTargetHeight();
|
2009-11-22 02:37:00 +00:00
|
|
|
vp.MinZ = 0.0;
|
|
|
|
vp.MaxZ = 1.0;
|
|
|
|
D3D::dev->SetViewport(&vp);
|
|
|
|
|
|
|
|
TargetRectangle targetRc = Renderer::ConvertEFBRectangle(rc);
|
|
|
|
|
|
|
|
// Always set the scissor in case it was set by the game and has not been reset
|
|
|
|
RECT sirc;
|
|
|
|
sirc.left = targetRc.left;
|
|
|
|
sirc.top = targetRc.top;
|
|
|
|
sirc.right = targetRc.right;
|
|
|
|
sirc.bottom = targetRc.bottom;
|
2009-11-23 14:08:08 +00:00
|
|
|
D3D::dev->SetScissorRect(&sirc);
|
2010-01-17 17:44:09 +00:00
|
|
|
if (zEnable)
|
2010-01-15 22:07:53 +00:00
|
|
|
D3D::ChangeRenderState(D3DRS_ZFUNC, D3DCMP_ALWAYS);
|
2009-12-07 18:48:31 +00:00
|
|
|
D3D::drawClearQuad(&sirc,color ,(z & 0xFFFFFF) / float(0xFFFFFF),PixelShaderCache::GetClearProgram(),VertexShaderCache::GetSimpleVertexShader());
|
2010-01-17 17:44:09 +00:00
|
|
|
if (zEnable)
|
2010-01-15 22:07:53 +00:00
|
|
|
D3D::RefreshRenderState(D3DRS_ZFUNC);
|
2009-12-07 18:48:31 +00:00
|
|
|
//D3D::dev->Clear(0, NULL, (colorEnable ? D3DCLEAR_TARGET : 0)| ( zEnable ? D3DCLEAR_ZBUFFER : 0), color | ((alphaEnable)?0:0xFF000000),(z & 0xFFFFFF) / float(0xFFFFFF), 0);
|
2009-11-23 14:08:08 +00:00
|
|
|
UpdateViewport();
|
2010-01-15 22:07:53 +00:00
|
|
|
SetScissorRect();
|
2009-10-02 21:23:56 +00:00
|
|
|
}
|
|
|
|
|
2009-10-10 23:36:18 +00:00
|
|
|
void Renderer::SetBlendMode(bool forceUpdate)
|
|
|
|
{
|
|
|
|
// blend mode bit mask
|
|
|
|
// 0 - blend enable
|
|
|
|
// 2 - reverse subtract enable (else add)
|
|
|
|
// 3-5 - srcRGB function
|
|
|
|
// 6-8 - dstRGB function
|
2010-01-17 17:44:09 +00:00
|
|
|
if (bpmem.blendmode.logicopenable && bpmem.blendmode.logicmode != 3)
|
2009-12-07 18:48:31 +00:00
|
|
|
return;
|
2009-10-10 23:36:18 +00:00
|
|
|
u32 newval = bpmem.blendmode.subtract << 2;
|
|
|
|
|
|
|
|
if (bpmem.blendmode.subtract) {
|
|
|
|
newval |= 0x0049; // enable blending src 1 dst 1
|
|
|
|
} else if (bpmem.blendmode.blendenable) {
|
|
|
|
newval |= 1; // enable blending
|
|
|
|
newval |= bpmem.blendmode.srcfactor << 3;
|
|
|
|
newval |= bpmem.blendmode.dstfactor << 6;
|
|
|
|
}
|
|
|
|
|
|
|
|
u32 changes = forceUpdate ? 0xFFFFFFFF : newval ^ s_blendMode;
|
|
|
|
|
|
|
|
if (changes & 1) {
|
|
|
|
// blend enable change
|
|
|
|
D3D::SetRenderState(D3DRS_ALPHABLENDENABLE, (newval & 1));
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
if (changes & 4) {
|
|
|
|
// subtract enable change
|
|
|
|
D3D::SetRenderState(D3DRS_BLENDOP, newval & 4 ? D3DBLENDOP_REVSUBTRACT : D3DBLENDOP_ADD);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (changes & 0x1F8) {
|
|
|
|
// blend RGB change
|
|
|
|
D3D::SetRenderState(D3DRS_SRCBLEND, d3dSrcFactors[(newval >> 3) & 7]);
|
|
|
|
D3D::SetRenderState(D3DRS_DESTBLEND, d3dDestFactors[(newval >> 6) & 7]);
|
|
|
|
}
|
|
|
|
|
|
|
|
s_blendMode = newval;
|
|
|
|
}
|
2009-10-02 21:23:56 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
2009-09-20 03:29:43 +00:00
|
|
|
void Renderer::Swap(u32 xfbAddr, FieldType field, u32 fbWidth, u32 fbHeight)
|
|
|
|
{
|
|
|
|
// this function is called after the XFB field is changed, not after
|
|
|
|
// EFB is copied to XFB. In this way, flickering is reduced in games
|
|
|
|
// and seems to also give more FPS in ZTP
|
|
|
|
|
|
|
|
// D3D frame is now over
|
|
|
|
// Clean out old stuff from caches.
|
|
|
|
frameCount++;
|
|
|
|
TextureCache::Cleanup();
|
|
|
|
|
|
|
|
// Make any new configuration settings active.
|
|
|
|
UpdateActiveConfig();
|
|
|
|
|
|
|
|
g_VideoInitialize.pCopiedToXFB(false);
|
|
|
|
|
|
|
|
CheckForResize();
|
|
|
|
|
2009-11-28 05:59:46 +00:00
|
|
|
// ---------------------------------------------------------------------
|
|
|
|
// Count FPS.
|
|
|
|
// -------------
|
|
|
|
static int fpscount = 0;
|
|
|
|
static unsigned long lasttime;
|
|
|
|
++fpscount;
|
2010-01-21 21:27:52 +00:00
|
|
|
if (Common::Timer::GetTimeMs() - lasttime > 1000)
|
2009-11-28 05:59:46 +00:00
|
|
|
{
|
2010-01-21 21:27:52 +00:00
|
|
|
lasttime = Common::Timer::GetTimeMs();
|
2009-11-28 05:59:46 +00:00
|
|
|
s_fps = fpscount - 1;
|
|
|
|
fpscount = 0;
|
|
|
|
}
|
2009-09-20 03:29:43 +00:00
|
|
|
|
|
|
|
// Begin new frame
|
|
|
|
// Set default viewport and scissor, for the clear to work correctly
|
|
|
|
stats.ResetFrame();
|
|
|
|
|
|
|
|
// Flip/present backbuffer to frontbuffer here
|
|
|
|
D3D::Present();
|
|
|
|
}
|
2009-11-08 20:35:11 +00:00
|
|
|
|
|
|
|
void Renderer::ResetAPIState()
|
|
|
|
{
|
2010-01-15 22:07:53 +00:00
|
|
|
D3D::SetRenderState(D3DRS_SCISSORTESTENABLE, FALSE);
|
|
|
|
D3D::SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
|
|
|
|
D3D::SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE);
|
|
|
|
D3D::SetRenderState(D3DRS_ZENABLE, FALSE);
|
|
|
|
D3D::SetRenderState(D3DRS_ZWRITEENABLE, FALSE);
|
2009-11-08 20:35:11 +00:00
|
|
|
DWORD color_mask = D3DCOLORWRITEENABLE_ALPHA| D3DCOLORWRITEENABLE_RED | D3DCOLORWRITEENABLE_GREEN | D3DCOLORWRITEENABLE_BLUE;
|
2010-01-15 22:07:53 +00:00
|
|
|
D3D::SetRenderState(D3DRS_COLORWRITEENABLE, color_mask);
|
2009-11-08 20:35:11 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void Renderer::RestoreAPIState()
|
|
|
|
{
|
|
|
|
// Gets us back into a more game-like state.
|
2010-01-15 22:07:53 +00:00
|
|
|
D3D::SetRenderState(D3DRS_SCISSORTESTENABLE, TRUE);
|
ok big changes here:
in videocommon little fix for the alpha test values, return to the original values as they are more accurate.
in D3D:
huge change in state management, now all the state management is centralized and redundant state changes are eliminated.
Fixed the overlapped viewport error in non ati cards:
the error was caused by this: when a viewport is defined larger than the current rendertarget, an error is thrown and the last valid viewport is used, this is the reference behavior, in ati cards if a larger viewport is defined, no eror is returned, the rendering is valid and is rendered using the projection defined by the viewport but limited to the rendertarget are, exactly like opengl or the GC hardware.
to solve this in reference drivers defined a large rendertarget (2x the size of the original) and proceed to render in a centered quad insithe the larger rendertarget, in this way larger viewports always falls inside a valid rendertarget size, the drawback of this is the waste of resources. it can be dynamized, depending or games or changed at runtime when a oversized viewport is detected, but i live that to future commits.
please test this and let me know the results.
git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@4841 8ced0084-cf51-0410-be5f-012b33b47a6e
2010-01-15 15:52:08 +00:00
|
|
|
UpdateViewport();
|
2010-01-15 22:07:53 +00:00
|
|
|
SetScissorRect();
|
|
|
|
if (bpmem.zmode.testenable) D3D::SetRenderState(D3DRS_ZENABLE, TRUE);
|
|
|
|
if (bpmem.zmode.updateenable) D3D::SetRenderState(D3DRS_ZWRITEENABLE, TRUE);
|
|
|
|
SetColorMask();
|
|
|
|
SetLogicOpMode();
|
2009-11-08 20:35:11 +00:00
|
|
|
}
|
2009-11-23 14:08:08 +00:00
|
|
|
|
|
|
|
void Renderer::SetGenerationMode()
|
|
|
|
{
|
2009-12-07 18:48:31 +00:00
|
|
|
D3D::SetRenderState(D3DRS_CULLMODE, d3dCullModes[bpmem.genMode.cullmode]);
|
2009-11-23 14:08:08 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void Renderer::SetDepthMode()
|
|
|
|
{
|
|
|
|
if (bpmem.zmode.testenable)
|
|
|
|
{
|
|
|
|
D3D::SetRenderState(D3DRS_ZENABLE, TRUE);
|
|
|
|
D3D::SetRenderState(D3DRS_ZWRITEENABLE, bpmem.zmode.updateenable);
|
|
|
|
D3D::SetRenderState(D3DRS_ZFUNC, d3dCmpFuncs[bpmem.zmode.func]);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
D3D::SetRenderState(D3DRS_ZENABLE, FALSE);
|
|
|
|
D3D::SetRenderState(D3DRS_ZWRITEENABLE, FALSE); // ??
|
|
|
|
}
|
|
|
|
}
|
2009-11-27 19:42:27 +00:00
|
|
|
|
|
|
|
void Renderer::SetLogicOpMode()
|
|
|
|
{
|
2009-12-09 13:51:28 +00:00
|
|
|
if (bpmem.blendmode.logicopenable && bpmem.blendmode.logicmode != 3)
|
2009-12-07 18:48:31 +00:00
|
|
|
{
|
2009-12-09 13:51:28 +00:00
|
|
|
s_blendMode = 0;
|
2009-12-07 18:48:31 +00:00
|
|
|
D3D::SetRenderState(D3DRS_ALPHABLENDENABLE, 1);
|
|
|
|
D3D::SetRenderState(D3DRS_BLENDOP, d3dLogincOPop[bpmem.blendmode.logicmode]);
|
|
|
|
D3D::SetRenderState(D3DRS_SRCBLEND, d3dLogicOpSrcFactors[bpmem.blendmode.logicmode]);
|
|
|
|
D3D::SetRenderState(D3DRS_DESTBLEND, d3dLogicOpDestFactors[bpmem.blendmode.logicmode]);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
SetBlendMode(true);
|
|
|
|
}
|
2009-11-27 19:42:27 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void Renderer::SetDitherMode()
|
|
|
|
{
|
|
|
|
D3D::SetRenderState(D3DRS_DITHERENABLE,bpmem.blendmode.dither);
|
|
|
|
}
|
|
|
|
|
|
|
|
void Renderer::SetLineWidth()
|
|
|
|
{
|
|
|
|
// We can't change line width in D3D unless we use ID3DXLine
|
2010-01-25 01:10:46 +00:00
|
|
|
float fratio = xfregs.rawViewport[0] != 0 ? Renderer::GetTargetScaleX() : 1.0f;
|
|
|
|
float psize = bpmem.lineptwidth.linesize * fratio / 6.0f;
|
2009-11-27 19:42:27 +00:00
|
|
|
D3D::SetRenderState(D3DRS_POINTSIZE, *((DWORD*)&psize));
|
|
|
|
}
|
|
|
|
|
2010-01-12 23:40:30 +00:00
|
|
|
void Renderer::SetSamplerState(int stage, int texindex)
|
2009-11-27 19:42:27 +00:00
|
|
|
{
|
|
|
|
const FourTexUnits &tex = bpmem.tex[texindex];
|
|
|
|
const TexMode0 &tm0 = tex.texMode0[stage];
|
|
|
|
|
|
|
|
D3DTEXTUREFILTERTYPE min, mag, mip;
|
|
|
|
if (g_ActiveConfig.bForceFiltering)
|
|
|
|
{
|
|
|
|
min = mag = mip = D3DTEXF_LINEAR;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
min = (tm0.min_filter & 4) ? D3DTEXF_LINEAR : D3DTEXF_POINT;
|
|
|
|
mag = tm0.mag_filter ? D3DTEXF_LINEAR : D3DTEXF_POINT;
|
|
|
|
mip = d3dMipFilters[tm0.min_filter & 3];
|
|
|
|
}
|
|
|
|
if (texindex)
|
|
|
|
stage += 4;
|
|
|
|
|
|
|
|
if (mag == D3DTEXF_LINEAR && min == D3DTEXF_LINEAR &&
|
|
|
|
g_ActiveConfig.iMaxAnisotropy > 1)
|
|
|
|
{
|
|
|
|
min = D3DTEXF_ANISOTROPIC;
|
|
|
|
}
|
|
|
|
D3D::SetSamplerState(stage, D3DSAMP_MINFILTER, min);
|
|
|
|
D3D::SetSamplerState(stage, D3DSAMP_MAGFILTER, mag);
|
|
|
|
D3D::SetSamplerState(stage, D3DSAMP_MIPFILTER, mip);
|
|
|
|
|
|
|
|
D3D::SetSamplerState(stage, D3DSAMP_ADDRESSU, d3dClamps[tm0.wrap_s]);
|
|
|
|
D3D::SetSamplerState(stage, D3DSAMP_ADDRESSV, d3dClamps[tm0.wrap_t]);
|
|
|
|
//wip
|
|
|
|
//dev->SetSamplerState(stage,D3DSAMP_MIPMAPLODBIAS,tm0.lod_bias/4.0f);
|
|
|
|
//char temp[256];
|
|
|
|
//sprintf(temp,"lod %f",tm0.lod_bias/4.0f);
|
|
|
|
//g_VideoInitialize.pLog(temp);
|
|
|
|
}
|
|
|
|
|
|
|
|
void Renderer::SetInterlacingMode()
|
|
|
|
{
|
|
|
|
// TODO
|
|
|
|
}
|
2010-01-27 22:07:59 +00:00
|
|
|
|
|
|
|
// Save screenshot
|
|
|
|
void Renderer::SetScreenshot(const char *filename)
|
|
|
|
{
|
|
|
|
s_criticalScreenshot.Enter();
|
|
|
|
strcpy(s_sScreenshotName,filename);
|
|
|
|
s_bScreenshot = true;
|
|
|
|
s_criticalScreenshot.Leave();
|
|
|
|
}
|