mirror of
https://github.com/doitsujin/dxvk.git
synced 2025-03-02 22:29:16 +01:00
[d3d9] Perform FF vertex clipping in world space
Previously we were doing this in object space which is incorrect. Closes #1446
This commit is contained in:
parent
cad3b69e82
commit
0c16cc7749
@ -6012,6 +6012,7 @@ namespace dxvk {
|
|||||||
D3D9FixedFunctionVS* data = reinterpret_cast<D3D9FixedFunctionVS*>(slice.mapPtr);
|
D3D9FixedFunctionVS* data = reinterpret_cast<D3D9FixedFunctionVS*>(slice.mapPtr);
|
||||||
data->WorldView = WorldView;
|
data->WorldView = WorldView;
|
||||||
data->NormalMatrix = NormalMatrix;
|
data->NormalMatrix = NormalMatrix;
|
||||||
|
data->InverseView = transpose(inverse(m_state.transforms[GetTransformIndex(D3DTS_VIEW)]));
|
||||||
data->Projection = m_state.transforms[GetTransformIndex(D3DTS_PROJECTION)];
|
data->Projection = m_state.transforms[GetTransformIndex(D3DTS_PROJECTION)];
|
||||||
|
|
||||||
for (uint32_t i = 0; i < data->TexcoordMatrices.size(); i++)
|
for (uint32_t i = 0; i < data->TexcoordMatrices.size(); i++)
|
||||||
|
@ -418,6 +418,7 @@ namespace dxvk {
|
|||||||
enum class D3D9FFVSMembers {
|
enum class D3D9FFVSMembers {
|
||||||
WorldViewMatrix,
|
WorldViewMatrix,
|
||||||
NormalMatrix,
|
NormalMatrix,
|
||||||
|
InverseViewMatrix,
|
||||||
ProjMatrix,
|
ProjMatrix,
|
||||||
|
|
||||||
Texcoord0,
|
Texcoord0,
|
||||||
@ -462,6 +463,7 @@ namespace dxvk {
|
|||||||
struct {
|
struct {
|
||||||
uint32_t worldview;
|
uint32_t worldview;
|
||||||
uint32_t normal;
|
uint32_t normal;
|
||||||
|
uint32_t inverseView;
|
||||||
uint32_t proj;
|
uint32_t proj;
|
||||||
|
|
||||||
uint32_t texcoord[8];
|
uint32_t texcoord[8];
|
||||||
@ -580,7 +582,7 @@ namespace dxvk {
|
|||||||
|
|
||||||
void emitPsSharedConstants();
|
void emitPsSharedConstants();
|
||||||
|
|
||||||
void emitVsClipping();
|
void emitVsClipping(uint32_t vtx);
|
||||||
|
|
||||||
void alphaTestPS();
|
void alphaTestPS();
|
||||||
|
|
||||||
@ -1161,7 +1163,7 @@ namespace dxvk {
|
|||||||
uint32_t pointSize = m_module.opFClamp(m_floatType, pointInfo.defaultValue, pointInfo.min, pointInfo.max);
|
uint32_t pointSize = m_module.opFClamp(m_floatType, pointInfo.defaultValue, pointInfo.min, pointInfo.max);
|
||||||
m_module.opStore(m_vs.out.POINTSIZE, pointSize);
|
m_module.opStore(m_vs.out.POINTSIZE, pointSize);
|
||||||
|
|
||||||
emitVsClipping();
|
emitVsClipping(vtx);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -1242,6 +1244,7 @@ namespace dxvk {
|
|||||||
std::array<uint32_t, uint32_t(D3D9FFVSMembers::MemberCount)> members = {
|
std::array<uint32_t, uint32_t(D3D9FFVSMembers::MemberCount)> members = {
|
||||||
m_mat4Type, // World
|
m_mat4Type, // World
|
||||||
m_mat4Type, // View
|
m_mat4Type, // View
|
||||||
|
m_mat4Type, // InverseView
|
||||||
m_mat4Type, // Proj
|
m_mat4Type, // Proj
|
||||||
|
|
||||||
m_mat4Type, // Texture0
|
m_mat4Type, // Texture0
|
||||||
@ -1315,6 +1318,7 @@ namespace dxvk {
|
|||||||
uint32_t member = 0;
|
uint32_t member = 0;
|
||||||
m_module.setDebugMemberName(structType, member++, "WorldView");
|
m_module.setDebugMemberName(structType, member++, "WorldView");
|
||||||
m_module.setDebugMemberName(structType, member++, "Normal");
|
m_module.setDebugMemberName(structType, member++, "Normal");
|
||||||
|
m_module.setDebugMemberName(structType, member++, "InverseView");
|
||||||
m_module.setDebugMemberName(structType, member++, "Projection");
|
m_module.setDebugMemberName(structType, member++, "Projection");
|
||||||
|
|
||||||
m_module.setDebugMemberName(structType, member++, "TexcoordTransform0");
|
m_module.setDebugMemberName(structType, member++, "TexcoordTransform0");
|
||||||
@ -1433,6 +1437,7 @@ namespace dxvk {
|
|||||||
|
|
||||||
m_vs.constants.worldview = LoadConstant(m_mat4Type, uint32_t(D3D9FFVSMembers::WorldViewMatrix));
|
m_vs.constants.worldview = LoadConstant(m_mat4Type, uint32_t(D3D9FFVSMembers::WorldViewMatrix));
|
||||||
m_vs.constants.normal = LoadConstant(m_mat4Type, uint32_t(D3D9FFVSMembers::NormalMatrix));
|
m_vs.constants.normal = LoadConstant(m_mat4Type, uint32_t(D3D9FFVSMembers::NormalMatrix));
|
||||||
|
m_vs.constants.inverseView = LoadConstant(m_mat4Type, uint32_t(D3D9FFVSMembers::InverseViewMatrix));
|
||||||
m_vs.constants.proj = LoadConstant(m_mat4Type, uint32_t(D3D9FFVSMembers::ProjMatrix));
|
m_vs.constants.proj = LoadConstant(m_mat4Type, uint32_t(D3D9FFVSMembers::ProjMatrix));
|
||||||
|
|
||||||
for (uint32_t i = 0; i < caps::TextureStageCount; i++)
|
for (uint32_t i = 0; i < caps::TextureStageCount; i++)
|
||||||
@ -2105,7 +2110,9 @@ namespace dxvk {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void D3D9FFShaderCompiler::emitVsClipping() {
|
void D3D9FFShaderCompiler::emitVsClipping(uint32_t vtx) {
|
||||||
|
uint32_t worldPos = m_module.opMatrixTimesVector(m_vec4Type, m_vs.constants.inverseView, vtx);
|
||||||
|
|
||||||
uint32_t clipPlaneCountId = m_module.constu32(caps::MaxClipPlanes);
|
uint32_t clipPlaneCountId = m_module.constu32(caps::MaxClipPlanes);
|
||||||
|
|
||||||
uint32_t floatType = m_module.defFloatType(32);
|
uint32_t floatType = m_module.defFloatType(32);
|
||||||
@ -2163,7 +2170,7 @@ namespace dxvk {
|
|||||||
m_module.defPointerType(vec4Type, spv::StorageClassUniform),
|
m_module.defPointerType(vec4Type, spv::StorageClassUniform),
|
||||||
clipPlaneBlock, blockMembers.size(), blockMembers.data()));
|
clipPlaneBlock, blockMembers.size(), blockMembers.data()));
|
||||||
|
|
||||||
uint32_t distId = m_module.opDot(floatType, m_vs.in.POSITION, planeId);
|
uint32_t distId = m_module.opDot(floatType, worldPos, planeId);
|
||||||
|
|
||||||
m_module.opStore(
|
m_module.opStore(
|
||||||
m_module.opAccessChain(
|
m_module.opAccessChain(
|
||||||
|
@ -113,6 +113,7 @@ namespace dxvk {
|
|||||||
struct D3D9FixedFunctionVS {
|
struct D3D9FixedFunctionVS {
|
||||||
Matrix4 WorldView;
|
Matrix4 WorldView;
|
||||||
Matrix4 NormalMatrix;
|
Matrix4 NormalMatrix;
|
||||||
|
Matrix4 InverseView;
|
||||||
Matrix4 Projection;
|
Matrix4 Projection;
|
||||||
|
|
||||||
std::array<Matrix4, 8> TexcoordMatrices;
|
std::array<Matrix4, 8> TexcoordMatrices;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user