Improved pNext pointer handling
- Added a loop for handling pNext pointers everywhere in
libVulkan.cpp where the wasn't already one, in order to
always output the unsupported structure type(s) received
by the library
- Changed UNIMPLEMENTED to WARN for unhandled pNext pointers
Fixes the test:
dEQP-VK.api.smoke.triangle_ext_structs
Bug: b/144999059 b/119321052
Change-Id: Id83b5e74c8925dbd38651747b0cea46fac4a69a4
Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/38548
Presubmit-Ready: Alexis Hétu <sugoi@google.com>
Kokoro-Presubmit: kokoro <noreply+kokoro@google.com>
Reviewed-by: Sean Risser <srisser@google.com>
Reviewed-by: Chris Forbes <chrisforbes@google.com>
Tested-by: Alexis Hétu <sugoi@google.com>
diff --git a/src/Vulkan/VkPipeline.cpp b/src/Vulkan/VkPipeline.cpp
index cbb79c7..9a4f34f 100644
--- a/src/Vulkan/VkPipeline.cpp
+++ b/src/Vulkan/VkPipeline.cpp
@@ -18,6 +18,7 @@
#include "VkPipelineCache.hpp"
#include "VkPipelineLayout.hpp"
#include "VkShaderModule.hpp"
+#include "VkStringify.hpp"
#include "VkRenderPass.hpp"
#include "Pipeline/ComputeProgram.hpp"
#include "Pipeline/SpirvShader.hpp"
@@ -419,7 +420,7 @@
}
break;
default:
- UNIMPLEMENTED("extensionCreateInfo->sType");
+ WARN("pCreateInfo->pRasterizationState->pNext sType = %s", vk::Stringify(extensionCreateInfo->sType));
break;
}
diff --git a/src/Vulkan/VkRenderPass.cpp b/src/Vulkan/VkRenderPass.cpp
index 10682ef..89632e3 100644
--- a/src/Vulkan/VkRenderPass.cpp
+++ b/src/Vulkan/VkRenderPass.cpp
@@ -13,6 +13,7 @@
// limitations under the License.
#include "VkRenderPass.hpp"
+#include "VkStringify.hpp"
#include <cstring>
namespace vk
@@ -76,7 +77,7 @@
break;
}
default:
- /* Unknown structure in pNext chain must be ignored */
+ WARN("pCreateInfo->pNext sType = %s", vk::Stringify(extensionCreateInfo->sType));
break;
}
diff --git a/src/Vulkan/libVulkan.cpp b/src/Vulkan/libVulkan.cpp
index c8980f9..c348133 100644
--- a/src/Vulkan/libVulkan.cpp
+++ b/src/Vulkan/libVulkan.cpp
@@ -283,7 +283,8 @@
if(pCreateInfo->pNext)
{
- switch(*reinterpret_cast<const VkStructureType*>(pCreateInfo->pNext))
+ const VkBaseInStructure* createInfo = reinterpret_cast<const VkBaseInStructure*>(pCreateInfo->pNext);
+ switch(createInfo->sType)
{
case VK_STRUCTURE_TYPE_LOADER_INSTANCE_CREATE_INFO:
// According to the Vulkan spec, section 2.7.2. Implicit Valid Usage:
@@ -293,7 +294,8 @@
// Vulkan structures in this Specification."
break;
default:
- UNIMPLEMENTED("pCreateInfo->pNext");
+ WARN("pCreateInfo->pNext sType = %s", vk::Stringify(createInfo->sType));
+ break;
}
}
@@ -638,7 +640,7 @@
break;
default:
// "the [driver] must skip over, without processing (other than reading the sType and pNext members) any structures in the chain with sType values not defined by [supported extenions]"
- TRACE_ASSERT("Unimplemented extensionCreateInfo->sType = %s", vk::Stringify(extensionCreateInfo->sType));
+ WARN("pCreateInfo->pNext sType = %s", vk::Stringify(extensionCreateInfo->sType));
break;
}
@@ -660,9 +662,16 @@
for(uint32_t i = 0; i < pCreateInfo->queueCreateInfoCount; i++)
{
const VkDeviceQueueCreateInfo& queueCreateInfo = pCreateInfo->pQueueCreateInfos[i];
- if(queueCreateInfo.pNext || queueCreateInfo.flags)
+ if(queueCreateInfo.flags)
{
- UNIMPLEMENTED("queueCreateInfo.pNext || queueCreateInfo.flags");
+ UNIMPLEMENTED("queueCreateInfo.flags");
+ }
+
+ auto extInfo = reinterpret_cast<VkBaseInStructure const*>(queueCreateInfo.pNext);
+ while(extInfo)
+ {
+ WARN("pCreateInfo->pQueueCreateInfos[%d].pNext sType = %s", i, vk::Stringify(extInfo->sType));
+ extInfo = extInfo->pNext;
}
ASSERT(queueCreateInfo.queueFamilyIndex < queueFamilyPropertyCount);
@@ -823,7 +832,7 @@
}
#endif
default:
- TRACE_ASSERT("Unimplemented allocationInfo->sType = %s", vk::Stringify(allocationInfo->sType));
+ WARN("pAllocateInfo->pNext sType = %s", vk::Stringify(allocationInfo->sType));
break;
}
@@ -1022,9 +1031,11 @@
TRACE("(VkDevice device = %p, const VkFenceCreateInfo* pCreateInfo = %p, const VkAllocationCallbacks* pAllocator = %p, VkFence* pFence = %p)",
device, pCreateInfo, pAllocator, pFence);
- if(pCreateInfo->pNext)
+ auto* nextInfo = reinterpret_cast<const VkBaseInStructure*>(pCreateInfo->pNext);
+ while(nextInfo)
{
- UNIMPLEMENTED("pCreateInfo->pNext");
+ WARN("pCreateInfo->pNext sType = %s", vk::Stringify(nextInfo->sType));
+ nextInfo = nextInfo->pNext;
}
return vk::Fence::Create(pAllocator, pCreateInfo, pFence);
@@ -1157,9 +1168,16 @@
TRACE("(VkDevice device = %p, const VkEventCreateInfo* pCreateInfo = %p, const VkAllocationCallbacks* pAllocator = %p, VkEvent* pEvent = %p)",
device, pCreateInfo, pAllocator, pEvent);
- if(pCreateInfo->pNext || pCreateInfo->flags)
+ if(pCreateInfo->flags)
{
- UNIMPLEMENTED("pCreateInfo->pNext || pCreateInfo->flags");
+ UNIMPLEMENTED("pCreateInfo->flags");
+ }
+
+ auto extInfo = reinterpret_cast<VkBaseInStructure const*>(pCreateInfo->pNext);
+ while(extInfo)
+ {
+ WARN("pCreateInfo->pNext sType = %s", vk::Stringify(extInfo->sType));
+ extInfo = extInfo->pNext;
}
return vk::Event::Create(pAllocator, pCreateInfo, pEvent);
@@ -1203,9 +1221,16 @@
TRACE("(VkDevice device = %p, const VkQueryPoolCreateInfo* pCreateInfo = %p, const VkAllocationCallbacks* pAllocator = %p, VkQueryPool* pQueryPool = %p)",
device, pCreateInfo, pAllocator, pQueryPool);
- if(pCreateInfo->pNext || pCreateInfo->flags)
+ if(pCreateInfo->flags)
{
- UNIMPLEMENTED("pCreateInfo->pNext || pCreateInfo->flags");
+ UNIMPLEMENTED("pCreateInfo->flags");
+ }
+
+ auto extInfo = reinterpret_cast<VkBaseInStructure const*>(pCreateInfo->pNext);
+ while(extInfo)
+ {
+ WARN("pCreateInfo->pNext sType = %s", vk::Stringify(extInfo->sType));
+ extInfo = extInfo->pNext;
}
return vk::QueryPool::Create(pAllocator, pCreateInfo, pQueryPool);
@@ -1241,7 +1266,8 @@
// Do nothing. Should be handled by vk::Buffer::Create().
break;
default:
- UNIMPLEMENTED("pCreateInfo->pNext sType=0x%X", nextInfo->sType);
+ WARN("pCreateInfo->pNext sType = %s", vk::Stringify(nextInfo->sType));
+ break;
}
nextInfo = nextInfo->pNext;
}
@@ -1262,9 +1288,16 @@
TRACE("(VkDevice device = %p, const VkBufferViewCreateInfo* pCreateInfo = %p, const VkAllocationCallbacks* pAllocator = %p, VkBufferView* pView = %p)",
device, pCreateInfo, pAllocator, pView);
- if(pCreateInfo->pNext || pCreateInfo->flags)
+ if(pCreateInfo->flags)
{
- UNIMPLEMENTED("pCreateInfo->pNext || pCreateInfo->flags");
+ UNIMPLEMENTED("pCreateInfo->flags");
+ }
+
+ auto extInfo = reinterpret_cast<VkBaseInStructure const*>(pCreateInfo->pNext);
+ while(extInfo)
+ {
+ WARN("pCreateInfo->pNext sType = %s", vk::Stringify(extInfo->sType));
+ extInfo = extInfo->pNext;
}
return vk::BufferView::Create(pAllocator, pCreateInfo, pView);
@@ -1318,7 +1351,7 @@
break;
default:
// "the [driver] must skip over, without processing (other than reading the sType and pNext members) any structures in the chain with sType values not defined by [supported extenions]"
- UNIMPLEMENTED("extensionCreateInfo->sType"); // TODO(b/119321052): UNIMPLEMENTED() should be used only for features that must still be implemented. Use a more informational macro here.
+ WARN("pCreateInfo->pNext sType = %s", vk::Stringify(extensionCreateInfo->sType));
break;
}
@@ -1422,7 +1455,7 @@
}
break;
default:
- UNIMPLEMENTED("extensionCreateInfo->sType %d", int(extensionCreateInfo->sType));
+ WARN("pCreateInfo->pNext sType = %s", vk::Stringify(extensionCreateInfo->sType));
break;
}
@@ -1445,9 +1478,16 @@
TRACE("(VkDevice device = %p, const VkShaderModuleCreateInfo* pCreateInfo = %p, const VkAllocationCallbacks* pAllocator = %p, VkShaderModule* pShaderModule = %p)",
device, pCreateInfo, pAllocator, pShaderModule);
- if(pCreateInfo->pNext || pCreateInfo->flags)
+ if(pCreateInfo->flags)
{
- UNIMPLEMENTED("pCreateInfo->pNext || pCreateInfo->flags");
+ UNIMPLEMENTED("pCreateInfo->flags");
+ }
+
+ auto* nextInfo = reinterpret_cast<const VkBaseInStructure*>(pCreateInfo->pNext);
+ while(nextInfo)
+ {
+ WARN("pCreateInfo->pNext sType = %s", vk::Stringify(nextInfo->sType));
+ nextInfo = nextInfo->pNext;
}
return vk::ShaderModule::Create(pAllocator, pCreateInfo, pShaderModule);
@@ -1466,9 +1506,16 @@
TRACE("(VkDevice device = %p, const VkPipelineCacheCreateInfo* pCreateInfo = %p, const VkAllocationCallbacks* pAllocator = %p, VkPipelineCache* pPipelineCache = %p)",
device, pCreateInfo, pAllocator, pPipelineCache);
- if(pCreateInfo->pNext || pCreateInfo->flags)
+ if(pCreateInfo->flags)
{
- UNIMPLEMENTED("pCreateInfo->pNext || pCreateInfo->flags");
+ UNIMPLEMENTED("pCreateInfo->flags");
+ }
+
+ auto extInfo = reinterpret_cast<VkBaseInStructure const*>(pCreateInfo->pNext);
+ while(extInfo)
+ {
+ WARN("pCreateInfo->pNext sType = %s", vk::Stringify(extInfo->sType));
+ extInfo = extInfo->pNext;
}
return vk::PipelineCache::Create(pAllocator, pCreateInfo, pPipelineCache);
@@ -1575,9 +1622,16 @@
TRACE("(VkDevice device = %p, const VkPipelineLayoutCreateInfo* pCreateInfo = %p, const VkAllocationCallbacks* pAllocator = %p, VkPipelineLayout* pPipelineLayout = %p)",
device, pCreateInfo, pAllocator, pPipelineLayout);
- if(pCreateInfo->pNext || pCreateInfo->flags)
+ if(pCreateInfo->flags)
{
- UNIMPLEMENTED("pCreateInfo->pNext || pCreateInfo->flags");
+ UNIMPLEMENTED("pCreateInfo->flags");
+ }
+
+ auto* nextInfo = reinterpret_cast<const VkBaseInStructure*>(pCreateInfo->pNext);
+ while(nextInfo)
+ {
+ WARN("pCreateInfo->pNext sType = %s", vk::Stringify(nextInfo->sType));
+ nextInfo = nextInfo->pNext;
}
return vk::PipelineLayout::Create(pAllocator, pCreateInfo, pPipelineLayout);
@@ -1598,7 +1652,7 @@
if(pCreateInfo->flags)
{
- UNIMPLEMENTED("pCreateInfo->pNext || pCreateInfo->flags");
+ UNIMPLEMENTED("pCreateInfo->flags");
}
const VkBaseInStructure* extensionCreateInfo = reinterpret_cast<const VkBaseInStructure*>(pCreateInfo->pNext);
@@ -1615,7 +1669,7 @@
}
break;
default:
- UNIMPLEMENTED("extensionCreateInfo->sType %d", int(extensionCreateInfo->sType));
+ WARN("pCreateInfo->pNext sType = %s", vk::Stringify(extensionCreateInfo->sType));
break;
}
@@ -1648,7 +1702,7 @@
ASSERT(!vk::Cast(device)->hasExtension(VK_EXT_DESCRIPTOR_INDEXING_EXTENSION_NAME));
break;
default:
- UNIMPLEMENTED("extensionCreateInfo->sType %d", int(extensionCreateInfo->sType));
+ WARN("pCreateInfo->pNext sType = %s", vk::Stringify(extensionCreateInfo->sType));
break;
}
@@ -1671,9 +1725,11 @@
TRACE("(VkDevice device = %p, const VkDescriptorPoolCreateInfo* pCreateInfo = %p, const VkAllocationCallbacks* pAllocator = %p, VkDescriptorPool* pDescriptorPool = %p)",
device, pCreateInfo, pAllocator, pDescriptorPool);
- if(pCreateInfo->pNext)
+ auto extInfo = reinterpret_cast<VkBaseInStructure const*>(pCreateInfo->pNext);
+ while(extInfo)
{
- UNIMPLEMENTED("pCreateInfo->pNext");
+ WARN("pCreateInfo->pNext sType = %s", vk::Stringify(extInfo->sType));
+ extInfo = extInfo->pNext;
}
return vk::DescriptorPool::Create(pAllocator, pCreateInfo, pDescriptorPool);
@@ -1705,9 +1761,11 @@
TRACE("(VkDevice device = %p, const VkDescriptorSetAllocateInfo* pAllocateInfo = %p, VkDescriptorSet* pDescriptorSets = %p)",
device, pAllocateInfo, pDescriptorSets);
- if(pAllocateInfo->pNext)
+ auto extInfo = reinterpret_cast<VkBaseInStructure const*>(pAllocateInfo->pNext);
+ while(extInfo)
{
- UNIMPLEMENTED("pAllocateInfo->pNext");
+ WARN("pAllocateInfo->pNext sType = %s", vk::Stringify(extInfo->sType));
+ extInfo = extInfo->pNext;
}
return vk::Cast(pAllocateInfo->descriptorPool)->allocateSets(
@@ -1737,9 +1795,16 @@
TRACE("(VkDevice device = %p, const VkFramebufferCreateInfo* pCreateInfo = %p, const VkAllocationCallbacks* pAllocator = %p, VkFramebuffer* pFramebuffer = %p)",
device, pCreateInfo, pAllocator, pFramebuffer);
- if(pCreateInfo->pNext || pCreateInfo->flags)
+ if(pCreateInfo->flags)
{
- UNIMPLEMENTED("pCreateInfo->pNext || pCreateInfo->flags");
+ UNIMPLEMENTED("pCreateInfo->flags");
+ }
+
+ auto* nextInfo = reinterpret_cast<const VkBaseInStructure*>(pCreateInfo->pNext);
+ while(nextInfo)
+ {
+ WARN("pCreateInfo->pNext sType = %s", vk::Stringify(nextInfo->sType));
+ nextInfo = nextInfo->pNext;
}
return vk::Framebuffer::Create(pAllocator, pCreateInfo, pFramebuffer);
@@ -1838,7 +1903,7 @@
}
break;
default:
- UNIMPLEMENTED("extensionCreateInfo->sType %d", int(extensionCreateInfo->sType));
+ WARN("pCreateInfo->pNext sType = %s", vk::Stringify(extensionCreateInfo->sType));
break;
}
@@ -1869,9 +1934,11 @@
TRACE("(VkDevice device = %p, const VkCommandPoolCreateInfo* pCreateInfo = %p, const VkAllocationCallbacks* pAllocator = %p, VkCommandPool* pCommandPool = %p)",
device, pCreateInfo, pAllocator, pCommandPool);
- if(pCreateInfo->pNext)
+ auto* nextInfo = reinterpret_cast<const VkBaseInStructure*>(pCreateInfo->pNext);
+ while(nextInfo)
{
- UNIMPLEMENTED("pCreateInfo->pNext");
+ WARN("pCreateInfo->pNext sType = %s", vk::Stringify(nextInfo->sType));
+ nextInfo = nextInfo->pNext;
}
return vk::CommandPool::Create(pAllocator, pCreateInfo, pCommandPool);
@@ -1898,9 +1965,11 @@
TRACE("(VkDevice device = %p, const VkCommandBufferAllocateInfo* pAllocateInfo = %p, VkCommandBuffer* pCommandBuffers = %p)",
device, pAllocateInfo, pCommandBuffers);
- if(pAllocateInfo->pNext)
+ auto* nextInfo = reinterpret_cast<const VkBaseInStructure*>(pAllocateInfo->pNext);
+ while(nextInfo)
{
- UNIMPLEMENTED("pAllocateInfo->pNext");
+ WARN("pAllocateInfo->pNext sType = %s", vk::Stringify(nextInfo->sType));
+ nextInfo = nextInfo->pNext;
}
return vk::Cast(pAllocateInfo->commandPool)->allocateCommandBuffers(
@@ -1920,9 +1989,11 @@
TRACE("(VkCommandBuffer commandBuffer = %p, const VkCommandBufferBeginInfo* pBeginInfo = %p)",
commandBuffer, pBeginInfo);
- if(pBeginInfo->pNext)
+ auto* nextInfo = reinterpret_cast<const VkBaseInStructure*>(pBeginInfo->pNext);
+ while(nextInfo)
{
- UNIMPLEMENTED("pBeginInfo->pNext");
+ WARN("pBeginInfo->pNext sType = %s", vk::Stringify(nextInfo->sType));
+ nextInfo = nextInfo->pNext;
}
return vk::Cast(commandBuffer)->begin(pBeginInfo->flags, pBeginInfo->pInheritanceInfo);
@@ -2281,7 +2352,7 @@
// SwiftShader only has a single physical device, so this extension does nothing in this case.
break;
default:
- UNIMPLEMENTED("renderPassBeginInfo->sType");
+ WARN("pRenderPassBegin->pNext sType = %s", vk::Stringify(renderPassBeginInfo->sType));
break;
}
@@ -2330,9 +2401,11 @@
for(uint32_t i = 0; i < bindInfoCount; i++)
{
- if(pBindInfos[i].pNext)
+ auto extInfo = reinterpret_cast<VkBaseInStructure const*>(pBindInfos[i].pNext);
+ while(extInfo)
{
- UNIMPLEMENTED("pBindInfos[%d].pNext", i);
+ WARN("pBindInfos[%d].pNext sType = %s", i, vk::Stringify(extInfo->sType));
+ extInfo = extInfo->pNext;
}
if (!vk::Cast(pBindInfos[i].buffer)->canBindToMemory(vk::Cast(pBindInfos[i].memory)))
@@ -2389,6 +2462,7 @@
#endif
default:
+ WARN("pBindInfos[%d].pNext sType = %s", i, vk::Stringify(extInfo->sType));
break;
}
extInfo = extInfo->pNext;
@@ -2437,9 +2511,11 @@
TRACE("(VkDevice device = %p, const VkImageMemoryRequirementsInfo2* pInfo = %p, VkMemoryRequirements2* pMemoryRequirements = %p)",
device, pInfo, pMemoryRequirements);
- if(pInfo->pNext)
+ auto extInfo = reinterpret_cast<VkBaseInStructure const*>(pInfo->pNext);
+ while(extInfo)
{
- UNIMPLEMENTED("pInfo->pNext");
+ WARN("pInfo->pNext sType = %s", vk::Stringify(extInfo->sType));
+ extInfo = extInfo->pNext;
}
VkBaseOutStructure* extensionRequirements = reinterpret_cast<VkBaseOutStructure*>(pMemoryRequirements->pNext);
@@ -2454,7 +2530,7 @@
}
break;
default:
- UNIMPLEMENTED("extensionRequirements->sType");
+ WARN("pMemoryRequirements->pNext sType = %s", vk::Stringify(extensionRequirements->sType));
break;
}
@@ -2469,9 +2545,11 @@
TRACE("(VkDevice device = %p, const VkBufferMemoryRequirementsInfo2* pInfo = %p, VkMemoryRequirements2* pMemoryRequirements = %p)",
device, pInfo, pMemoryRequirements);
- if(pInfo->pNext)
+ auto extInfo = reinterpret_cast<VkBaseInStructure const*>(pInfo->pNext);
+ while(extInfo)
{
- UNIMPLEMENTED("pInfo->pNext");
+ WARN("pInfo->pNext sType = %s", vk::Stringify(extInfo->sType));
+ extInfo = extInfo->pNext;
}
VkBaseOutStructure* extensionRequirements = reinterpret_cast<VkBaseOutStructure*>(pMemoryRequirements->pNext);
@@ -2486,7 +2564,7 @@
}
break;
default:
- UNIMPLEMENTED("extensionRequirements->sType");
+ WARN("pMemoryRequirements->pNext sType = %s", vk::Stringify(extensionRequirements->sType));
break;
}
@@ -2501,9 +2579,18 @@
TRACE("(VkDevice device = %p, const VkImageSparseMemoryRequirementsInfo2* pInfo = %p, uint32_t* pSparseMemoryRequirementCount = %p, VkSparseImageMemoryRequirements2* pSparseMemoryRequirements = %p)",
device, pInfo, pSparseMemoryRequirementCount, pSparseMemoryRequirements);
- if(pInfo->pNext || pSparseMemoryRequirements->pNext)
+ auto extInfo = reinterpret_cast<VkBaseInStructure const*>(pInfo->pNext);
+ while(extInfo)
{
- UNIMPLEMENTED("pInfo->pNext || pSparseMemoryRequirements->pNext");
+ WARN("pInfo->pNext sType = %s", vk::Stringify(extInfo->sType));
+ extInfo = extInfo->pNext;
+ }
+
+ auto extensionRequirements = reinterpret_cast<VkBaseInStructure const*>(pSparseMemoryRequirements->pNext);
+ while(extensionRequirements)
+ {
+ WARN("pSparseMemoryRequirements->pNext sType = %s", vk::Stringify(extensionRequirements->sType));
+ extensionRequirements = extensionRequirements->pNext;
}
// The 'sparseBinding' feature is not supported, so images can not be created with the VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT flag.
@@ -2591,8 +2678,7 @@
sizeof(deviceExtensionProperties) / sizeof(deviceExtensionProperties[0])));
break;
default:
- // "the [driver] must skip over, without processing (other than reading the sType and pNext members) any structures in the chain with sType values not defined by [supported extenions]"
- UNIMPLEMENTED("extensionFeatures->sType"); // TODO(b/119321052): UNIMPLEMENTED() should be used only for features that must still be implemented. Use a more informational macro here.
+ WARN("pFeatures->pNext sType = %s", vk::Stringify(extensionFeatures->sType));
break;
}
@@ -2688,7 +2774,7 @@
break;
default:
// "the [driver] must skip over, without processing (other than reading the sType and pNext members) any structures in the chain with sType values not defined by [supported extenions]"
- UNIMPLEMENTED("extensionProperties->sType"); // TODO(b/119321052): UNIMPLEMENTED() should be used only for features that must still be implemented. Use a more informational macro here.
+ WARN("pProperties->pNext sType = %s", vk::Stringify(extensionProperties->sType));
break;
}
@@ -2703,9 +2789,11 @@
TRACE("(VkPhysicalDevice physicalDevice = %p, VkFormat format = %d, VkFormatProperties2* pFormatProperties = %p)",
physicalDevice, format, pFormatProperties);
- if(pFormatProperties->pNext)
+ auto extInfo = reinterpret_cast<VkBaseInStructure const*>(pFormatProperties->pNext);
+ while(extInfo)
{
- UNIMPLEMENTED("pFormatProperties->pNext");
+ WARN("pFormatProperties->pNext sType = %s", vk::Stringify(extInfo->sType));
+ extInfo = extInfo->pNext;
}
vkGetPhysicalDeviceFormatProperties(physicalDevice, format, &(pFormatProperties->formatProperties));
@@ -2751,7 +2839,7 @@
}
break;
default:
- UNIMPLEMENTED("extensionFormatInfo->sType");
+ WARN("pImageFormatInfo->pNext sType = %s", vk::Stringify(extensionFormatInfo->sType));
break;
}
@@ -2784,7 +2872,7 @@
}
break;
default:
- UNIMPLEMENTED("extensionProperties->sType");
+ WARN("pImageFormatProperties->pNext sType = %s", vk::Stringify(extensionProperties->sType));
break;
}
@@ -2805,9 +2893,14 @@
TRACE("(VkPhysicalDevice physicalDevice = %p, uint32_t* pQueueFamilyPropertyCount = %p, VkQueueFamilyProperties2* pQueueFamilyProperties = %p)",
physicalDevice, pQueueFamilyPropertyCount, pQueueFamilyProperties);
- if(pQueueFamilyProperties && pQueueFamilyProperties->pNext)
+ if(pQueueFamilyProperties)
{
- UNIMPLEMENTED("pQueueFamilyProperties->pNext");
+ auto extInfo = reinterpret_cast<VkBaseInStructure const*>(pQueueFamilyProperties->pNext);
+ while(extInfo)
+ {
+ WARN("pQueueFamilyProperties->pNext sType = %s", vk::Stringify(extInfo->sType));
+ extInfo = extInfo->pNext;
+ }
}
if(!pQueueFamilyProperties)
@@ -2824,9 +2917,11 @@
{
TRACE("(VkPhysicalDevice physicalDevice = %p, VkPhysicalDeviceMemoryProperties2* pMemoryProperties = %p)", physicalDevice, pMemoryProperties);
- if(pMemoryProperties->pNext)
+ auto extInfo = reinterpret_cast<VkBaseInStructure const*>(pMemoryProperties->pNext);
+ while(extInfo)
{
- UNIMPLEMENTED("pMemoryProperties->pNext");
+ WARN("pMemoryProperties->pNext sType = %s", vk::Stringify(extInfo->sType));
+ extInfo = extInfo->pNext;
}
vkGetPhysicalDeviceMemoryProperties(physicalDevice, &(pMemoryProperties->memoryProperties));
@@ -2837,9 +2932,14 @@
TRACE("(VkPhysicalDevice physicalDevice = %p, const VkPhysicalDeviceSparseImageFormatInfo2* pFormatInfo = %p, uint32_t* pPropertyCount = %p, VkSparseImageFormatProperties2* pProperties = %p)",
physicalDevice, pFormatInfo, pPropertyCount, pProperties);
- if(pProperties && pProperties->pNext)
+ if(pProperties)
{
- UNIMPLEMENTED("pProperties->pNext");
+ auto extInfo = reinterpret_cast<VkBaseInStructure const*>(pProperties->pNext);
+ while(extInfo)
+ {
+ WARN("pProperties->pNext sType = %s", vk::Stringify(extInfo->sType));
+ extInfo = extInfo->pNext;
+ }
}
// We do not support sparse images.
@@ -2859,9 +2959,11 @@
TRACE("(VkDevice device = %p, const VkDeviceQueueInfo2* pQueueInfo = %p, VkQueue* pQueue = %p)",
device, pQueueInfo, pQueue);
- if(pQueueInfo->pNext)
+ auto extInfo = reinterpret_cast<VkBaseInStructure const*>(pQueueInfo->pNext);
+ while(extInfo)
{
- UNIMPLEMENTED("pQueueInfo->pNext");
+ WARN("pQueueInfo->pNext sType = %s", vk::Stringify(extInfo->sType));
+ extInfo = extInfo->pNext;
}
// The only flag that can be set here is VK_DEVICE_QUEUE_CREATE_PROTECTED_BIT
@@ -2884,9 +2986,11 @@
TRACE("(VkDevice device = %p, const VkSamplerYcbcrConversionCreateInfo* pCreateInfo = %p, const VkAllocationCallbacks* pAllocator = %p, VkSamplerYcbcrConversion* pYcbcrConversion = %p)",
device, pCreateInfo, pAllocator, pYcbcrConversion);
- if(pCreateInfo->pNext)
+ auto extInfo = reinterpret_cast<VkBaseInStructure const*>(pCreateInfo->pNext);
+ while(extInfo)
{
- UNIMPLEMENTED("pCreateInfo->pNext");
+ WARN("pCreateInfo->pNext sType = %s", vk::Stringify(extInfo->sType));
+ extInfo = extInfo->pNext;
}
return vk::SamplerYcbcrConversion::Create(pAllocator, pCreateInfo, pYcbcrConversion);
@@ -2905,9 +3009,16 @@
TRACE("(VkDevice device = %p, const VkDescriptorUpdateTemplateCreateInfo* pCreateInfo = %p, const VkAllocationCallbacks* pAllocator = %p, VkDescriptorUpdateTemplate* pDescriptorUpdateTemplate = %p)",
device, pCreateInfo, pAllocator, pDescriptorUpdateTemplate);
- if(pCreateInfo->pNext || pCreateInfo->flags || (pCreateInfo->templateType != VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_DESCRIPTOR_SET))
+ if(pCreateInfo->flags || (pCreateInfo->templateType != VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_DESCRIPTOR_SET))
{
- UNIMPLEMENTED("pCreateInfo->pNext || pCreateInfo->flags || (pCreateInfo->templateType != VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_DESCRIPTOR_SET)");
+ UNIMPLEMENTED("pCreateInfo->flags || (pCreateInfo->templateType != VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_DESCRIPTOR_SET)");
+ }
+
+ auto extInfo = reinterpret_cast<VkBaseInStructure const*>(pCreateInfo->pNext);
+ while(extInfo)
+ {
+ WARN("pCreateInfo->pNext sType = %s", vk::Stringify(extInfo->sType));
+ extInfo = extInfo->pNext;
}
return vk::DescriptorUpdateTemplate::Create(pAllocator, pCreateInfo, pDescriptorUpdateTemplate);