diff options
author | Jeff Bolz <jbolz@nvidia.com> | 2019-08-16 16:29:45 -0500 |
---|---|---|
committer | Mark Lobodzinski <mark@lunarg.com> | 2019-08-20 08:34:31 -0600 |
commit | 8125a8b42a9e82cbcbccb70b6389ce90dbc12f25 (patch) | |
tree | 18cc6fb3e5417d12efdbfb9faada41c55b471b61 | |
parent | 5b184be4c8ccc4b9f01690396c6bf9a8b61ee99c (diff) | |
download | vulkan-validation-layers-8125a8b42a9e82cbcbccb70b6389ce90dbc12f25.tar.gz |
layers: Validate VK_EXT_line_rasterization
-rw-r--r-- | layers/core_validation.cpp | 34 | ||||
-rw-r--r-- | layers/core_validation.h | 3 | ||||
-rw-r--r-- | layers/core_validation_types.h | 3 | ||||
-rw-r--r-- | layers/generated/parameter_validation.cpp | 1 | ||||
-rw-r--r-- | layers/parameter_validation_utils.cpp | 122 | ||||
-rw-r--r-- | layers/stateless_validation.h | 2 | ||||
-rw-r--r-- | scripts/parameter_validation_generator.py | 1 |
7 files changed, 165 insertions, 1 deletions
diff --git a/layers/core_validation.cpp b/layers/core_validation.cpp index 5d8c2ea23..420feb396 100644 --- a/layers/core_validation.cpp +++ b/layers/core_validation.cpp @@ -774,6 +774,15 @@ bool CoreChecks::ValidateDrawStateFlags(const CMD_BUFFER_STATE *pCB, const PIPEL result |= ValidateStatus(pCB, CBSTATUS_INDEX_BUFFER_BOUND, VK_DEBUG_REPORT_ERROR_BIT_EXT, "Index buffer object not bound to this command buffer when Indexed Draw attempted", msg_code); } + if (pPipe->topology_at_rasterizer == VK_PRIMITIVE_TOPOLOGY_LINE_LIST || + pPipe->topology_at_rasterizer == VK_PRIMITIVE_TOPOLOGY_LINE_STRIP) { + const auto *line_state = + lvl_find_in_chain<VkPipelineRasterizationLineStateCreateInfoEXT>(pPipe->graphicsPipelineCI.pRasterizationState->pNext); + if (line_state && line_state->stippledLineEnable) { + result |= ValidateStatus(pCB, CBSTATUS_LINE_STIPPLE_SET, VK_DEBUG_REPORT_ERROR_BIT_EXT, + "Dynamic line stipple state not set for this command buffer", msg_code); + } + } return result; } @@ -2247,6 +2256,9 @@ CBStatusFlags MakeStaticStateMask(VkPipelineDynamicStateCreateInfo const *ds) { case VK_DYNAMIC_STATE_VIEWPORT_SHADING_RATE_PALETTE_NV: flags &= ~CBSTATUS_SHADING_RATE_PALETTE_SET; break; + case VK_DYNAMIC_STATE_LINE_STIPPLE_EXT: + flags &= ~CBSTATUS_LINE_STIPPLE_SET; + break; default: break; } @@ -7229,6 +7241,28 @@ void ValidationStateTracker::PreCallRecordCmdSetLineWidth(VkCommandBuffer comman cb_state->status |= CBSTATUS_LINE_WIDTH_SET; } +bool CoreChecks::PreCallValidateCmdSetLineStippleEXT(VkCommandBuffer commandBuffer, uint32_t lineStippleFactor, + uint16_t lineStipplePattern) { + const CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer); + assert(cb_state); + bool skip = ValidateCmdQueueFlags(cb_state, "vkCmdSetLineStippleEXT()", VK_QUEUE_GRAPHICS_BIT, + "VUID-vkCmdSetLineStippleEXT-commandBuffer-cmdpool"); + skip |= ValidateCmd(cb_state, CMD_SETLINESTIPPLEEXT, "vkCmdSetLineStippleEXT()"); + + if (cb_state->static_status & CBSTATUS_LINE_STIPPLE_SET) { + skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, + HandleToUint64(commandBuffer), "VUID-vkCmdSetLineStippleEXT-None-02775", + "vkCmdSetLineStippleEXT called but pipeline was created without VK_DYNAMIC_STATE_LINE_STIPPLE_EXT flag."); + } + return skip; +} + +void ValidationStateTracker::PreCallRecordCmdSetLineStippleEXT(VkCommandBuffer commandBuffer, uint32_t lineStippleFactor, + uint16_t lineStipplePattern) { + CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer); + cb_state->status |= CBSTATUS_LINE_STIPPLE_SET; +} + bool CoreChecks::PreCallValidateCmdSetDepthBias(VkCommandBuffer commandBuffer, float depthBiasConstantFactor, float depthBiasClamp, float depthBiasSlopeFactor) { const CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer); diff --git a/layers/core_validation.h b/layers/core_validation.h index 539928211..0e2eadf84 100644 --- a/layers/core_validation.h +++ b/layers/core_validation.h @@ -685,6 +685,7 @@ class ValidationStateTracker : public ValidationObject { void PreCallRecordCmdSetExclusiveScissorNV(VkCommandBuffer commandBuffer, uint32_t firstExclusiveScissor, uint32_t exclusiveScissorCount, const VkRect2D* pExclusiveScissors); void PreCallRecordCmdSetLineWidth(VkCommandBuffer commandBuffer, float lineWidth); + void PreCallRecordCmdSetLineStippleEXT(VkCommandBuffer commandBuffer, uint32_t lineStippleFactor, uint16_t lineStipplePattern); void PreCallRecordCmdSetScissor(VkCommandBuffer commandBuffer, uint32_t firstScissor, uint32_t scissorCount, const VkRect2D* pScissors); void PreCallRecordCmdSetStencilCompareMask(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t compareMask); @@ -1722,6 +1723,8 @@ class CoreChecks : public ValidationStateTracker { bool PreCallValidateDestroyAccelerationStructureNV(VkDevice device, VkAccelerationStructureNV accelerationStructure, const VkAllocationCallbacks* pAllocator); bool PreCallValidateCmdSetLineWidth(VkCommandBuffer commandBuffer, float lineWidth); + bool PreCallValidateCmdSetLineStippleEXT(VkCommandBuffer commandBuffer, uint32_t lineStippleFactor, + uint16_t lineStipplePattern); bool PreCallValidateCmdSetDepthBias(VkCommandBuffer commandBuffer, float depthBiasConstantFactor, float depthBiasClamp, float depthBiasSlopeFactor); bool PreCallValidateCmdSetBlendConstants(VkCommandBuffer commandBuffer, const float blendConstants[4]); diff --git a/layers/core_validation_types.h b/layers/core_validation_types.h index 266a0af84..72dbdf23d 100644 --- a/layers/core_validation_types.h +++ b/layers/core_validation_types.h @@ -972,7 +972,8 @@ enum CBStatusFlagBits { CBSTATUS_INDEX_BUFFER_BOUND = 0x00000200, // Index buffer has been set CBSTATUS_EXCLUSIVE_SCISSOR_SET = 0x00000400, CBSTATUS_SHADING_RATE_PALETTE_SET = 0x00000800, - CBSTATUS_ALL_STATE_SET = 0x00000DFF, // All state set (intentionally exclude index buffer) + CBSTATUS_LINE_STIPPLE_SET = 0x00001000, + CBSTATUS_ALL_STATE_SET = 0x00001DFF, // All state set (intentionally exclude index buffer) // clang-format on }; diff --git a/layers/generated/parameter_validation.cpp b/layers/generated/parameter_validation.cpp index e0de66886..9156bb2b4 100644 --- a/layers/generated/parameter_validation.cpp +++ b/layers/generated/parameter_validation.cpp @@ -10348,6 +10348,7 @@ bool StatelessValidation::PreCallValidateCmdSetLineStippleEXT( if (!device_extensions.vk_khr_get_physical_device_properties_2) skip |= OutputExtensionError("vkCmdSetLineStippleEXT", VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME); if (!device_extensions.vk_ext_line_rasterization) skip |= OutputExtensionError("vkCmdSetLineStippleEXT", VK_EXT_LINE_RASTERIZATION_EXTENSION_NAME); // No xml-driven validation + if (!skip) skip |= manual_PreCallValidateCmdSetLineStippleEXT(commandBuffer, lineStippleFactor, lineStipplePattern); return skip; } diff --git a/layers/parameter_validation_utils.cpp b/layers/parameter_validation_utils.cpp index 16d0ca1de..40008150d 100644 --- a/layers/parameter_validation_utils.cpp +++ b/layers/parameter_validation_utils.cpp @@ -917,6 +917,7 @@ bool StatelessValidation::manual_PreCallValidateCreateGraphicsPipelines(VkDevice bool has_dynamic_sample_locations_ext = false; bool has_dynamic_exclusive_scissor_nv = false; bool has_dynamic_shading_rate_palette_nv = false; + bool has_dynamic_line_stipple = false; if (pCreateInfos[i].pDynamicState != nullptr) { const auto &dynamic_state_info = *pCreateInfos[i].pDynamicState; for (uint32_t state_index = 0; state_index < dynamic_state_info.dynamicStateCount; ++state_index) { @@ -930,6 +931,7 @@ bool StatelessValidation::manual_PreCallValidateCreateGraphicsPipelines(VkDevice if (dynamic_state == VK_DYNAMIC_STATE_EXCLUSIVE_SCISSOR_NV) has_dynamic_exclusive_scissor_nv = true; if (dynamic_state == VK_DYNAMIC_STATE_VIEWPORT_SHADING_RATE_PALETTE_NV) has_dynamic_shading_rate_palette_nv = true; + if (dynamic_state == VK_DYNAMIC_STATE_LINE_STIPPLE_EXT) has_dynamic_line_stipple = true; } } @@ -1601,6 +1603,113 @@ bool StatelessValidation::manual_PreCallValidateCreateGraphicsPipelines(VkDevice "vkCreateGraphicsPipelines(): parameter pCreateInfos[%d].pMultisampleState->minSampleShading.", i); } } + + const auto *line_state = lvl_find_in_chain<VkPipelineRasterizationLineStateCreateInfoEXT>( + pCreateInfos[i].pRasterizationState->pNext); + + if (line_state) { + if ((line_state->lineRasterizationMode == VK_LINE_RASTERIZATION_MODE_BRESENHAM_EXT || + line_state->lineRasterizationMode == VK_LINE_RASTERIZATION_MODE_RECTANGULAR_SMOOTH_EXT)) { + if (pCreateInfos[i].pMultisampleState->alphaToCoverageEnable) { + skip |= + log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + "VUID-VkGraphicsPipelineCreateInfo-lineRasterizationMode-02766", + "vkCreateGraphicsPipelines(): Bresenham/Smooth line rasterization not supported with " + "pCreateInfos[%d].pMultisampleState->alphaToCoverageEnable == VK_TRUE.", + i); + } + if (pCreateInfos[i].pMultisampleState->alphaToOneEnable) { + skip |= + log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + "VUID-VkGraphicsPipelineCreateInfo-lineRasterizationMode-02766", + "vkCreateGraphicsPipelines(): Bresenham/Smooth line rasterization not supported with " + "pCreateInfos[%d].pMultisampleState->alphaToOneEnable == VK_TRUE.", + i); + } + if (pCreateInfos[i].pMultisampleState->sampleShadingEnable) { + skip |= + log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + "VUID-VkGraphicsPipelineCreateInfo-lineRasterizationMode-02766", + "vkCreateGraphicsPipelines(): Bresenham/Smooth line rasterization not supported with " + "pCreateInfos[%d].pMultisampleState->sampleShadingEnable == VK_TRUE.", + i); + } + } + if (line_state->stippledLineEnable && !has_dynamic_line_stipple) { + if (line_state->lineStippleFactor < 1 || line_state->lineStippleFactor > 256) { + skip |= + log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + "VUID-VkGraphicsPipelineCreateInfo-stippledLineEnable-02767", + "vkCreateGraphicsPipelines(): pCreateInfos[%d] lineStippleFactor = %d must be in the " + "range [1,256].", + i, line_state->lineStippleFactor); + } + } + const auto *line_features = + lvl_find_in_chain<VkPhysicalDeviceLineRasterizationFeaturesEXT>(physical_device_features2.pNext); + if (line_state->lineRasterizationMode == VK_LINE_RASTERIZATION_MODE_RECTANGULAR_EXT && + (!line_features || !line_features->rectangularLines)) { + skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + "VUID-VkPipelineRasterizationLineStateCreateInfoEXT-lineRasterizationMode-02768", + "vkCreateGraphicsPipelines(): pCreateInfos[%d] lineRasterizationMode = " + "VK_LINE_RASTERIZATION_MODE_RECTANGULAR_EXT requires the rectangularLines feature.", + i); + } + if (line_state->lineRasterizationMode == VK_LINE_RASTERIZATION_MODE_BRESENHAM_EXT && + (!line_features || !line_features->bresenhamLines)) { + skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + "VUID-VkPipelineRasterizationLineStateCreateInfoEXT-lineRasterizationMode-02769", + "vkCreateGraphicsPipelines(): pCreateInfos[%d] lineRasterizationMode = " + "VK_LINE_RASTERIZATION_MODE_BRESENHAM_EXT requires the bresenhamLines feature.", + i); + } + if (line_state->lineRasterizationMode == VK_LINE_RASTERIZATION_MODE_RECTANGULAR_SMOOTH_EXT && + (!line_features || !line_features->smoothLines)) { + skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + "VUID-VkPipelineRasterizationLineStateCreateInfoEXT-lineRasterizationMode-02770", + "vkCreateGraphicsPipelines(): pCreateInfos[%d] lineRasterizationMode = " + "VK_LINE_RASTERIZATION_MODE_RECTANGULAR_SMOOTH_EXT requires the smoothLines feature.", + i); + } + if (line_state->stippledLineEnable) { + if (line_state->lineRasterizationMode == VK_LINE_RASTERIZATION_MODE_RECTANGULAR_EXT && + (!line_features || !line_features->stippledRectangularLines)) { + skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, + 0, "VUID-VkPipelineRasterizationLineStateCreateInfoEXT-stippledLineEnable-02771", + "vkCreateGraphicsPipelines(): pCreateInfos[%d] lineRasterizationMode = " + "VK_LINE_RASTERIZATION_MODE_RECTANGULAR_EXT with stipple requires the " + "stippledRectangularLines feature.", + i); + } + if (line_state->lineRasterizationMode == VK_LINE_RASTERIZATION_MODE_BRESENHAM_EXT && + (!line_features || !line_features->stippledBresenhamLines)) { + skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, + 0, "VUID-VkPipelineRasterizationLineStateCreateInfoEXT-stippledLineEnable-02772", + "vkCreateGraphicsPipelines(): pCreateInfos[%d] lineRasterizationMode = " + "VK_LINE_RASTERIZATION_MODE_BRESENHAM_EXT with stipple requires the " + "stippledBresenhamLines feature.", + i); + } + if (line_state->lineRasterizationMode == VK_LINE_RASTERIZATION_MODE_RECTANGULAR_SMOOTH_EXT && + (!line_features || !line_features->stippledSmoothLines)) { + skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, + 0, "VUID-VkPipelineRasterizationLineStateCreateInfoEXT-stippledLineEnable-02773", + "vkCreateGraphicsPipelines(): pCreateInfos[%d] lineRasterizationMode = " + "VK_LINE_RASTERIZATION_MODE_RECTANGULAR_SMOOTH_EXT with stipple requires the " + "stippledSmoothLines feature.", + i); + } + if (line_state->lineRasterizationMode == VK_LINE_RASTERIZATION_MODE_DEFAULT_EXT && + (!line_features || !line_features->stippledSmoothLines || !device_limits.strictLines)) { + skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, + 0, "VUID-VkPipelineRasterizationLineStateCreateInfoEXT-stippledLineEnable-02774", + "vkCreateGraphicsPipelines(): pCreateInfos[%d] lineRasterizationMode = " + "VK_LINE_RASTERIZATION_MODE_DEFAULT_EXT with stipple requires the " + "stippledRectangularLines and strictLines features.", + i); + } + } + } } bool uses_color_attachment = false; @@ -3419,3 +3528,16 @@ bool StatelessValidation::manual_PreCallValidateCreateFramebuffer(VkDevice devic } return skip; } + +bool StatelessValidation::manual_PreCallValidateCmdSetLineStippleEXT(VkCommandBuffer commandBuffer, uint32_t lineStippleFactor, + uint16_t lineStipplePattern) { + bool skip = false; + + if (lineStippleFactor < 1 || lineStippleFactor > 256) { + skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, + HandleToUint64(commandBuffer), "VUID-vkCmdSetLineStippleEXT-lineStippleFactor-02776", + "vkCmdSetLineStippleEXT::lineStippleFactor=%d is not in [1,256].", lineStippleFactor); + } + + return skip; +} diff --git a/layers/stateless_validation.h b/layers/stateless_validation.h index 235fcc080..3bf229a56 100644 --- a/layers/stateless_validation.h +++ b/layers/stateless_validation.h @@ -1176,5 +1176,7 @@ class StatelessValidation : public ValidationObject { bool manual_PreCallValidateCreateFramebuffer(VkDevice device, const VkFramebufferCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkFramebuffer *pFramebuffer); + bool manual_PreCallValidateCmdSetLineStippleEXT(VkCommandBuffer commandBuffer, uint32_t lineStippleFactor, + uint16_t lineStipplePattern); #include "parameter_validation.h" }; // Class StatelessValidation diff --git a/scripts/parameter_validation_generator.py b/scripts/parameter_validation_generator.py index 50bec7f30..3392fb597 100644 --- a/scripts/parameter_validation_generator.py +++ b/scripts/parameter_validation_generator.py @@ -180,6 +180,7 @@ class ParameterValidationOutputGenerator(OutputGenerator): 'vkGetAccelerationStructureHandleNV', 'vkCmdBuildAccelerationStructureNV', 'vkCreateFramebuffer', + 'vkCmdSetLineStippleEXT', ] # Commands to ignore |