OpCopy* fixes This CL fixes 2 issues with OpCopy* operations: 1) descriptorDecorations should propagate when making a copy 2) pointers can be copied Bug: b/236957718 Change-Id: Id99a94f45416df94ad74803313f1e6176ee3b9f7 Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/67808 Commit-Queue: Alexis Hétu <sugoi@google.com> Presubmit-Ready: Alexis Hétu <sugoi@google.com> Reviewed-by: Nicolas Capens <nicolascapens@google.com> Kokoro-Result: kokoro <noreply+kokoro@google.com> Tested-by: Alexis Hétu <sugoi@google.com>
diff --git a/src/Pipeline/SpirvShader.cpp b/src/Pipeline/SpirvShader.cpp index 9a628dd..28516ed 100644 --- a/src/Pipeline/SpirvShader.cpp +++ b/src/Pipeline/SpirvShader.cpp
@@ -572,6 +572,8 @@ case spv::OpPtrAccessChain: case spv::OpSampledImage: case spv::OpImage: + case spv::OpCopyObject: + case spv::OpCopyLogical: { // Propagate the descriptor decorations to the result. Object::ID resultId = insn.word(2); @@ -765,8 +767,6 @@ case spv::OpGroupNonUniformLogicalAnd: case spv::OpGroupNonUniformLogicalOr: case spv::OpGroupNonUniformLogicalXor: - case spv::OpCopyObject: - case spv::OpCopyLogical: case spv::OpArrayLength: case spv::OpIsHelperInvocationEXT: // Instructions that yield an intermediate value or divergent pointer @@ -2642,12 +2642,19 @@ SpirvShader::EmitResult SpirvShader::EmitCopyObject(InsnIterator insn, EmitState *state) const { - auto type = getType(insn.resultTypeId()); - auto &dst = state->createIntermediate(insn.resultId(), type.componentCount); auto src = Operand(this, state, insn.word(3)); - for(uint32_t i = 0; i < type.componentCount; i++) + if(src.isPointer()) { - dst.move(i, src.Int(i)); + state->createPointer(insn.resultId(), src.Pointer(0)); + } + else + { + auto type = getType(insn.resultTypeId()); + auto &dst = state->createIntermediate(insn.resultId(), type.componentCount); + for(uint32_t i = 0; i < type.componentCount; i++) + { + dst.move(i, src.Int(i)); + } } return EmitResult::Continue; }