aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Forbes <chrisforbes@google.com>2016-03-04 10:40:09 +1300
committerTobin Ehlis <tobine@google.com>2016-03-07 07:11:26 -0700
commitb35468d53d299d9fb947d4c570ca45583d49bb1e (patch)
treeee7619ab540a45c84a9fb42288b43c067462f2d0
parent9d8195958a1aa758fd50244e9c1ccc763c5a3dd6 (diff)
downloadusermoji-b35468d53d299d9fb947d4c570ca45583d49bb1e.tar.xz
layers: Validate pipeline derivative requirements in DrawState
Signed-off-by: Chris Forbes <chrisforbes@google.com>
-rw-r--r--layers/draw_state.cpp38
1 files changed, 36 insertions, 2 deletions
diff --git a/layers/draw_state.cpp b/layers/draw_state.cpp
index 7735d64a..6f7f1cf4 100644
--- a/layers/draw_state.cpp
+++ b/layers/draw_state.cpp
@@ -1961,10 +1961,44 @@ static VkBool32 validate_draw_state(layer_data* my_data, GLOBAL_CB_NODE* pCB, Vk
}
// Verify that create state for a pipeline is valid
-static VkBool32 verifyPipelineCreateState(layer_data* my_data, const VkDevice device, PIPELINE_NODE* pPipeline)
+static VkBool32 verifyPipelineCreateState(layer_data* my_data, const VkDevice device, std::vector<PIPELINE_NODE *> pPipelines, int pipelineIndex)
{
VkBool32 skipCall = VK_FALSE;
+ PIPELINE_NODE *pPipeline = pPipelines[pipelineIndex];
+
+ // If create derivative bit is set, check that we've specified a base
+ // pipeline correctly, and that the base pipeline was created to allow
+ // derivatives.
+ if (pPipeline->graphicsPipelineCI.flags & VK_PIPELINE_CREATE_DERIVATIVE_BIT) {
+ PIPELINE_NODE *pBasePipeline = nullptr;
+ if (!((pPipeline->graphicsPipelineCI.basePipelineHandle != VK_NULL_HANDLE) ^
+ (pPipeline->graphicsPipelineCI.basePipelineIndex != -1))) {
+ skipCall |= log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT,
+ (VkDebugReportObjectTypeEXT) 0, 0, __LINE__, DRAWSTATE_INVALID_PIPELINE_CREATE_STATE, "DS",
+ "Invalid Pipeline CreateInfo: exactly one of base pipeline index and handle must be specified");
+ }
+ else if (pPipeline->graphicsPipelineCI.basePipelineIndex != -1) {
+ if (pPipeline->graphicsPipelineCI.basePipelineIndex >= pipelineIndex) {
+ skipCall |= log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT,
+ (VkDebugReportObjectTypeEXT) 0, 0, __LINE__, DRAWSTATE_INVALID_PIPELINE_CREATE_STATE, "DS",
+ "Invalid Pipeline CreateInfo: base pipeline must occur earlier in array than derivative pipeline.");
+ }
+ else {
+ pBasePipeline = pPipelines[pPipeline->graphicsPipelineCI.basePipelineIndex];
+ }
+ }
+ else if (pPipeline->graphicsPipelineCI.basePipelineHandle != VK_NULL_HANDLE) {
+ pBasePipeline = getPipeline(my_data, pPipeline->graphicsPipelineCI.basePipelineHandle);
+ }
+
+ if (pBasePipeline && !(pBasePipeline->graphicsPipelineCI.flags & VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT)) {
+ skipCall |= log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT,
+ (VkDebugReportObjectTypeEXT) 0, 0, __LINE__, DRAWSTATE_INVALID_PIPELINE_CREATE_STATE, "DS",
+ "Invalid Pipeline CreateInfo: base pipeline does not allow derivatives.");
+ }
+ }
+
if (pPipeline->graphicsPipelineCI.pColorBlendState != NULL) {
if (!my_data->physDevProperties.features.independentBlend) {
VkPipelineColorBlendAttachmentState *pAttachments = pPipeline->pAttachments;
@@ -4890,7 +4924,7 @@ VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateGraphicsPipelines(
for (i=0; i<count; i++) {
pPipeNode[i] = initGraphicsPipeline(dev_data, &pCreateInfos[i], NULL);
- skipCall |= verifyPipelineCreateState(dev_data, device, pPipeNode[i]);
+ skipCall |= verifyPipelineCreateState(dev_data, device, pPipeNode, i);
}
if (VK_FALSE == skipCall) {