From b97a95729ce2bba69154bfd8c7719677af5797c0 Mon Sep 17 00:00:00 2001 From: Chris Forbes Date: Thu, 21 Feb 2019 16:51:42 -0800 Subject: [PATCH] Add support for OpCompositeConstruct Bug: b/126475423 Change-Id: I69d05db8eaf0825893210424496dc6c9ad793d0d Reviewed-on: https://swiftshader-review.googlesource.com/c/25190 Tested-by: Chris Forbes Reviewed-by: Nicolas Capens Reviewed-by: Ben Clayton Kokoro-Presubmit: kokoro --- src/Pipeline/SpirvShader.cpp | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/Pipeline/SpirvShader.cpp b/src/Pipeline/SpirvShader.cpp index 418ffd4e9..97fc5d8e7 100644 --- a/src/Pipeline/SpirvShader.cpp +++ b/src/Pipeline/SpirvShader.cpp @@ -259,6 +259,7 @@ namespace sw case spv::OpLoad: case spv::OpAccessChain: + case spv::OpCompositeConstruct: // Instructions that yield an ssavalue. { TypeID typeId = insn.word(1); @@ -927,6 +928,24 @@ namespace sw } break; } + case spv::OpCompositeConstruct: + { + auto &type = getType(insn.word(1)); + auto &dst = routine->createIntermediate(insn.word(2), type.sizeInComponents); + auto offset = 0u; + + for (auto i = 0u; i < insn.wordCount() - 3; i++) + { + ObjectID srcObjectId = insn.word(3u + i); + auto & srcObject = getObject(srcObjectId); + auto & srcObjectTy = getType(srcObject.type); + GenericValue srcObjectAccess(this, routine, srcObjectId); + + for (auto j = 0u; j < srcObjectTy.sizeInComponents; j++) + dst.emplace(offset++, srcObjectAccess[j]); + } + break; + } default: printf("emit: ignoring opcode %d\n", insn.opcode()); break; -- 2.11.0