mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2025-07-23 14:19:46 -06:00
more bug fix in dx11:
fixed screen clearing and simplify drawClearQuad a little put some nice code from dx11 that i like in dx9. modify plugin spec preparing for implementing efb poke (is not used often but is a missing functionality so..) please test. git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@5710 8ced0084-cf51-0410-be5f-012b33b47a6e
This commit is contained in:
@ -77,7 +77,7 @@ EmuGfxState::EmuGfxState() : vertexshader(NULL), vsbytecode(NULL), pixelshader(N
|
||||
depthdesc.StencilWriteMask = D3D11_DEFAULT_STENCIL_WRITE_MASK;
|
||||
|
||||
// this probably must be changed once multisampling support gets added
|
||||
rastdesc = CD3D11_RASTERIZER_DESC(D3D11_FILL_SOLID, D3D11_CULL_NONE, false, 0, 0.f, 0, false, false, false, false);
|
||||
rastdesc = CD3D11_RASTERIZER_DESC(D3D11_FILL_SOLID, D3D11_CULL_NONE, false, 0, 0.f, 0, false, true, false, false);
|
||||
|
||||
pscbuf = NULL;
|
||||
vscbuf = NULL;
|
||||
|
@ -420,7 +420,7 @@ ID3D11Buffer* clearvb = NULL;
|
||||
|
||||
typedef struct { float x,y,z,u,v; } STQVertex;
|
||||
typedef struct { float x,y,z,u,v; } STSQVertex;
|
||||
typedef struct { float x,y,z; float col[4];} ClearVertex;
|
||||
typedef struct { float x,y,z; u32 col;} ClearVertex;
|
||||
|
||||
void InitUtils()
|
||||
{
|
||||
@ -575,16 +575,11 @@ void drawClearQuad(u32 Color, float z, ID3D11PixelShader* PShader, ID3D11VertexS
|
||||
|
||||
if (lastcol != Color || lastz != z)
|
||||
{
|
||||
float col[4];
|
||||
col[0] = (float)((Color & 0xFF) << 24);
|
||||
col[1] = (float)((Color & 0xFF00) << 8);
|
||||
col[2] = (float)((Color & 0xFF0000) >> 8);
|
||||
col[3] = (float)((Color & 0xFF000000) >> 24);
|
||||
ClearVertex coords[4] = {
|
||||
{-1.0f, 1.0f, z, {col[0],col[1],col[2],col[3]}},
|
||||
{ 1.0f, 1.0f, z, {col[0],col[1],col[2],col[3]}},
|
||||
{-1.0f, -1.0f, z, {col[0],col[1],col[2],col[3]}},
|
||||
{ 1.0f, -1.0f, z, {col[0],col[1],col[2],col[3]}},
|
||||
{-1.0f, 1.0f, z, Color},
|
||||
{ 1.0f, 1.0f, z, Color},
|
||||
{-1.0f, -1.0f, z, Color},
|
||||
{ 1.0f, -1.0f, z, Color},
|
||||
};
|
||||
|
||||
D3D11_MAPPED_SUBRESOURCE map;
|
||||
|
@ -240,19 +240,20 @@ void SetupDeviceObjects()
|
||||
|
||||
D3D11_DEPTH_STENCIL_DESC ddesc;
|
||||
ddesc.DepthEnable = FALSE;
|
||||
ddesc.DepthWriteMask = D3D11_DEPTH_WRITE_MASK_ALL;
|
||||
ddesc.DepthWriteMask = D3D11_DEPTH_WRITE_MASK_ZERO;
|
||||
ddesc.DepthFunc = D3D11_COMPARISON_ALWAYS;
|
||||
ddesc.StencilEnable = FALSE;
|
||||
ddesc.StencilReadMask = D3D11_DEFAULT_STENCIL_READ_MASK;
|
||||
ddesc.StencilWriteMask = D3D11_DEFAULT_STENCIL_WRITE_MASK;
|
||||
D3D::device->CreateDepthStencilState(&ddesc, &cleardepthstates[0]);
|
||||
ddesc.DepthWriteMask = D3D11_DEPTH_WRITE_MASK_ALL;
|
||||
ddesc.DepthEnable = TRUE;
|
||||
D3D::device->CreateDepthStencilState(&ddesc, &cleardepthstates[1]);
|
||||
D3D::SetDebugObjectName((ID3D11DeviceChild*)cleardepthstates[0], "depth state for Renderer::ClearScreen (depth buffer disabled)");
|
||||
D3D::SetDebugObjectName((ID3D11DeviceChild*)cleardepthstates[1], "depth state for Renderer::ClearScreen (depth buffer enabled)");
|
||||
|
||||
// TODO: once multisampling gets implemented, this might need to be changed
|
||||
D3D11_RASTERIZER_DESC rdesc = CD3D11_RASTERIZER_DESC(D3D11_FILL_SOLID, D3D11_CULL_NONE, false, 0, 0.f, 0.f, false, false, false, false);
|
||||
D3D11_RASTERIZER_DESC rdesc = CD3D11_RASTERIZER_DESC(D3D11_FILL_SOLID, D3D11_CULL_NONE, false, 0, 0.f, 0.f, false, true, false, false);
|
||||
D3D::device->CreateRasterizerState(&rdesc, &clearraststate);
|
||||
D3D::SetDebugObjectName((ID3D11DeviceChild*)clearraststate, "rasterizer state for Renderer::ClearScreen");
|
||||
|
||||
@ -739,15 +740,15 @@ void UpdateViewport()
|
||||
|
||||
void Renderer::ClearScreen(const EFBRectangle& rc, bool colorEnable, bool alphaEnable, bool zEnable, u32 color, u32 z)
|
||||
{
|
||||
// update the view port for clearing the picture
|
||||
D3D11_VIEWPORT vp = CD3D11_VIEWPORT(0.f, 0.f, (float)Renderer::GetFullTargetWidth(), (float)Renderer::GetFullTargetHeight());
|
||||
D3D::context->RSSetViewports(1, &vp);
|
||||
|
||||
TargetRectangle targetRc = Renderer::ConvertEFBRectangle(rc);
|
||||
|
||||
// update the view port for clearing the picture
|
||||
D3D11_VIEWPORT vp = CD3D11_VIEWPORT((float)targetRc.left, (float)targetRc.top, (float)targetRc.GetWidth(), (float)targetRc.GetHeight(),
|
||||
0.f,
|
||||
1.f);
|
||||
D3D::context->RSSetViewports(1, &vp);
|
||||
// always set the scissor in case it was set by the game and has not been reset
|
||||
// TODO: Do we really need to set the scissor rect? Why not just disable scissor testing?
|
||||
D3D11_RECT sirc = CD3D11_RECT(targetRc.left, targetRc.top, targetRc.right, targetRc.bottom);
|
||||
D3D11_RECT sirc = CD3D11_RECT(targetRc.left, targetRc.top, targetRc.right, targetRc.bottom);
|
||||
D3D::context->RSSetScissorRects(1, &sirc);
|
||||
D3D::context->OMSetDepthStencilState(cleardepthstates[zEnable], 0);
|
||||
D3D::context->RSSetState(clearraststate);
|
||||
@ -984,6 +985,7 @@ void Renderer::RestoreAPIState()
|
||||
if (bpmem.zmode.updateenable) D3D::gfxstate->depthdesc.DepthWriteMask = D3D11_DEPTH_WRITE_MASK_ALL;
|
||||
SetColorMask();
|
||||
SetLogicOpMode();
|
||||
D3D::gfxstate->ApplyState();
|
||||
}
|
||||
|
||||
void Renderer::SetGenerationMode()
|
||||
|
@ -141,7 +141,7 @@ void VertexShaderCache::Init()
|
||||
const D3D11_INPUT_ELEMENT_DESC clearelems[2] =
|
||||
{
|
||||
{ "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 },
|
||||
{ "COLOR", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, 12, D3D11_INPUT_PER_VERTEX_DATA, 0 },
|
||||
{ "COLOR", 0, DXGI_FORMAT_B8G8R8A8_UNORM, 0, 12, D3D11_INPUT_PER_VERTEX_DATA, 0 },
|
||||
};
|
||||
|
||||
ID3D10Blob* blob;
|
||||
|
@ -392,6 +392,7 @@ static struct
|
||||
EFBAccessType type;
|
||||
u32 x;
|
||||
u32 y;
|
||||
u32 Data;
|
||||
} s_accessEFBArgs;
|
||||
|
||||
static u32 s_AccessEFBResult = 0;
|
||||
@ -406,14 +407,14 @@ void VideoFifo_CheckEFBAccess()
|
||||
}
|
||||
}
|
||||
|
||||
u32 Video_AccessEFB(EFBAccessType type, u32 x, u32 y)
|
||||
u32 Video_AccessEFB(EFBAccessType type, u32 x, u32 y, u32 InputData)
|
||||
{
|
||||
if (s_PluginInitialized)
|
||||
{
|
||||
s_accessEFBArgs.type = type;
|
||||
s_accessEFBArgs.x = x;
|
||||
s_accessEFBArgs.y = y;
|
||||
|
||||
s_accessEFBArgs.Data = InputData;
|
||||
Common::AtomicStoreRelease(s_efbAccessRequested, TRUE);
|
||||
|
||||
if (g_VideoInitialize.bOnThread)
|
||||
|
Reference in New Issue
Block a user