All: Only convert depth stencil state if dirty
This commit is contained in:
parent
e4567c694c
commit
e2b179d6e2
12 changed files with 24 additions and 21 deletions
|
@ -780,7 +780,7 @@ void FramebufferManagerCommon::DrawFramebufferToOutput(const u8 *srcPixels, GEBu
|
||||||
DrawActiveTexture(x, y, w, h, (float)pixelWidth_, (float)pixelHeight_, u0, v0, u1, v1, uvRotation, flags);
|
DrawActiveTexture(x, y, w, h, (float)pixelWidth_, (float)pixelHeight_, u0, v0, u1, v1, uvRotation, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
gstate_c.Dirty(DIRTY_BLEND_STATE);
|
gstate_c.Dirty(DIRTY_BLEND_STATE | DIRTY_DEPTHSTENCIL_STATE);
|
||||||
}
|
}
|
||||||
|
|
||||||
void FramebufferManagerCommon::DownloadFramebufferOnSwitch(VirtualFramebuffer *vfb) {
|
void FramebufferManagerCommon::DownloadFramebufferOnSwitch(VirtualFramebuffer *vfb) {
|
||||||
|
|
|
@ -211,7 +211,7 @@ void FramebufferManagerD3D11::DisableState() {
|
||||||
context_->OMSetBlendState(stockD3D11.blendStateDisabledWithColorMask[0xF], nullptr, 0xFFFFFFFF);
|
context_->OMSetBlendState(stockD3D11.blendStateDisabledWithColorMask[0xF], nullptr, 0xFFFFFFFF);
|
||||||
context_->RSSetState(stockD3D11.rasterStateNoCull);
|
context_->RSSetState(stockD3D11.rasterStateNoCull);
|
||||||
context_->OMSetDepthStencilState(stockD3D11.depthStencilDisabled, 0xFF);
|
context_->OMSetDepthStencilState(stockD3D11.depthStencilDisabled, 0xFF);
|
||||||
gstate_c.Dirty(DIRTY_BLEND_STATE);
|
gstate_c.Dirty(DIRTY_BLEND_STATE | DIRTY_DEPTHSTENCIL_STATE);
|
||||||
}
|
}
|
||||||
|
|
||||||
void FramebufferManagerD3D11::CompilePostShader() {
|
void FramebufferManagerD3D11::CompilePostShader() {
|
||||||
|
@ -433,7 +433,7 @@ void FramebufferManagerD3D11::DrawActiveTexture(float x, float y, float w, float
|
||||||
UINT offset = 0;
|
UINT offset = 0;
|
||||||
context_->IASetVertexBuffers(0, 1, &quadBuffer_, &stride, &offset);
|
context_->IASetVertexBuffers(0, 1, &quadBuffer_, &stride, &offset);
|
||||||
context_->Draw(4, 0);
|
context_->Draw(4, 0);
|
||||||
gstate_c.Dirty(DIRTY_BLEND_STATE);
|
gstate_c.Dirty(DIRTY_BLEND_STATE | DIRTY_DEPTHSTENCIL_STATE);
|
||||||
}
|
}
|
||||||
|
|
||||||
void FramebufferManagerD3D11::Bind2DShader() {
|
void FramebufferManagerD3D11::Bind2DShader() {
|
||||||
|
@ -510,7 +510,7 @@ void FramebufferManagerD3D11::ReformatFramebufferFrom(VirtualFramebuffer *vfb, G
|
||||||
}
|
}
|
||||||
|
|
||||||
RebindFramebuffer();
|
RebindFramebuffer();
|
||||||
gstate_c.Dirty(DIRTY_BLEND_STATE);
|
gstate_c.Dirty(DIRTY_BLEND_STATE | DIRTY_DEPTHSTENCIL_STATE);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void CopyPixelDepthOnly(u32 *dstp, const u32 *srcp, size_t c) {
|
static void CopyPixelDepthOnly(u32 *dstp, const u32 *srcp, size_t c) {
|
||||||
|
@ -713,7 +713,7 @@ void FramebufferManagerD3D11::SimpleBlit(
|
||||||
context_->IASetVertexBuffers(0, 1, &quadBuffer_, &stride, &offset);
|
context_->IASetVertexBuffers(0, 1, &quadBuffer_, &stride, &offset);
|
||||||
context_->Draw(4, 0);
|
context_->Draw(4, 0);
|
||||||
|
|
||||||
gstate_c.Dirty(DIRTY_BLEND_STATE);
|
gstate_c.Dirty(DIRTY_BLEND_STATE | DIRTY_DEPTHSTENCIL_STATE);
|
||||||
}
|
}
|
||||||
|
|
||||||
void FramebufferManagerD3D11::BlitFramebuffer(VirtualFramebuffer *dst, int dstX, int dstY, VirtualFramebuffer *src, int srcX, int srcY, int w, int h, int bpp) {
|
void FramebufferManagerD3D11::BlitFramebuffer(VirtualFramebuffer *dst, int dstX, int dstY, VirtualFramebuffer *src, int srcX, int srcY, int w, int h, int bpp) {
|
||||||
|
|
|
@ -77,7 +77,7 @@ static const D3D11CommandTableEntry commandTable[] = {
|
||||||
// Changes that dirty the current texture.
|
// Changes that dirty the current texture.
|
||||||
{ GE_CMD_TEXSIZE0, FLAG_FLUSHBEFOREONCHANGE | FLAG_EXECUTE, 0, &GPU_D3D11::Execute_TexSize0 },
|
{ GE_CMD_TEXSIZE0, FLAG_FLUSHBEFOREONCHANGE | FLAG_EXECUTE, 0, &GPU_D3D11::Execute_TexSize0 },
|
||||||
|
|
||||||
{ GE_CMD_STENCILTEST, FLAG_FLUSHBEFOREONCHANGE, DIRTY_STENCILREPLACEVALUE | DIRTY_FOGCOEF | DIRTY_BLEND_STATE }, // These are combined in D3D11
|
{ GE_CMD_STENCILTEST, FLAG_FLUSHBEFOREONCHANGE, DIRTY_STENCILREPLACEVALUE | DIRTY_FOGCOEF | DIRTY_BLEND_STATE | DIRTY_DEPTHSTENCIL_STATE }, // These are combined in D3D11
|
||||||
|
|
||||||
// Changing the vertex type requires us to flush.
|
// Changing the vertex type requires us to flush.
|
||||||
{ GE_CMD_VERTEXTYPE, FLAG_FLUSHBEFOREONCHANGE | FLAG_EXECUTEONCHANGE, 0, &GPU_D3D11::Execute_VertexType },
|
{ GE_CMD_VERTEXTYPE, FLAG_FLUSHBEFOREONCHANGE | FLAG_EXECUTEONCHANGE, 0, &GPU_D3D11::Execute_VertexType },
|
||||||
|
|
|
@ -301,8 +301,8 @@ void DrawEngineD3D11::ApplyDrawState(int prim) {
|
||||||
rasterState_ = rs;
|
rasterState_ = rs;
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
if (gstate_c.IsDirty(DIRTY_DEPTHSTENCIL_STATE)) {
|
||||||
// Set ColorMask/Stencil/Depth
|
gstate_c.Clean(DIRTY_DEPTHSTENCIL_STATE);
|
||||||
if (gstate.isModeClear()) {
|
if (gstate.isModeClear()) {
|
||||||
keys_.depthStencil.value = 0;
|
keys_.depthStencil.value = 0;
|
||||||
keys_.depthStencil.depthTestEnable = true;
|
keys_.depthStencil.depthTestEnable = true;
|
||||||
|
|
|
@ -394,6 +394,7 @@ public:
|
||||||
context_->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP);
|
context_->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP);
|
||||||
context_->IASetVertexBuffers(0, 1, &vbuffer_, &stride_, &offset_);
|
context_->IASetVertexBuffers(0, 1, &vbuffer_, &stride_, &offset_);
|
||||||
context_->Draw(4, 0);
|
context_->Draw(4, 0);
|
||||||
|
gstate_c.Dirty(DIRTY_BLEND_STATE | DIRTY_DEPTHSTENCIL_STATE);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
|
@ -61,7 +61,7 @@ static const D3D9CommandTableEntry commandTable[] = {
|
||||||
// Changes that dirty the current texture.
|
// Changes that dirty the current texture.
|
||||||
{ GE_CMD_TEXSIZE0, FLAG_FLUSHBEFOREONCHANGE | FLAG_EXECUTE, 0, &GPU_DX9::Execute_TexSize0 },
|
{ GE_CMD_TEXSIZE0, FLAG_FLUSHBEFOREONCHANGE | FLAG_EXECUTE, 0, &GPU_DX9::Execute_TexSize0 },
|
||||||
|
|
||||||
{ GE_CMD_STENCILTEST, FLAG_FLUSHBEFOREONCHANGE, DIRTY_STENCILREPLACEVALUE | DIRTY_BLEND_STATE },
|
{ GE_CMD_STENCILTEST, FLAG_FLUSHBEFOREONCHANGE, DIRTY_STENCILREPLACEVALUE | DIRTY_BLEND_STATE | DIRTY_DEPTHSTENCIL_STATE },
|
||||||
|
|
||||||
// Changing the vertex type requires us to flush.
|
// Changing the vertex type requires us to flush.
|
||||||
{ GE_CMD_VERTEXTYPE, FLAG_FLUSHBEFOREONCHANGE | FLAG_EXECUTEONCHANGE, 0, &GPU_DX9::Execute_VertexType },
|
{ GE_CMD_VERTEXTYPE, FLAG_FLUSHBEFOREONCHANGE | FLAG_EXECUTEONCHANGE, 0, &GPU_DX9::Execute_VertexType },
|
||||||
|
|
|
@ -215,7 +215,8 @@ void DrawEngineDX9::ApplyDrawState(int prim) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
if (gstate_c.IsDirty(DIRTY_DEPTHSTENCIL_STATE)) {
|
||||||
|
gstate_c.Clean(DIRTY_DEPTHSTENCIL_STATE);
|
||||||
// Set Stencil/Depth
|
// Set Stencil/Depth
|
||||||
if (gstate.isModeClear()) {
|
if (gstate.isModeClear()) {
|
||||||
// Depth Test
|
// Depth Test
|
||||||
|
|
|
@ -65,7 +65,7 @@ static const GLESCommandTableEntry commandTable[] = {
|
||||||
// Changes that dirty the current texture.
|
// Changes that dirty the current texture.
|
||||||
{ GE_CMD_TEXSIZE0, FLAG_FLUSHBEFOREONCHANGE | FLAG_EXECUTE, DIRTY_UVSCALEOFFSET, &GPU_GLES::Execute_TexSize0 },
|
{ GE_CMD_TEXSIZE0, FLAG_FLUSHBEFOREONCHANGE | FLAG_EXECUTE, DIRTY_UVSCALEOFFSET, &GPU_GLES::Execute_TexSize0 },
|
||||||
|
|
||||||
{ GE_CMD_STENCILTEST, FLAG_FLUSHBEFOREONCHANGE, DIRTY_STENCILREPLACEVALUE | DIRTY_BLEND_STATE },
|
{ GE_CMD_STENCILTEST, FLAG_FLUSHBEFOREONCHANGE, DIRTY_STENCILREPLACEVALUE | DIRTY_BLEND_STATE | DIRTY_DEPTHSTENCIL_STATE },
|
||||||
|
|
||||||
// Changing the vertex type requires us to flush.
|
// Changing the vertex type requires us to flush.
|
||||||
{ GE_CMD_VERTEXTYPE, FLAG_FLUSHBEFOREONCHANGE | FLAG_EXECUTEONCHANGE, 0, &GPU_GLES::Execute_VertexType },
|
{ GE_CMD_VERTEXTYPE, FLAG_FLUSHBEFOREONCHANGE | FLAG_EXECUTEONCHANGE, 0, &GPU_GLES::Execute_VertexType },
|
||||||
|
|
|
@ -277,7 +277,8 @@ void DrawEngineGLES::ApplyDrawState(int prim) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
if (gstate_c.IsDirty(DIRTY_DEPTHSTENCIL_STATE)) {
|
||||||
|
gstate_c.Clean(DIRTY_DEPTHSTENCIL_STATE);
|
||||||
bool enableStencilTest = !g_Config.bDisableStencilTest;
|
bool enableStencilTest = !g_Config.bDisableStencilTest;
|
||||||
if (gstate.isModeClear()) {
|
if (gstate.isModeClear()) {
|
||||||
// Depth Test
|
// Depth Test
|
||||||
|
|
|
@ -47,7 +47,7 @@ const CommonCommandTableEntry commonCommandTable[] = {
|
||||||
// Changes that dirty the framebuffer
|
// Changes that dirty the framebuffer
|
||||||
{ GE_CMD_FRAMEBUFPTR, FLAG_FLUSHBEFOREONCHANGE, DIRTY_FRAMEBUF | DIRTY_TEXTURE_PARAMS },
|
{ GE_CMD_FRAMEBUFPTR, FLAG_FLUSHBEFOREONCHANGE, DIRTY_FRAMEBUF | DIRTY_TEXTURE_PARAMS },
|
||||||
{ GE_CMD_FRAMEBUFWIDTH, FLAG_FLUSHBEFOREONCHANGE, DIRTY_FRAMEBUF | DIRTY_TEXTURE_PARAMS },
|
{ GE_CMD_FRAMEBUFWIDTH, FLAG_FLUSHBEFOREONCHANGE, DIRTY_FRAMEBUF | DIRTY_TEXTURE_PARAMS },
|
||||||
{ GE_CMD_FRAMEBUFPIXFORMAT, FLAG_FLUSHBEFOREONCHANGE, DIRTY_FRAMEBUF | DIRTY_TEXTURE_PARAMS | DIRTY_BLEND_STATE },
|
{ GE_CMD_FRAMEBUFPIXFORMAT, FLAG_FLUSHBEFOREONCHANGE, DIRTY_FRAMEBUF | DIRTY_TEXTURE_PARAMS | DIRTY_BLEND_STATE | DIRTY_DEPTHSTENCIL_STATE },
|
||||||
{ GE_CMD_ZBUFPTR, FLAG_FLUSHBEFOREONCHANGE },
|
{ GE_CMD_ZBUFPTR, FLAG_FLUSHBEFOREONCHANGE },
|
||||||
{ GE_CMD_ZBUFWIDTH, FLAG_FLUSHBEFOREONCHANGE },
|
{ GE_CMD_ZBUFWIDTH, FLAG_FLUSHBEFOREONCHANGE },
|
||||||
|
|
||||||
|
@ -97,17 +97,17 @@ const CommonCommandTableEntry commonCommandTable[] = {
|
||||||
{ GE_CMD_CULL, FLAG_FLUSHBEFOREONCHANGE },
|
{ GE_CMD_CULL, FLAG_FLUSHBEFOREONCHANGE },
|
||||||
{ GE_CMD_CULLFACEENABLE, FLAG_FLUSHBEFOREONCHANGE },
|
{ GE_CMD_CULLFACEENABLE, FLAG_FLUSHBEFOREONCHANGE },
|
||||||
{ GE_CMD_DITHERENABLE, FLAG_FLUSHBEFOREONCHANGE },
|
{ GE_CMD_DITHERENABLE, FLAG_FLUSHBEFOREONCHANGE },
|
||||||
{ GE_CMD_STENCILOP, FLAG_FLUSHBEFOREONCHANGE, DIRTY_BLEND_STATE },
|
{ GE_CMD_STENCILOP, FLAG_FLUSHBEFOREONCHANGE, DIRTY_BLEND_STATE | DIRTY_DEPTHSTENCIL_STATE },
|
||||||
{ GE_CMD_STENCILTESTENABLE, FLAG_FLUSHBEFOREONCHANGE, DIRTY_BLEND_STATE },
|
{ GE_CMD_STENCILTESTENABLE, FLAG_FLUSHBEFOREONCHANGE, DIRTY_BLEND_STATE | DIRTY_DEPTHSTENCIL_STATE },
|
||||||
{ GE_CMD_ALPHABLENDENABLE, FLAG_FLUSHBEFOREONCHANGE, DIRTY_BLEND_STATE },
|
{ GE_CMD_ALPHABLENDENABLE, FLAG_FLUSHBEFOREONCHANGE, DIRTY_BLEND_STATE },
|
||||||
{ GE_CMD_BLENDMODE, FLAG_FLUSHBEFOREONCHANGE, DIRTY_BLEND_STATE },
|
{ GE_CMD_BLENDMODE, FLAG_FLUSHBEFOREONCHANGE, DIRTY_BLEND_STATE },
|
||||||
{ GE_CMD_BLENDFIXEDA, FLAG_FLUSHBEFOREONCHANGE, DIRTY_BLEND_STATE },
|
{ GE_CMD_BLENDFIXEDA, FLAG_FLUSHBEFOREONCHANGE, DIRTY_BLEND_STATE },
|
||||||
{ GE_CMD_BLENDFIXEDB, FLAG_FLUSHBEFOREONCHANGE, DIRTY_BLEND_STATE },
|
{ GE_CMD_BLENDFIXEDB, FLAG_FLUSHBEFOREONCHANGE, DIRTY_BLEND_STATE },
|
||||||
{ GE_CMD_MASKRGB, FLAG_FLUSHBEFOREONCHANGE, DIRTY_BLEND_STATE },
|
{ GE_CMD_MASKRGB, FLAG_FLUSHBEFOREONCHANGE, DIRTY_BLEND_STATE },
|
||||||
{ GE_CMD_MASKALPHA, FLAG_FLUSHBEFOREONCHANGE, DIRTY_BLEND_STATE },
|
{ GE_CMD_MASKALPHA, FLAG_FLUSHBEFOREONCHANGE, DIRTY_BLEND_STATE },
|
||||||
{ GE_CMD_ZTEST, FLAG_FLUSHBEFOREONCHANGE },
|
{ GE_CMD_ZTEST, FLAG_FLUSHBEFOREONCHANGE, DIRTY_DEPTHSTENCIL_STATE },
|
||||||
{ GE_CMD_ZTESTENABLE, FLAG_FLUSHBEFOREONCHANGE },
|
{ GE_CMD_ZTESTENABLE, FLAG_FLUSHBEFOREONCHANGE, DIRTY_DEPTHSTENCIL_STATE },
|
||||||
{ GE_CMD_ZWRITEDISABLE, FLAG_FLUSHBEFOREONCHANGE },
|
{ GE_CMD_ZWRITEDISABLE, FLAG_FLUSHBEFOREONCHANGE, DIRTY_DEPTHSTENCIL_STATE },
|
||||||
{ GE_CMD_LOGICOP, FLAG_FLUSHBEFOREONCHANGE, DIRTY_BLEND_STATE },
|
{ GE_CMD_LOGICOP, FLAG_FLUSHBEFOREONCHANGE, DIRTY_BLEND_STATE },
|
||||||
{ GE_CMD_LOGICOPENABLE, FLAG_FLUSHBEFOREONCHANGE, DIRTY_BLEND_STATE },
|
{ GE_CMD_LOGICOPENABLE, FLAG_FLUSHBEFOREONCHANGE, DIRTY_BLEND_STATE },
|
||||||
|
|
||||||
|
|
|
@ -61,7 +61,7 @@ static const VulkanCommandTableEntry commandTable[] = {
|
||||||
// Changes that dirty the current texture.
|
// Changes that dirty the current texture.
|
||||||
{ GE_CMD_TEXSIZE0, FLAG_FLUSHBEFOREONCHANGE | FLAG_EXECUTE, 0, &GPU_Vulkan::Execute_TexSize0 },
|
{ GE_CMD_TEXSIZE0, FLAG_FLUSHBEFOREONCHANGE | FLAG_EXECUTE, 0, &GPU_Vulkan::Execute_TexSize0 },
|
||||||
|
|
||||||
{ GE_CMD_STENCILTEST, FLAG_FLUSHBEFOREONCHANGE, DIRTY_STENCILREPLACEVALUE | DIRTY_BLEND_STATE },
|
{ GE_CMD_STENCILTEST, FLAG_FLUSHBEFOREONCHANGE, DIRTY_STENCILREPLACEVALUE | DIRTY_BLEND_STATE | DIRTY_DEPTHSTENCIL_STATE },
|
||||||
|
|
||||||
// Changing the vertex type requires us to flush.
|
// Changing the vertex type requires us to flush.
|
||||||
{ GE_CMD_VERTEXTYPE, FLAG_FLUSHBEFOREONCHANGE | FLAG_EXECUTEONCHANGE, 0, &GPU_Vulkan::Execute_VertexType },
|
{ GE_CMD_VERTEXTYPE, FLAG_FLUSHBEFOREONCHANGE | FLAG_EXECUTEONCHANGE, 0, &GPU_Vulkan::Execute_VertexType },
|
||||||
|
|
|
@ -244,8 +244,8 @@ void DrawEngineVulkan::ConvertStateToVulkanKey(FramebufferManagerVulkan &fbManag
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
if (gstate_c.IsDirty(DIRTY_DEPTHSTENCIL_STATE)) {
|
||||||
// Set Stencil/Depth
|
gstate_c.Clean(DIRTY_DEPTHSTENCIL_STATE);
|
||||||
if (gstate.isModeClear()) {
|
if (gstate.isModeClear()) {
|
||||||
key.depthTestEnable = true;
|
key.depthTestEnable = true;
|
||||||
key.depthCompareOp = VK_COMPARE_OP_ALWAYS;
|
key.depthCompareOp = VK_COMPARE_OP_ALWAYS;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue