diff --git a/Source/Core/Common/Src/LinearDiskCache.cpp b/Source/Core/Common/Src/LinearDiskCache.cpp index 6fe72df549..fbad27f670 100644 --- a/Source/Core/Common/Src/LinearDiskCache.cpp +++ b/Source/Core/Common/Src/LinearDiskCache.cpp @@ -22,7 +22,7 @@ static const char ID[4] = {'D', 'C', 'A', 'C'}; // Update this to the current SVN revision every time you change shader generation code. // We don't automatically get this from SVN_REV because that would mean regenerating the // shader cache for every revision, graphics-related or not, which is simply annoying. -const int version = 5520; +const int version = 5597; LinearDiskCache::LinearDiskCache() : file_(NULL), num_entries_(0) { diff --git a/Source/Core/VideoCommon/Src/BPMemory.h b/Source/Core/VideoCommon/Src/BPMemory.h index 0a62bea162..80312baa68 100644 --- a/Source/Core/VideoCommon/Src/BPMemory.h +++ b/Source/Core/VideoCommon/Src/BPMemory.h @@ -108,6 +108,15 @@ // Tev/combiner things +#define TEVSCALE_1 0 +#define TEVSCALE_2 1 +#define TEVSCALE_4 2 +#define TEVDIVIDE_2 3 + +#define TEVCMP_R8 0 +#define TEVCMP_GR16 1 +#define TEVCMP_BGR24 2 +#define TEVCMP_RGB8 3 #define TEVOP_ADD 0 #define TEVOP_SUB 1 @@ -173,13 +182,10 @@ enum Compare #define ZTEXTURE_ADD 1 #define ZTEXTURE_REPLACE 2 -enum TevBias -{ - TB_ZERO = 0, - TB_ADDHALF = 1, - TB_SUBHALF = 2, - TB_COMPARE = 3, -}; +#define TevBias_ZERO 0 +#define TevBias_ADDHALF 1 +#define TevBias_SUBHALF 2 +#define TevBias_COMPARE 3 enum AlphaOp { diff --git a/Source/Core/VideoCommon/Src/PixelShaderGen.cpp b/Source/Core/VideoCommon/Src/PixelShaderGen.cpp index 5fd720c73f..aee94f3ace 100644 --- a/Source/Core/VideoCommon/Src/PixelShaderGen.cpp +++ b/Source/Core/VideoCommon/Src/PixelShaderGen.cpp @@ -157,13 +157,13 @@ const float epsilon8bit = 1.0f / 255.0f; static const char *tevKSelTableC[] = // KCSEL { "1.0f,1.0f,1.0f", // 1 = 0x00 - "0.8745098f,0.8745098f,0.8745098f", // 7_8 = 0x01 - "0.7490196f,0.7490196f,0.7490196f", // 3_4 = 0x02 - "0.6235294f,0.6235294f,0.6235294f", // 5_8 = 0x03 - "0.4980392f,0.4980392f,0.4980392f", // 1_2 = 0x04 - "0.372549f,0.372549f,0.372549f", // 3_8 = 0x05 - "0.2470588f,0.2470588f,0.2470588f", // 1_4 = 0x06 - "0.1215686f,0.1215686f,0.1215686f", // 1_8 = 0x07 + "(223.0f/255.0f),(223.0f/255.0f),(223.0f/255.0f)", // 7_8 = 0x01 + "(191.0f/255.0f),(191.0f/255.0f),(191.0f/255.0f)", // 3_4 = 0x02 + "(159.0f/255.0f),(159.0f/255.0f),(159.0f/255.0f)", // 5_8 = 0x03 + "(127.0f/255.0f),(127.0f/255.0f),(127.0f/255.0f)", // 1_2 = 0x04 + "(95.0f/255.0f),(95.0f/255.0f),(95.0f/255.0f)", // 3_8 = 0x05 + "(63.0f/255.0f),(63.0f/255.0f),(63.0f/255.0f)", // 1_4 = 0x06 + "(31.0f/255.0f),(31.0f/255.0f),(31.0f/255.0f)", // 1_8 = 0x07 "ERROR", // 0x08 "ERROR", // 0x09 "ERROR", // 0x0a @@ -193,13 +193,13 @@ static const char *tevKSelTableC[] = // KCSEL static const char *tevKSelTableA[] = // KASEL { "1.0f", // 1 = 0x00 - "0.8745098f",// 7_8 = 0x01 - "0.7490196f", // 3_4 = 0x02 - "0.6235294f",// 5_8 = 0x03 - "0.4980392f", // 1_2 = 0x04 - "0.372549f",// 3_8 = 0x05 - "0.2470588f", // 1_4 = 0x06 - "0.1215686f",// 1_8 = 0x07 + "(223.0f/255.0f)",// 7_8 = 0x01 + "(191.0f/255.0f)", // 3_4 = 0x02 + "(159.0f/255.0f)",// 5_8 = 0x03 + "(127.0f/255.0f)", // 1_2 = 0x04 + "(95.0f/255.0f)",// 3_8 = 0x05 + "(63.0f/255.0f)", // 1_4 = 0x06 + "(31.0f/255.0f)",// 1_8 = 0x07 "ERROR", // 0x08 "ERROR", // 0x09 "ERROR", // 0x0a @@ -237,8 +237,8 @@ static const char *tevScaleTable[] = // CS static const char *tevBiasTable[] = // TB { "", // ZERO, - "+0.4980392f", // ADDHALF, - "-0.4980392f", // SUBHALF, + "+(127.0f/255.0f)", // ADDHALF, + "-(127.0f/255.0f)", // SUBHALF, "", }; @@ -247,13 +247,6 @@ static const char *tevOpTable[] = { // TEV "-", // TEVOP_SUB = 1, }; -//static const char *tevCompOpTable[] = { ">", "==" }; - -#define TEVCMP_R8 0 -#define TEVCMP_GR16 1 -#define TEVCMP_BGR24 2 -#define TEVCMP_RGB8 3 - static const char *tevCInputTable[] = // CC { "(prev.rgb)", // CPREV, @@ -269,7 +262,7 @@ static const char *tevCInputTable[] = // CC "(rastemp.rgb)", // RASC, "(rastemp.aaa)", // RASA, "float3(1.0f,1.0f,1.0f)", // ONE - "float3(0.4980392f,0.4980392f,0.4980392f)", // HALF + "float3((127.0f/255.0f),(127.0f/255.0f),(127.0f/255.0f))", // HALF "(konsttemp.rgb)", //"konsttemp.rgb", // KONST "float3(0.0f,0.0f,0.0f)", // ZERO ///aded extra values to map clamped values @@ -286,7 +279,7 @@ static const char *tevCInputTable[] = // CC "(rastemp.rgb)", // RASC, "(rastemp.aaa)", // RASA, "float3(1.0f,1.0f,1.0f)", // ONE - "float3(0.4980392f,0.4980392f,0.4980392f)", // HALF + "float3((127.0f/255.0f),(127.0f/255.0f),(127.0f/255.0f))", // HALF "(konsttemp.rgb)", //"konsttemp.rgb", // KONST "float3(0.0f,0.0f,0.0f)", // ZERO "PADERROR", "PADERROR", "PADERROR", "PADERROR", @@ -510,7 +503,7 @@ const char *GeneratePixelShaderCode(u32 texture_mask, bool dstAlphaEnable, u32 H } // emulation of unisgned 8 overflow when casting - WRITE(p, "prev = frac(4.0f + prev * 0.99609375f) * 1.00392157f;\n");//fmod(fmod(prev * 255.0f,256.0f) + 256.0f,256.0f) * 0.0039215686f;\n"); + WRITE(p, "prev = frac(4.0f + prev * (255.0f/256.0f)) * (256.0f/255.0f);\n"); if (!WriteAlphaTest(p, HLSL)) { @@ -719,14 +712,49 @@ static void WriteStage(char *&p, int n, u32 texture_mask, u32 HLSL) if (bCKonst || bAKonst ) WRITE(p, "konsttemp=float4(%s,%s);\n",tevKSelTableC[kc],tevKSelTableA[ka]); - if(cc.a == 0 || cc.a == 1 || cc.b == 0 || cc.b == 1 || cc.c == 0 || cc.c == 1 || ac.a == 0 || ac.b == 0 || ac.c == 0) - WRITE(p, "cprev = frac(4.0f + prev * 0.99609375f) * 1.00392157f;\n"); - if(cc.a == 2 || cc.a == 3 || cc.b == 2 || cc.b == 3 || cc.c == 2 || cc.c == 3 || ac.a == 1 || ac.b == 1 || ac.c == 1) - WRITE(p, "cc0 = frac(4.0f + c0 * 0.99609375f) * 1.00392157f;\n"); - if(cc.a == 4 || cc.a == 5 || cc.b == 4 || cc.b == 5 || cc.c == 4 || cc.c == 5 || ac.a == 2 || ac.b == 2 || ac.c == 2) - WRITE(p, "cc1 = frac(4.0f + c1 * 0.99609375f) * 1.00392157f;\n"); - if(cc.a == 6 || cc.a == 7 || cc.b == 6 || cc.b == 7 || cc.c == 6 || cc.c == 7 || ac.a == 3 || ac.b == 3 || ac.c == 3) - WRITE(p, "cc2 = frac(4.0f + c2 * 0.99609375f) * 1.00392157f;\n"); + if(cc.a == TEVCOLORARG_CPREV + || cc.a == TEVCOLORARG_APREV + || cc.b == TEVCOLORARG_CPREV + || cc.b == TEVCOLORARG_APREV + || cc.c == TEVCOLORARG_CPREV + || cc.c == TEVCOLORARG_APREV + || ac.a == TEVALPHAARG_APREV + || ac.b == TEVALPHAARG_APREV + || ac.c == TEVALPHAARG_APREV) + WRITE(p, "cprev = frac(4.0f + prev * (255.0f/256.0f)) * (256.0f/255.0f);\n"); + + if(cc.a == TEVCOLORARG_C0 + || cc.a == TEVCOLORARG_A0 + || cc.b == TEVCOLORARG_C0 + || cc.b == TEVCOLORARG_A0 + || cc.c == TEVCOLORARG_C0 + || cc.c == TEVCOLORARG_A0 + || ac.a == TEVALPHAARG_A0 + || ac.b == TEVALPHAARG_A0 + || ac.c == TEVALPHAARG_A0) + WRITE(p, "cc0 = frac(4.0f + c0 * (255.0f/256.0f)) * (256.0f/255.0f);\n"); + + if(cc.a == TEVCOLORARG_C1 + || cc.a == TEVCOLORARG_A1 + || cc.b == TEVCOLORARG_C1 + || cc.b == TEVCOLORARG_A1 + || cc.c == TEVCOLORARG_C1 + || cc.c == TEVCOLORARG_A1 + || ac.a == TEVALPHAARG_A1 + || ac.b == TEVALPHAARG_A1 + || ac.c == TEVALPHAARG_A1) + WRITE(p, "cc1 = frac(4.0f + c1 * (255.0f/256.0f)) * (256.0f/255.0f);\n"); + + if(cc.a == TEVCOLORARG_C2 + || cc.a == TEVCOLORARG_A2 + || cc.b == TEVCOLORARG_C2 + || cc.b == TEVCOLORARG_A2 + || cc.c == TEVCOLORARG_C2 + || cc.c == TEVCOLORARG_A2 + || ac.a == TEVALPHAARG_A2 + || ac.b == TEVALPHAARG_A2 + || ac.c == TEVALPHAARG_A2) + WRITE(p, "cc2 = frac(4.0f + c2 * (255.0f/256.0f)) * (256.0f/255.0f);\n"); if (cc.clamp) WRITE(p, "%s=saturate(", tevCOutputTable[cc.dest]); @@ -734,13 +762,13 @@ static void WriteStage(char *&p, int n, u32 texture_mask, u32 HLSL) WRITE(p, "%s=", tevCOutputTable[cc.dest]); // combine the color channel - if (cc.bias != 3) // if not compare + if (cc.bias != TevBias_COMPARE) // if not compare { //normal color combiner goes here - if (cc.shift>0) + if (cc.shift > TEVSCALE_1) WRITE(p, "%s*(",tevScaleTable[cc.shift]); - if(!(cc.d == TEVCOLORARG_ZERO && cc.op == 0)) + if(!(cc.d == TEVCOLORARG_ZERO && cc.op == TEVOP_ADD)) WRITE(p, "%s%s",tevCInputTable[cc.d],tevOpTable[cc.op]); if (cc.a == cc.b) @@ -750,11 +778,11 @@ static void WriteStage(char *&p, int n, u32 texture_mask, u32 HLSL) else if (cc.c == TEVCOLORARG_ONE) WRITE(p,"%s",tevCInputTable[cc.b + 16]); else if (cc.a == TEVCOLORARG_ZERO) - WRITE(p,"%s*(trunc(%s * 256.9921875f)*0.00390625f)",tevCInputTable[cc.b + 16],tevCInputTable[cc.c + 16]); + WRITE(p,"%s*%s",tevCInputTable[cc.b + 16],tevCInputTable[cc.c + 16]); else if (cc.b == TEVCOLORARG_ZERO) - WRITE(p,"%s*(float3(1.0f,1.0f,1.0f)-(trunc(%s * 256.9921875f)*0.00390625f))",tevCInputTable[cc.a + 16],tevCInputTable[cc.c + 16]); + WRITE(p,"%s*(float3(1.0f,1.0f,1.0f)-%s)",tevCInputTable[cc.a + 16],tevCInputTable[cc.c + 16]); else - WRITE(p, "lerp(%s,%s,(trunc(%s * 256.9921875f)*0.00390625f))",tevCInputTable[cc.a + 16], tevCInputTable[cc.b + 16],tevCInputTable[cc.c + 16]); + WRITE(p, "lerp(%s,%s,%s)",tevCInputTable[cc.a + 16], tevCInputTable[cc.b + 16],tevCInputTable[cc.c + 16]); WRITE(p, "%s",tevBiasTable[cc.bias]); @@ -780,13 +808,13 @@ static void WriteStage(char *&p, int n, u32 texture_mask, u32 HLSL) else WRITE(p, "%s=", tevAOutputTable[ac.dest]); - if (ac.bias != 3) // if not compare + if (ac.bias != TevBias_COMPARE) // if not compare { //normal alpha combiner goes here - if (ac.shift>0) + if (ac.shift > TEVSCALE_1) WRITE(p, "%s*(",tevScaleTable[ac.shift]); - if(!(ac.d == TEVALPHAARG_ZERO && ac.op == 0)) + if(!(ac.d == TEVALPHAARG_ZERO && ac.op == TEVOP_ADD)) WRITE(p, "%s.a%s",tevAInputTable[ac.d],tevOpTable[ac.op]); if (ac.a == ac.b) @@ -794,11 +822,11 @@ static void WriteStage(char *&p, int n, u32 texture_mask, u32 HLSL) else if (ac.c == TEVALPHAARG_ZERO) WRITE(p,"%s.a",tevAInputTable[ac.a + 8]); else if (ac.a == TEVALPHAARG_ZERO) - WRITE(p,"%s.a*(trunc(%s.a * 256.9921875f)*0.00390625f)",tevAInputTable[ac.b + 8],tevAInputTable[ac.c + 8]); + WRITE(p,"%s.a*%s.a",tevAInputTable[ac.b + 8],tevAInputTable[ac.c + 8]); else if (ac.b == TEVALPHAARG_ZERO) - WRITE(p,"%s.a*(1.0f-(trunc(%s.a * 256.9921875f)*0.00390625f))",tevAInputTable[ac.a + 8],tevAInputTable[ac.c + 8]); + WRITE(p,"%s.a*(1.0f-%s.a)",tevAInputTable[ac.a + 8],tevAInputTable[ac.c + 8]); else - WRITE(p, "lerp(%s.a,%s.a,(trunc(%s.a * 256.9921875f)*0.00390625f))",tevAInputTable[ac.a + 8],tevAInputTable[ac.b + 8],tevAInputTable[ac.c + 8]); + WRITE(p, "lerp(%s.a,%s.a,%s.a)",tevAInputTable[ac.a + 8],tevAInputTable[ac.b + 8],tevAInputTable[ac.c + 8]); WRITE(p, "%s",tevBiasTable[ac.bias]); diff --git a/Source/Core/VideoCommon/Src/TextureConversionShader.cpp b/Source/Core/VideoCommon/Src/TextureConversionShader.cpp index b3d22a71a3..eecc620fec 100644 --- a/Source/Core/VideoCommon/Src/TextureConversionShader.cpp +++ b/Source/Core/VideoCommon/Src/TextureConversionShader.cpp @@ -111,6 +111,7 @@ void WriteSwizzler(char*& p, u32 format,bool HLSL) if(HLSL) { + WRITE(p, " sampleUv = sampleUv + float2(0.0f,1.0f);\n");// still to determine the reason for this WRITE(p, " sampleUv = sampleUv / blkDims.zw;\n"); } } @@ -163,6 +164,7 @@ void Write32BitSwizzler(char*& p, u32 format, bool HLSL) if(HLSL) { + WRITE(p, " sampleUv = sampleUv + float2(0.0f,1.0f);\n");// still to determine the reason for this WRITE(p, " sampleUv = sampleUv / blkDims.zw;\n"); } } diff --git a/Source/Core/VideoCommon/Src/VertexLoader.cpp b/Source/Core/VideoCommon/Src/VertexLoader.cpp index 797cacd0ce..0093ae7581 100644 --- a/Source/Core/VideoCommon/Src/VertexLoader.cpp +++ b/Source/Core/VideoCommon/Src/VertexLoader.cpp @@ -598,12 +598,12 @@ void VertexLoader::RunVertices(int vtx_attr_group, int primitive, int count) int startv = 0, extraverts = 0; int v = 0; - int remainingVerts2 = VertexManager::GetRemainingVertices(primitive); + //int remainingVerts2 = VertexManager::GetRemainingVertices(primitive); while (v < count) { int remainingVerts = VertexManager::GetRemainingSize() / native_stride; - if (remainingVerts2 - v + startv < remainingVerts) - remainingVerts = remainingVerts2 - v + startv; + //if (remainingVerts2 - v + startv < remainingVerts) + //remainingVerts = remainingVerts2 - v + startv; if (remainingVerts < granularity) { INCSTAT(stats.thisFrame.numBufferSplits); // This buffer full - break current primitive and flush, to switch to the next buffer. @@ -611,7 +611,7 @@ void VertexLoader::RunVertices(int vtx_attr_group, int primitive, int count) if (v - startv > 0) VertexManager::AddVertices(primitive, v - startv + extraverts); VertexManager::Flush(); - remainingVerts2 = VertexManager::GetRemainingVertices(primitive); + //remainingVerts2 = VertexManager::GetRemainingVertices(primitive); // Why does this need to be so complicated? switch (primitive) { case 3: // triangle strip, copy last two vertices diff --git a/Source/Plugins/Plugin_VideoDX9/Src/D3DBase.cpp b/Source/Plugins/Plugin_VideoDX9/Src/D3DBase.cpp index 806b2fd53f..d7b2175e99 100644 --- a/Source/Plugins/Plugin_VideoDX9/Src/D3DBase.cpp +++ b/Source/Plugins/Plugin_VideoDX9/Src/D3DBase.cpp @@ -148,10 +148,15 @@ void Enumerate() bool isNvidia = a.ident.VendorId == VENDOR_NVIDIA; // Add SuperSamples modes - a.aa_levels.push_back(AALevel("None", D3DMULTISAMPLE_NONE, 0)); - a.aa_levels.push_back(AALevel("2.25x SSAA", D3DMULTISAMPLE_NONE, 0)); - a.aa_levels.push_back(AALevel("4x SSAA", D3DMULTISAMPLE_NONE, 0)); - a.aa_levels.push_back(AALevel("9x SSAA", D3DMULTISAMPLE_NONE, 0)); + a.aa_levels.push_back(AALevel("1x EFB - SSAA NONE", D3DMULTISAMPLE_NONE, 0)); + a.aa_levels.push_back(AALevel("1x EFB - 4x SSAA", D3DMULTISAMPLE_NONE, 0)); + a.aa_levels.push_back(AALevel("1x EFB - 9x SSAA", D3DMULTISAMPLE_NONE, 0)); + a.aa_levels.push_back(AALevel("2x EFB - SSAA NONE", D3DMULTISAMPLE_NONE, 0)); + a.aa_levels.push_back(AALevel("2x EFB - 4x SSAA", D3DMULTISAMPLE_NONE, 0)); + a.aa_levels.push_back(AALevel("2x EFB - 9x SSAA", D3DMULTISAMPLE_NONE, 0)); + a.aa_levels.push_back(AALevel("3x EFB - SSAA NONE", D3DMULTISAMPLE_NONE, 0)); + a.aa_levels.push_back(AALevel("3x EFB - 4x SSAA", D3DMULTISAMPLE_NONE, 0)); + a.aa_levels.push_back(AALevel("3x EFB - 9x SSAA", D3DMULTISAMPLE_NONE, 0)); //Add multisample modes //disable them will they are not implemnted /* diff --git a/Source/Plugins/Plugin_VideoDX9/Src/FramebufferManager.cpp b/Source/Plugins/Plugin_VideoDX9/Src/FramebufferManager.cpp index 5a7248bd4d..6149cbde80 100644 --- a/Source/Plugins/Plugin_VideoDX9/Src/FramebufferManager.cpp +++ b/Source/Plugins/Plugin_VideoDX9/Src/FramebufferManager.cpp @@ -325,31 +325,12 @@ void FramebufferManager::copyToVirtualXFB(u32 xfbAddr, u32 fbWidth, u32 fbHeight float SuperSampleCompensation = 1.0f; float scaleX = Renderer::GetXFBScaleX(); float scaleY = Renderer::GetXFBScaleY(); - if(g_ActiveConfig.iMultisampleMode > 0 && g_ActiveConfig.iMultisampleMode < 4) - { - switch (g_ActiveConfig.iMultisampleMode) - { - case 1: - break; - case 2: - SuperSampleCompensation = 0.5f; - break; - case 3: - SuperSampleCompensation = 1.0f/3.0f; - break; - default: - break; - }; - } - - scaleX *= SuperSampleCompensation ; - scaleY *= SuperSampleCompensation; TargetRectangle targetSource,efbSource; efbSource = Renderer::ConvertEFBRectangle(sourceRc); - targetSource.top = (sourceRc.top *scaleY); - targetSource.bottom = (sourceRc.bottom *scaleY); - targetSource.left = (sourceRc.left *scaleX); - targetSource.right = (sourceRc.right * scaleX); + targetSource.top = (int)(sourceRc.top *scaleY); + targetSource.bottom = (int)(sourceRc.bottom *scaleY); + targetSource.left = (int)(sourceRc.left *scaleX); + targetSource.right = (int)(sourceRc.right * scaleX); int target_width = targetSource.right - targetSource.left; int target_height = targetSource.bottom - targetSource.top; if (it != m_virtualXFBList.end()) @@ -445,7 +426,6 @@ void FramebufferManager::copyToVirtualXFB(u32 xfbAddr, u32 fbWidth, u32 fbHeight D3D::ChangeSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR); - int SSAAMode = ( g_ActiveConfig.iMultisampleMode > 3 )? 0 : g_ActiveConfig.iMultisampleMode; D3D::drawShadedTexQuad( read_texture, &sourcerect, @@ -453,8 +433,8 @@ void FramebufferManager::copyToVirtualXFB(u32 xfbAddr, u32 fbWidth, u32 fbHeight Renderer::GetFullTargetHeight(), target_width, target_height, - PixelShaderCache::GetColorCopyProgram(SSAAMode), - (SSAAMode != 0)? VertexShaderCache::GetFSAAVertexShader() : VertexShaderCache::GetSimpleVertexShader()); + PixelShaderCache::GetColorCopyProgram( g_ActiveConfig.iMultisampleMode), + VertexShaderCache::GetSimpleVertexShader( g_ActiveConfig.iMultisampleMode)); D3D::RefreshSamplerState(0, D3DSAMP_MINFILTER); diff --git a/Source/Plugins/Plugin_VideoDX9/Src/PixelShaderCache.cpp b/Source/Plugins/Plugin_VideoDX9/Src/PixelShaderCache.cpp index ec6a755bc3..e309b7bcbf 100644 --- a/Source/Plugins/Plugin_VideoDX9/Src/PixelShaderCache.cpp +++ b/Source/Plugins/Plugin_VideoDX9/Src/PixelShaderCache.cpp @@ -42,26 +42,26 @@ LinearDiskCache g_ps_disk_cache; static float lastPSconstants[C_COLORMATRIX+16][4]; -static LPDIRECT3DPIXELSHADER9 s_ColorMatrixProgram[4]; -static LPDIRECT3DPIXELSHADER9 s_ColorCopyProgram[4]; -static LPDIRECT3DPIXELSHADER9 s_DepthMatrixProgram[4]; +static LPDIRECT3DPIXELSHADER9 s_ColorMatrixProgram[3]; +static LPDIRECT3DPIXELSHADER9 s_ColorCopyProgram[3]; +static LPDIRECT3DPIXELSHADER9 s_DepthMatrixProgram[3]; static LPDIRECT3DPIXELSHADER9 s_ClearProgram = 0; LPDIRECT3DPIXELSHADER9 PixelShaderCache::GetColorMatrixProgram(int SSAAMode) { - return s_ColorMatrixProgram[SSAAMode]; + return s_ColorMatrixProgram[SSAAMode % 3]; } LPDIRECT3DPIXELSHADER9 PixelShaderCache::GetDepthMatrixProgram(int SSAAMode) { - return s_DepthMatrixProgram[SSAAMode]; + return s_DepthMatrixProgram[SSAAMode % 3]; } LPDIRECT3DPIXELSHADER9 PixelShaderCache::GetColorCopyProgram(int SSAAMode) { - return s_ColorCopyProgram[SSAAMode]; + return s_ColorCopyProgram[SSAAMode % 3]; } LPDIRECT3DPIXELSHADER9 PixelShaderCache::GetClearProgram() @@ -132,18 +132,7 @@ void PixelShaderCache::Init() "in float2 uv0 : TEXCOORD0){\n" "ocol0 = tex2D(samp0,uv0);\n" "}\n"); - s_ColorCopyProgram[0] = D3D::CompileAndCreatePixelShader(pprog, (int)strlen(pprog)); - - //2 samples - sprintf(pprog, "uniform sampler samp0 : register(s0);\n" - "void main(\n" - "out float4 ocol0 : COLOR0,\n" - "in float4 uv0 : TEXCOORD0,\n" - "in float4 uv1 : TEXCOORD1,\n" - "in float4 uv2 : TEXCOORD2){\n" - "ocol0 = (tex2D(samp0,uv1.xy) + tex2D(samp0,uv2.xy))*0.5f;\n" - "}\n"); - s_ColorCopyProgram[1] = D3D::CompileAndCreatePixelShader(pprog, (int)strlen(pprog)); + s_ColorCopyProgram[0] = D3D::CompileAndCreatePixelShader(pprog, (int)strlen(pprog)); //4 Samples sprintf(pprog, "uniform sampler samp0 : register(s0);\n" @@ -156,7 +145,7 @@ void PixelShaderCache::Init() "in float4 uv4 : TEXCOORD4){\n" "ocol0 = (tex2D(samp0,uv1.xy) + tex2D(samp0,uv2.xy) + tex2D(samp0,uv3.xy) + tex2D(samp0,uv4.xy))*0.25f;\n" "}\n"); - s_ColorCopyProgram[2] = D3D::CompileAndCreatePixelShader(pprog, (int)strlen(pprog)); + s_ColorCopyProgram[1] = D3D::CompileAndCreatePixelShader(pprog, (int)strlen(pprog)); //9 Samples sprintf(pprog, "uniform sampler samp0 : register(s0);\n" @@ -169,7 +158,7 @@ void PixelShaderCache::Init() "in float4 uv4 : TEXCOORD4){\n" "ocol0 = (tex2D(samp0,uv1.xy) + tex2D(samp0,uv1.wz) + tex2D(samp0,uv2.xy) + tex2D(samp0,uv2.wz) + tex2D(samp0,uv3.xy) + tex2D(samp0,uv3.wz) + tex2D(samp0,uv4.xy) + tex2D(samp0,uv4.wz) + tex2D(samp0,uv0.xy))/9.0f;\n" "}\n"); - s_ColorCopyProgram[3] = D3D::CompileAndCreatePixelShader(pprog, (int)strlen(pprog)); + s_ColorCopyProgram[2] = D3D::CompileAndCreatePixelShader(pprog, (int)strlen(pprog)); //Color conversion Programs //1 sample @@ -181,24 +170,8 @@ void PixelShaderCache::Init() "float4 texcol = tex2D(samp0,uv0);\n" "ocol0 = float4(dot(texcol,cColMatrix[0]),dot(texcol,cColMatrix[1]),dot(texcol,cColMatrix[2]),dot(texcol,cColMatrix[3])) + cColMatrix[4];\n" "}\n",C_COLORMATRIX); - s_ColorMatrixProgram[0] = D3D::CompileAndCreatePixelShader(pprog, (int)strlen(pprog)); + s_ColorMatrixProgram[0] = D3D::CompileAndCreatePixelShader(pprog, (int)strlen(pprog)); - //2 samples - sprintf(pprog, "uniform sampler samp0 : register(s0);\n" - "uniform float4 cColMatrix[5] : register(c%d);\n" - "void main(\n" - "out float4 ocol0 : COLOR0,\n" - "in float4 uv0 : TEXCOORD0,\n" - "in float4 uv1 : TEXCOORD1,\n" - "in float4 uv2 : TEXCOORD2,\n" - "in float4 uv3 : TEXCOORD3,\n" - "in float4 uv4 : TEXCOORD4,\n" - "in float4 uv5 : TEXCOORD5){\n" - "float4 texcol = (tex2D(samp0,float2(clamp(uv1.x,uv5.x,uv5.z),clamp(uv1.y,uv5.y,uv5.w))) + tex2D(samp0,float2(clamp(uv2.x,uv5.x,uv5.z),clamp(uv2.y,uv5.y,uv5.w)))) * 0.5f;\n" - "ocol0 = float4(dot(texcol,cColMatrix[0]),dot(texcol,cColMatrix[1]),dot(texcol,cColMatrix[2]),dot(texcol,cColMatrix[3])) + cColMatrix[4];\n" - "}\n",C_COLORMATRIX); - s_ColorMatrixProgram[1] = D3D::CompileAndCreatePixelShader(pprog, (int)strlen(pprog)); - //4 samples sprintf(pprog, "uniform sampler samp0 : register(s0);\n" "uniform float4 cColMatrix[5] : register(c%d);\n" @@ -213,7 +186,7 @@ void PixelShaderCache::Init() "float4 texcol = (tex2D(samp0,float2(clamp(uv1.x,uv5.x,uv5.z),clamp(uv1.y,uv5.y,uv5.w))) + tex2D(samp0,float2(clamp(uv2.x,uv5.x,uv5.z),clamp(uv2.y,uv5.y,uv5.w))) + tex2D(samp0,float2(clamp(uv3.x,uv5.x,uv5.z),clamp(uv3.y,uv5.y,uv5.w))) + tex2D(samp0,float2(clamp(uv4.x,uv5.x,uv5.z),clamp(uv4.y,uv5.y,uv5.w))))*0.25f;\n" "ocol0 = float4(dot(texcol,cColMatrix[0]),dot(texcol,cColMatrix[1]),dot(texcol,cColMatrix[2]),dot(texcol,cColMatrix[3])) + cColMatrix[4];\n" "}\n",C_COLORMATRIX); - s_ColorMatrixProgram[2] = D3D::CompileAndCreatePixelShader(pprog, (int)strlen(pprog)); + s_ColorMatrixProgram[1] = D3D::CompileAndCreatePixelShader(pprog, (int)strlen(pprog)); //9 samples sprintf(pprog, "uniform sampler samp0 : register(s0);\n" @@ -229,7 +202,7 @@ void PixelShaderCache::Init() "float4 texcol = (tex2D(samp0,float2(clamp(uv1.x,uv5.x,uv5.z),clamp(uv1.y,uv5.y,uv5.w))) + tex2D(samp0,float2(clamp(uv1.w,uv5.x,uv5.z),clamp(uv1.z,uv5.y,uv5.w))) + tex2D(samp0,float2(clamp(uv2.x,uv5.x,uv5.z),clamp(uv2.y,uv5.y,uv5.w))) + tex2D(samp0,float2(clamp(uv2.w,uv5.x,uv5.z),clamp(uv2.z,uv5.y,uv5.w))) + tex2D(samp0,float2(clamp(uv3.x,uv5.x,uv5.z),clamp(uv3.y,uv5.y,uv5.w))) + tex2D(samp0,float2(clamp(uv3.w,uv5.x,uv5.z),clamp(uv3.z,uv5.y,uv5.w))) + tex2D(samp0,float2(clamp(uv4.x,uv5.x,uv5.z),clamp(uv4.y,uv5.y,uv5.w))) + tex2D(samp0,float2(clamp(uv4.w,uv5.x,uv5.z),clamp(uv4.z,uv5.y,uv5.w))) + tex2D(samp0,float2(clamp(uv0.x,uv5.x,uv5.z),clamp(uv0.y,uv5.y,uv5.w))))/9;\n" "ocol0 = float4(dot(texcol,cColMatrix[0]),dot(texcol,cColMatrix[1]),dot(texcol,cColMatrix[2]),dot(texcol,cColMatrix[3])) + cColMatrix[4];\n" "}\n",C_COLORMATRIX); - s_ColorMatrixProgram[3] = D3D::CompileAndCreatePixelShader(pprog, (int)strlen(pprog)); + s_ColorMatrixProgram[2] = D3D::CompileAndCreatePixelShader(pprog, (int)strlen(pprog)); //Depth copy programs //1 sample @@ -243,26 +216,8 @@ void PixelShaderCache::Init() "texcol = float4((EncodedDepth.rgb * (16777216.0f/16777215.0f)),1.0f);\n" "ocol0 = float4(dot(texcol,cColMatrix[0]),dot(texcol,cColMatrix[1]),dot(texcol,cColMatrix[2]),dot(texcol,cColMatrix[3])) + cColMatrix[4];\n" "}\n",C_COLORMATRIX); - s_DepthMatrixProgram[0] = D3D::CompileAndCreatePixelShader(pprog, (int)strlen(pprog)); + s_DepthMatrixProgram[0] = D3D::CompileAndCreatePixelShader(pprog, (int)strlen(pprog)); - //2 sample - sprintf(pprog, "uniform sampler samp0 : register(s0);\n" - "uniform float4 cColMatrix[5] : register(c%d);\n" - "void main(\n" - "out float4 ocol0 : COLOR0,\n" - "in float4 uv0 : TEXCOORD0,\n" - "in float4 uv1 : TEXCOORD1,\n" - "in float4 uv2 : TEXCOORD2,\n" - "in float4 uv3 : TEXCOORD3,\n" - "in float4 uv4 : TEXCOORD4,\n" - "in float4 uv5 : TEXCOORD5){\n" - "float4 texcol = (tex2D(samp0,float2(clamp(uv1.x,uv5.x,uv5.z),clamp(uv1.y,uv5.y,uv5.w))) + tex2D(samp0,float2(clamp(uv2.x,uv5.x,uv5.z),clamp(uv2.y,uv5.y,uv5.w)))) * 0.5f;\n" - "float4 EncodedDepth = frac((texcol.r * (16777215.0f/16777216.0f)) * float4(1.0f,255.0f,255.0f*255.0f,255.0f*255.0f*255.0f));\n" - "texcol = float4((EncodedDepth.rgb * (16777216.0f/16777215.0f)),1.0f);\n" - "ocol0 = float4(dot(texcol,cColMatrix[0]),dot(texcol,cColMatrix[1]),dot(texcol,cColMatrix[2]),dot(texcol,cColMatrix[3])) + cColMatrix[4];\n" - "}\n",C_COLORMATRIX); - s_DepthMatrixProgram[1] = D3D::CompileAndCreatePixelShader(pprog, (int)strlen(pprog)); - //4 sample sprintf(pprog, "uniform sampler samp0 : register(s0);\n" "uniform float4 cColMatrix[5] : register(c%d);\n" @@ -279,7 +234,7 @@ void PixelShaderCache::Init() "texcol = float4((EncodedDepth.rgb * (16777216.0f/16777215.0f)),1.0f);\n" "ocol0 = float4(dot(texcol,cColMatrix[0]),dot(texcol,cColMatrix[1]),dot(texcol,cColMatrix[2]),dot(texcol,cColMatrix[3])) + cColMatrix[4];\n" "}\n",C_COLORMATRIX); - s_DepthMatrixProgram[2] = D3D::CompileAndCreatePixelShader(pprog, (int)strlen(pprog)); + s_DepthMatrixProgram[1] = D3D::CompileAndCreatePixelShader(pprog, (int)strlen(pprog)); //9 sample sprintf(pprog, "uniform sampler samp0 : register(s0);\n" @@ -297,7 +252,7 @@ void PixelShaderCache::Init() "texcol = float4((EncodedDepth.rgb * (16777216.0f/16777215.0f)),1.0f);\n" "ocol0 = float4(dot(texcol,cColMatrix[0]),dot(texcol,cColMatrix[1]),dot(texcol,cColMatrix[2]),dot(texcol,cColMatrix[3])) + cColMatrix[4];\n" "}\n",C_COLORMATRIX); - s_DepthMatrixProgram[3] = D3D::CompileAndCreatePixelShader(pprog, (int)strlen(pprog)); + s_DepthMatrixProgram[2] = D3D::CompileAndCreatePixelShader(pprog, (int)strlen(pprog)); Clear(); @@ -325,7 +280,7 @@ void PixelShaderCache::Clear() void PixelShaderCache::Shutdown() { - for(int i = 0;i<4;i++) + for(int i = 0;i<3;i++) { if (s_ColorMatrixProgram[i]) s_ColorMatrixProgram[i]->Release(); s_ColorMatrixProgram[i] = NULL; diff --git a/Source/Plugins/Plugin_VideoDX9/Src/Render.cpp b/Source/Plugins/Plugin_VideoDX9/Src/Render.cpp index 5745694a6a..72d55aa0b2 100644 --- a/Source/Plugins/Plugin_VideoDX9/Src/Render.cpp +++ b/Source/Plugins/Plugin_VideoDX9/Src/Render.cpp @@ -116,85 +116,67 @@ static const D3DBLEND d3dDestFactors[8] = D3DBLEND_INVDESTALPHA }; -// 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] = { - D3DBLENDOP_ADD,//0 - D3DBLENDOP_ADD,//1 - D3DBLENDOP_SUBTRACT,//2 - D3DBLENDOP_ADD,//3 - D3DBLENDOP_REVSUBTRACT,//4 - D3DBLENDOP_ADD,//5 - D3DBLENDOP_MAX,//6 - D3DBLENDOP_ADD,//7 + D3DBLENDOP_ADD, + D3DBLENDOP_ADD, + D3DBLENDOP_SUBTRACT, + D3DBLENDOP_ADD, + D3DBLENDOP_REVSUBTRACT, + D3DBLENDOP_ADD, + D3DBLENDOP_MAX, + D3DBLENDOP_ADD, - D3DBLENDOP_MAX,//8 - D3DBLENDOP_MAX,//9 - D3DBLENDOP_ADD,//10 - D3DBLENDOP_ADD,//11 - D3DBLENDOP_ADD,//12 - D3DBLENDOP_ADD,//13 - D3DBLENDOP_ADD,//14 - D3DBLENDOP_ADD//15 + D3DBLENDOP_MAX, + D3DBLENDOP_MAX, + D3DBLENDOP_ADD, + D3DBLENDOP_ADD, + D3DBLENDOP_ADD, + D3DBLENDOP_ADD, + D3DBLENDOP_ADD, + D3DBLENDOP_ADD }; static const D3DBLEND d3dLogicOpSrcFactors[16] = { - 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_ZERO, + D3DBLEND_DESTCOLOR, + D3DBLEND_ONE, + D3DBLEND_ONE, + D3DBLEND_DESTCOLOR, + D3DBLEND_ZERO, + D3DBLEND_INVDESTCOLOR, + D3DBLEND_INVDESTCOLOR, - D3DBLEND_INVSRCCOLOR,//8 - D3DBLEND_INVSRCCOLOR,//9 - D3DBLEND_INVDESTCOLOR,//10 - D3DBLEND_ONE,//11 - D3DBLEND_INVSRCCOLOR,//12 - D3DBLEND_INVSRCCOLOR,//13 - D3DBLEND_INVDESTCOLOR,//14 - D3DBLEND_ONE//15 + D3DBLEND_INVSRCCOLOR, + D3DBLEND_INVSRCCOLOR, + D3DBLEND_INVDESTCOLOR, + D3DBLEND_ONE, + D3DBLEND_INVSRCCOLOR, + D3DBLEND_INVSRCCOLOR, + D3DBLEND_INVDESTCOLOR, + D3DBLEND_ONE }; static const D3DBLEND d3dLogicOpDestFactors[16] = { - 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_ZERO, + D3DBLEND_ZERO, + D3DBLEND_INVSRCCOLOR, + D3DBLEND_ZERO, + D3DBLEND_ONE, + D3DBLEND_ONE, + D3DBLEND_INVSRCCOLOR, + D3DBLEND_ONE, - D3DBLEND_INVDESTCOLOR,//8 - D3DBLEND_SRCCOLOR,//9 - D3DBLEND_INVDESTCOLOR,//10 - D3DBLEND_INVDESTCOLOR,//11 - D3DBLEND_INVSRCCOLOR,//12 - D3DBLEND_ONE,//13 - D3DBLEND_INVSRCCOLOR,//14 - D3DBLEND_ONE//15 + D3DBLEND_INVDESTCOLOR, + D3DBLEND_SRCCOLOR, + D3DBLEND_INVDESTCOLOR, + D3DBLEND_INVDESTCOLOR, + D3DBLEND_INVSRCCOLOR, + D3DBLEND_ONE, + D3DBLEND_INVSRCCOLOR, + D3DBLEND_ONE }; static const D3DCULL d3dCullModes[4] = @@ -269,8 +251,8 @@ bool Renderer::Init() UpdateActiveConfig(); int fullScreenRes, x, y, w_temp, h_temp; s_blendMode = 0; - // Multisample Anti-aliasing hasn't been implemented yet - int backbuffer_ms_mode = 0; // g_ActiveConfig.iMultisampleMode; + // Multisample Anti-aliasing hasn't been implemented yet use supersamling instead + int backbuffer_ms_mode = 0; g_VideoInitialize.pRequestWindowSize(x, y, w_temp, h_temp); @@ -308,26 +290,9 @@ bool Renderer::Init() s_LastAA = (g_ActiveConfig.iMultisampleMode > 3)?0:g_ActiveConfig.iMultisampleMode; - float SupersampleCoeficient = 1.0f; - switch (s_LastAA) - { - case 1: - break; - case 2: - SupersampleCoeficient = 2.0f; - break; - case 3: - SupersampleCoeficient = 3.0f; - break; - default: - break; - }; - - xScale *= SupersampleCoeficient; - yScale *= SupersampleCoeficient; - - EFBxScale = ceilf(xScale); - EFByScale = ceilf(yScale); + float SupersampleCoeficient = (s_LastAA % 3) + 1; + EFBxScale = (s_LastAA / 3) + 1 * SupersampleCoeficient; + EFByScale = EFBxScale; s_target_width = EFB_WIDTH * EFBxScale; s_target_height = EFB_HEIGHT * EFByScale; @@ -423,16 +388,6 @@ void Renderer::DrawDebugText() std::string T1 = "", T2 = ""; std::vector T0; -/* - int W, H; - sscanf(g_ActiveConfig.cInternalRes, "%dx%d", &W, &H); - std::string OSDM1 = - g_ActiveConfig.bNativeResolution || g_ActiveConfig.b2xResolution ? - (g_ActiveConfig.bNativeResolution ? - StringFromFormat("%i x %i (native)", OSDInternalW, OSDInternalH) - : StringFromFormat("%i x %i (2x)", OSDInternalW, OSDInternalH)) - : StringFromFormat("%i x %i (custom)", W, H); -*/ std::string OSDM1 = StringFromFormat("%i x %i", OSDInternalW, OSDInternalH); std::string OSDM21; switch(g_ActiveConfig.iAspectRatio) @@ -494,16 +449,6 @@ void Renderer::RenderText(const char *text, int left, int top, u32 color) D3D::font.DrawTextScaled((float)left, (float)top, 20, 20, 0.0f, color, text, false); } -void dumpMatrix(D3DXMATRIX &mtx) -{ - for (int y = 0; y < 4; y++) - { - char temp[256]; - 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]); - g_VideoInitialize.pLog(temp, FALSE); - } -} - TargetRectangle Renderer::ConvertEFBRectangle(const EFBRectangle& rc) { int Xstride = (s_Fulltarget_width - s_target_width) / 2; @@ -597,27 +542,14 @@ bool Renderer::SetScissorRect() rc.right = (int)((float)bpmem.scissorBR.x - xoff - 341); rc.bottom = (int)((float)bpmem.scissorBR.y - yoff - 341); - int Xstride = (s_Fulltarget_width - s_target_width) / 2; - int Ystride = (s_Fulltarget_height - s_target_height) / 2; - - rc.left = (int)(rc.left * EFBxScale); - rc.top = (int)(rc.top * EFByScale); - rc.right = (int)(rc.right * EFBxScale); - rc.bottom = (int)(rc.bottom * EFByScale); - if (rc.left < 0) rc.left = 0; if (rc.right < 0) rc.right = 0; - if (rc.left > s_target_width) rc.left = s_target_width; - if (rc.right > s_target_width) rc.right = s_target_width; + if (rc.left > EFB_WIDTH) rc.left = EFB_WIDTH; + if (rc.right > EFB_WIDTH) rc.right = EFB_WIDTH; if (rc.top < 0) rc.top = 0; if (rc.bottom < 0) rc.bottom = 0; - if (rc.top > s_target_height) rc.top = s_target_height; - if (rc.bottom > s_target_height) rc.bottom = s_target_height; - - rc.left += Xstride; - rc.top += Ystride; - rc.right += Xstride; - rc.bottom += Ystride; + if (rc.top > EFB_HEIGHT) rc.top = EFB_HEIGHT; + if (rc.bottom > EFB_HEIGHT) rc.bottom = EFB_HEIGHT; if (rc.left > rc.right) { @@ -631,8 +563,16 @@ bool Renderer::SetScissorRect() rc.bottom = rc.top; rc.top = temp; } - - if (rc.right >= rc.left && rc.bottom >= rc.top) + + int Xstride = (s_Fulltarget_width - s_target_width) / 2; + int Ystride = (s_Fulltarget_height - s_target_height) / 2; + + rc.left = (int)(rc.left * EFBxScale) + Xstride; + rc.top = (int)(rc.top * EFByScale) + Ystride; + rc.right = (int)(rc.right * EFBxScale) + Xstride; + rc.bottom = (int)(rc.bottom * EFByScale) + Ystride; + + if (rc.right != rc.left && rc.bottom != rc.top) { D3D::dev->SetScissorRect(&rc); return true; @@ -761,7 +701,7 @@ u32 Renderer::AccessEFB(EFBAccessType type, int x, int y) Renderer::GetFullTargetHeight(), 4,4, (BufferFormat == FOURCC_RAWZ)?PixelShaderCache::GetColorMatrixProgram(0):PixelShaderCache::GetDepthMatrixProgram(0), - VertexShaderCache::GetSimpleVertexShader()); + VertexShaderCache::GetSimpleVertexShader(0)); D3D::RefreshSamplerState(0, D3DSAMP_MINFILTER); @@ -959,8 +899,7 @@ void Renderer::ClearScreen(const EFBRectangle& rc, bool colorEnable, bool alphaE D3D::ChangeRenderState(D3DRS_ZFUNC, D3DCMP_ALWAYS); D3D::drawClearQuad(color ,(z & 0xFFFFFF) / float(0xFFFFFF),PixelShaderCache::GetClearProgram(),VertexShaderCache::GetClearVertexShader()); if (zEnable) - D3D::RefreshRenderState(D3DRS_ZFUNC); - //D3D::dev->Clear(0, NULL, (colorEnable ? D3DCLEAR_TARGET : 0)| ( zEnable ? D3DCLEAR_ZBUFFER : 0), color | ((alphaEnable)?0:0xFF000000),(z & 0xFFFFFF) / float(0xFFFFFF), 0); + D3D::RefreshRenderState(D3DRS_ZFUNC); UpdateViewport(); SetScissorRect(); } @@ -1118,7 +1057,7 @@ void Renderer::Swap(u32 xfbAddr, FieldType field, u32 fbWidth, u32 fbHeight) drawRc.right = 1; } - D3D::drawShadedTexSubQuad(xfbSource->texture,&sourceRc,xfbSource->texWidth,xfbSource->texHeight,&drawRc,Width,Height,PixelShaderCache::GetColorCopyProgram(0),VertexShaderCache::GetSimpleVertexShader()); + D3D::drawShadedTexSubQuad(xfbSource->texture,&sourceRc,xfbSource->texWidth,xfbSource->texHeight,&drawRc,Width,Height,PixelShaderCache::GetColorCopyProgram(0),VertexShaderCache::GetSimpleVertexShader(0)); } D3D::RefreshSamplerState(0, D3DSAMP_MINFILTER); @@ -1133,7 +1072,6 @@ void Renderer::Swap(u32 xfbAddr, FieldType field, u32 fbWidth, u32 fbHeight) if(s_bScreenshot) { s_criticalScreenshot.Enter(); - // create a R8G8B8 surface for the screenshot (no alpha channel) // otherwise funky screenshots get saved LPDIRECT3DSURFACE9 screenshot_surface; @@ -1145,7 +1083,7 @@ void Renderer::Swap(u32 xfbAddr, FieldType field, u32 fbWidth, u32 fbHeight) } else PanicAlert("Failed to create surface for screenshot!"); - + s_bScreenshot = false; s_criticalScreenshot.Leave(); } @@ -1256,29 +1194,11 @@ void Renderer::Swap(u32 xfbAddr, FieldType field, u32 fbWidth, u32 fbHeight) yScale = (float)(dst_rect.bottom - dst_rect.top) / (float)s_XFB_height; } - float SupersampleCoeficient = 1.0f; - switch (s_LastAA) - { - case 1: - break; - case 2: - SupersampleCoeficient = 2.0f; - break; - case 3: - SupersampleCoeficient = 3.0f; - break; - default: - break; - }; - - xScale *= SupersampleCoeficient; - yScale *= SupersampleCoeficient; - - EFBxScale = ceilf(xScale); - EFByScale = ceilf(yScale); - - s_target_width = EFB_WIDTH * ceilf(EFBxScale); - s_target_height = EFB_HEIGHT * ceilf(EFByScale); + float SupersampleCoeficient = (s_LastAA % 3) + 1; + EFBxScale = (s_LastAA / 3) + 1 * SupersampleCoeficient; + EFByScale = EFBxScale; + s_target_width = EFB_WIDTH * EFBxScale; + s_target_height = EFB_HEIGHT * EFByScale; D3D::dev->SetRenderTarget(0, D3D::GetBackBufferSurface()); D3D::dev->SetDepthStencilSurface(D3D::GetBackBufferDepthSurface()); if(WindowResized) @@ -1413,7 +1333,7 @@ void Renderer::SetSamplerState(int stage, int texindex) min = (tm0.min_filter & 4) ? D3DTEXF_LINEAR : D3DTEXF_POINT; mag = tm0.mag_filter ? D3DTEXF_LINEAR : D3DTEXF_POINT; mip = (tm0.min_filter == 8)?D3DTEXF_NONE:d3dMipFilters[tm0.min_filter & 3]; - if((tm0.min_filter & 3) && (tm0.min_filter != 8) && ((tm1.max_lod >> 4) == 0)) mip = D3DTEXF_NONE; + if((tm0.min_filter & 3) && (tm0.min_filter != 8) && ((tm1.max_lod >> 5) == 0)) mip = D3DTEXF_NONE; } if (texindex) stage += 4; @@ -1429,7 +1349,6 @@ void Renderer::SetSamplerState(int stage, int texindex) D3D::SetSamplerState(stage, D3DSAMP_ADDRESSU, d3dClamps[tm0.wrap_s]); D3D::SetSamplerState(stage, D3DSAMP_ADDRESSV, d3dClamps[tm0.wrap_t]); - //just a test but it seems to work float lodbias = tm0.lod_bias / 32.0f; D3D::SetSamplerState(stage,D3DSAMP_MIPMAPLODBIAS,*(DWORD*)&lodbias); D3D::SetSamplerState(stage,D3DSAMP_MAXMIPLEVEL,tm1.min_lod>>5); diff --git a/Source/Plugins/Plugin_VideoDX9/Src/TextureCache.cpp b/Source/Plugins/Plugin_VideoDX9/Src/TextureCache.cpp index 4e9ae42a66..f17a1774ea 100644 --- a/Source/Plugins/Plugin_VideoDX9/Src/TextureCache.cpp +++ b/Source/Plugins/Plugin_VideoDX9/Src/TextureCache.cpp @@ -188,7 +188,7 @@ TextureCache::TCacheEntry *TextureCache::Load(int stage, u32 address, int width, if (!g_ActiveConfig.bSafeTextureCache) hash_value = ((u32 *)ptr)[0]; - if (entry.isRenderTarget || ((address == entry.addr) && (hash_value == entry.hash) && FullFormat == entry.fmt)) + if (entry.isRenderTarget || ((address == entry.addr) && (hash_value == entry.hash) && FullFormat == entry.fmt && entry.MipLevels <= maxlevel)) { entry.frameCount = frameCount; D3D::SetTexture(stage, entry.texture); @@ -200,7 +200,7 @@ TextureCache::TCacheEntry *TextureCache::Load(int stage, u32 address, int width, // instead of destroying it and having to create a new one. // Might speed up movie playback very, very slightly. - if (width == entry.w && height==entry.h && FullFormat == entry.fmt) + if (width == entry.w && height==entry.h && FullFormat == entry.fmt && entry.MipLevels == maxlevel) { skip_texture_create = true; } @@ -286,6 +286,7 @@ TextureCache::TCacheEntry *TextureCache::Load(int stage, u32 address, int width, TexLevels = (isPow2 && UseNativeMips && (maxlevel > 0)) ? (int)(log((double)TexLevels)/log((double)2)) + 1 : ((isPow2)? 0 : 1); if(TexLevels > maxlevel && maxlevel > 0) TexLevels = maxlevel; + entry.MipLevels = maxlevel; if (!skip_texture_create) { entry.texture = D3D::CreateTexture2D((BYTE*)temp, width, height, expandedWidth, d3d_fmt, swap_r_b, TexLevels); @@ -361,25 +362,11 @@ void TextureCache::CopyRenderTargetToTexture(u32 address, bool bFromZBuffer, boo int tex_w = (abs(source_rect.GetWidth()) >> bScaleByHalf); int tex_h = (abs(source_rect.GetHeight()) >> bScaleByHalf); //compensate the texture grow if supersampling is enabled to conserve memory usage - float SuperSampleCompensation = 1.0f; + float SuperSampleCompensation = (g_ActiveConfig.iMultisampleMode % 3) + 1; + SuperSampleCompensation = 1.0f / SuperSampleCompensation; float xScale = Renderer::GetTargetScaleX(); float yScale = Renderer::GetTargetScaleY(); - if(g_ActiveConfig.iMultisampleMode > 0 && g_ActiveConfig.iMultisampleMode < 4) - { - switch (g_ActiveConfig.iMultisampleMode) - { - case 1: - break; - case 2: - SuperSampleCompensation = 0.5f; - break; - case 3: - SuperSampleCompensation = 1.0f/3.0f; - break; - default: - break; - }; - } + int Scaledtex_w = (g_ActiveConfig.bCopyEFBScaled)?((int)(xScale * SuperSampleCompensation * tex_w)):tex_w; int Scaledtex_h = (g_ActiveConfig.bCopyEFBScaled)?((int)(yScale * SuperSampleCompensation * tex_h)):tex_h; @@ -585,7 +572,7 @@ void TextureCache::CopyRenderTargetToTexture(u32 address, bool bFromZBuffer, boo Scaledtex_w, Scaledtex_h, ((bformat != FOURCC_RAWZ && bformat != D3DFMT_D24X8) && bFromZBuffer)? PixelShaderCache::GetDepthMatrixProgram(SSAAMode): PixelShaderCache::GetColorMatrixProgram(SSAAMode), - (SSAAMode != 0)? VertexShaderCache::GetFSAAVertexShader() : VertexShaderCache::GetSimpleVertexShader()); + VertexShaderCache::GetSimpleVertexShader(SSAAMode)); D3D::RefreshSamplerState(0, D3DSAMP_MINFILTER); diff --git a/Source/Plugins/Plugin_VideoDX9/Src/TextureCache.h b/Source/Plugins/Plugin_VideoDX9/Src/TextureCache.h index 317b689326..29c21a1ee7 100644 --- a/Source/Plugins/Plugin_VideoDX9/Src/TextureCache.h +++ b/Source/Plugins/Plugin_VideoDX9/Src/TextureCache.h @@ -39,7 +39,7 @@ public: u32 oldpixel; int frameCount; - int w, h, fmt; + int w, h, fmt,MipLevels; int Scaledw, Scaledh; float scaleX, scaleY; // Hires texutres need this diff --git a/Source/Plugins/Plugin_VideoDX9/Src/TextureConverter.cpp b/Source/Plugins/Plugin_VideoDX9/Src/TextureConverter.cpp index 23796a1a50..69d844864b 100644 --- a/Source/Plugins/Plugin_VideoDX9/Src/TextureConverter.cpp +++ b/Source/Plugins/Plugin_VideoDX9/Src/TextureConverter.cpp @@ -271,7 +271,7 @@ void EncodeToRamUsingShader(LPDIRECT3DPIXELSHADER9 shader, LPDIRECT3DTEXTURE9 sr // Draw... - D3D::drawShadedTexQuad(srcTexture,&SrcRect,1,1,dstWidth,dstHeight,shader,VertexShaderCache::GetSimpleVertexShader()); + D3D::drawShadedTexQuad(srcTexture,&SrcRect,1,1,dstWidth,dstHeight,shader,VertexShaderCache::GetSimpleVertexShader(0)); hr = D3D::dev->SetRenderTarget(0, FBManager.GetEFBColorRTSurface()); hr = D3D::dev->SetDepthStencilSurface(FBManager.GetEFBDepthRTSurface()); Renderer::RestoreAPIState(); @@ -414,8 +414,7 @@ void DecodeToTexture(u32 xfbAddr, int srcWidth, int srcHeight, LPDIRECT3DTEXTURE return; } - float srcFormatFactor = 0.5f; - float srcFmtWidth = srcWidth * srcFormatFactor; + int srcFmtWidth = srcWidth / 2; Renderer::ResetAPIState(); // reset any game specific settings LPDIRECT3DTEXTURE9 s_srcTexture = D3D::CreateTexture2D(srcAddr, srcFmtWidth, srcHeight, srcFmtWidth, D3DFMT_A8R8G8B8, false); @@ -466,7 +465,7 @@ void DecodeToTexture(u32 xfbAddr, int srcWidth, int srcHeight, LPDIRECT3DTEXTURE srcWidth, srcHeight, s_yuyvToRgbProgram, - VertexShaderCache::GetSimpleVertexShader()); + VertexShaderCache::GetSimpleVertexShader(0)); D3D::RefreshSamplerState(0, D3DSAMP_MINFILTER); diff --git a/Source/Plugins/Plugin_VideoDX9/Src/VertexManager.cpp b/Source/Plugins/Plugin_VideoDX9/Src/VertexManager.cpp index 5e1aa87d37..8ca9354710 100644 --- a/Source/Plugins/Plugin_VideoDX9/Src/VertexManager.cpp +++ b/Source/Plugins/Plugin_VideoDX9/Src/VertexManager.cpp @@ -269,7 +269,7 @@ void Flush() tex.texImage0[i&3].format, tex.texTlut[i&3].tmem_offset<<9, tex.texTlut[i&3].tlut_format, (tex.texMode0[i&3].min_filter & 3) && (tex.texMode0[i&3].min_filter != 8) && g_ActiveConfig.bUseNativeMips, - (tex.texMode1[i&3].max_lod >> 4)); + (tex.texMode1[i&3].max_lod >> 5)); if (tentry) { PixelShaderManager::SetTexDims(i, tentry->w, tentry->h, 0, 0); diff --git a/Source/Plugins/Plugin_VideoDX9/Src/VertexShaderCache.cpp b/Source/Plugins/Plugin_VideoDX9/Src/VertexShaderCache.cpp index ce84e66ace..8f16cd170c 100644 --- a/Source/Plugins/Plugin_VideoDX9/Src/VertexShaderCache.cpp +++ b/Source/Plugins/Plugin_VideoDX9/Src/VertexShaderCache.cpp @@ -40,15 +40,14 @@ const VertexShaderCache::VSCacheEntry *VertexShaderCache::last_entry; static float GC_ALIGNED16(lastVSconstants[C_FOGPARAMS + 8][4]); -static LPDIRECT3DVERTEXSHADER9 SimpleVertexShader; +static LPDIRECT3DVERTEXSHADER9 SimpleVertexShader[3]; static LPDIRECT3DVERTEXSHADER9 ClearVertexShader; -static LPDIRECT3DVERTEXSHADER9 FSAAVertexShader; LinearDiskCache g_vs_disk_cache; -LPDIRECT3DVERTEXSHADER9 VertexShaderCache::GetSimpleVertexShader() +LPDIRECT3DVERTEXSHADER9 VertexShaderCache::GetSimpleVertexShader(int level) { - return SimpleVertexShader; + return SimpleVertexShader[level % 3]; } LPDIRECT3DVERTEXSHADER9 VertexShaderCache::GetClearVertexShader() @@ -56,10 +55,6 @@ LPDIRECT3DVERTEXSHADER9 VertexShaderCache::GetClearVertexShader() return ClearVertexShader; } -LPDIRECT3DVERTEXSHADER9 VertexShaderCache::GetFSAAVertexShader() -{ - return FSAAVertexShader; -} void SetVSConstant4f(int const_number, float f1, float f2, float f3, float f4) { @@ -148,7 +143,7 @@ void VertexShaderCache::Init() "return OUT;\n" "}\n"); - SimpleVertexShader = D3D::CompileAndCreateVertexShader(vProg, (int)strlen(vProg)); + SimpleVertexShader[0] = D3D::CompileAndCreateVertexShader(vProg, (int)strlen(vProg)); sprintf(vProg,"struct VSOUTPUT\n" "{\n" @@ -180,14 +175,38 @@ void VertexShaderCache::Init() "VSOUTPUT OUT;" "OUT.vPosition = inPosition;\n" "OUT.vTexCoord = inTEX0.xyyx;\n" - "OUT.vTexCoord1 = inTEX0.xyyx + (float4(-0.1830127f,-0.6830127f,-0.7071068f,-1.2247449f) * inTEX1.xyyx);\n" - "OUT.vTexCoord2 = inTEX0.xyyx + (float4(-0.6830127f, 0.1830127f, 0.7071068f, 1.2247449f) * inTEX1.xyyx);\n" - "OUT.vTexCoord3 = inTEX0.xyyx + (float4( 0.6830127f,-0.1830127f,-1.2247449f, 0.7071068f) * inTEX1.xyyx);\n" - "OUT.vTexCoord4 = inTEX0.xyyx + (float4( 0.1830127f, 0.6830127f, 1.2247449f,-0.7071068f) * inTEX1.xyyx);\n" + "OUT.vTexCoord1 = inTEX0.xyyx + (float4(-0.5f,-0.5f,-0.5f,-0.5f) * inTEX1.xyyx);\n" + "OUT.vTexCoord2 = inTEX0.xyyx + (float4(-0.5f, 0.5f, 0.5f,-0.5f) * inTEX1.xyyx);\n" + "OUT.vTexCoord3 = inTEX0.xyyx + (float4( 0.5f,-0.5f,-0.5f, 0.5f) * inTEX1.xyyx);\n" + "OUT.vTexCoord4 = inTEX0.xyyx + (float4( 0.5f, 0.5f, 0.5f, 0.5f) * inTEX1.xyyx);\n" "OUT.vTexCoord5 = inTEX2;\n" "return OUT;\n" "}\n"); - FSAAVertexShader = D3D::CompileAndCreateVertexShader(vProg, (int)strlen(vProg)); + SimpleVertexShader[1] = D3D::CompileAndCreateVertexShader(vProg, (int)strlen(vProg)); + + sprintf(vProg, "struct VSOUTPUT\n" + "{\n" + "float4 vPosition : POSITION;\n" + "float4 vTexCoord : TEXCOORD0;\n" + "float4 vTexCoord1 : TEXCOORD1;\n" + "float4 vTexCoord2 : TEXCOORD2;\n" + "float4 vTexCoord3 : TEXCOORD3;\n" + "float4 vTexCoord4 : TEXCOORD4;\n" + "float4 vTexCoord5 : TEXCOORD5;\n" + "};\n" + "VSOUTPUT main(float4 inPosition : POSITION,float2 inTEX0 : TEXCOORD0,float2 inTEX1 : TEXCOORD1,float4 inTEX2 : TEXCOORD2)\n" + "{\n" + "VSOUTPUT OUT;" + "OUT.vPosition = inPosition;\n" + "OUT.vTexCoord = inTEX0.xyyx;\n" + "OUT.vTexCoord1 = inTEX0.xyyx + (float4(-1.0f,-1.0f,-1.0f, 1.0f) * inTEX1.xyyx);\n" + "OUT.vTexCoord2 = inTEX0.xyyx + (float4(-1.0f, 0.0f, 0.0f, 1.0f) * inTEX1.xyyx);\n" + "OUT.vTexCoord3 = inTEX0.xyyx + (float4(-1.0f, 1.0f, 1.0f, 1.0f) * inTEX1.xyyx);\n" + "OUT.vTexCoord4 = inTEX0.xyyx + (float4( 0.0f, 1.0f,-1.0f, 0.0f) * inTEX1.xyyx);\n" + "OUT.vTexCoord5 = inTEX2;\n" + "return OUT;\n" + "}\n"); + SimpleVertexShader[2] = D3D::CompileAndCreateVertexShader(vProg, (int)strlen(vProg)); Clear(); delete [] vProg; @@ -215,17 +234,17 @@ void VertexShaderCache::Clear() void VertexShaderCache::Shutdown() { - if (SimpleVertexShader) - SimpleVertexShader->Release(); - SimpleVertexShader = NULL; + for (int i = 0; i<3;i++) + { + if (SimpleVertexShader[i]) + SimpleVertexShader[i]->Release(); + SimpleVertexShader[i] = NULL; + } if (ClearVertexShader) ClearVertexShader->Release(); ClearVertexShader = NULL; - - if (FSAAVertexShader) - FSAAVertexShader->Release(); - FSAAVertexShader = NULL; + Clear(); g_vs_disk_cache.Sync(); diff --git a/Source/Plugins/Plugin_VideoDX9/Src/VertexShaderCache.h b/Source/Plugins/Plugin_VideoDX9/Src/VertexShaderCache.h index 72f71af38e..256402a684 100644 --- a/Source/Plugins/Plugin_VideoDX9/Src/VertexShaderCache.h +++ b/Source/Plugins/Plugin_VideoDX9/Src/VertexShaderCache.h @@ -55,9 +55,8 @@ public: static void Clear(); static void Shutdown(); static bool SetShader(u32 components); - static LPDIRECT3DVERTEXSHADER9 GetSimpleVertexShader(); - static LPDIRECT3DVERTEXSHADER9 GetClearVertexShader(); - static LPDIRECT3DVERTEXSHADER9 GetFSAAVertexShader(); + static LPDIRECT3DVERTEXSHADER9 GetSimpleVertexShader(int level); + static LPDIRECT3DVERTEXSHADER9 GetClearVertexShader(); static bool InsertByteCode(const VERTEXSHADERUID &uid, const u8 *bytecode, int bytecodelen, bool activate); #if defined(_DEBUG) || defined(DEBUGFAST) static std::string GetCurrentShaderCode(); diff --git a/Source/Plugins/Plugin_VideoDX9/Src/resource.rc b/Source/Plugins/Plugin_VideoDX9/Src/resource.rc index ad4a7005a9..9d8efb1007 100644 --- a/Source/Plugins/Plugin_VideoDX9/Src/resource.rc +++ b/Source/Plugins/Plugin_VideoDX9/Src/resource.rc @@ -12,11 +12,13 @@ #undef APSTUDIO_READONLY_SYMBOLS ///////////////////////////////////////////////////////////////////////////// -// English (United States) resources +// English (U.S.) resources #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +#ifdef _WIN32 LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US #pragma code_page(1252) +#endif //_WIN32 ///////////////////////////////////////////////////////////////////////////// // @@ -44,7 +46,7 @@ BEGIN CONTROL "&Widescreen Hack",IDC_WIDESCREEN_HACK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,161,25,67,10 LTEXT "&Aspect Ratio:",IDC_STATIC,9,40,48,8 COMBOBOX IDC_ASPECTRATIO,68,39,89,57,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "&Anti-alias mode:",IDC_STATIC,9,59,51,8 + LTEXT "&Scale - AA mode:",IDC_STATIC,9,59,59,8 COMBOBOX IDC_ANTIALIASMODE,68,59,162,73,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP CONTROL "&Enable CPU->EFB access ",IDC_EFB_ACCESS_ENABLE,"Button",BS_AUTOCHECKBOX | BS_MULTILINE | WS_TABSTOP,7,80,94,11 GROUPBOX "Safe Texture Cache Mode",IDC_STATIC,109,94,125,27 @@ -103,7 +105,7 @@ END // #ifdef APSTUDIO_INVOKED -GUIDELINES DESIGNINFO +GUIDELINES DESIGNINFO BEGIN IDD_ABOUT, DIALOG BEGIN @@ -177,7 +179,7 @@ END #endif // APSTUDIO_INVOKED -#endif // English (United States) resources +#endif // English (U.S.) resources ///////////////////////////////////////////////////////////////////////////// diff --git a/Source/Plugins/Plugin_VideoOGL/Src/PixelShaderCache.cpp b/Source/Plugins/Plugin_VideoOGL/Src/PixelShaderCache.cpp index 2b9e090088..427e53bc6f 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/PixelShaderCache.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/PixelShaderCache.cpp @@ -111,7 +111,7 @@ void PixelShaderCache::Init() "ADD result.color, R1, program.env[%d];\n" "END\n", C_COLORMATRIX+3, C_COLORMATRIX+2, C_COLORMATRIX, C_COLORMATRIX+1, C_COLORMATRIX+4); glGenProgramsARB(1, &s_ColorMatrixProgram); - glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, s_ColorMatrixProgram); + SetCurrentShader(s_ColorMatrixProgram); glProgramStringARB(GL_FRAGMENT_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB, (GLsizei)strlen(pmatrixprog), pmatrixprog); GLenum err = GL_REPORT_ERROR(); @@ -139,7 +139,7 @@ void PixelShaderCache::Init() "ADD result.color, R1, program.env[%d];\n" "END\n", C_COLORMATRIX, C_COLORMATRIX+1, C_COLORMATRIX+2, C_COLORMATRIX+3, C_COLORMATRIX+4); glGenProgramsARB(1, &s_DepthMatrixProgram); - glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, s_DepthMatrixProgram); + SetCurrentShader(s_DepthMatrixProgram); glProgramStringARB(GL_FRAGMENT_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB, (GLsizei)strlen(pmatrixprog), pmatrixprog); err = GL_REPORT_ERROR(); @@ -148,9 +148,7 @@ void PixelShaderCache::Init() glDeleteProgramsARB(1, &s_DepthMatrixProgram); s_DepthMatrixProgram = 0; } - CurrentShader=0; - ShaderEnabled = false; - EnableShader(s_DepthMatrixProgram); + } void PixelShaderCache::Shutdown() @@ -160,7 +158,7 @@ void PixelShaderCache::Shutdown() glDeleteProgramsARB(1, &s_DepthMatrixProgram); s_DepthMatrixProgram = 0; PSCache::iterator iter = pshaders.begin(); - for (; iter != pshaders.end(); ++iter) + for (; iter != pshaders.end(); iter++) iter->second.Destroy(); pshaders.clear(); } @@ -272,7 +270,7 @@ bool PixelShaderCache::CompilePixelShader(FRAGMENTSHADER& ps, const char* pstrpr } glGenProgramsARB(1, &ps.glprogid); - EnableShader(ps.glprogid); + SetCurrentShader(ps.glprogid); glProgramStringARB(GL_FRAGMENT_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB, (GLsizei)strlen(pcompiledprog), pcompiledprog); err = GL_REPORT_ERROR(); @@ -311,7 +309,6 @@ void PixelShaderCache::DisableShader() CurrentShader = 0; if(ShaderEnabled) { - glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, CurrentShader); glDisable(GL_FRAGMENT_PROGRAM_ARB); ShaderEnabled = false; } @@ -320,17 +317,6 @@ void PixelShaderCache::DisableShader() //bind a program if is diferent from the binded oone void PixelShaderCache::SetCurrentShader(GLuint Shader) -{ - //The caching here breakes Super Mario Sunshine i'm still trying to figure out wy - if(ShaderEnabled /*&& CurrentShader != Shader*/) - { - CurrentShader = Shader; - glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, CurrentShader); - } -} - -//Enable Fragment program and bind initial program -void PixelShaderCache::EnableShader(GLuint Shader) { if(!ShaderEnabled) { @@ -343,4 +329,4 @@ void PixelShaderCache::EnableShader(GLuint Shader) CurrentShader = Shader; glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, CurrentShader); } -} +} \ No newline at end of file diff --git a/Source/Plugins/Plugin_VideoOGL/Src/PixelShaderCache.h b/Source/Plugins/Plugin_VideoOGL/Src/PixelShaderCache.h index 0fc1082c9b..09aff051a5 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/PixelShaderCache.h +++ b/Source/Plugins/Plugin_VideoOGL/Src/PixelShaderCache.h @@ -81,8 +81,6 @@ public: static void SetCurrentShader(GLuint Shader); static void DisableShader(); - - static void EnableShader(GLuint Shader); }; #endif // _PIXELSHADERCACHE_H_ diff --git a/Source/Plugins/Plugin_VideoOGL/Src/PostProcessing.cpp b/Source/Plugins/Plugin_VideoOGL/Src/PostProcessing.cpp index 28958384a1..4be24195e0 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/PostProcessing.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/PostProcessing.cpp @@ -74,7 +74,7 @@ bool ApplyShader() if (s_shader.glprogid != 0) { - PixelShaderCache::EnableShader(s_shader.glprogid); + PixelShaderCache::SetCurrentShader(s_shader.glprogid); return true; } else diff --git a/Source/Plugins/Plugin_VideoOGL/Src/Render.cpp b/Source/Plugins/Plugin_VideoOGL/Src/Render.cpp index 846eba1c56..c7893230d5 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/Render.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/Render.cpp @@ -591,8 +591,8 @@ void Renderer::RestoreAPIState() SetColorMask(); SetBlendMode(true); - VertexShaderCache::EnableShader(0); - PixelShaderCache::EnableShader(0); + VertexShaderCache::SetCurrentShader(0); + PixelShaderCache::SetCurrentShader(0); } void Renderer::SetColorMask() diff --git a/Source/Plugins/Plugin_VideoOGL/Src/TextureConverter.cpp b/Source/Plugins/Plugin_VideoOGL/Src/TextureConverter.cpp index 4e3ebfe769..80943e5d46 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/TextureConverter.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/TextureConverter.cpp @@ -203,7 +203,7 @@ void EncodeToRamUsingShader(FRAGMENTSHADER& shader, GLuint srcTexture, const Tar glViewport(0, 0, (GLsizei)dstWidth, (GLsizei)dstHeight); - PixelShaderCache::EnableShader(shader.glprogid); + PixelShaderCache::SetCurrentShader(shader.glprogid); // Draw... glBegin(GL_QUADS); @@ -340,8 +340,7 @@ void DecodeToTexture(u32 xfbAddr, int srcWidth, int srcHeight, GLuint destTextur Renderer::ResetAPIState(); - float srcFormatFactor = 0.5f; - float srcFmtWidth = srcWidth * srcFormatFactor; + int srcFmtWidth = srcWidth / 2; // swich to texture converter frame buffer // attach destTexture as color destination @@ -374,7 +373,7 @@ void DecodeToTexture(u32 xfbAddr, int srcWidth, int srcHeight, GLuint destTextur glViewport(0, 0, srcWidth, srcHeight); - PixelShaderCache::EnableShader(s_yuyvToRgbProgram.glprogid); + PixelShaderCache::SetCurrentShader(s_yuyvToRgbProgram.glprogid); GL_REPORT_ERRORD(); diff --git a/Source/Plugins/Plugin_VideoOGL/Src/TextureMngr.cpp b/Source/Plugins/Plugin_VideoOGL/Src/TextureMngr.cpp index f614005623..20b32c5bba 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/TextureMngr.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/TextureMngr.cpp @@ -132,7 +132,7 @@ void TextureMngr::TCacheEntry::SetTextureParameters(TexMode0 &newmode,TexMode1 & if (g_ActiveConfig.bForceFiltering && newmode.min_filter < 4) mode.min_filter += 4; // take equivalent forced linear int filt = newmode.min_filter; - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, c_MinLinearFilter[filt & (((newmode1.max_lod >> 4) > 0)?7:4)]); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, c_MinLinearFilter[filt & (((newmode1.max_lod >> 5) > 0)?7:4)]); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, newmode1.min_lod >> 5); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, newmode1.max_lod >> 5); glTexEnvf(GL_TEXTURE_FILTER_CONTROL, GL_TEXTURE_LOD_BIAS, (newmode.lod_bias/32.0f)); @@ -261,7 +261,7 @@ TextureMngr::TCacheEntry* TextureMngr::Load(int texstage, u32 address, int width TexMode1 &tm1 = bpmem.tex[texstage >> 2].texMode1[texstage & 3]; bool UseNativeMips = (tm0.min_filter & 3) && (tm0.min_filter != 8) && g_ActiveConfig.bUseNativeMips; - int maxlevel = ((tm1.max_lod >> 4)); + int maxlevel = tm1.max_lod >> 4;//this ir realy strange should be 5 but that breaks some textures u8 *ptr = g_VideoInitialize.pGetMemoryPointer(address); int bsw = TexDecoder_GetBlockWidthInTexels(tex_format) - 1; @@ -309,7 +309,7 @@ TextureMngr::TCacheEntry* TextureMngr::Load(int texstage, u32 address, int width if (!g_ActiveConfig.bSafeTextureCache) hash_value = ((u32 *)ptr)[0]; - if (entry.isRenderTarget || ((address == entry.addr) && (hash_value == entry.hash) && (int) FullFormat == entry.fmt)) + if (entry.isRenderTarget || ((address == entry.addr) && (hash_value == entry.hash) && ((int) FullFormat == entry.fmt) && maxlevel <= entry.MipLevels )) { entry.frameCount = frameCount; glEnable(entry.isRectangle ? GL_TEXTURE_RECTANGLE_ARB : GL_TEXTURE_2D); @@ -327,7 +327,7 @@ TextureMngr::TCacheEntry* TextureMngr::Load(int texstage, u32 address, int width // Let's reload the new texture data into the same texture, // instead of destroying it and having to create a new one. // Might speed up movie playback very, very slightly. - if (width == entry.w && height == entry.h && (int) FullFormat == entry.fmt) + if (width == entry.w && height == entry.h && (int) FullFormat == entry.fmt && maxlevel <= entry.MipLevels ) { glBindTexture(entry.isRectangle ? GL_TEXTURE_RECTANGLE_ARB : GL_TEXTURE_2D, entry.texture); GL_REPORT_ERRORD(); @@ -398,6 +398,7 @@ TextureMngr::TCacheEntry* TextureMngr::Load(int texstage, u32 address, int width TexLevels = (isPow2 && UseNativeMips && (maxlevel > 0)) ? (int)(log((double)TexLevels)/log((double)2)) + 1 : (isPow2? 0 : 1); if(TexLevels > maxlevel && maxlevel > 0) TexLevels = maxlevel; + entry.MipLevels = maxlevel; bool GenerateMipmaps = TexLevels > 1 || TexLevels == 0; entry.bHaveMipMaps = GenerateMipmaps; int gl_format = 0; @@ -509,27 +510,13 @@ TextureMngr::TCacheEntry* TextureMngr::Load(int texstage, u32 address, int width { if (expandedWidth != (int)currentWidth) glPixelStorei(GL_UNPACK_ROW_LENGTH, expandedWidth); - if(skip_texture_create) - { - glTexSubImage2D(target, level,0,0,currentWidth, currentWidth, gl_format, gl_type, temp); - } - else - { - glTexImage2D(target, level, gl_iformat, currentWidth, currentHeight, 0, gl_format, gl_type, temp); - } + glTexImage2D(target, level, gl_iformat, currentWidth, currentHeight, 0, gl_format, gl_type, temp); if (expandedWidth != (int)currentWidth) glPixelStorei(GL_UNPACK_ROW_LENGTH, 0); } else { - if(skip_texture_create) - { - glCompressedTexSubImage2D(target, level,0,0,currentWidth, currentHeight, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT,expandedWidth*expandedHeight/2, temp); - } - else - { - glCompressedTexImage2D(target, level, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, currentWidth, currentHeight, 0, expandedWidth*expandedHeight/2, temp); - } + glCompressedTexImage2D(target, level, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, currentWidth, currentHeight, 0, expandedWidth*expandedHeight/2, temp); } GL_REPORT_ERRORD(); u32 size = (max(mipWidth, bsw) * max(mipHeight, bsh) * bsdepth) >> 1; @@ -778,7 +765,7 @@ void TextureMngr::CopyRenderTargetToTexture(u32 address, bool bFromZBuffer, bool glViewport(0, 0, w, h); - PixelShaderCache::EnableShader(bFromZBuffer ? PixelShaderCache::GetDepthMatrixProgram() : PixelShaderCache::GetColorMatrixProgram()); + PixelShaderCache::SetCurrentShader(bFromZBuffer ? PixelShaderCache::GetDepthMatrixProgram() : PixelShaderCache::GetColorMatrixProgram()); PixelShaderManager::SetColorMatrix(colmat, fConstAdd); // set transformation GL_REPORT_ERRORD(); diff --git a/Source/Plugins/Plugin_VideoOGL/Src/TextureMngr.h b/Source/Plugins/Plugin_VideoOGL/Src/TextureMngr.h index e5f698508b..66f06197bc 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/TextureMngr.h +++ b/Source/Plugins/Plugin_VideoOGL/Src/TextureMngr.h @@ -29,7 +29,7 @@ class TextureMngr public: struct TCacheEntry { - TCacheEntry() : texture(0), addr(0), size_in_bytes(0), hash(0), w(0), h(0), scaleX(1.0f), scaleY(1.0f), isRenderTarget(false), isRectangle(true), bHaveMipMaps(false) { mode.hex = 0xFCFCFCFC; } + TCacheEntry() : texture(0), addr(0), size_in_bytes(0), hash(0), w(0), h(0),MipLevels(0), scaleX(1.0f), scaleY(1.0f), isRenderTarget(false), isRectangle(true), bHaveMipMaps(false) { mode.hex = 0xFCFCFCFC; } GLuint texture; u32 addr; @@ -41,7 +41,7 @@ public: TexMode1 mode1; // current filter and clamp modes that texture is set to int frameCount; - int w, h, fmt; + int w, h, fmt,MipLevels; float scaleX, scaleY; // Hires texutres need this diff --git a/Source/Plugins/Plugin_VideoOGL/Src/VertexShaderCache.cpp b/Source/Plugins/Plugin_VideoOGL/Src/VertexShaderCache.cpp index 285a560567..ed7378ac5c 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/VertexShaderCache.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/VertexShaderCache.cpp @@ -108,15 +108,13 @@ void VertexShaderCache::Init() s_displayCompileAlert = true; - glGetProgramivARB(GL_VERTEX_PROGRAM_ARB, GL_MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB, (GLint *)&s_nMaxVertexInstructions); - ShaderEnabled = false; - CurrentShader = 0; - EnableShader(0); + glGetProgramivARB(GL_VERTEX_PROGRAM_ARB, GL_MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB, (GLint *)&s_nMaxVertexInstructions); + SetCurrentShader(0); } void VertexShaderCache::Shutdown() { - for (VSCache::iterator iter = vshaders.begin(); iter != vshaders.end(); ++iter) + for (VSCache::iterator iter = vshaders.begin(); iter != vshaders.end(); iter++) iter->second.Destroy(); vshaders.clear(); } @@ -213,7 +211,7 @@ bool VertexShaderCache::CompileVertexShader(VERTEXSHADER& vs, const char* pstrpr plocal = strstr(plocal + 13, "program.local"); } glGenProgramsARB(1, &vs.glprogid); - EnableShader(vs.glprogid); + SetCurrentShader(vs.glprogid); glProgramStringARB(GL_VERTEX_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB, (GLsizei)strlen(pcompiledprog), pcompiledprog); err = GL_REPORT_ERROR(); @@ -233,10 +231,9 @@ bool VertexShaderCache::CompileVertexShader(VERTEXSHADER& vs, const char* pstrpr void VertexShaderCache::DisableShader() { + CurrentShader = 0; if (ShaderEnabled) { - CurrentShader = 0; - glBindProgramARB(GL_VERTEX_PROGRAM_ARB, CurrentShader); glDisable(GL_VERTEX_PROGRAM_ARB); ShaderEnabled = false; } @@ -244,15 +241,6 @@ void VertexShaderCache::DisableShader() void VertexShaderCache::SetCurrentShader(GLuint Shader) -{ - if (ShaderEnabled && CurrentShader != Shader) - { - CurrentShader = Shader; - glBindProgramARB(GL_VERTEX_PROGRAM_ARB, CurrentShader); - } -} - -void VertexShaderCache::EnableShader(GLuint Shader) { if (!ShaderEnabled) { @@ -265,5 +253,4 @@ void VertexShaderCache::EnableShader(GLuint Shader) CurrentShader = Shader; glBindProgramARB(GL_VERTEX_PROGRAM_ARB, CurrentShader); } -} - +} \ No newline at end of file diff --git a/Source/Plugins/Plugin_VideoOGL/Src/VertexShaderCache.h b/Source/Plugins/Plugin_VideoOGL/Src/VertexShaderCache.h index 5ba34bc31e..8befe6bd68 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/VertexShaderCache.h +++ b/Source/Plugins/Plugin_VideoOGL/Src/VertexShaderCache.h @@ -65,9 +65,8 @@ public: static bool CompileVertexShader(VERTEXSHADER& ps, const char* pstrprogram); static void SetCurrentShader(GLuint Shader); - static void DisableShader(); - static void EnableShader(GLuint Shader); + }; #endif // _VERTEXSHADERCACHE_H_