Merge changes Ia7ee9d37,Ia3214243
* changes:
Update Marl to 5f31df137
Squashed 'third_party/marl/' changes from bf3e23083..5f31df137
diff --git a/src/Pipeline/SpirvShader.cpp b/src/Pipeline/SpirvShader.cpp
index 0498c6c..b4b1f73 100644
--- a/src/Pipeline/SpirvShader.cpp
+++ b/src/Pipeline/SpirvShader.cpp
@@ -917,12 +917,15 @@
break;
case spv::OpFunctionParameter:
- case spv::OpFunctionCall:
// These should have all been removed by preprocessing passes. If we see them here,
// our assumptions are wrong and we will probably generate wrong code.
UNREACHABLE("%s should have already been lowered.", OpcodeName(opcode).c_str());
break;
+ case spv::OpFunctionCall:
+ // TODO(b/141246700): Add full support for spv::OpFunctionCall
+ break;
+
case spv::OpFConvert:
UNSUPPORTED("SPIR-V Float16 or Float64 Capability (OpFConvert)");
break;
@@ -2693,6 +2696,9 @@
case spv::OpReturn:
return EmitReturn(insn, state);
+ case spv::OpFunctionCall:
+ return EmitFunctionCall(insn, state);
+
case spv::OpKill:
return EmitKill(insn, state);
@@ -4833,6 +4839,44 @@
return EmitResult::Terminator;
}
+ SpirvShader::EmitResult SpirvShader::EmitFunctionCall(InsnIterator insn, EmitState *state) const
+ {
+ auto functionId = Function::ID(insn.word(3));
+ const auto& functionIt = functions.find(functionId);
+ ASSERT(functionIt != functions.end());
+ auto& function = functionIt->second;
+
+ // TODO(b/141246700): Add full support for spv::OpFunctionCall
+ // The only supported function is a single OpKill wrapped in a
+ // function, as a result of the "wrap OpKill" SPIRV-Tools pass
+ ASSERT(function.blocks.size() == 1);
+ spv::Op wrapOpKill[] = { spv::OpLabel, spv::OpKill };
+
+ for (auto block : function.blocks)
+ {
+ int insnNumber = 0;
+ for (auto blockInsn : block.second)
+ {
+ if (insnNumber > 1)
+ {
+ UNIMPLEMENTED("Function block number of instructions: %d", insnNumber);
+ return EmitResult::Continue;
+ }
+ if (blockInsn.opcode() != wrapOpKill[insnNumber++])
+ {
+ UNIMPLEMENTED("Function block instruction %d : %s", insnNumber - 1, OpcodeName(blockInsn.opcode()).c_str());
+ return EmitResult::Continue;
+ }
+ if (blockInsn.opcode() == spv::OpKill)
+ {
+ EmitInstruction(blockInsn, state);
+ }
+ }
+ }
+
+ return EmitResult::Continue;
+ }
+
SpirvShader::EmitResult SpirvShader::EmitPhi(InsnIterator insn, EmitState *state) const
{
auto &function = getFunction(state->function);
diff --git a/src/Pipeline/SpirvShader.hpp b/src/Pipeline/SpirvShader.hpp
index 4a28af6..34565cb 100644
--- a/src/Pipeline/SpirvShader.hpp
+++ b/src/Pipeline/SpirvShader.hpp
@@ -1224,6 +1224,7 @@
EmitResult EmitUnreachable(InsnIterator insn, EmitState *state) const;
EmitResult EmitReturn(InsnIterator insn, EmitState *state) const;
EmitResult EmitKill(InsnIterator insn, EmitState *state) const;
+ EmitResult EmitFunctionCall(InsnIterator insn, EmitState *state) const;
EmitResult EmitPhi(InsnIterator insn, EmitState *state) const;
EmitResult EmitImageSampleImplicitLod(Variant variant, InsnIterator insn, EmitState *state) const;
EmitResult EmitImageSampleExplicitLod(Variant variant, InsnIterator insn, EmitState *state) const;
diff --git a/src/Vulkan/VkFormat.cpp b/src/Vulkan/VkFormat.cpp
index 7e7cce7..3746c08 100644
--- a/src/Vulkan/VkFormat.cpp
+++ b/src/Vulkan/VkFormat.cpp
@@ -196,6 +196,7 @@
case VK_IMAGE_ASPECT_STENCIL_BIT:
switch(format)
{
+ case VK_FORMAT_S8_UINT:
case VK_FORMAT_D16_UNORM_S8_UINT:
case VK_FORMAT_D24_UNORM_S8_UINT:
case VK_FORMAT_D32_SFLOAT_S8_UINT:
@@ -211,6 +212,7 @@
case VK_IMAGE_ASPECT_PLANE_0_BIT:
switch(format)
{
+ case VK_FORMAT_R8_UNORM:
case VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM:
case VK_FORMAT_G8_B8R8_2PLANE_420_UNORM:
return VK_FORMAT_R8_UNORM;
@@ -223,8 +225,10 @@
case VK_IMAGE_ASPECT_PLANE_1_BIT:
switch(format)
{
+ case VK_FORMAT_R8_UNORM:
case VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM:
return VK_FORMAT_R8_UNORM;
+ case VK_FORMAT_R8G8_UNORM:
case VK_FORMAT_G8_B8R8_2PLANE_420_UNORM:
return VK_FORMAT_R8G8_UNORM;
default:
@@ -236,6 +240,7 @@
case VK_IMAGE_ASPECT_PLANE_2_BIT:
switch(format)
{
+ case VK_FORMAT_R8_UNORM:
case VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM:
return VK_FORMAT_R8_UNORM;
default:
diff --git a/src/Vulkan/VkImageView.cpp b/src/Vulkan/VkImageView.cpp
index d847aa7..0a61ce6 100644
--- a/src/Vulkan/VkImageView.cpp
+++ b/src/Vulkan/VkImageView.cpp
@@ -253,7 +253,8 @@
Format ImageView::getFormat(Usage usage) const
{
- return ((usage == RAW) || (getImage(usage) == image)) ? format : getImage(usage)->getFormat();
+ Format imageFormat = ((usage == RAW) || (getImage(usage) == image)) ? format : getImage(usage)->getFormat();
+ return imageFormat.getAspectFormat(subresourceRange.aspectMask);
}
int ImageView::rowPitchBytes(VkImageAspectFlagBits aspect, uint32_t mipLevel, Usage usage) const
diff --git a/src/Vulkan/VkPhysicalDevice.cpp b/src/Vulkan/VkPhysicalDevice.cpp
index 1618773..1112b56 100644
--- a/src/Vulkan/VkPhysicalDevice.cpp
+++ b/src/Vulkan/VkPhysicalDevice.cpp
@@ -451,8 +451,10 @@
case VK_FORMAT_R32G32B32A32_UINT:
case VK_FORMAT_R32G32B32A32_SINT:
case VK_FORMAT_R32G32B32A32_SFLOAT:
+ case VK_FORMAT_S8_UINT:
case VK_FORMAT_D16_UNORM:
case VK_FORMAT_D32_SFLOAT:
+ case VK_FORMAT_D32_SFLOAT_S8_UINT:
pFormatProperties->optimalTilingFeatures |=
VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT |
VK_FORMAT_FEATURE_BLIT_SRC_BIT |
@@ -557,6 +559,7 @@
VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT |
VK_FORMAT_FEATURE_BLIT_DST_BIT;
break;
+ case VK_FORMAT_S8_UINT:
case VK_FORMAT_D16_UNORM:
case VK_FORMAT_D32_SFLOAT: // Note: either VK_FORMAT_D32_SFLOAT or VK_FORMAT_X8_D24_UNORM_PACK32 must be supported
case VK_FORMAT_D32_SFLOAT_S8_UINT: // Note: either VK_FORMAT_D24_UNORM_S8_UINT or VK_FORMAT_D32_SFLOAT_S8_UINT must be supported
diff --git a/src/Vulkan/VkPipeline.cpp b/src/Vulkan/VkPipeline.cpp
index 7c55daa..ebee9f2 100644
--- a/src/Vulkan/VkPipeline.cpp
+++ b/src/Vulkan/VkPipeline.cpp
@@ -193,7 +193,8 @@
}
// Full optimization list taken from spirv-opt.
- opt.RegisterPass(spvtools::CreateDeadBranchElimPass())
+ opt.RegisterPass(spvtools::CreateWrapOpKillPass())
+ .RegisterPass(spvtools::CreateDeadBranchElimPass())
.RegisterPass(spvtools::CreateMergeReturnPass())
.RegisterPass(spvtools::CreateInlineExhaustivePass())
.RegisterPass(spvtools::CreateAggressiveDCEPass())