diff --git a/src/core/hle/D3D8/Direct3D9/Direct3D9.cpp b/src/core/hle/D3D8/Direct3D9/Direct3D9.cpp index 6d5a02faa..b0c15023a 100644 --- a/src/core/hle/D3D8/Direct3D9/Direct3D9.cpp +++ b/src/core/hle/D3D8/Direct3D9/Direct3D9.cpp @@ -6469,21 +6469,23 @@ void UpdateFixedFunctionVertexShaderState() ffShaderState.Modes.BackEmissiveMaterialSource = (float)(ColorVertex ? XboxRenderStates.GetXboxRenderState(X_D3DRS_BACKEMISSIVEMATERIALSOURCE) : D3DMCS_MATERIAL); // 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); - ffShaderState.PointSprite.PointSizeMin = *reinterpret_cast(&pointSizeMin); - ffShaderState.PointSprite.PointSizeMax = *reinterpret_cast(&pointSizeMax); - + bool PointSpriteEnable = XboxRenderStates.GetXboxRenderState(X_D3DRS_POINTSPRITEENABLE); + float pointSize = XboxRenderStates.GetXboxRenderStateAsFloat(X_D3DRS_POINTSIZE); + float pointSizeMin = XboxRenderStates.GetXboxRenderStateAsFloat(X_D3DRS_POINTSIZE_MIN); + float pointSizeMax = XboxRenderStates.GetXboxRenderStateAsFloat(X_D3DRS_POINTSIZE_MAX); bool PointScaleEnable = XboxRenderStates.GetXboxRenderState(X_D3DRS_POINTSCALEENABLE); - auto scaleA = XboxRenderStates.GetXboxRenderState(X_D3DRS_POINTSCALE_A); - auto scaleB = XboxRenderStates.GetXboxRenderState(X_D3DRS_POINTSCALE_B); - auto scaleC = XboxRenderStates.GetXboxRenderState(X_D3DRS_POINTSCALE_C); - 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; + float scaleA = XboxRenderStates.GetXboxRenderStateAsFloat(X_D3DRS_POINTSCALE_A); + float scaleB = XboxRenderStates.GetXboxRenderStateAsFloat(X_D3DRS_POINTSCALE_B); + float scaleC = XboxRenderStates.GetXboxRenderStateAsFloat(X_D3DRS_POINTSCALE_C); + float renderTargetHeight = (float)GetPixelContainerHeight(g_pXbox_RenderTarget); + PointScaleEnable &= PointSpriteEnable; + ffShaderState.PointSprite.PointSize = PointSpriteEnable ? pointSize : 1.0f; + ffShaderState.PointSprite.PointSizeMin = PointSpriteEnable ? pointSizeMin : 1.0f; + ffShaderState.PointSprite.PointSizeMax = PointSpriteEnable ? pointSizeMax : 1.0f; + ffShaderState.PointSprite.ScaleABC.x = PointScaleEnable ? scaleA : 1.0f; + ffShaderState.PointSprite.ScaleABC.y = PointScaleEnable ? scaleB : 0.0f; + ffShaderState.PointSprite.ScaleABC.z = PointScaleEnable ? scaleC : 0.0f; + ffShaderState.PointSprite.XboxRenderTargetHeight = PointScaleEnable ? renderTargetHeight : 1.0f; ffShaderState.PointSprite.RenderUpscaleFactor = g_RenderUpscaleFactor; // Fog diff --git a/src/core/hle/D3D8/Direct3D9/FixedFunctionVertexShader.hlsl b/src/core/hle/D3D8/Direct3D9/FixedFunctionVertexShader.hlsl index cdab93f0f..c5c76dd94 100644 --- a/src/core/hle/D3D8/Direct3D9/FixedFunctionVertexShader.hlsl +++ b/src/core/hle/D3D8/Direct3D9/FixedFunctionVertexShader.hlsl @@ -19,10 +19,13 @@ struct VS_INPUT #else float4 pos : POSITION; float4 bw : BLENDWEIGHT; - float4 color[2] : COLOR; + float4 normal : NORMAL; + float4 color[2] : COLOR; + float1 fogCoord : FOG; + float1 pointSize : PSIZE; float4 backColor[2] : TEXCOORD4; - float4 normal : NORMAL; float4 texcoord[4] : TEXCOORD; + float4 reserved[3] : TEXCOORD6; #endif }; @@ -59,12 +62,17 @@ float4 Get(const VS_INPUT xIn, const uint index) if(index == normal) return xIn.normal; if(index == diffuse) return xIn.color[0]; if(index == specular) return xIn.color[1]; + if(index == fogCoord) return xIn.fogCoord; + if(index == pointSize) return xIn.pointSize; if(index == backDiffuse) return xIn.backColor[0]; if(index == backSpecular) return xIn.backColor[1]; if(index == texcoord0) return xIn.texcoord[0]; if(index == texcoord1) return xIn.texcoord[1]; if(index == texcoord2) return xIn.texcoord[2]; if(index == texcoord3) return xIn.texcoord[3]; + if(index == reserved0) return xIn.reserved[0]; + if(index == reserved1) return xIn.reserved[1]; + if(index == reserved2) return xIn.reserved[2]; return 1; #endif } diff --git a/src/core/hle/D3D8/Direct3D9/RenderStates.cpp b/src/core/hle/D3D8/Direct3D9/RenderStates.cpp index f53eda030..e617eb30b 100644 --- a/src/core/hle/D3D8/Direct3D9/RenderStates.cpp +++ b/src/core/hle/D3D8/Direct3D9/RenderStates.cpp @@ -186,6 +186,16 @@ uint32_t XboxRenderStateConverter::GetXboxRenderState(uint32_t State) return D3D__RenderState[XboxRenderStateOffsets[State]]; } +float XboxRenderStateConverter::GetXboxRenderStateAsFloat(uint32_t State) +{ + if (!XboxRenderStateExists(State)) { + EmuLog(LOG_LEVEL::WARNING, "Attempt to read a Renderstate (%s) that does not exist in the current D3D8 XDK Version (%d)", GetDxbxRenderStateInfo(State).S, g_LibVersion_D3D8); + return 0; + } + + return *reinterpret_cast(&(D3D__RenderState[XboxRenderStateOffsets[State]])); +} + void XboxRenderStateConverter::StoreInitialValues() { for (unsigned int RenderState = xbox::X_D3DRS_FIRST; RenderState <= xbox::X_D3DRS_LAST; RenderState++) { diff --git a/src/core/hle/D3D8/Direct3D9/RenderStates.h b/src/core/hle/D3D8/Direct3D9/RenderStates.h index 78bfab944..dbc161ddb 100644 --- a/src/core/hle/D3D8/Direct3D9/RenderStates.h +++ b/src/core/hle/D3D8/Direct3D9/RenderStates.h @@ -46,6 +46,7 @@ public: void SetWireFrameMode(int mode); void SetDirty(); uint32_t GetXboxRenderState(uint32_t State); + float GetXboxRenderStateAsFloat(uint32_t State); private: void VerifyAndFixDeferredRenderStateOffset(); void DeriveRenderStateOffsetFromDeferredRenderStateOffset(); diff --git a/src/core/hle/D3D8/Direct3D9/TextureStates.cpp b/src/core/hle/D3D8/Direct3D9/TextureStates.cpp index f75714d34..045b06235 100644 --- a/src/core/hle/D3D8/Direct3D9/TextureStates.cpp +++ b/src/core/hle/D3D8/Direct3D9/TextureStates.cpp @@ -33,6 +33,7 @@ #include "EmuShared.h" #include "core/hle/Intercept.hpp" #include "RenderStates.h" +#include "core/hle/D3D8/XbVertexShader.h" // For g_UseFixedFunctionVertexShader, g_Xbox_VertexShaderMode and VertexShaderMode::FixedFunction #include "core/hle/D3D8/Direct3D9/Direct3D9.h" // For g_pD3DDevice #include @@ -166,9 +167,12 @@ void XboxTextureStateConverter::Apply() // The Xbox NV2A uses only Stage 3 for point-sprites, so we emulate this // by mapping Stage 3 to Stage 0, and disabling all stages > 0 bool pointSpriteOverride = false; - bool pointSpritesEnabled = pXboxRenderStates->GetXboxRenderState(xbox::X_D3DRS_POINTSPRITEENABLE); - if (pointSpritesEnabled) { - pointSpriteOverride = true; + bool pointSpritesEnabled = false; + if (g_Xbox_VertexShaderMode == VertexShaderMode::FixedFunction && g_UseFixedFunctionVertexShader) { + pointSpritesEnabled = pXboxRenderStates->GetXboxRenderState(xbox::X_D3DRS_POINTSPRITEENABLE); + if (pointSpritesEnabled) { + pointSpriteOverride = true; + } } for (int XboxStage = 0; XboxStage < xbox::X_D3DTS_STAGECOUNT; XboxStage++) {