Fix dynamic rendering implicit clears with multiview Applied the same fix that had been previously applied to CmdClearAttachment::execute() to CmdBeginRendering::execute(). Also, multiview is set when viewMask > 0, so the logic was modified to take that into account. Tests: dEQP-VK.multiview.dynamic_rendering.readback_implicit_clear.* Bug: b/204502119 Change-Id: I98fddd81ebf82412bd5f5e13ce8a9fe645905e41 Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/63288 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> Commit-Queue: Alexis Hétu <sugoi@google.com>
diff --git a/src/Pipeline/PixelProgram.cpp b/src/Pipeline/PixelProgram.cpp index 42fefc1..d6cbe0a 100644 --- a/src/Pipeline/PixelProgram.cpp +++ b/src/Pipeline/PixelProgram.cpp
@@ -98,7 +98,7 @@ routine.helperInvocation = ~maskAny(cMask, samples); routine.windowSpacePosition[0] = x + SIMD::Int(0, 1, 0, 1); routine.windowSpacePosition[1] = y + SIMD::Int(0, 0, 1, 1); - routine.viewID = *Pointer<Int>(data + OFFSET(DrawData, viewID)); + routine.layer = *Pointer<Int>(data + OFFSET(DrawData, layer)); // PointCoord formula reference: https://www.khronos.org/registry/vulkan/specs/1.2/html/vkspec.html#primsrast-points-basic // Note we don't add a 0.5 offset to x and y here (like for fragCoord) because pointCoordX/Y have 0.5 subtracted as part of the viewport transform. @@ -108,7 +108,7 @@ routine.setInputBuiltin(spirvShader, spv::BuiltInViewIndex, [&](const SpirvShader::BuiltinMapping &builtin, Array<SIMD::Float> &value) { assert(builtin.SizeInComponents == 1); - value[builtin.FirstComponent] = As<SIMD::Float>(SIMD::Int(routine.viewID)); + value[builtin.FirstComponent] = As<SIMD::Float>(SIMD::Int(routine.layer)); }); routine.setInputBuiltin(spirvShader, spv::BuiltInFragCoord, [&](const SpirvShader::BuiltinMapping &builtin, Array<SIMD::Float> &value) {
diff --git a/src/Pipeline/SpirvShader.hpp b/src/Pipeline/SpirvShader.hpp index 6aab7a7..1641d83 100644 --- a/src/Pipeline/SpirvShader.hpp +++ b/src/Pipeline/SpirvShader.hpp
@@ -1509,7 +1509,7 @@ // Give careful consideration to the runtime performance loss before adding // more state here. std::array<SIMD::Int, 2> windowSpacePosition; - Int viewID; // slice offset into input attachments for multiview, even if the shader doesn't use ViewIndex + Int layer; // slice offset into input attachments for multiview, even if the shader doesn't use ViewIndex Int instanceID; SIMD::Int vertexIndex; std::array<SIMD::Float, 4> fragCoord;
diff --git a/src/Pipeline/SpirvShaderDebugger.cpp b/src/Pipeline/SpirvShaderDebugger.cpp index 0d3704b..0f25a32 100644 --- a/src/Pipeline/SpirvShaderDebugger.cpp +++ b/src/Pipeline/SpirvShaderDebugger.cpp
@@ -2633,7 +2633,7 @@ case spv::ExecutionModelFragment: { auto fragment = globals + OFFSET(Globals, fragment); - store(fragment + OFFSET(Globals::Fragment, viewIndex), routine->viewID); + store(fragment + OFFSET(Globals::Fragment, viewIndex), routine->layer); store(fragment + OFFSET(Globals::Fragment, fragCoord), routine->fragCoord); store(fragment + OFFSET(Globals::Fragment, pointCoord), routine->pointCoord); store(fragment + OFFSET(Globals::Fragment, windowSpacePosition), routine->windowSpacePosition); @@ -2643,7 +2643,7 @@ case spv::ExecutionModelVertex: { auto vertex = globals + OFFSET(Globals, vertex); - store(vertex + OFFSET(Globals::Vertex, viewIndex), routine->viewID); + store(vertex + OFFSET(Globals::Vertex, viewIndex), routine->layer); store(vertex + OFFSET(Globals::Vertex, instanceIndex), routine->instanceID); store(vertex + OFFSET(Globals::Vertex, vertexIndex), routine->vertexIndex); }
diff --git a/src/Pipeline/SpirvShaderImage.cpp b/src/Pipeline/SpirvShaderImage.cpp index d66a1a2..7a9b1dd 100644 --- a/src/Pipeline/SpirvShaderImage.cpp +++ b/src/Pipeline/SpirvShaderImage.cpp
@@ -684,7 +684,7 @@ if(dim == spv::DimSubpassData) { // Multiview input attachment access is to the layer corresponding to the current view - ptrOffset += SIMD::Int(state->routine->viewID) * slicePitch; + ptrOffset += SIMD::Int(state->routine->layer) * slicePitch; } if(instruction.sample)
diff --git a/src/Pipeline/VertexProgram.cpp b/src/Pipeline/VertexProgram.cpp index ca1aad3..7583b12 100644 --- a/src/Pipeline/VertexProgram.cpp +++ b/src/Pipeline/VertexProgram.cpp
@@ -36,12 +36,12 @@ // TODO(b/146486064): Consider only assigning these to the SpirvRoutine iff // they are ever going to be read. - routine.viewID = *Pointer<Int>(data + OFFSET(DrawData, viewID)); + routine.layer = *Pointer<Int>(data + OFFSET(DrawData, layer)); routine.instanceID = *Pointer<Int>(data + OFFSET(DrawData, instanceID)); routine.setInputBuiltin(spirvShader, spv::BuiltInViewIndex, [&](const SpirvShader::BuiltinMapping &builtin, Array<SIMD::Float> &value) { assert(builtin.SizeInComponents == 1); - value[builtin.FirstComponent] = As<SIMD::Float>(SIMD::Int(routine.viewID)); + value[builtin.FirstComponent] = As<SIMD::Float>(SIMD::Int(routine.layer)); }); routine.setInputBuiltin(spirvShader, spv::BuiltInInstanceIndex, [&](const SpirvShader::BuiltinMapping &builtin, Array<SIMD::Float> &value) {