diff --git a/Source/Core/VideoBackends/D3D/PixelShaderCache.cpp b/Source/Core/VideoBackends/D3D/PixelShaderCache.cpp index a3a151bb25..91e4e52453 100644 --- a/Source/Core/VideoBackends/D3D/PixelShaderCache.cpp +++ b/Source/Core/VideoBackends/D3D/PixelShaderCache.cpp @@ -578,7 +578,7 @@ bool PixelShaderCache::SetShader(DSTALPHA_MODE dstAlphaMode) } // Need to compile a new shader - ShaderCode code = GeneratePixelShaderCode(dstAlphaMode, APIType::D3D, uid.GetUidData()); + ShaderCode code = GeneratePixelShaderCode(APIType::D3D, uid.GetUidData()); D3DBlob* pbytecode; if (!D3D::CompilePixelShader(code.GetBuffer(), &pbytecode)) diff --git a/Source/Core/VideoBackends/D3D12/ShaderCache.cpp b/Source/Core/VideoBackends/D3D12/ShaderCache.cpp index 4329d2de61..f0fb71aaca 100644 --- a/Source/Core/VideoBackends/D3D12/ShaderCache.cpp +++ b/Source/Core/VideoBackends/D3D12/ShaderCache.cpp @@ -231,8 +231,7 @@ void ShaderCache::HandlePSUIDChange(PixelShaderUid ps_uid, DSTALPHA_MODE ps_dst_ } else { - ShaderCode ps_code = - GeneratePixelShaderCode(ps_dst_alpha_mode, APIType::D3D, ps_uid.GetUidData()); + ShaderCode ps_code = GeneratePixelShaderCode(APIType::D3D, ps_uid.GetUidData()); ID3DBlob* ps_bytecode = nullptr; if (!D3D::CompilePixelShader(ps_code.GetBuffer(), &ps_bytecode)) @@ -355,4 +354,4 @@ D3D12_SHADER_BYTECODE ShaderCache::GetVertexShaderFromUid(const VertexShaderUid* return D3D12_SHADER_BYTECODE(); } -} \ No newline at end of file +} diff --git a/Source/Core/VideoBackends/Null/ShaderCache.cpp b/Source/Core/VideoBackends/Null/ShaderCache.cpp index 629e440763..a7513f4909 100644 --- a/Source/Core/VideoBackends/Null/ShaderCache.cpp +++ b/Source/Core/VideoBackends/Null/ShaderCache.cpp @@ -60,7 +60,7 @@ bool ShaderCache::SetShader(DSTALPHA_MODE dst_alpha_mode, u32 primitive_typ } // Need to compile a new shader - ShaderCode code = GenerateCode(dst_alpha_mode, APIType::OpenGL, uid); + ShaderCode code = GenerateCode(APIType::OpenGL, uid); m_shaders.emplace(uid, code.GetBuffer()); GFX_DEBUGGER_PAUSE_AT(NEXT_PIXEL_SHADER_CHANGE, true); diff --git a/Source/Core/VideoBackends/Null/ShaderCache.h b/Source/Core/VideoBackends/Null/ShaderCache.h index e9f23173a9..9ed794b8d3 100644 --- a/Source/Core/VideoBackends/Null/ShaderCache.h +++ b/Source/Core/VideoBackends/Null/ShaderCache.h @@ -26,7 +26,7 @@ public: protected: virtual Uid GetUid(DSTALPHA_MODE dst_alpha_mode, u32 primitive_type, APIType api_type) = 0; - virtual ShaderCode GenerateCode(DSTALPHA_MODE dst_alpha_mode, APIType api_type, Uid uid) = 0; + virtual ShaderCode GenerateCode(APIType api_type, Uid uid) = 0; private: std::map m_shaders; @@ -45,8 +45,7 @@ protected: { return GetVertexShaderUid(); } - ShaderCode GenerateCode(DSTALPHA_MODE dst_alpha_mode, APIType api_type, - VertexShaderUid uid) override + ShaderCode GenerateCode(APIType api_type, VertexShaderUid uid) override { return GenerateVertexShaderCode(api_type, uid.GetUidData()); } @@ -63,8 +62,7 @@ protected: { return GetGeometryShaderUid(primitive_type); } - ShaderCode GenerateCode(DSTALPHA_MODE dst_alpha_mode, APIType api_type, - GeometryShaderUid uid) override + ShaderCode GenerateCode(APIType api_type, GeometryShaderUid uid) override { return GenerateGeometryShaderCode(api_type, uid.GetUidData()); } @@ -80,10 +78,9 @@ protected: { return GetPixelShaderUid(dst_alpha_mode); } - ShaderCode GenerateCode(DSTALPHA_MODE dst_alpha_mode, APIType api_type, - PixelShaderUid uid) override + ShaderCode GenerateCode(APIType api_type, PixelShaderUid uid) override { - return GeneratePixelShaderCode(dst_alpha_mode, api_type, uid.GetUidData()); + return GeneratePixelShaderCode(api_type, uid.GetUidData()); } }; diff --git a/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp b/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp index 599f783cef..f49fa3718b 100644 --- a/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp +++ b/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp @@ -208,7 +208,7 @@ SHADER* ProgramShaderCache::SetShader(DSTALPHA_MODE dstAlphaMode, u32 primitive_ newentry.in_cache = 0; ShaderCode vcode = GenerateVertexShaderCode(APIType::OpenGL, uid.vuid.GetUidData()); - ShaderCode pcode = GeneratePixelShaderCode(dstAlphaMode, APIType::OpenGL, uid.puid.GetUidData()); + ShaderCode pcode = GeneratePixelShaderCode(APIType::OpenGL, uid.puid.GetUidData()); ShaderCode gcode; if (g_ActiveConfig.backend_info.bSupportsGeometryShaders && !uid.guid.GetUidData()->IsPassthrough()) diff --git a/Source/Core/VideoBackends/Vulkan/ObjectCache.cpp b/Source/Core/VideoBackends/Vulkan/ObjectCache.cpp index cf90fc2f60..d1e874cac6 100644 --- a/Source/Core/VideoBackends/Vulkan/ObjectCache.cpp +++ b/Source/Core/VideoBackends/Vulkan/ObjectCache.cpp @@ -525,8 +525,7 @@ VkShaderModule ObjectCache::GetGeometryShaderForUid(const GeometryShaderUid& uid return module; } -VkShaderModule ObjectCache::GetPixelShaderForUid(const PixelShaderUid& uid, - DSTALPHA_MODE dstalpha_mode) +VkShaderModule ObjectCache::GetPixelShaderForUid(const PixelShaderUid& uid) { auto it = m_ps_cache.shader_map.find(uid); if (it != m_ps_cache.shader_map.end()) @@ -535,8 +534,7 @@ VkShaderModule ObjectCache::GetPixelShaderForUid(const PixelShaderUid& uid, // Not in the cache, so compile the shader. ShaderCompiler::SPIRVCodeVector spv; VkShaderModule module = VK_NULL_HANDLE; - ShaderCode source_code = - GeneratePixelShaderCode(dstalpha_mode, APIType::Vulkan, uid.GetUidData()); + ShaderCode source_code = GeneratePixelShaderCode(APIType::Vulkan, uid.GetUidData()); if (ShaderCompiler::CompileFragmentShader(&spv, source_code.GetBuffer().c_str(), source_code.GetBuffer().length())) { diff --git a/Source/Core/VideoBackends/Vulkan/ObjectCache.h b/Source/Core/VideoBackends/Vulkan/ObjectCache.h index 3778f2bedb..b991b8a3b8 100644 --- a/Source/Core/VideoBackends/Vulkan/ObjectCache.h +++ b/Source/Core/VideoBackends/Vulkan/ObjectCache.h @@ -101,7 +101,7 @@ public: // Accesses ShaderGen shader caches VkShaderModule GetVertexShaderForUid(const VertexShaderUid& uid); VkShaderModule GetGeometryShaderForUid(const GeometryShaderUid& uid); - VkShaderModule GetPixelShaderForUid(const PixelShaderUid& uid, DSTALPHA_MODE dstalpha_mode); + VkShaderModule GetPixelShaderForUid(const PixelShaderUid& uid); // Static samplers VkSampler GetPointSampler() const { return m_point_sampler; } diff --git a/Source/Core/VideoBackends/Vulkan/StateTracker.cpp b/Source/Core/VideoBackends/Vulkan/StateTracker.cpp index 80c13323b0..84b1099862 100644 --- a/Source/Core/VideoBackends/Vulkan/StateTracker.cpp +++ b/Source/Core/VideoBackends/Vulkan/StateTracker.cpp @@ -223,7 +223,7 @@ bool StateTracker::CheckForShaderChanges(u32 gx_primitive_type, DSTALPHA_MODE ds if (ps_uid != m_ps_uid) { - m_pipeline_state.ps = g_object_cache->GetPixelShaderForUid(ps_uid, dstalpha_mode); + m_pipeline_state.ps = g_object_cache->GetPixelShaderForUid(ps_uid); m_ps_uid = ps_uid; changed = true; } diff --git a/Source/Core/VideoCommon/LightingShaderGen.cpp b/Source/Core/VideoCommon/LightingShaderGen.cpp index 8160364de3..ecc19b7b9f 100644 --- a/Source/Core/VideoCommon/LightingShaderGen.cpp +++ b/Source/Core/VideoCommon/LightingShaderGen.cpp @@ -72,9 +72,9 @@ static void GenerateLightShader(ShaderCode& object, const LightingUidData& uid_d // inColorName is color in vs and colors_ in ps // dest is o.colors_ in vs and colors_ in ps void GenerateLightingShaderCode(ShaderCode& object, const LightingUidData& uid_data, int components, - const char* inColorName, const char* dest) + u32 numColorChans, const char* inColorName, const char* dest) { - for (unsigned int j = 0; j < xfmem.numChan.numColorChans; j++) + for (unsigned int j = 0; j < numColorChans; j++) { object.Write("{\n"); @@ -200,4 +200,4 @@ void GetLightingShaderUid(LightingUidData& uid_data) uid_data.light_mask |= xfmem.alpha[j].GetFullLightMask() << (8 * (j + 2)); } } -} \ No newline at end of file +} diff --git a/Source/Core/VideoCommon/LightingShaderGen.h b/Source/Core/VideoCommon/LightingShaderGen.h index d8a8f183d0..5a0bd28574 100644 --- a/Source/Core/VideoCommon/LightingShaderGen.h +++ b/Source/Core/VideoCommon/LightingShaderGen.h @@ -47,5 +47,5 @@ static const char s_lighting_struct[] = "struct Light {\n" "};\n"; void GenerateLightingShaderCode(ShaderCode& object, const LightingUidData& uid_data, int components, - const char* inColorName, const char* dest); + u32 numColorChans, const char* inColorName, const char* dest); void GetLightingShaderUid(LightingUidData& uid_data); diff --git a/Source/Core/VideoCommon/PixelShaderGen.cpp b/Source/Core/VideoCommon/PixelShaderGen.cpp index e4227e8280..ce63752b86 100644 --- a/Source/Core/VideoCommon/PixelShaderGen.cpp +++ b/Source/Core/VideoCommon/PixelShaderGen.cpp @@ -207,7 +207,7 @@ PixelShaderUid GetPixelShaderUid(DSTALPHA_MODE dstAlphaMode) // The lighting shader only needs the two color bits of the 23bit component bit array. uid_data->components = (VertexLoaderManager::g_current_components & (VB_HAS_COL0 | VB_HAS_COL1)) >> VB_COL_SHIFT; - ; + uid_data->numColorChans = xfmem.numChan.numColorChans; GetLightingShaderUid(uid_data->lighting); } @@ -342,11 +342,10 @@ static void WriteTevRegular(ShaderCode& out, const char* components, int bias, i static void SampleTexture(ShaderCode& out, const char* texcoords, const char* texswap, int texmap, bool stereo, APIType ApiType); static void WriteAlphaTest(ShaderCode& out, const pixel_shader_uid_data* uid_data, APIType ApiType, - DSTALPHA_MODE dstAlphaMode, bool per_pixel_depth); + bool per_pixel_depth); static void WriteFog(ShaderCode& out, const pixel_shader_uid_data* uid_data); -ShaderCode GeneratePixelShaderCode(DSTALPHA_MODE dstAlphaMode, APIType ApiType, - const pixel_shader_uid_data* uid_data) +ShaderCode GeneratePixelShaderCode(APIType ApiType, const pixel_shader_uid_data* uid_data) { ShaderCode out; @@ -501,21 +500,10 @@ ShaderCode GeneratePixelShaderCode(DSTALPHA_MODE dstAlphaMode, APIType ApiType, out.Write("[earlydepthstencil]\n"); } } - else if (bpmem.UseEarlyDepthTest() && - (uid_data->fast_depth_calc || bpmem.alpha_test.TestResult() == AlphaTest::UNDETERMINED)) - { - static bool warn_once = true; - if (warn_once) - WARN_LOG(VIDEO, "Early z test enabled but not possible to emulate with current " - "configuration. Make sure to enable fast depth calculations. If this message " - "still shows up your hardware isn't able to emulate the feature properly (a " - "GPU with D3D 11.0 / OGL 4.2 support is required)."); - warn_once = false; - } if (ApiType == APIType::OpenGL || ApiType == APIType::Vulkan) { - if (dstAlphaMode == DSTALPHA_DUAL_SOURCE_BLEND) + if (uid_data->dstAlphaMode == DSTALPHA_DUAL_SOURCE_BLEND) { if (DriverDetails::HasBug(DriverDetails::BUG_BROKEN_FRAGMENT_SHADER_INDEX_DECORATION)) { @@ -587,8 +575,9 @@ ShaderCode GeneratePixelShaderCode(DSTALPHA_MODE dstAlphaMode, APIType ApiType, { out.Write("void main(\n"); out.Write(" out float4 ocol0 : SV_Target0,%s%s\n in float4 rawpos : SV_Position,\n", - dstAlphaMode == DSTALPHA_DUAL_SOURCE_BLEND ? "\n out float4 ocol1 : SV_Target1," : - "", + uid_data->dstAlphaMode == DSTALPHA_DUAL_SOURCE_BLEND ? + "\n out float4 ocol1 : SV_Target1," : + "", uid_data->per_pixel_depth ? "\n out float depth : SV_Depth," : ""); out.Write(" in %s float4 colors_0 : COLOR0,\n", @@ -649,7 +638,7 @@ ShaderCode GeneratePixelShaderCode(DSTALPHA_MODE dstAlphaMode, APIType ApiType, // out.SetConstantsUsed(C_PLIGHTS, C_PLIGHTS+31); // TODO: Can be optimized further // out.SetConstantsUsed(C_PMATERIALS, C_PMATERIALS+3); GenerateLightingShaderCode(out, uid_data->lighting, uid_data->components << VB_COL_SHIFT, - "colors_", "col"); + uid_data->numColorChans, "colors_", "col"); } // HACK to handle cases where the tex gen is not enabled @@ -716,7 +705,7 @@ ShaderCode GeneratePixelShaderCode(DSTALPHA_MODE dstAlphaMode, APIType ApiType, // testing result) if (uid_data->Pretest == AlphaTest::UNDETERMINED || (uid_data->Pretest == AlphaTest::FAIL && uid_data->late_ztest)) - WriteAlphaTest(out, uid_data, ApiType, dstAlphaMode, uid_data->per_pixel_depth); + WriteAlphaTest(out, uid_data, ApiType, uid_data->per_pixel_depth); if (uid_data->zfreeze) { @@ -787,7 +776,7 @@ ShaderCode GeneratePixelShaderCode(DSTALPHA_MODE dstAlphaMode, APIType ApiType, out.Write("\tdepth = float(zCoord) / 16777216.0;\n"); } - if (dstAlphaMode == DSTALPHA_ALPHA_PASS) + if (uid_data->dstAlphaMode == DSTALPHA_ALPHA_PASS) { out.SetConstantsUsed(C_ALPHA, C_ALPHA); out.Write("\tocol0 = float4(float3(prev.rgb), float(" I_ALPHA ".a)) / 255.0;\n"); @@ -799,7 +788,7 @@ ShaderCode GeneratePixelShaderCode(DSTALPHA_MODE dstAlphaMode, APIType ApiType, } // Use dual-source color blending to perform dst alpha in a single pass - if (dstAlphaMode == DSTALPHA_DUAL_SOURCE_BLEND) + if (uid_data->dstAlphaMode == DSTALPHA_DUAL_SOURCE_BLEND) { out.SetConstantsUsed(C_ALPHA, C_ALPHA); @@ -1195,7 +1184,7 @@ static const char* tevAlphaFunclogicTable[] = { }; static void WriteAlphaTest(ShaderCode& out, const pixel_shader_uid_data* uid_data, APIType ApiType, - DSTALPHA_MODE dstAlphaMode, bool per_pixel_depth) + bool per_pixel_depth) { static const char* alphaRef[2] = {I_ALPHA ".r", I_ALPHA ".g"}; @@ -1222,7 +1211,7 @@ static void WriteAlphaTest(ShaderCode& out, const pixel_shader_uid_data* uid_dat out.Write(")) {\n"); out.Write("\t\tocol0 = float4(0.0, 0.0, 0.0, 0.0);\n"); - if (dstAlphaMode == DSTALPHA_DUAL_SOURCE_BLEND) + if (uid_data->dstAlphaMode == DSTALPHA_DUAL_SOURCE_BLEND) out.Write("\t\tocol1 = float4(0.0, 0.0, 0.0, 0.0);\n"); if (per_pixel_depth) { diff --git a/Source/Core/VideoCommon/PixelShaderGen.h b/Source/Core/VideoCommon/PixelShaderGen.h index 7e83adaf4f..46fdcc36aa 100644 --- a/Source/Core/VideoCommon/PixelShaderGen.h +++ b/Source/Core/VideoCommon/PixelShaderGen.h @@ -52,7 +52,8 @@ struct pixel_shader_uid_data u32 zfreeze : 1; u32 msaa : 1; u32 ssaa : 1; - u32 pad : 16; + u32 numColorChans : 2; + u32 pad : 14; u32 texMtxInfo_n_projection : 8; // 8x1 bit u32 tevindref_bi0 : 3; @@ -166,6 +167,5 @@ struct pixel_shader_uid_data typedef ShaderUid PixelShaderUid; -ShaderCode GeneratePixelShaderCode(DSTALPHA_MODE dstAlphaMode, APIType ApiType, - const pixel_shader_uid_data* uid_data); +ShaderCode GeneratePixelShaderCode(APIType ApiType, const pixel_shader_uid_data* uid_data); PixelShaderUid GetPixelShaderUid(DSTALPHA_MODE dstAlphaMode); diff --git a/Source/Core/VideoCommon/VertexShaderGen.cpp b/Source/Core/VideoCommon/VertexShaderGen.cpp index 7725331193..11a9e40de0 100644 --- a/Source/Core/VideoCommon/VertexShaderGen.cpp +++ b/Source/Core/VideoCommon/VertexShaderGen.cpp @@ -250,7 +250,8 @@ ShaderCode GenerateVertexShaderCode(APIType api_type, const vertex_shader_uid_da out.Write("o.colors_0 = float4(1.0, 1.0, 1.0, 1.0);\n"); } - GenerateLightingShaderCode(out, uid_data->lighting, uid_data->components, "color", "o.colors_"); + GenerateLightingShaderCode(out, uid_data->lighting, uid_data->components, uid_data->numColorChans, + "color", "o.colors_"); if (uid_data->numColorChans < 2) {