From: Chris Forbes Date: Fri, 29 Mar 2019 02:08:39 +0000 (-0700) Subject: Add support for OpMatrixTimesMatrix X-Git-Tag: android-x86-9.0-r1~48 X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=51562f15f4ad9cc7c0ea1a0e528a4f2c4aa89202;p=android-x86%2Fexternal-swiftshader.git Add support for OpMatrixTimesMatrix Bug: b/126873455 Test: dEQP-VK.glsl.matrix.* Change-Id: I3070690017263b3bf766a329ef7729206f285e45 Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/28228 Tested-by: Chris Forbes Presubmit-Ready: Chris Forbes Reviewed-by: Nicolas Capens Kokoro-Presubmit: kokoro --- diff --git a/src/Pipeline/SpirvShader.cpp b/src/Pipeline/SpirvShader.cpp index 938351766..c54c4cb2c 100644 --- a/src/Pipeline/SpirvShader.cpp +++ b/src/Pipeline/SpirvShader.cpp @@ -361,6 +361,7 @@ namespace sw case spv::OpMatrixTimesScalar: case spv::OpMatrixTimesVector: case spv::OpVectorTimesMatrix: + case spv::OpMatrixTimesMatrix: case spv::OpVectorExtractDynamic: case spv::OpVectorInsertDynamic: case spv::OpNot: // Unary ops @@ -1480,6 +1481,9 @@ namespace sw case spv::OpVectorTimesMatrix: return EmitVectorTimesMatrix(insn, state); + case spv::OpMatrixTimesMatrix: + return EmitMatrixTimesMatrix(insn, state); + case spv::OpNot: case spv::OpSNegate: case spv::OpFNegate: @@ -2105,6 +2109,34 @@ namespace sw return EmitResult::Continue; } + SpirvShader::EmitResult SpirvShader::EmitMatrixTimesMatrix(InsnIterator insn, EmitState *state) const + { + auto routine = state->routine; + auto &type = getType(insn.word(1)); + auto &dst = routine->createIntermediate(insn.word(2), type.sizeInComponents); + auto lhs = GenericValue(this, routine, insn.word(3)); + auto rhs = GenericValue(this, routine, insn.word(4)); + + auto numColumns = type.definition.word(3); + auto numRows = getType(type.definition.word(2)).definition.word(3); + auto numAdds = getType(getObject(insn.word(3)).type).definition.word(3); + + for (auto row = 0u; row < numRows; row++) + { + for (auto col = 0u; col < numColumns; col++) + { + SIMD::Float v = SIMD::Float(0); + for (auto i = 0u; i < numAdds; i++) + { + v += lhs.Float(i * numRows + row) * rhs.Float(col * numAdds + i); + } + dst.move(numRows * col + row, v); + } + } + + return EmitResult::Continue; + } + SpirvShader::EmitResult SpirvShader::EmitUnaryOp(InsnIterator insn, EmitState *state) const { auto routine = state->routine; diff --git a/src/Pipeline/SpirvShader.hpp b/src/Pipeline/SpirvShader.hpp index 3410dc17e..498c54712 100644 --- a/src/Pipeline/SpirvShader.hpp +++ b/src/Pipeline/SpirvShader.hpp @@ -598,6 +598,7 @@ namespace sw EmitResult EmitVectorTimesScalar(InsnIterator insn, EmitState *state) const; EmitResult EmitMatrixTimesVector(InsnIterator insn, EmitState *state) const; EmitResult EmitVectorTimesMatrix(InsnIterator insn, EmitState *state) const; + EmitResult EmitMatrixTimesMatrix(InsnIterator insn, EmitState *state) const; EmitResult EmitVectorExtractDynamic(InsnIterator insn, EmitState *state) const; EmitResult EmitVectorInsertDynamic(InsnIterator insn, EmitState *state) const; EmitResult EmitUnaryOp(InsnIterator insn, EmitState *state) const;