From 9acc9bf3e0178c526f60f3cb5c5f1e19da805aeb Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Sun, 10 Dec 2017 20:01:38 +0100 Subject: [PATCH] [dxbc] Implemented Rsq instruction --- src/dxbc/dxbc_compiler.cpp | 14 ++++++++++++++ src/dxbc/dxbc_compiler.h | 3 +++ src/dxbc/gen/dxbc_gen_common.cpp | 10 ++++++++++ src/dxbc/gen/dxbc_gen_common.h | 3 +++ src/spirv/spirv_module.cpp | 15 +++++++++++++++ src/spirv/spirv_module.h | 4 ++++ 6 files changed, 49 insertions(+) diff --git a/src/dxbc/dxbc_compiler.cpp b/src/dxbc/dxbc_compiler.cpp index 897b4fd0..b37d8032 100644 --- a/src/dxbc/dxbc_compiler.cpp +++ b/src/dxbc/dxbc_compiler.cpp @@ -62,6 +62,9 @@ namespace dxvk { case DxbcOpcode::Dp4: return this->opDpx(ins, 4); + case DxbcOpcode::Rsq: + return this->opRsq(ins); + case DxbcOpcode::Ret: return this->opRet(ins); @@ -262,6 +265,17 @@ namespace dxvk { } + void DxbcCompiler::opRsq(const DxbcInstruction& ins) { + auto dstOp = ins.operand(0); + auto srcOp = ins.operand(dstOp.length()); + DxbcComponentMask mask = this->getDstOperandMask(dstOp); + + DxbcValue src = this->loadOperand(srcOp, mask, DxbcScalarType::Float32); + DxbcValue val = m_gen->opRsqrt(src); + val = this->applyResultModifiers(val, ins.token().control()); + this->storeOperand(dstOp, val, mask); + } + void DxbcCompiler::opMov(const DxbcInstruction& ins) { auto dstOp = ins.operand(0); auto srcOp = ins.operand(dstOp.length()); diff --git a/src/dxbc/dxbc_compiler.h b/src/dxbc/dxbc_compiler.h index 807c22e9..fa6278a7 100644 --- a/src/dxbc/dxbc_compiler.h +++ b/src/dxbc/dxbc_compiler.h @@ -57,6 +57,9 @@ namespace dxvk { const DxbcInstruction& ins, uint32_t n); + void opRsq( + const DxbcInstruction& ins); + void opMov( const DxbcInstruction& ins); diff --git a/src/dxbc/gen/dxbc_gen_common.cpp b/src/dxbc/gen/dxbc_gen_common.cpp index 0dfcdea8..b07d041d 100644 --- a/src/dxbc/gen/dxbc_gen_common.cpp +++ b/src/dxbc/gen/dxbc_gen_common.cpp @@ -354,6 +354,16 @@ namespace dxvk { } + DxbcValue DxbcCodeGen::opRsqrt(const DxbcValue& src) { + DxbcValue result; + result.type = src.type; + result.valueId = m_module.opInverseSqrt( + this->defValueType(result.type), + src.valueId); + return result; + } + + DxbcValue DxbcCodeGen::opNeg(const DxbcValue& src) { DxbcValue result; result.type = src.type; diff --git a/src/dxbc/gen/dxbc_gen_common.h b/src/dxbc/gen/dxbc_gen_common.h index ce6af4a5..bedccaa4 100644 --- a/src/dxbc/gen/dxbc_gen_common.h +++ b/src/dxbc/gen/dxbc_gen_common.h @@ -118,6 +118,9 @@ namespace dxvk { const DxbcValue& a, const DxbcValue& b); + DxbcValue opRsqrt( + const DxbcValue& src); + DxbcValue opNeg( const DxbcValue& src); diff --git a/src/spirv/spirv_module.cpp b/src/spirv/spirv_module.cpp index 49638813..b3137f3f 100644 --- a/src/spirv/spirv_module.cpp +++ b/src/spirv/spirv_module.cpp @@ -786,6 +786,21 @@ namespace dxvk { } + uint32_t SpirvModule::opInverseSqrt( + uint32_t resultType, + uint32_t x) { + uint32_t resultId = this->allocateId(); + + m_code.putIns (spv::OpExtInst, 6); + m_code.putWord(resultType); + m_code.putWord(resultId); + m_code.putWord(m_instExtGlsl450); + m_code.putWord(spv::GLSLstd450InverseSqrt); + m_code.putWord(x); + return resultId; + } + + uint32_t SpirvModule::opFunctionCall( uint32_t resultType, uint32_t functionId, diff --git a/src/spirv/spirv_module.h b/src/spirv/spirv_module.h index 14eebaad..76072c93 100644 --- a/src/spirv/spirv_module.h +++ b/src/spirv/spirv_module.h @@ -281,6 +281,10 @@ namespace dxvk { uint32_t vector1, uint32_t vector2); + uint32_t opInverseSqrt( + uint32_t resultType, + uint32_t x); + uint32_t opFunctionCall( uint32_t resultType, uint32_t functionId,