From dd3fcd977c9f1e053df84ca0adc23752141b10ee Mon Sep 17 00:00:00 2001 From: spencer-lunarg Date: Wed, 25 Sep 2024 13:05:32 -0400 Subject: [PATCH] layers: Fix VK_DYNAMIC_STATE_VIEWPORT_W_SCALING_NV --- layers/core_checks/cc_cmd_buffer_dynamic.cpp | 44 ++++++++++++------- layers/drawdispatch/drawdispatch_vuids.cpp | 30 ++++++------- layers/drawdispatch/drawdispatch_vuids.h | 2 +- layers/state_tracker/pipeline_state.cpp | 16 +++++++ layers/state_tracker/pipeline_state.h | 1 + .../vulkan/generated/dynamic_state_helper.cpp | 8 ++++ scripts/generators/dynamic_state_generator.py | 10 ++++- tests/unit/shader_object.cpp | 3 +- 8 files changed, 79 insertions(+), 35 deletions(-) diff --git a/layers/core_checks/cc_cmd_buffer_dynamic.cpp b/layers/core_checks/cc_cmd_buffer_dynamic.cpp index 95752f895e6..e05534c91dd 100644 --- a/layers/core_checks/cc_cmd_buffer_dynamic.cpp +++ b/layers/core_checks/cc_cmd_buffer_dynamic.cpp @@ -188,6 +188,9 @@ bool CoreChecks::ValidateDynamicStateIsSet(const LastBound& last_bound_state, co case CB_DYNAMIC_STATE_VIEWPORT_SHADING_RATE_PALETTE_NV: vuid_str = vuid.set_viewport_shading_rate_palette_09234; break; + case CB_DYNAMIC_STATE_VIEWPORT_W_SCALING_NV: + vuid_str = vuid.set_clip_space_w_scaling_04138; + break; default: assert(false); break; @@ -219,6 +222,16 @@ bool CoreChecks::ValidateGraphicsDynamicStateSetStatus(const LastBound& last_bou last_bound_state.pipeline_state->dynamic_state)) : cb_state.dynamic_state_status.cb; + // Some VUs are only if pipeline had the state dynamic (otherwise it is checked at pipeline creation time). + // For ShaderObject is always dynamic + auto has_dynamic_state = [&last_bound_state](CBDynamicState dynamic_state) { + if (const vvl::Pipeline* pipeline = last_bound_state.pipeline_state) { + return pipeline->IsDynamic(dynamic_state); + } else { + return true; + } + }; + skip |= ValidateDynamicStateIsSet(last_bound_state, state_status_cb, CB_DYNAMIC_STATE_RASTERIZER_DISCARD_ENABLE, vuid); if (!last_bound_state.IsRasterizationDisabled()) { skip |= ValidateDynamicStateIsSet(last_bound_state, state_status_cb, CB_DYNAMIC_STATE_CULL_MODE, vuid); @@ -383,7 +396,21 @@ bool CoreChecks::ValidateGraphicsDynamicStateSetStatus(const LastBound& last_bou if (IsExtEnabled(device_extensions.vk_nv_clip_space_w_scaling)) { skip |= ValidateDynamicStateIsSet(last_bound_state, state_status_cb, CB_DYNAMIC_STATE_VIEWPORT_W_SCALING_ENABLE_NV, vuid); + + if (last_bound_state.IsViewportWScalingEnable() && has_dynamic_state(CB_DYNAMIC_STATE_VIEWPORT_WITH_COUNT) && + has_dynamic_state(CB_DYNAMIC_STATE_VIEWPORT_W_SCALING_NV)) { + skip |= ValidateDynamicStateIsSet(last_bound_state, state_status_cb, CB_DYNAMIC_STATE_VIEWPORT_W_SCALING_NV, vuid); + + if (cb_state.dynamic_state_value.viewport_w_scaling_count < cb_state.dynamic_state_value.viewport_count) { + skip |= + LogError(vuid.viewport_w_scaling_08636, cb_state.Handle(), vuid.loc(), + "Graphics stages are bound, but viewportCount set with vkCmdSetViewportWithCount() was %" PRIu32 + " and viewportCount set with vkCmdSetViewportWScalingNV() was %" PRIu32 ".", + cb_state.dynamic_state_value.viewport_count, cb_state.dynamic_state_value.viewport_w_scaling_count); + } + } } + if (IsExtEnabled(device_extensions.vk_nv_viewport_swizzle)) { skip |= ValidateDynamicStateIsSet(last_bound_state, state_status_cb, CB_DYNAMIC_STATE_VIEWPORT_SWIZZLE_NV, vuid); } @@ -1386,16 +1413,6 @@ bool CoreChecks::ValidateDrawDynamicStateShaderObject(const LastBound& last_boun " and scissorCount set with vkCmdSetScissorWithCount() was %" PRIu32 ".", cb_state.dynamic_state_value.viewport_count, cb_state.dynamic_state_value.scissor_count); } - if (IsExtEnabled(device_extensions.vk_nv_clip_space_w_scaling) && - cb_state.IsDynamicStateSet(CB_DYNAMIC_STATE_VIEWPORT_W_SCALING_ENABLE_NV) && - cb_state.dynamic_state_value.viewport_w_scaling_enable && - cb_state.IsDynamicStateSet(CB_DYNAMIC_STATE_VIEWPORT_W_SCALING_NV) && - cb_state.dynamic_state_value.viewport_w_scaling_count < cb_state.dynamic_state_value.viewport_count) { - skip |= LogError(vuid.viewport_w_scaling_08636, cb_state.Handle(), loc, - "Graphics shader objects are bound, but viewportCount set with vkCmdSetViewportWithCount() was %" PRIu32 - " and viewportCount set with vkCmdSetViewportWScalingNV() was %" PRIu32 ".", - cb_state.dynamic_state_value.viewport_count, cb_state.dynamic_state_value.viewport_w_scaling_count); - } if (!cb_state.dynamic_state_value.rasterizer_discard_enable) { for (uint32_t i = 0; i < cb_state.active_attachments.size(); ++i) { @@ -1469,13 +1486,6 @@ bool CoreChecks::ValidateDrawDynamicStateShaderObject(const LastBound& last_boun } } } - if (IsExtEnabled(device_extensions.vk_nv_clip_space_w_scaling)) { - if (cb_state.IsDynamicStateSet(CB_DYNAMIC_STATE_VIEWPORT_W_SCALING_ENABLE_NV) && - cb_state.dynamic_state_value.viewport_w_scaling_enable) { - skip |= ValidateDynamicStateIsSet(cb_state.dynamic_state_status.cb, CB_DYNAMIC_STATE_VIEWPORT_W_SCALING_NV, cb_state, - objlist, loc, vuid.set_clip_space_w_scaling_09232); - } - } if (cb_state.IsDynamicStateSet(CB_DYNAMIC_STATE_POLYGON_MODE_EXT) && cb_state.dynamic_state_value.polygon_mode == VK_POLYGON_MODE_LINE) { skip |= ValidateDynamicStateIsSet(cb_state.dynamic_state_status.cb, CB_DYNAMIC_STATE_LINE_WIDTH, cb_state, objlist, loc, diff --git a/layers/drawdispatch/drawdispatch_vuids.cpp b/layers/drawdispatch/drawdispatch_vuids.cpp index 485515f65d8..8d12b196c06 100644 --- a/layers/drawdispatch/drawdispatch_vuids.cpp +++ b/layers/drawdispatch/drawdispatch_vuids.cpp @@ -248,7 +248,7 @@ struct DispatchVuidsCmdDraw : DrawDispatchVuid { vertex_input_format_08937 = "VUID-vkCmdDraw-format-08937"; vertex_input_format_09203 = "VUID-vkCmdDraw-None-09203"; vertex_input_format_07939 = "VUID-vkCmdDraw-Input-07939"; - set_clip_space_w_scaling_09232 = "VUID-vkCmdDraw-None-09232"; + set_clip_space_w_scaling_04138 = "VUID-vkCmdDraw-viewportCount-04138"; set_discard_rectangle_09236 = "VUID-vkCmdDraw-rasterizerDiscardEnable-09236"; set_viewport_coarse_sample_order_09233 = "VUID-vkCmdDraw-shadingRateImage-09233"; set_viewport_shading_rate_palette_09234 = "VUID-vkCmdDraw-shadingRateImage-09234"; @@ -518,7 +518,7 @@ struct DispatchVuidsCmdDrawMultiEXT : DrawDispatchVuid { vertex_input_format_08937 = "VUID-vkCmdDrawMultiEXT-format-08937"; vertex_input_format_09203 = "VUID-vkCmdDrawMultiEXT-None-09203"; vertex_input_format_07939 = "VUID-vkCmdDrawMultiEXT-Input-07939"; - set_clip_space_w_scaling_09232 = "VUID-vkCmdDrawMultiEXT-None-09232"; + set_clip_space_w_scaling_04138 = "VUID-vkCmdDrawMultiEXT-viewportCount-04138"; set_discard_rectangle_09236 = "VUID-vkCmdDrawMultiEXT-rasterizerDiscardEnable-09236"; set_viewport_coarse_sample_order_09233 = "VUID-vkCmdDrawMultiEXT-shadingRateImage-09233"; set_viewport_shading_rate_palette_09234 = "VUID-vkCmdDrawMultiEXT-shadingRateImage-09234"; @@ -789,7 +789,7 @@ struct DispatchVuidsCmdDrawIndexed : DrawDispatchVuid { vertex_input_format_08937 = "VUID-vkCmdDrawIndexed-format-08937"; vertex_input_format_09203 = "VUID-vkCmdDrawIndexed-None-09203"; vertex_input_format_07939 = "VUID-vkCmdDrawIndexed-Input-07939"; - set_clip_space_w_scaling_09232 = "VUID-vkCmdDrawIndexed-None-09232"; + set_clip_space_w_scaling_04138 = "VUID-vkCmdDrawIndexed-viewportCount-04138"; set_discard_rectangle_09236 = "VUID-vkCmdDrawIndexed-rasterizerDiscardEnable-09236"; set_viewport_coarse_sample_order_09233 = "VUID-vkCmdDrawIndexed-shadingRateImage-09233"; set_viewport_shading_rate_palette_09234 = "VUID-vkCmdDrawIndexed-shadingRateImage-09234"; @@ -1060,7 +1060,7 @@ struct DispatchVuidsCmdDrawMultiIndexedEXT : DrawDispatchVuid { vertex_input_format_08937 = "VUID-vkCmdDrawMultiIndexedEXT-format-08937"; vertex_input_format_09203 = "VUID-vkCmdDrawMultiIndexedEXT-None-09203"; vertex_input_format_07939 = "VUID-vkCmdDrawMultiIndexedEXT-Input-07939"; - set_clip_space_w_scaling_09232 = "VUID-vkCmdDrawMultiIndexedEXT-None-09232"; + set_clip_space_w_scaling_04138 = "VUID-vkCmdDrawMultiIndexedEXT-viewportCount-04138"; set_discard_rectangle_09236 = "VUID-vkCmdDrawMultiIndexedEXT-rasterizerDiscardEnable-09236"; set_viewport_coarse_sample_order_09233 = "VUID-vkCmdDrawMultiIndexedEXT-shadingRateImage-09233"; set_viewport_shading_rate_palette_09234 = "VUID-vkCmdDrawMultiIndexedEXT-shadingRateImage-09234"; @@ -1331,7 +1331,7 @@ struct DispatchVuidsCmdDrawIndirect : DrawDispatchVuid { vertex_input_format_08937 = "VUID-vkCmdDrawIndirect-format-08937"; vertex_input_format_09203 = "VUID-vkCmdDrawIndirect-None-09203"; vertex_input_format_07939 = "VUID-vkCmdDrawIndirect-Input-07939"; - set_clip_space_w_scaling_09232 = "VUID-vkCmdDrawIndirect-None-09232"; + set_clip_space_w_scaling_04138 = "VUID-vkCmdDrawIndirect-viewportCount-04138"; set_discard_rectangle_09236 = "VUID-vkCmdDrawIndirect-rasterizerDiscardEnable-09236"; set_viewport_coarse_sample_order_09233 = "VUID-vkCmdDrawIndirect-shadingRateImage-09233"; set_viewport_shading_rate_palette_09234 = "VUID-vkCmdDrawIndirect-shadingRateImage-09234"; @@ -1601,7 +1601,7 @@ struct DispatchVuidsCmdDrawIndexedIndirect : DrawDispatchVuid { vertex_input_format_08937 = "VUID-vkCmdDrawIndexedIndirect-format-08937"; vertex_input_format_09203 = "VUID-vkCmdDrawIndexedIndirect-None-09203"; vertex_input_format_07939 = "VUID-vkCmdDrawIndexedIndirect-Input-07939"; - set_clip_space_w_scaling_09232 = "VUID-vkCmdDrawIndexedIndirect-None-09232"; + set_clip_space_w_scaling_04138 = "VUID-vkCmdDrawIndexedIndirect-viewportCount-04138"; set_discard_rectangle_09236 = "VUID-vkCmdDrawIndexedIndirect-rasterizerDiscardEnable-09236"; set_viewport_coarse_sample_order_09233 = "VUID-vkCmdDrawIndexedIndirect-shadingRateImage-09233"; set_viewport_shading_rate_palette_09234 = "VUID-vkCmdDrawIndexedIndirect-shadingRateImage-09234"; @@ -1970,7 +1970,7 @@ struct DispatchVuidsCmdDrawIndirectCount : DrawDispatchVuid { vertex_input_format_08937 = "VUID-vkCmdDrawIndirectCount-format-08937"; vertex_input_format_09203 = "VUID-vkCmdDrawIndirectCount-None-09203"; vertex_input_format_07939 = "VUID-vkCmdDrawIndirectCount-Input-07939"; - set_clip_space_w_scaling_09232 = "VUID-vkCmdDrawIndirectCount-None-09232"; + set_clip_space_w_scaling_04138 = "VUID-vkCmdDrawIndirectCount-viewportCount-04138"; set_discard_rectangle_09236 = "VUID-vkCmdDrawIndirectCount-rasterizerDiscardEnable-09236"; set_viewport_coarse_sample_order_09233 = "VUID-vkCmdDrawIndirectCount-shadingRateImage-09233"; set_viewport_shading_rate_palette_09234 = "VUID-vkCmdDrawIndirectCount-shadingRateImage-09234"; @@ -2243,7 +2243,7 @@ struct DispatchVuidsCmdDrawIndexedIndirectCount : DrawDispatchVuid { vertex_input_format_08937 = "VUID-vkCmdDrawIndexedIndirectCount-format-08937"; vertex_input_format_09203 = "VUID-vkCmdDrawIndexedIndirectCount-None-09203"; vertex_input_format_07939 = "VUID-vkCmdDrawIndexedIndirectCount-Input-07939"; - set_clip_space_w_scaling_09232 = "VUID-vkCmdDrawIndexedIndirectCount-None-09232"; + set_clip_space_w_scaling_04138 = "VUID-vkCmdDrawIndexedIndirectCount-viewportCount-04138"; set_discard_rectangle_09236 = "VUID-vkCmdDrawIndexedIndirectCount-rasterizerDiscardEnable-09236"; set_viewport_coarse_sample_order_09233 = "VUID-vkCmdDrawIndexedIndirectCount-shadingRateImage-09233"; set_viewport_shading_rate_palette_09234 = "VUID-vkCmdDrawIndexedIndirectCount-shadingRateImage-09234"; @@ -2690,7 +2690,7 @@ struct DispatchVuidsCmdDrawMeshTasksNV: DrawDispatchVuid { set_viewport_with_count_08642 = "VUID-vkCmdDrawMeshTasksNV-primitiveFragmentShadingRateWithMultipleViewports-08642"; alpha_component_word_08920 = "VUID-vkCmdDrawMeshTasksNV-alphaToCoverageEnable-08920"; color_write_mask_09116 = "VUID-vkCmdDrawMeshTasksNV-None-09116"; - set_clip_space_w_scaling_09232 = "VUID-vkCmdDrawMeshTasksNV-None-09232"; + set_clip_space_w_scaling_04138 = "VUID-vkCmdDrawMeshTasksNV-viewportCount-04138"; set_discard_rectangle_09236 = "VUID-vkCmdDrawMeshTasksNV-rasterizerDiscardEnable-09236"; set_viewport_coarse_sample_order_09233 = "VUID-vkCmdDrawMeshTasksNV-shadingRateImage-09233"; set_viewport_shading_rate_palette_09234 = "VUID-vkCmdDrawMeshTasksNV-shadingRateImage-09234"; @@ -2946,7 +2946,7 @@ struct DispatchVuidsCmdDrawMeshTasksIndirectNV: DrawDispatchVuid { set_viewport_with_count_08642 = "VUID-vkCmdDrawMeshTasksIndirectNV-primitiveFragmentShadingRateWithMultipleViewports-08642"; alpha_component_word_08920 = "VUID-vkCmdDrawMeshTasksIndirectNV-alphaToCoverageEnable-08920"; color_write_mask_09116 = "VUID-vkCmdDrawMeshTasksIndirectNV-None-09116"; - set_clip_space_w_scaling_09232 = "VUID-vkCmdDrawMeshTasksIndirectNV-None-09232"; + set_clip_space_w_scaling_04138 = "VUID-vkCmdDrawMeshTasksIndirectNV-viewportCount-04138"; set_discard_rectangle_09236 = "VUID-vkCmdDrawMeshTasksIndirectNV-rasterizerDiscardEnable-09236"; set_viewport_coarse_sample_order_09233 = "VUID-vkCmdDrawMeshTasksIndirectNV-shadingRateImage-09233"; set_viewport_shading_rate_palette_09234 = "VUID-vkCmdDrawMeshTasksIndirectNV-shadingRateImage-09234"; @@ -3205,7 +3205,7 @@ struct DispatchVuidsCmdDrawMeshTasksIndirectCountNV : DrawDispatchVuid { set_viewport_with_count_08642 = "VUID-vkCmdDrawMeshTasksIndirectCountNV-primitiveFragmentShadingRateWithMultipleViewports-08642"; alpha_component_word_08920 = "VUID-vkCmdDrawMeshTasksIndirectCountNV-alphaToCoverageEnable-08920"; color_write_mask_09116 = "VUID-vkCmdDrawMeshTasksIndirectCountNV-None-09116"; - set_clip_space_w_scaling_09232 = "VUID-vkCmdDrawMeshTasksIndirectCountNV-None-09232"; + set_clip_space_w_scaling_04138 = "VUID-vkCmdDrawMeshTasksIndirectCountNV-viewportCount-04138"; set_discard_rectangle_09236 = "VUID-vkCmdDrawMeshTasksIndirectCountNV-rasterizerDiscardEnable-09236"; set_viewport_coarse_sample_order_09233 = "VUID-vkCmdDrawMeshTasksIndirectCountNV-shadingRateImage-09233"; set_viewport_shading_rate_palette_09234 = "VUID-vkCmdDrawMeshTasksIndirectCountNV-shadingRateImage-09234"; @@ -3458,7 +3458,7 @@ struct DispatchVuidsCmdDrawMeshTasksEXT: DrawDispatchVuid { set_viewport_with_count_08642 = "VUID-vkCmdDrawMeshTasksEXT-primitiveFragmentShadingRateWithMultipleViewports-08642"; alpha_component_word_08920 = "VUID-vkCmdDrawMeshTasksEXT-alphaToCoverageEnable-08920"; color_write_mask_09116 = "VUID-vkCmdDrawMeshTasksEXT-None-09116"; - set_clip_space_w_scaling_09232 = "VUID-vkCmdDrawMeshTasksEXT-None-09232"; + set_clip_space_w_scaling_04138 = "VUID-vkCmdDrawMeshTasksEXT-viewportCount-04138"; set_discard_rectangle_09236 = "VUID-vkCmdDrawMeshTasksEXT-rasterizerDiscardEnable-09236"; set_viewport_coarse_sample_order_09233 = "VUID-vkCmdDrawMeshTasksEXT-shadingRateImage-09233"; set_viewport_shading_rate_palette_09234 = "VUID-vkCmdDrawMeshTasksEXT-shadingRateImage-09234"; @@ -3714,7 +3714,7 @@ struct DispatchVuidsCmdDrawMeshTasksIndirectEXT: DrawDispatchVuid { set_viewport_with_count_08642 = "VUID-vkCmdDrawMeshTasksIndirectEXT-primitiveFragmentShadingRateWithMultipleViewports-08642"; alpha_component_word_08920 = "VUID-vkCmdDrawMeshTasksIndirectEXT-alphaToCoverageEnable-08920"; color_write_mask_09116 = "VUID-vkCmdDrawMeshTasksIndirectEXT-None-09116"; - set_clip_space_w_scaling_09232 = "VUID-vkCmdDrawMeshTasksIndirectEXT-None-09232"; + set_clip_space_w_scaling_04138 = "VUID-vkCmdDrawMeshTasksIndirectEXT-viewportCount-04138"; set_discard_rectangle_09236 = "VUID-vkCmdDrawMeshTasksIndirectEXT-rasterizerDiscardEnable-09236"; set_viewport_coarse_sample_order_09233 = "VUID-vkCmdDrawMeshTasksIndirectEXT-shadingRateImage-09233"; set_viewport_shading_rate_palette_09234 = "VUID-vkCmdDrawMeshTasksIndirectEXT-shadingRateImage-09234"; @@ -3973,7 +3973,7 @@ struct DispatchVuidsCmdDrawMeshTasksIndirectCountEXT : DrawDispatchVuid { set_viewport_with_count_08642 = "VUID-vkCmdDrawMeshTasksIndirectCountEXT-primitiveFragmentShadingRateWithMultipleViewports-08642"; alpha_component_word_08920 = "VUID-vkCmdDrawMeshTasksIndirectCountEXT-alphaToCoverageEnable-08920"; color_write_mask_09116 = "VUID-vkCmdDrawMeshTasksIndirectCountEXT-None-09116"; - set_clip_space_w_scaling_09232 = "VUID-vkCmdDrawMeshTasksIndirectCountEXT-None-09232"; + set_clip_space_w_scaling_04138 = "VUID-vkCmdDrawMeshTasksIndirectCountEXT-viewportCount-04138"; set_discard_rectangle_09236 = "VUID-vkCmdDrawMeshTasksIndirectCountEXT-rasterizerDiscardEnable-09236"; set_viewport_coarse_sample_order_09233 = "VUID-vkCmdDrawMeshTasksIndirectCountEXT-shadingRateImage-09233"; set_viewport_shading_rate_palette_09234 = "VUID-vkCmdDrawMeshTasksIndirectCountEXT-shadingRateImage-09234"; @@ -4244,7 +4244,7 @@ struct DispatchVuidsCmdDrawIndirectByteCountEXT: DrawDispatchVuid { vertex_input_format_08937 = "VUID-vkCmdDrawIndirectByteCountEXT-format-08937"; vertex_input_format_09203 = "VUID-vkCmdDrawIndirectByteCountEXT-None-09203"; vertex_input_format_07939 = "VUID-vkCmdDrawIndirectByteCountEXT-Input-07939"; - set_clip_space_w_scaling_09232 = "VUID-vkCmdDrawIndirectByteCountEXT-None-09232"; + set_clip_space_w_scaling_04138 = "VUID-vkCmdDrawIndirectByteCountEXT-viewportCount-04138"; set_discard_rectangle_09236 = "VUID-vkCmdDrawIndirectByteCountEXT-rasterizerDiscardEnable-09236"; set_viewport_coarse_sample_order_09233 = "VUID-vkCmdDrawIndirectByteCountEXT-shadingRateImage-09233"; set_viewport_shading_rate_palette_09234 = "VUID-vkCmdDrawIndirectByteCountEXT-shadingRateImage-09234"; diff --git a/layers/drawdispatch/drawdispatch_vuids.h b/layers/drawdispatch/drawdispatch_vuids.h index dfc88cec2e3..63e28a685c7 100644 --- a/layers/drawdispatch/drawdispatch_vuids.h +++ b/layers/drawdispatch/drawdispatch_vuids.h @@ -267,7 +267,7 @@ struct DrawDispatchVuid { const char* vertex_input_format_08937 = kVUIDUndefined; const char* vertex_input_format_09203 = kVUIDUndefined; const char* vertex_input_format_07939 = kVUIDUndefined; - const char* set_clip_space_w_scaling_09232 = kVUIDUndefined; + const char* set_clip_space_w_scaling_04138 = kVUIDUndefined; const char* set_discard_rectangle_09236 = kVUIDUndefined; const char* set_viewport_coarse_sample_order_09233 = kVUIDUndefined; const char* set_viewport_shading_rate_palette_09234 = kVUIDUndefined; diff --git a/layers/state_tracker/pipeline_state.cpp b/layers/state_tracker/pipeline_state.cpp index f0952d3cf2e..d9ccc9dab84 100644 --- a/layers/state_tracker/pipeline_state.cpp +++ b/layers/state_tracker/pipeline_state.cpp @@ -1125,6 +1125,22 @@ bool LastBound::IsShadingRateImageEnable() const { return false; } +bool LastBound::IsViewportWScalingEnable() const { + if (!pipeline_state || pipeline_state->IsDynamic(CB_DYNAMIC_STATE_VIEWPORT_W_SCALING_ENABLE_NV)) { + if (cb_state.IsDynamicStateSet(CB_DYNAMIC_STATE_VIEWPORT_W_SCALING_ENABLE_NV)) { + return cb_state.dynamic_state_value.viewport_w_scaling_enable; + } + } else { + if (auto viewport_state = pipeline_state->ViewportState()) { + if (const auto *viewport_w_scaling_state = + vku::FindStructInPNextChain(viewport_state->pNext)) { + return viewport_w_scaling_state->viewportWScalingEnable; + } + } + } + return false; +} + VkCoverageModulationModeNV LastBound::GetCoverageModulationMode() const { if (!pipeline_state || pipeline_state->IsDynamic(CB_DYNAMIC_STATE_COVERAGE_MODULATION_MODE_NV)) { if (cb_state.IsDynamicStateSet(CB_DYNAMIC_STATE_COVERAGE_MODULATION_MODE_NV)) { diff --git a/layers/state_tracker/pipeline_state.h b/layers/state_tracker/pipeline_state.h index 728adb26c87..1a42d47a1cf 100644 --- a/layers/state_tracker/pipeline_state.h +++ b/layers/state_tracker/pipeline_state.h @@ -725,6 +725,7 @@ struct LastBound { bool IsCoverageToColorEnabled() const; bool IsCoverageModulationTableEnable() const; bool IsShadingRateImageEnable() const; + bool IsViewportWScalingEnable() const; VkCoverageModulationModeNV GetCoverageModulationMode() const; bool ValidShaderObjectCombination(const VkPipelineBindPoint bind_point, const DeviceFeatures &device_features) const; diff --git a/layers/vulkan/generated/dynamic_state_helper.cpp b/layers/vulkan/generated/dynamic_state_helper.cpp index 2cf84e219bf..b7dd369a41c 100644 --- a/layers/vulkan/generated/dynamic_state_helper.cpp +++ b/layers/vulkan/generated/dynamic_state_helper.cpp @@ -740,6 +740,14 @@ std::string DescribeDynamicStateDependency(CBDynamicState dynamic_state, const v ss << rasterizer_discard_enable_static; } break; + case CB_DYNAMIC_STATE_VIEWPORT_W_SCALING_NV: + if (!pipeline || pipeline->IsDynamic(CB_DYNAMIC_STATE_VIEWPORT_W_SCALING_ENABLE_NV)) { + ss << "vkCmdSetViewportWScalingEnableNV last set viewportWScalingEnable to VK_TRUE.\n"; + } else { + ss << "VkPipelineViewportStateCreateInfo::pNext->VkPipelineViewportWScalingStateCreateInfoNV::" + "viewportWScalingEnable was VK_TRUE in the last bound graphics pipeline.\n"; + } + break; case CB_DYNAMIC_STATE_SAMPLE_LOCATIONS_EXT: if (!pipeline || pipeline->IsDynamic(CB_DYNAMIC_STATE_RASTERIZER_DISCARD_ENABLE)) { ss << rasterizer_discard_enable_dynamic; diff --git a/scripts/generators/dynamic_state_generator.py b/scripts/generators/dynamic_state_generator.py index 795bf6d7247..8249f8efe33 100644 --- a/scripts/generators/dynamic_state_generator.py +++ b/scripts/generators/dynamic_state_generator.py @@ -107,7 +107,8 @@ "command" : ["vkCmdSetPrimitiveRestartEnable"] }, "VK_DYNAMIC_STATE_VIEWPORT_W_SCALING_NV" : { - "command" : ["vkCmdSetViewportWScalingNV"] + "command" : ["vkCmdSetViewportWScalingNV"], + "dependency" : ["viewportWScalingEnable"] }, "VK_DYNAMIC_STATE_DISCARD_RECTANGLE_EXT" : { "command" : ["vkCmdSetDiscardRectangleEXT"] @@ -528,6 +529,13 @@ def generateSource(self): } else { ss << "VkPipelineViewportStateCreateInfo::pNext->VkPipelineViewportShadingRateImageStateCreateInfoNV::shadingRateImageEnable was VK_TRUE in the last bound graphics pipeline.\\n"; }''') + if 'viewportWScalingEnable' in dependency: + out.append(''' + if (!pipeline || pipeline->IsDynamic(CB_DYNAMIC_STATE_VIEWPORT_W_SCALING_ENABLE_NV)) { + ss << "vkCmdSetViewportWScalingEnableNV last set viewportWScalingEnable to VK_TRUE.\\n"; + } else { + ss << "VkPipelineViewportStateCreateInfo::pNext->VkPipelineViewportWScalingStateCreateInfoNV::viewportWScalingEnable was VK_TRUE in the last bound graphics pipeline.\\n"; + }''') out.append(' break;') out.append(''' diff --git a/tests/unit/shader_object.cpp b/tests/unit/shader_object.cpp index 90736aca71e..fc695c901f4 100644 --- a/tests/unit/shader_object.cpp +++ b/tests/unit/shader_object.cpp @@ -2420,7 +2420,8 @@ TEST_F(NegativeShaderObject, MissingCmdSetViewportWScalingEnableNV) { TEST_F(NegativeShaderObject, MissingCmdSetViewportWScalingNV) { TEST_DESCRIPTION("Draw with shader objects without setting vkCmdSetViewportWScalingNV."); - m_errorMonitor->SetDesiredError("VUID-vkCmdDraw-None-09232"); + m_errorMonitor->SetDesiredError("VUID-vkCmdDraw-viewportCount-04138"); + m_errorMonitor->SetAllowedFailureMsg("VUID-vkCmdDraw-None-08636"); AddRequiredExtensions(VK_NV_CLIP_SPACE_W_SCALING_EXTENSION_NAME); RETURN_IF_SKIP(InitBasicShaderObject());