GPU: Clear alpha more consistently from 565.
Before, the backends all did different things. Now they are more in sync, but Vulkan still behaves slightly differently. Fixes #11326.
This commit is contained in:
parent
22a536fb0c
commit
16d7a80980
6 changed files with 65 additions and 26 deletions
|
@ -100,6 +100,19 @@ static const D3DVERTEXELEMENT9 g_FramebufferVertexElements[] = {
|
|||
}
|
||||
|
||||
device_->CreateVertexDeclaration(g_FramebufferVertexElements, &pFramebufferVertexDecl);
|
||||
|
||||
|
||||
int usage = 0;
|
||||
D3DPOOL pool = D3DPOOL_MANAGED;
|
||||
if (deviceEx_) {
|
||||
pool = D3DPOOL_DEFAULT;
|
||||
usage = D3DUSAGE_DYNAMIC;
|
||||
}
|
||||
HRESULT hr = device_->CreateTexture(1, 1, 1, usage, D3DFMT_A8R8G8B8, pool, &nullTex_, nullptr);
|
||||
D3DLOCKED_RECT rect;
|
||||
nullTex_->LockRect(0, &rect, nullptr, D3DLOCK_DISCARD);
|
||||
memset(rect.pBits, 0, 4);
|
||||
nullTex_->UnlockRect(0);
|
||||
}
|
||||
|
||||
FramebufferManagerDX9::~FramebufferManagerDX9() {
|
||||
|
@ -125,6 +138,8 @@ static const D3DVERTEXELEMENT9 g_FramebufferVertexElements[] = {
|
|||
if (stencilUploadVS_) {
|
||||
stencilUploadVS_->Release();
|
||||
}
|
||||
if (nullTex_)
|
||||
nullTex_->Release();
|
||||
}
|
||||
|
||||
void FramebufferManagerDX9::SetTextureCache(TextureCacheDX9 *tc) {
|
||||
|
@ -307,24 +322,24 @@ static const D3DVERTEXELEMENT9 g_FramebufferVertexElements[] = {
|
|||
return;
|
||||
}
|
||||
|
||||
draw_->BindFramebufferAsRenderTarget(vfb->fbo, { Draw::RPAction::CLEAR, Draw::RPAction::KEEP, Draw::RPAction::KEEP });
|
||||
|
||||
// Technically, we should at this point re-interpret the bytes of the old format to the new.
|
||||
// That might get tricky, and could cause unnecessary slowness in some games.
|
||||
// For now, we just clear alpha/stencil from 565, which fixes shadow issues in Kingdom Hearts.
|
||||
// (it uses 565 to write zeros to the buffer, than 4444 to actually render the shadow.)
|
||||
// (it uses 565 to write zeros to the buffer, then 4444 to actually render the shadow.)
|
||||
//
|
||||
// The best way to do this may ultimately be to create a new FBO (combine with any resize?)
|
||||
// and blit with a shader to that, then replace the FBO on vfb. Stencil would still be complex
|
||||
// to exactly reproduce in 4444 and 8888 formats.
|
||||
|
||||
if (old == GE_FORMAT_565) {
|
||||
draw_->BindFramebufferAsRenderTarget(vfb->fbo, { Draw::RPAction::KEEP, Draw::RPAction::KEEP, Draw::RPAction::CLEAR });
|
||||
|
||||
dxstate.scissorTest.disable();
|
||||
dxstate.depthWrite.set(FALSE);
|
||||
dxstate.colorMask.set(false, false, false, true);
|
||||
dxstate.stencilFunc.set(D3DCMP_ALWAYS, 0, 0);
|
||||
dxstate.stencilMask.set(0xFF);
|
||||
gstate_c.Dirty(DIRTY_BLEND_STATE | DIRTY_DEPTHSTENCIL_STATE | DIRTY_VIEWPORTSCISSOR_STATE);
|
||||
gstate_c.Dirty(DIRTY_BLEND_STATE | DIRTY_DEPTHSTENCIL_STATE | DIRTY_RASTER_STATE | DIRTY_VIEWPORTSCISSOR_STATE | DIRTY_TEXTURE_PARAMS | DIRTY_VERTEXSHADER_STATE | DIRTY_FRAGMENTSHADER_STATE);
|
||||
|
||||
float coord[20] = {
|
||||
-1.0f,-1.0f,0, 0,0,
|
||||
|
@ -338,7 +353,7 @@ static const D3DVERTEXELEMENT9 g_FramebufferVertexElements[] = {
|
|||
device_->SetPixelShader(pFramebufferPixelShader);
|
||||
device_->SetVertexShader(pFramebufferVertexShader);
|
||||
shaderManagerDX9_->DirtyLastShader();
|
||||
device_->SetTexture(0, nullptr);
|
||||
device_->SetTexture(0, nullTex_);
|
||||
|
||||
D3DVIEWPORT9 vp{ 0, 0, (DWORD)vfb->renderWidth, (DWORD)vfb->renderHeight, 0.0f, 1.0f };
|
||||
device_->SetViewport(&vp);
|
||||
|
@ -349,9 +364,9 @@ static const D3DVERTEXELEMENT9 g_FramebufferVertexElements[] = {
|
|||
ERROR_LOG_REPORT(G3D, "ReformatFramebufferFrom() failed: %08x", hr);
|
||||
}
|
||||
dxstate.viewport.restore();
|
||||
}
|
||||
|
||||
RebindFramebuffer();
|
||||
textureCache_->ForgetLastTexture();
|
||||
}
|
||||
}
|
||||
|
||||
static void CopyPixelDepthOnly(u32 *dstp, const u32 *srcp, size_t c) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue