[d3d9] Add helpers for precise matrix-vector products

This commit is contained in:
Philip Rebohle 2022-09-16 15:31:17 +02:00 committed by Joshie
parent 3a63c7cb31
commit b56ec10deb
1 changed files with 35 additions and 0 deletions

View File

@ -764,6 +764,9 @@ namespace dxvk {
void alphaTestPS();
uint32_t emitMatrixTimesVector(uint32_t rowCount, uint32_t colCount, uint32_t matrix, uint32_t vector);
uint32_t emitVectorTimesMatrix(uint32_t rowCount, uint32_t colCount, uint32_t vector, uint32_t matrix);
bool isVS() { return m_programType == DxsoProgramType::VertexShader; }
bool isPS() { return !isVS(); }
@ -2390,6 +2393,38 @@ namespace dxvk {
}
uint32_t D3D9FFShaderCompiler::emitMatrixTimesVector(uint32_t rowCount, uint32_t colCount, uint32_t matrix, uint32_t vector) {
uint32_t f32Type = m_module.defFloatType(32);
uint32_t vecType = m_module.defVectorType(f32Type, rowCount);
uint32_t accum = 0;
for (uint32_t i = 0; i < colCount; i++) {
std::array<uint32_t, 4> indices = { i, i, i, i };
uint32_t a = m_module.opVectorShuffle(vecType, vector, vector, rowCount, indices.data());
uint32_t b = m_module.opCompositeExtract(vecType, matrix, 1, &i);
accum = accum
? m_module.opFFma(vecType, a, b, accum)
: m_module.opFMul(vecType, a, b);
m_module.decorate(accum, spv::DecorationNoContraction);
}
return accum;
}
uint32_t D3D9FFShaderCompiler::emitVectorTimesMatrix(uint32_t rowCount, uint32_t colCount, uint32_t vector, uint32_t matrix) {
uint32_t f32Type = m_module.defFloatType(32);
uint32_t vecType = m_module.defVectorType(f32Type, colCount);
uint32_t matType = m_module.defMatrixType(vecType, rowCount);
matrix = m_module.opTranspose(matType, matrix);
return emitMatrixTimesVector(colCount, rowCount, matrix, vector);
}
D3D9FFShader::D3D9FFShader(
D3D9DeviceEx* pDevice,
const D3D9FFShaderKeyVS& Key) {