diff --git a/src/core/hle/D3D8/Direct3D9/Direct3D9.cpp b/src/core/hle/D3D8/Direct3D9/Direct3D9.cpp index 9fbb22d84..e36268f50 100644 --- a/src/core/hle/D3D8/Direct3D9/Direct3D9.cpp +++ b/src/core/hle/D3D8/Direct3D9/Direct3D9.cpp @@ -6394,15 +6394,21 @@ void UpdateFixedFunctionVertexShaderState() // Point sprites auto pointSize = XboxRenderStates.GetXboxRenderState(X_D3DRS_POINTSIZE); + auto pointSizeMin = XboxRenderStates.GetXboxRenderState(X_D3DRS_POINTSIZE_MIN); + auto pointSizeMax = XboxRenderStates.GetXboxRenderState(X_D3DRS_POINTSIZE_MAX); ffShaderState.PointSprite.PointSize = *reinterpret_cast(&pointSize); - bool PointScaleEnable = XboxRenderStates.GetXboxRenderState(X_D3DRS_POINTSCALEENABLE) != FALSE; - ffShaderState.PointSprite.RenderTargetHeight = PointScaleEnable ? (float)GetPixelContainerHeight(g_pXbox_RenderTarget) : 1.0f; + ffShaderState.PointSprite.PointSizeMin = *reinterpret_cast(&pointSizeMin); + ffShaderState.PointSprite.PointSizeMax = *reinterpret_cast(&pointSizeMax); + + bool PointScaleEnable = XboxRenderStates.GetXboxRenderState(X_D3DRS_POINTSCALEENABLE); auto scaleA = XboxRenderStates.GetXboxRenderState(X_D3DRS_POINTSCALE_A); - ffShaderState.PointSprite.ScaleA = PointScaleEnable ? *reinterpret_cast(&scaleA) : 1.0f; auto scaleB = XboxRenderStates.GetXboxRenderState(X_D3DRS_POINTSCALE_B); - ffShaderState.PointSprite.ScaleB = PointScaleEnable ? *reinterpret_cast(&scaleB) : 0.0f; auto scaleC = XboxRenderStates.GetXboxRenderState(X_D3DRS_POINTSCALE_C); - ffShaderState.PointSprite.ScaleC = PointScaleEnable ? *reinterpret_cast(&scaleC) : 0.0f; + ffShaderState.PointSprite.ScaleABC.x = PointScaleEnable ? *reinterpret_cast(&scaleA) : 1.0f; + ffShaderState.PointSprite.ScaleABC.y = PointScaleEnable ? *reinterpret_cast(&scaleB) : 0.0f; + ffShaderState.PointSprite.ScaleABC.z = PointScaleEnable ? *reinterpret_cast(&scaleC) : 0.0f; + ffShaderState.PointSprite.XboxRenderTargetHeight = PointScaleEnable ? (float)GetPixelContainerHeight(g_pXbox_RenderTarget) : 1.0f; + ffShaderState.PointSprite.RenderUpscaleFactor = g_RenderUpscaleFactor; // Fog // Determine how fog depth is calculated diff --git a/src/core/hle/D3D8/Direct3D9/FixedFunctionVertexShader.hlsl b/src/core/hle/D3D8/Direct3D9/FixedFunctionVertexShader.hlsl index 0cf4619af..cdab93f0f 100644 --- a/src/core/hle/D3D8/Direct3D9/FixedFunctionVertexShader.hlsl +++ b/src/core/hle/D3D8/Direct3D9/FixedFunctionVertexShader.hlsl @@ -390,16 +390,19 @@ float DoPointSpriteSize() { const PointSprite ps = state.PointSprite; float pointSize = ps.PointSize; + float A = ps.ScaleABC.x; + float B = ps.ScaleABC.y; + float C = ps.ScaleABC.z; // Note : if (ps.PointScaleEnable) not required because when disabled, CPU sets RenderTargetHeight and ScaleA to 1, and ScaleB and ScaleC to 0 { const float eyeDistance = length(View.Position); - const float factor = ps.ScaleA + ps.ScaleB * eyeDistance + ps.ScaleC * (eyeDistance * eyeDistance); + const float factor = A + (B * eyeDistance) + (C * (eyeDistance * eyeDistance)); - pointSize *= ps.RenderTargetHeight * sqrt(1 / factor); + pointSize *= ps.XboxRenderTargetHeight * sqrt(1 / factor); } - return pointSize; + return clamp(pointSize, ps.PointSizeMin, ps.PointSizeMax) * ps.RenderUpscaleFactor; } VS_INPUT InitializeInputRegisters(const VS_INPUT xInput) diff --git a/src/core/hle/D3D8/Direct3D9/FixedFunctionVertexShaderState.hlsli b/src/core/hle/D3D8/Direct3D9/FixedFunctionVertexShaderState.hlsli index 77fb72a1a..b909b97e4 100644 --- a/src/core/hle/D3D8/Direct3D9/FixedFunctionVertexShaderState.hlsli +++ b/src/core/hle/D3D8/Direct3D9/FixedFunctionVertexShaderState.hlsli @@ -105,11 +105,12 @@ struct Modes { struct PointSprite { alignas(16) float PointSize; + alignas(16) float PointSizeMin; + alignas(16) float PointSizeMax; // alignas(16) float PointScaleEnable; - alignas(16) float RenderTargetHeight; - alignas(16) float ScaleA; - alignas(16) float ScaleB; - alignas(16) float ScaleC; + alignas(16) float XboxRenderTargetHeight; + alignas(16) float3 ScaleABC; + alignas(16) float RenderUpscaleFactor; }; struct TextureState {