Revert "layers: Fix Graphics Pipeline pointers not ignored"
This caused segfaults on Intel Skylake, NexusPlayer, and
Samsung Galaxy S8 (Mali).
This reverts commit 367d276ffe5c0748ff9d8e2b3551d4a00c9fc3c2.
diff --git a/layers/core_validation.cpp b/layers/core_validation.cpp
index b210f8f..78e72aa 100644
--- a/layers/core_validation.cpp
+++ b/layers/core_validation.cpp
@@ -4514,8 +4514,8 @@
for (i = 0; i < count; i++) {
pipe_state.push_back(std::unique_ptr<PIPELINE_STATE>(new PIPELINE_STATE));
- pipe_state[i]->render_pass_ci.initialize(GetRenderPassState(dev_data, pCreateInfos[i].renderPass)->createInfo.ptr());
pipe_state[i]->initGraphicsPipeline(&pCreateInfos[i]);
+ pipe_state[i]->render_pass_ci.initialize(GetRenderPassState(dev_data, pCreateInfos[i].renderPass)->createInfo.ptr());
pipe_state[i]->pipeline_layout = *getPipelineLayout(dev_data, pCreateInfos[i].layout);
}
diff --git a/layers/core_validation_types.h b/layers/core_validation_types.h
index 610539a..928583c 100644
--- a/layers/core_validation_types.h
+++ b/layers/core_validation_types.h
@@ -576,23 +576,7 @@
pipeline_layout() {}
void initGraphicsPipeline(const VkGraphicsPipelineCreateInfo *pCreateInfo) {
- bool uses_color_attachment = false;
- bool uses_depthstencil_attachment = false;
- if (pCreateInfo->subpass < render_pass_ci.subpassCount) {
- const auto &subpass = render_pass_ci.pSubpasses[pCreateInfo->subpass];
-
- for (uint32_t i = 0; i < subpass.colorAttachmentCount; ++i) {
- if (subpass.pColorAttachments[i].attachment != VK_ATTACHMENT_UNUSED) {
- uses_color_attachment = true;
- break;
- }
- }
-
- if (subpass.pDepthStencilAttachment && subpass.pDepthStencilAttachment->attachment != VK_ATTACHMENT_UNUSED) {
- uses_depthstencil_attachment = true;
- }
- }
- graphicsPipelineCI.initialize(pCreateInfo, uses_color_attachment, uses_depthstencil_attachment);
+ graphicsPipelineCI.initialize(pCreateInfo);
// Make sure compute pipeline is null
VkComputePipelineCreateInfo emptyComputeCI = {};
computePipelineCI.initialize(&emptyComputeCI);
@@ -601,15 +585,15 @@
this->duplicate_shaders |= this->active_shaders & pPSSCI->stage;
this->active_shaders |= pPSSCI->stage;
}
- if (graphicsPipelineCI.pVertexInputState) {
- const auto pVICI = graphicsPipelineCI.pVertexInputState;
+ if (pCreateInfo->pVertexInputState) {
+ const VkPipelineVertexInputStateCreateInfo *pVICI = pCreateInfo->pVertexInputState;
if (pVICI->vertexBindingDescriptionCount) {
this->vertexBindingDescriptions = std::vector<VkVertexInputBindingDescription>(
pVICI->pVertexBindingDescriptions, pVICI->pVertexBindingDescriptions + pVICI->vertexBindingDescriptionCount);
}
}
- if (graphicsPipelineCI.pColorBlendState) {
- const auto pCBCI = graphicsPipelineCI.pColorBlendState;
+ if (pCreateInfo->pColorBlendState) {
+ const VkPipelineColorBlendStateCreateInfo *pCBCI = pCreateInfo->pColorBlendState;
if (pCBCI->attachmentCount) {
this->attachments = std::vector<VkPipelineColorBlendAttachmentState>(pCBCI->pAttachments,
pCBCI->pAttachments + pCBCI->attachmentCount);
@@ -621,7 +605,7 @@
computePipelineCI.initialize(pCreateInfo);
// Make sure gfx pipeline is null
VkGraphicsPipelineCreateInfo emptyGraphicsCI = {};
- graphicsPipelineCI.initialize(&emptyGraphicsCI, false, false);
+ graphicsPipelineCI.initialize(&emptyGraphicsCI);
switch (computePipelineCI.stage.stage) {
case VK_SHADER_STAGE_COMPUTE_BIT:
this->active_shaders |= VK_SHADER_STAGE_COMPUTE_BIT;
diff --git a/layers/parameter_validation.h b/layers/parameter_validation.h
index b9d153c..6ef3de2 100644
--- a/layers/parameter_validation.h
+++ b/layers/parameter_validation.h
@@ -25,9 +25,8 @@
#include <cstdlib>
#include <string>
#include <bitset>
-#include <unordered_map>
-#include <unordered_set>
#include <mutex>
+#include <unordered_set>
#include "vulkan/vulkan.h"
#include "vk_enum_string_helper.h"
@@ -81,13 +80,6 @@
VkDevice device = VK_NULL_HANDLE;
DeviceExtensions extensions;
- struct SubpassesUsageStates {
- std::unordered_set<uint32_t> subpasses_using_color_attachment;
- std::unordered_set<uint32_t> subpasses_using_depthstencil_attachment;
- };
-
- std::unordered_map<VkRenderPass, SubpassesUsageStates> renderpasses_states;
-
VkLayerDispatchTable dispatch_table = {};
};
diff --git a/layers/parameter_validation_utils.cpp b/layers/parameter_validation_utils.cpp
index 11706cd..4f6f5b8 100644
--- a/layers/parameter_validation_utils.cpp
+++ b/layers/parameter_validation_utils.cpp
@@ -82,10 +82,6 @@
const VkAllocationCallbacks *pAllocator);
extern bool parameter_validation_vkCreateCommandPool(VkDevice device, const VkCommandPoolCreateInfo *pCreateInfo,
const VkAllocationCallbacks *pAllocator, VkCommandPool *pCommandPool);
-extern bool parameter_validation_vkCreateRenderPass(VkDevice device, const VkRenderPassCreateInfo *pCreateInfo,
- const VkAllocationCallbacks *pAllocator, VkRenderPass *pRenderPass);
-extern bool parameter_validation_vkDestroyRenderPass(VkDevice device, VkRenderPass renderPass,
- const VkAllocationCallbacks *pAllocator);
// TODO : This can be much smarter, using separate locks for separate global data
std::mutex global_lock;
@@ -594,78 +590,6 @@
return result;
}
-VKAPI_ATTR VkResult VKAPI_CALL vkCreateRenderPass(VkDevice device, const VkRenderPassCreateInfo *pCreateInfo,
- const VkAllocationCallbacks *pAllocator, VkRenderPass *pRenderPass) {
- layer_data *device_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
- bool skip = false;
- VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
-
- {
- std::unique_lock<std::mutex> lock(global_lock);
- skip |= parameter_validation_vkCreateRenderPass(device, pCreateInfo, pAllocator, pRenderPass);
-
- typedef bool (*PFN_manual_vkCreateRenderPass)(VkDevice device, const VkRenderPassCreateInfo *pCreateInfo,
- const VkAllocationCallbacks *pAllocator, VkRenderPass *pRenderPass);
- PFN_manual_vkCreateRenderPass custom_func = (PFN_manual_vkCreateRenderPass)custom_functions["vkCreateRenderPass"];
- if (custom_func != nullptr) {
- skip |= custom_func(device, pCreateInfo, pAllocator, pRenderPass);
- }
- }
-
- if (!skip) {
- result = device_data->dispatch_table.CreateRenderPass(device, pCreateInfo, pAllocator, pRenderPass);
-
- // track the state necessary for checking vkCreateGraphicsPipeline (subpass usage of depth and color attachments)
- if (result == VK_SUCCESS) {
- std::unique_lock<std::mutex> lock(global_lock);
- const auto renderPass = *pRenderPass;
- auto &renderpass_state = device_data->renderpasses_states[renderPass];
-
- for (uint32_t subpass = 0; subpass < pCreateInfo->subpassCount; ++subpass) {
- bool uses_color = false;
- for (uint32_t i = 0; i < pCreateInfo->pSubpasses[subpass].colorAttachmentCount && !uses_color; ++i)
- if (pCreateInfo->pSubpasses[subpass].pColorAttachments[i].attachment != VK_ATTACHMENT_UNUSED) uses_color = true;
-
- bool uses_depthstencil = false;
- if (pCreateInfo->pSubpasses[subpass].pDepthStencilAttachment)
- if (pCreateInfo->pSubpasses[subpass].pDepthStencilAttachment->attachment != VK_ATTACHMENT_UNUSED)
- uses_depthstencil = true;
-
- if (uses_color) renderpass_state.subpasses_using_color_attachment.insert(subpass);
- if (uses_depthstencil) renderpass_state.subpasses_using_depthstencil_attachment.insert(subpass);
- }
- }
- }
- return result;
-}
-
-VKAPI_ATTR void VKAPI_CALL vkDestroyRenderPass(VkDevice device, VkRenderPass renderPass, const VkAllocationCallbacks *pAllocator) {
- layer_data *device_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
- bool skip = false;
-
- {
- std::unique_lock<std::mutex> lock(global_lock);
- skip |= parameter_validation_vkDestroyRenderPass(device, renderPass, pAllocator);
-
- typedef bool (*PFN_manual_vkDestroyRenderPass)(VkDevice device, VkRenderPass renderPass,
- const VkAllocationCallbacks *pAllocator);
- PFN_manual_vkDestroyRenderPass custom_func = (PFN_manual_vkDestroyRenderPass)custom_functions["vkDestroyRenderPass"];
- if (custom_func != nullptr) {
- skip |= custom_func(device, renderPass, pAllocator);
- }
- }
-
- if (!skip) {
- device_data->dispatch_table.DestroyRenderPass(device, renderPass, pAllocator);
-
- // track the state necessary for checking vkCreateGraphicsPipeline (subpass usage of depth and color attachments)
- {
- std::unique_lock<std::mutex> lock(global_lock);
- device_data->renderpasses_states.erase(renderPass);
- }
- }
-}
-
bool pv_vkCreateBuffer(VkDevice device, const VkBufferCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator,
VkBuffer *pBuffer) {
bool skip = false;
@@ -1283,20 +1207,8 @@
}
}
- bool uses_color_attachment = false;
- bool uses_depthstencil_attachment = false;
- {
- const auto subpasses_uses_it = device_data->renderpasses_states.find(pCreateInfos[i].renderPass);
- if (subpasses_uses_it != device_data->renderpasses_states.end()) {
- const auto &subpasses_uses = subpasses_uses_it->second;
- if (subpasses_uses.subpasses_using_color_attachment.count(pCreateInfos[i].subpass))
- uses_color_attachment = true;
- if (subpasses_uses.subpasses_using_depthstencil_attachment.count(pCreateInfos[i].subpass))
- uses_depthstencil_attachment = true;
- }
- }
-
- if (pCreateInfos[i].pDepthStencilState != nullptr && uses_depthstencil_attachment) {
+ // TODO: Conditional NULL check based on subpass depth/stencil attachment
+ if (pCreateInfos[i].pDepthStencilState != nullptr) {
skip |= validate_struct_pnext(
report_data, "vkCreateGraphicsPipelines",
ParameterName("pCreateInfos[%i].pDepthStencilState->pNext", ParameterName::IndexVector{i}), NULL,
@@ -1390,7 +1302,8 @@
}
}
- if (pCreateInfos[i].pColorBlendState != nullptr && uses_color_attachment) {
+ // TODO: Conditional NULL check based on subpass color attachment
+ if (pCreateInfos[i].pColorBlendState != nullptr) {
skip |= validate_struct_pnext(
report_data, "vkCreateGraphicsPipelines",
ParameterName("pCreateInfos[%i].pColorBlendState->pNext", ParameterName::IndexVector{i}), NULL,
diff --git a/layers/unique_objects.cpp b/layers/unique_objects.cpp
index 8af7772..d324ce4 100644
--- a/layers/unique_objects.cpp
+++ b/layers/unique_objects.cpp
@@ -328,22 +328,7 @@
local_pCreateInfos = new safe_VkGraphicsPipelineCreateInfo[createInfoCount];
std::lock_guard<std::mutex> lock(global_lock);
for (uint32_t idx0 = 0; idx0 < createInfoCount; ++idx0) {
- bool uses_color_attachment = false;
- bool uses_depthstencil_attachment = false;
- {
- const auto subpasses_uses_it =
- device_data->renderpasses_states.find(Unwrap(device_data, pCreateInfos[idx0].renderPass));
- if (subpasses_uses_it != device_data->renderpasses_states.end()) {
- const auto &subpasses_uses = subpasses_uses_it->second;
- if (subpasses_uses.subpasses_using_color_attachment.count(pCreateInfos[idx0].subpass))
- uses_color_attachment = true;
- if (subpasses_uses.subpasses_using_depthstencil_attachment.count(pCreateInfos[idx0].subpass))
- uses_depthstencil_attachment = true;
- }
- }
-
- local_pCreateInfos[idx0].initialize(&pCreateInfos[idx0], uses_color_attachment, uses_depthstencil_attachment);
-
+ local_pCreateInfos[idx0].initialize(&pCreateInfos[idx0]);
if (pCreateInfos[idx0].basePipelineHandle) {
local_pCreateInfos[idx0].basePipelineHandle = Unwrap(device_data, pCreateInfos[idx0].basePipelineHandle);
}
@@ -381,55 +366,6 @@
return result;
}
-static void PostCallCreateRenderPass(layer_data *dev_data, const VkRenderPassCreateInfo *pCreateInfo, VkRenderPass renderPass) {
- auto &renderpass_state = dev_data->renderpasses_states[renderPass];
-
- for (uint32_t subpass = 0; subpass < pCreateInfo->subpassCount; ++subpass) {
- bool uses_color = false;
- for (uint32_t i = 0; i < pCreateInfo->pSubpasses[subpass].colorAttachmentCount && !uses_color; ++i)
- if (pCreateInfo->pSubpasses[subpass].pColorAttachments[i].attachment != VK_ATTACHMENT_UNUSED) uses_color = true;
-
- bool uses_depthstencil = false;
- if (pCreateInfo->pSubpasses[subpass].pDepthStencilAttachment)
- if (pCreateInfo->pSubpasses[subpass].pDepthStencilAttachment->attachment != VK_ATTACHMENT_UNUSED)
- uses_depthstencil = true;
-
- if (uses_color) renderpass_state.subpasses_using_color_attachment.insert(subpass);
- if (uses_depthstencil) renderpass_state.subpasses_using_depthstencil_attachment.insert(subpass);
- }
-}
-
-VKAPI_ATTR VkResult VKAPI_CALL CreateRenderPass(VkDevice device, const VkRenderPassCreateInfo *pCreateInfo,
- const VkAllocationCallbacks *pAllocator, VkRenderPass *pRenderPass) {
- layer_data *dev_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
- VkResult result = dev_data->dispatch_table.CreateRenderPass(device, pCreateInfo, pAllocator, pRenderPass);
- if (VK_SUCCESS == result) {
- std::lock_guard<std::mutex> lock(global_lock);
-
- PostCallCreateRenderPass(dev_data, pCreateInfo, *pRenderPass);
-
- *pRenderPass = WrapNew(dev_data, *pRenderPass);
- }
- return result;
-}
-
-static void PostCallDestroyRenderPass(layer_data *dev_data, VkRenderPass renderPass) {
- dev_data->renderpasses_states.erase(renderPass);
-}
-
-VKAPI_ATTR void VKAPI_CALL DestroyRenderPass(VkDevice device, VkRenderPass renderPass, const VkAllocationCallbacks *pAllocator) {
- layer_data *dev_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
- std::unique_lock<std::mutex> lock(global_lock);
- uint64_t renderPass_id = reinterpret_cast<uint64_t &>(renderPass);
- renderPass = (VkRenderPass)dev_data->unique_id_mapping[renderPass_id];
- dev_data->unique_id_mapping.erase(renderPass_id);
- lock.unlock();
- dev_data->dispatch_table.DestroyRenderPass(device, renderPass, pAllocator);
-
- lock.lock();
- PostCallDestroyRenderPass(dev_data, renderPass);
-}
-
VKAPI_ATTR VkResult VKAPI_CALL CreateSwapchainKHR(VkDevice device, const VkSwapchainCreateInfoKHR *pCreateInfo,
const VkAllocationCallbacks *pAllocator, VkSwapchainKHR *pSwapchain) {
layer_data *my_map_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
diff --git a/layers/unique_objects.h b/layers/unique_objects.h
index e604e91..57b9dbf 100644
--- a/layers/unique_objects.h
+++ b/layers/unique_objects.h
@@ -21,9 +21,6 @@
#include "vulkan/vulkan.h"
-#include <unordered_map>
-#include <unordered_set>
-
#include "vk_layer_data.h"
#include "vk_safe_struct.h"
#include "vk_layer_utils.h"
@@ -72,13 +69,6 @@
std::unordered_map<uint64_t, uint64_t> unique_id_mapping; // Map uniqueID to actual object handle
VkPhysicalDevice gpu;
- struct SubpassesUsageStates {
- std::unordered_set<uint32_t> subpasses_using_color_attachment;
- std::unordered_set<uint32_t> subpasses_using_depthstencil_attachment;
- };
- // uses unwrapped handles
- std::unordered_map<VkRenderPass, SubpassesUsageStates> renderpasses_states;
-
layer_data() : wsi_enabled(false), gpu(VK_NULL_HANDLE){};
};