Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Revert the recent zcomploc changes including the Graphic_Fixes merge.
Reason:
- It's wrong, zcomploc can't be emulated perfectly in HW backends without severely impacting performance.
- It provides virtually no advantages over the previous hack while introducing lots of code.
- There is a better alternative: If people insist on having some sort of valid zcomploc emulation, I suggest rendering each primitive separately while using a _clean_ dual-pass approach to emulate zcomploc.

This reverts commit 0efd4e5.
This reverts commit b4ec836.
This reverts commit bb4c9e2.
This reverts commit 146b026.
  • Loading branch information
neobrain committed Aug 10, 2012
1 parent 6e02ad5 commit 08a9c66
Show file tree
Hide file tree
Showing 22 changed files with 211 additions and 358 deletions.
2 changes: 1 addition & 1 deletion Source/Core/Common/Src/LinearDiskCache.h
Expand Up @@ -24,7 +24,7 @@
// Increment this every time you change shader generation code.
enum
{
LINEAR_DISKCACHE_VER = 6979
LINEAR_DISKCACHE_VER = 6975
};

// On disk format:
Expand Down
8 changes: 4 additions & 4 deletions Source/Core/VideoCommon/Src/Debugger.cpp
Expand Up @@ -103,21 +103,21 @@ void GFXDebuggerBase::DumpPixelShader(const char* path)
if (!useDstAlpha)
{
output = "Destination alpha disabled:\n";
output += GeneratePixelShaderCode(PSGRENDER_NORMAL, g_ActiveConfig.backend_info.APIType, g_nativeVertexFmt->m_components);
output += GeneratePixelShaderCode(DSTALPHA_NONE, g_ActiveConfig.backend_info.APIType, g_nativeVertexFmt->m_components);
}
else
{
if(g_ActiveConfig.backend_info.bSupportsDualSourceBlend)
{
output = "Using dual source blending for destination alpha:\n";
output += GeneratePixelShaderCode(PSGRENDER_DSTALPHA_DUAL_SOURCE_BLEND, g_ActiveConfig.backend_info.APIType, g_nativeVertexFmt->m_components);
output += GeneratePixelShaderCode(DSTALPHA_DUAL_SOURCE_BLEND, g_ActiveConfig.backend_info.APIType, g_nativeVertexFmt->m_components);
}
else
{
output = "Using two passes for emulating destination alpha:\n";
output += GeneratePixelShaderCode(PSGRENDER_NORMAL, g_ActiveConfig.backend_info.APIType, g_nativeVertexFmt->m_components);
output += GeneratePixelShaderCode(DSTALPHA_NONE, g_ActiveConfig.backend_info.APIType, g_nativeVertexFmt->m_components);
output += "\n\nDestination alpha pass shader:\n";
output += GeneratePixelShaderCode(PSGRENDER_DSTALPHA_ALPHA_PASS, g_ActiveConfig.backend_info.APIType, g_nativeVertexFmt->m_components);
output += GeneratePixelShaderCode(DSTALPHA_ALPHA_PASS, g_ActiveConfig.backend_info.APIType, g_nativeVertexFmt->m_components);
}
}

Expand Down
289 changes: 141 additions & 148 deletions Source/Core/VideoCommon/Src/PixelShaderGen.cpp

Large diffs are not rendered by default.

26 changes: 9 additions & 17 deletions Source/Core/VideoCommon/Src/PixelShaderGen.h
Expand Up @@ -105,28 +105,20 @@ class _PIXELSHADERUID
typedef _PIXELSHADERUID<false> PIXELSHADERUID;
typedef _PIXELSHADERUID<true> PIXELSHADERUIDSAFE;

// Different ways to achieve rendering
enum PSGRENDER_MODE
// Different ways to achieve rendering with destination alpha
enum DSTALPHA_MODE
{
PSGRENDER_NORMAL, // Render normally, without destination alpha
PSGRENDER_DSTALPHA_ALPHA_PASS, // Render normally first, then render again for alpha
PSGRENDER_DSTALPHA_DUAL_SOURCE_BLEND, // Use dual-source blending
PSGRENDER_ZCOMPLOC //Render to Depth Channel only with no depth dextures enabled
DSTALPHA_NONE, // Render normally, without destination alpha
DSTALPHA_ALPHA_PASS, // Render normally first, then render again for alpha
DSTALPHA_DUAL_SOURCE_BLEND // Use dual-source blending
};

enum ALPHA_PRETEST_RESULT
{
ALPHAPT_UNDEFINED, // AlphaTest Result is not defined
ALPHAPT_ALWAYSFAIL, // Alpha test alway Fail
ALPHAPT_ALWAYSPASS // Alpha test alway Pass
};

const char *GeneratePixelShaderCode(PSGRENDER_MODE PSGRenderMode, API_TYPE ApiType, u32 components);
const char *GeneratePixelShaderCode(DSTALPHA_MODE dstAlphaMode, API_TYPE ApiType, u32 components);

void GetPixelShaderId(PIXELSHADERUID *uid, PSGRENDER_MODE PSGRenderMode, u32 components);
void GetSafePixelShaderId(PIXELSHADERUIDSAFE *uid, PSGRENDER_MODE PSGRenderMode, u32 components);
void GetPixelShaderId(PIXELSHADERUID *uid, DSTALPHA_MODE dstAlphaMode, u32 components);
void GetSafePixelShaderId(PIXELSHADERUIDSAFE *uid, DSTALPHA_MODE dstAlphaMode, u32 components);

// Used to make sure that our optimized pixel shader IDs don't lose any possible shader code changes
void ValidatePixelShaderIDs(API_TYPE api, PIXELSHADERUIDSAFE old_id, const std::string& old_code, PSGRENDER_MODE PSGRenderMode, u32 components);
void ValidatePixelShaderIDs(API_TYPE api, PIXELSHADERUIDSAFE old_id, const std::string& old_code, DSTALPHA_MODE dstAlphaMode, u32 components);

#endif // GCOGL_PIXELSHADER_H
33 changes: 0 additions & 33 deletions Source/Core/VideoCommon/Src/PixelShaderManager.cpp
Expand Up @@ -466,39 +466,6 @@ void PixelShaderManager::SetMaterialColorChanged(int index)
nMaterialsChanged |= (1 << index);
}

ALPHA_PRETEST_RESULT PixelShaderManager::AlphaPreTest()
{
u32 op = bpmem.alphaFunc.logic;
u32 comp[2] = {bpmem.alphaFunc.comp0, bpmem.alphaFunc.comp1};

// First kill all the simple cases
switch(op)
{
case 0: // AND
if (comp[0] == ALPHACMP_ALWAYS && comp[1] == ALPHACMP_ALWAYS) return ALPHAPT_ALWAYSPASS;
if (comp[0] == ALPHACMP_NEVER || comp[1] == ALPHACMP_NEVER) return ALPHAPT_ALWAYSFAIL;
break;
case 1: // OR
if (comp[0] == ALPHACMP_ALWAYS || comp[1] == ALPHACMP_ALWAYS) return ALPHAPT_ALWAYSPASS;
if (comp[0] == ALPHACMP_NEVER && comp[1] == ALPHACMP_NEVER)return ALPHAPT_ALWAYSFAIL;
break;
case 2: // XOR
if ((comp[0] == ALPHACMP_ALWAYS && comp[1] == ALPHACMP_NEVER) || (comp[0] == ALPHACMP_NEVER && comp[1] == ALPHACMP_ALWAYS))
return ALPHAPT_ALWAYSPASS;
if ((comp[0] == ALPHACMP_ALWAYS && comp[1] == ALPHACMP_ALWAYS) || (comp[0] == ALPHACMP_NEVER && comp[1] == ALPHACMP_NEVER))
return ALPHAPT_ALWAYSFAIL;
break;
case 3: // XNOR
if ((comp[0] == ALPHACMP_ALWAYS && comp[1] == ALPHACMP_NEVER) || (comp[0] == ALPHACMP_NEVER && comp[1] == ALPHACMP_ALWAYS))
return ALPHAPT_ALWAYSFAIL;
if ((comp[0] == ALPHACMP_ALWAYS && comp[1] == ALPHACMP_ALWAYS) || (comp[0] == ALPHACMP_NEVER && comp[1] == ALPHACMP_NEVER))
return ALPHAPT_ALWAYSPASS;
break;
default: PanicAlert("bad logic for alpha test? %08x", op);
}
return ALPHAPT_UNDEFINED;
}

void PixelShaderManager::DoState(PointerWrap &p)
{
p.Do(lastRGBAfull);
Expand Down
1 change: 0 additions & 1 deletion Source/Core/VideoCommon/Src/PixelShaderManager.h
Expand Up @@ -54,7 +54,6 @@ class PixelShaderManager
static void SetColorMatrix(const float* pmatrix);
static void InvalidateXFRange(int start, int end);
static void SetMaterialColorChanged(int index);
static ALPHA_PRETEST_RESULT AlphaPreTest();

};

Expand Down
7 changes: 1 addition & 6 deletions Source/Core/VideoCommon/Src/RenderBase.h
Expand Up @@ -43,11 +43,6 @@ extern int OSDChoice, OSDTime;

extern bool bLastFrameDumped;

#define RSM_None 0
#define RSM_Multipass 1
#define RSM_Zcomploc 2
#define RSM_UseDstAlpha 4

// Renderer really isn't a very good name for this class - it's more like "Misc".
// The long term goal is to get rid of this class and replace it with others that make
// more sense.
Expand All @@ -68,7 +63,7 @@ class Renderer
virtual void SetSamplerState(int stage,int texindex) = 0;
virtual void SetInterlacingMode() = 0;

virtual void ApplyState(u32 mode) = 0;
virtual void ApplyState(bool bUseDstAlpha) = 0;
virtual void RestoreState() = 0;

// Ideal internal resolution - determined by display resolution (automatic scaling) and/or a multiple of the native EFB resolution
Expand Down
12 changes: 6 additions & 6 deletions Source/Plugins/Plugin_VideoDX11/Src/PixelShaderCache.cpp
Expand Up @@ -459,18 +459,18 @@ void PixelShaderCache::Shutdown()
g_ps_disk_cache.Close();
}

bool PixelShaderCache::SetShader(PSGRENDER_MODE PSGRenderMode, u32 components)
bool PixelShaderCache::SetShader(DSTALPHA_MODE dstAlphaMode, u32 components)
{
PIXELSHADERUID uid;
GetPixelShaderId(&uid, PSGRenderMode, components);
GetPixelShaderId(&uid, dstAlphaMode, components);

// Check if the shader is already set
if (last_entry)
{
if (uid == last_uid)
{
GFX_DEBUGGER_PAUSE_AT(NEXT_PIXEL_SHADER_CHANGE,true);
ValidatePixelShaderIDs(API_D3D11, last_entry->safe_uid, last_entry->code, PSGRenderMode, components);
ValidatePixelShaderIDs(API_D3D11, last_entry->safe_uid, last_entry->code, dstAlphaMode, components);
return (last_entry->shader != NULL);
}
}
Expand All @@ -486,12 +486,12 @@ bool PixelShaderCache::SetShader(PSGRENDER_MODE PSGRenderMode, u32 components)
last_entry = &entry;

GFX_DEBUGGER_PAUSE_AT(NEXT_PIXEL_SHADER_CHANGE,true);
ValidatePixelShaderIDs(API_D3D11, entry.safe_uid, entry.code, PSGRenderMode, components);
ValidatePixelShaderIDs(API_D3D11, entry.safe_uid, entry.code, dstAlphaMode, components);
return (entry.shader != NULL);
}

// Need to compile a new shader
const char* code = GeneratePixelShaderCode(PSGRenderMode, API_D3D11, components);
const char* code = GeneratePixelShaderCode(dstAlphaMode, API_D3D11, components);

D3DBlob* pbytecode;
if (!D3D::CompilePixelShader(code, (unsigned int)strlen(code), &pbytecode))
Expand All @@ -509,7 +509,7 @@ bool PixelShaderCache::SetShader(PSGRENDER_MODE PSGRenderMode, u32 components)
if (g_ActiveConfig.bEnableShaderDebugging && success)
{
PixelShaders[uid].code = code;
GetSafePixelShaderId(&PixelShaders[uid].safe_uid, PSGRenderMode, components);
GetSafePixelShaderId(&PixelShaders[uid].safe_uid, dstAlphaMode, components);
}

GFX_DEBUGGER_PAUSE_AT(NEXT_PIXEL_SHADER_CHANGE, true);
Expand Down
4 changes: 2 additions & 2 deletions Source/Plugins/Plugin_VideoDX11/Src/PixelShaderCache.h
Expand Up @@ -23,7 +23,7 @@

#include <map>

enum PSGRENDER_MODE;
enum DSTALPHA_MODE;

namespace DX11
{
Expand All @@ -34,7 +34,7 @@ class PixelShaderCache
static void Init();
static void Clear();
static void Shutdown();
static bool SetShader(PSGRENDER_MODE PSGRenderMode, u32 components); // TODO: Should be renamed to LoadShader
static bool SetShader(DSTALPHA_MODE dstAlphaMode, u32 components); // TODO: Should be renamed to LoadShader
static bool InsertByteCode(const PIXELSHADERUID &uid, const void* bytecode, unsigned int bytecodelen);

static ID3D11PixelShader* GetActiveShader() { return last_entry->shader; }
Expand Down
6 changes: 3 additions & 3 deletions Source/Plugins/Plugin_VideoDX11/Src/Render.cpp
Expand Up @@ -1224,11 +1224,11 @@ void Renderer::RestoreAPIState()
BPFunctions::SetScissor();
}

void Renderer::ApplyState(u32 mode)
void Renderer::ApplyState(bool bUseDstAlpha)
{
HRESULT hr;

if (mode & RSM_UseDstAlpha)
if (bUseDstAlpha)
{
// Colors should blend against SRC1_ALPHA
if (gx_state.blenddc.RenderTarget[0].SrcBlend == D3D11_BLEND_SRC_ALPHA)
Expand Down Expand Up @@ -1288,7 +1288,7 @@ void Renderer::ApplyState(u32 mode)

D3D::stateman->Apply();

if (mode & RSM_UseDstAlpha)
if (bUseDstAlpha)
{
// restore actual state
SetBlendMode(false);
Expand Down
2 changes: 1 addition & 1 deletion Source/Plugins/Plugin_VideoDX11/Src/Render.h
Expand Up @@ -25,7 +25,7 @@ class Renderer : public ::Renderer
void SetInterlacingMode();

// TODO: Fix confusing names (see ResetAPIState and RestoreAPIState)
void ApplyState(u32 mode);
void ApplyState(bool bUseDstAlpha);
void RestoreState();

void ApplyCullDisable();
Expand Down
4 changes: 2 additions & 2 deletions Source/Plugins/Plugin_VideoDX11/Src/VertexManager.cpp
Expand Up @@ -249,7 +249,7 @@ void VertexManager::vFlush()
bpmem.zcontrol.pixel_format == PIXELFMT_RGBA6_Z24;

if (!PixelShaderCache::SetShader(
useDstAlpha ? PSGRENDER_DSTALPHA_DUAL_SOURCE_BLEND : PSGRENDER_NORMAL,
useDstAlpha ? DSTALPHA_DUAL_SOURCE_BLEND : DSTALPHA_NONE,
g_nativeVertexFmt->m_components))
{
GFX_DEBUGGER_PAUSE_LOG_AT(NEXT_ERROR,true,{printf("Fail to set pixel shader\n");});
Expand All @@ -264,7 +264,7 @@ void VertexManager::vFlush()
unsigned int stride = g_nativeVertexFmt->GetVertexStride();
g_nativeVertexFmt->SetupVertexPointers();

g_renderer->ApplyState(useDstAlpha ? RSM_UseDstAlpha : RSM_None);
g_renderer->ApplyState(useDstAlpha);
LoadBuffers();
Draw(stride);

Expand Down
12 changes: 6 additions & 6 deletions Source/Plugins/Plugin_VideoDX9/Src/PixelShaderCache.cpp
Expand Up @@ -330,19 +330,19 @@ void PixelShaderCache::Shutdown()
unique_shaders.clear();
}

bool PixelShaderCache::SetShader(PSGRENDER_MODE PSGRenderMode, u32 components)
bool PixelShaderCache::SetShader(DSTALPHA_MODE dstAlphaMode, u32 components)
{
const API_TYPE api = ((D3D::GetCaps().PixelShaderVersion >> 8) & 0xFF) < 3 ? API_D3D9_SM20 : API_D3D9_SM30;
PIXELSHADERUID uid;
GetPixelShaderId(&uid, PSGRenderMode, components);
GetPixelShaderId(&uid, dstAlphaMode, components);

// Check if the shader is already set
if (last_entry)
{
if (uid == last_uid)
{
GFX_DEBUGGER_PAUSE_AT(NEXT_PIXEL_SHADER_CHANGE, true);
ValidatePixelShaderIDs(api, last_entry->safe_uid, last_entry->code, PSGRenderMode, components);
ValidatePixelShaderIDs(api, last_entry->safe_uid, last_entry->code, dstAlphaMode, components);
return last_entry->shader != NULL;
}
}
Expand All @@ -359,13 +359,13 @@ bool PixelShaderCache::SetShader(PSGRENDER_MODE PSGRenderMode, u32 components)

if (entry.shader) D3D::SetPixelShader(entry.shader);
GFX_DEBUGGER_PAUSE_AT(NEXT_PIXEL_SHADER_CHANGE, true);
ValidatePixelShaderIDs(api, entry.safe_uid, entry.code, PSGRenderMode, components);
ValidatePixelShaderIDs(api, entry.safe_uid, entry.code, dstAlphaMode, components);
return (entry.shader != NULL);
}


// Need to compile a new shader
const char *code = GeneratePixelShaderCode(PSGRenderMode, api, components);
const char *code = GeneratePixelShaderCode(dstAlphaMode, api, components);

if (g_ActiveConfig.bEnableShaderDebugging)
{
Expand Down Expand Up @@ -401,7 +401,7 @@ bool PixelShaderCache::SetShader(PSGRENDER_MODE PSGRenderMode, u32 components)
if (g_ActiveConfig.bEnableShaderDebugging && success)
{
PixelShaders[uid].code = code;
GetSafePixelShaderId(&PixelShaders[uid].safe_uid, PSGRenderMode, components);
GetSafePixelShaderId(&PixelShaders[uid].safe_uid, dstAlphaMode, components);
}

GFX_DEBUGGER_PAUSE_AT(NEXT_PIXEL_SHADER_CHANGE, true);
Expand Down
2 changes: 1 addition & 1 deletion Source/Plugins/Plugin_VideoDX9/Src/PixelShaderCache.h
Expand Up @@ -63,7 +63,7 @@ class PixelShaderCache
public:
static void Init();
static void Shutdown();
static bool SetShader(PSGRENDER_MODE PSGRenderMode, u32 componets);
static bool SetShader(DSTALPHA_MODE dstAlphaMode, u32 componets);
static bool InsertByteCode(const PIXELSHADERUID &uid, const u8 *bytecode, int bytecodelen, bool activate);
static LPDIRECT3DPIXELSHADER9 GetColorMatrixProgram(int SSAAMode);
static LPDIRECT3DPIXELSHADER9 GetColorCopyProgram(int SSAAMode);
Expand Down
40 changes: 5 additions & 35 deletions Source/Plugins/Plugin_VideoDX9/Src/Render.cpp
Expand Up @@ -247,7 +247,6 @@ void TeardownDeviceObjects()
// Init functions
Renderer::Renderer()
{
Renderer::LastMode = RSM_None;
st = new char[32768];

int fullScreenRes, x, y, w_temp, h_temp;
Expand Down Expand Up @@ -1202,49 +1201,20 @@ void Renderer::Swap(u32 xfbAddr, FieldType field, u32 fbWidth, u32 fbHeight,cons
XFBWrited = false;
}

void Renderer::ApplyState(u32 mode)
void Renderer::ApplyState(bool bUseDstAlpha)
{
if(mode & RSM_Zcomploc)
{
D3D::ChangeRenderState(D3DRS_COLORWRITEENABLE, 0);
}

if(mode & RSM_Multipass)
{
D3D::ChangeRenderState(D3DRS_ZENABLE, TRUE);
D3D::ChangeRenderState(D3DRS_ZWRITEENABLE, false);
D3D::ChangeRenderState(D3DRS_ZFUNC, D3DCMP_EQUAL);
}

if (mode & RSM_UseDstAlpha)
if (bUseDstAlpha)
{
D3D::ChangeRenderState(D3DRS_COLORWRITEENABLE, D3DCOLORWRITEENABLE_ALPHA);
D3D::ChangeRenderState(D3DRS_ALPHABLENDENABLE, false);
}
Renderer::LastMode |= mode;
}

void Renderer::RestoreState()
{
if(Renderer::LastMode & RSM_Zcomploc)
{
D3D::RefreshRenderState(D3DRS_COLORWRITEENABLE);
}

if(Renderer::LastMode & RSM_Multipass)
{
D3D::RefreshRenderState(D3DRS_ALPHABLENDENABLE);
D3D::RefreshRenderState(D3DRS_ZENABLE);
D3D::RefreshRenderState(D3DRS_ZWRITEENABLE);
D3D::RefreshRenderState(D3DRS_ZFUNC);
}

if(Renderer::LastMode & RSM_UseDstAlpha)
{
D3D::RefreshRenderState(D3DRS_COLORWRITEENABLE);
D3D::RefreshRenderState(D3DRS_ALPHABLENDENABLE);
}
Renderer::LastMode = RSM_None;
D3D::RefreshRenderState(D3DRS_COLORWRITEENABLE);
D3D::RefreshRenderState(D3DRS_ALPHABLENDENABLE);

// TODO: Enable this code. Caused glitches for me however (neobrain)
// for (unsigned int i = 0; i < 8; ++i)
// D3D::dev->SetTexture(i, NULL);
Expand Down
4 changes: 1 addition & 3 deletions Source/Plugins/Plugin_VideoDX9/Src/Render.h
Expand Up @@ -9,8 +9,6 @@ namespace DX9

class Renderer : public ::Renderer
{
private:
u32 LastMode;
public:
Renderer();
~Renderer();
Expand All @@ -26,7 +24,7 @@ class Renderer : public ::Renderer
void SetSamplerState(int stage,int texindex);
void SetInterlacingMode();

void ApplyState(u32 mode);
void ApplyState(bool bUseDstAlpha);
void RestoreState();

void RenderText(const char* pstr, int left, int top, u32 color);
Expand Down

0 comments on commit 08a9c66

Please sign in to comment.