|
2 | 2 | * Copyright (c) 2015-2026 Valve Corporation |
3 | 3 | * Copyright (c) 2015-2026 LunarG, Inc. |
4 | 4 | * Copyright (C) 2015-2026 Google Inc. |
| 5 | + * Copyright (C) 2026 Qualcomm Technologies, Inc. |
5 | 6 | * Modifications Copyright (C) 2020-2022 Advanced Micro Devices, Inc. All rights reserved. |
6 | 7 | * |
7 | 8 | * Licensed under the Apache License, Version 2.0 (the "License"); |
@@ -654,6 +655,21 @@ bool CoreChecks::ValidateCmdBeginRenderPass(VkCommandBuffer commandBuffer, const |
654 | 655 | pRenderPassBegin->renderArea, rp_begin_loc); |
655 | 656 | } |
656 | 657 |
|
| 658 | + if ((cb_state.begin_info_flags & VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT) != 0) { |
| 659 | + if (const auto* rp_tile_shading_ci = |
| 660 | + vku::FindStructInPNextChain<VkRenderPassTileShadingCreateInfoQCOM>(rp_state->create_info.pNext)) { |
| 661 | + if ((rp_tile_shading_ci->flags & VK_TILE_SHADING_RENDER_PASS_ENABLE_BIT_QCOM) != 0) { |
| 662 | + const LogObjectList objlist(commandBuffer, pRenderPassBegin->renderPass); |
| 663 | + skip |= LogError("VUID-vkCmdBeginRenderPass2-flags-10652", objlist, |
| 664 | + rp_begin_loc.dot(Field::renderPass), |
| 665 | + "has been created with VkTileShadingRenderPassFlagsQCOM (%s), but commandBuffer " |
| 666 | + "is being recorded with VkCommandBufferUsageFlags (%s).", |
| 667 | + string_VkTileShadingRenderPassFlagsQCOM(rp_tile_shading_ci->flags).c_str(), |
| 668 | + string_VkCommandBufferUsageFlags(cb_state.begin_info_flags).c_str()); |
| 669 | + } |
| 670 | + } |
| 671 | + } |
| 672 | + |
657 | 673 | return skip; |
658 | 674 | } |
659 | 675 |
|
@@ -775,6 +791,12 @@ bool CoreChecks::ValidateCmdEndRenderPass(const vvl::CommandBuffer& cb_state, co |
775 | 791 | FormatHandle(query.pool).c_str(), query.subpass); |
776 | 792 | } |
777 | 793 |
|
| 794 | + if (cb_state.per_tile_execution_model_enabled) { |
| 795 | + const LogObjectList objlist(cb_state.Handle(), rp_state.Handle()); |
| 796 | + skip |= LogError("VUID-vkCmdEndRenderPass-None-10653", objlist, error_obj.location, |
| 797 | + "per-tile execution model is still enabled in this command buffer."); |
| 798 | + } |
| 799 | + |
778 | 800 | return skip; |
779 | 801 | } |
780 | 802 |
|
@@ -3923,6 +3945,11 @@ bool CoreChecks::PreCallValidateCmdBeginRendering(VkCommandBuffer commandBuffer, |
3923 | 3945 | commandBuffer, *counters_begin_info, objlist, 1u, layer_or_view_count, pRenderingInfo->renderArea, rendering_info_loc); |
3924 | 3946 | } |
3925 | 3947 |
|
| 3948 | + if (const auto* rp_tile_shading_ci = |
| 3949 | + vku::FindStructInPNextChain<VkRenderPassTileShadingCreateInfoQCOM>(pRenderingInfo->pNext)) { |
| 3950 | + skip |= ValidateBeginRenderingTileShadingCreateInfo(*cb_state, *pRenderingInfo, *rp_tile_shading_ci, rendering_info_loc); |
| 3951 | + } |
| 3952 | + |
3926 | 3953 | return skip; |
3927 | 3954 | } |
3928 | 3955 |
|
@@ -4540,6 +4567,55 @@ bool CoreChecks::ValidateBeginRenderingDepthAndStencilAttachment(VkCommandBuffer |
4540 | 4567 | return skip; |
4541 | 4568 | } |
4542 | 4569 |
|
| 4570 | +bool CoreChecks::ValidateBeginRenderingTileShadingCreateInfo(const vvl::CommandBuffer& cb_state, const VkRenderingInfo& rendering_info, |
| 4571 | + const VkRenderPassTileShadingCreateInfoQCOM& rp_tile_shading_ci, |
| 4572 | + const Location& rendering_info_loc) const { |
| 4573 | + bool skip = false; |
| 4574 | + const bool has_rp_enable_bit = (rp_tile_shading_ci.flags & VK_TILE_SHADING_RENDER_PASS_ENABLE_BIT_QCOM) != 0; |
| 4575 | + const bool has_rp_per_tile_exec_bit = (rp_tile_shading_ci.flags & VK_TILE_SHADING_RENDER_PASS_PER_TILE_EXECUTION_BIT_QCOM) != 0; |
| 4576 | + const auto* fragment_density_map_info = |
| 4577 | + vku::FindStructInPNextChain<VkRenderingFragmentDensityMapAttachmentInfoEXT>(rendering_info.pNext); |
| 4578 | + |
| 4579 | + if (fragment_density_map_info && fragment_density_map_info->imageView != VK_NULL_HANDLE && has_rp_enable_bit) { |
| 4580 | + const LogObjectList objlist(cb_state.Handle(), fragment_density_map_info->imageView); |
| 4581 | + skip |= LogError("VUID-VkRenderingInfo-imageView-10643", objlist, |
| 4582 | + rendering_info_loc.pNext(Struct::VkRenderingFragmentDensityMapAttachmentInfoEXT, Field::imageView), |
| 4583 | + "is not VK_NULL_HANDLE, but VkRenderPassTileShadingCreateInfoQCOM::flags (%s) includes " |
| 4584 | + "VK_TILE_SHADING_RENDER_PASS_ENABLE_BIT_QCOM bit.", |
| 4585 | + string_VkTileShadingRenderPassFlagsQCOM(rp_tile_shading_ci.flags).c_str()); |
| 4586 | + } |
| 4587 | + |
| 4588 | + for (uint32_t index = 0; index < rendering_info.colorAttachmentCount; ++index) { |
| 4589 | + if (rendering_info.pColorAttachments[index].resolveMode == VK_RESOLVE_MODE_EXTERNAL_FORMAT_DOWNSAMPLE_BIT_ANDROID && |
| 4590 | + has_rp_enable_bit) { |
| 4591 | + const LogObjectList objlist(cb_state.Handle(), rendering_info.pColorAttachments[index].resolveImageView); |
| 4592 | + skip |= LogError("VUID-VkRenderingInfo-resolveMode-10644", objlist, |
| 4593 | + rendering_info_loc.dot(Field::pColorAttachments, index).dot(Field::resolveMode), |
| 4594 | + "is VK_RESOLVE_MODE_EXTERNAL_FORMAT_DOWNSAMPLE_BIT_ANDROID, but " |
| 4595 | + "VkRenderPassTileShadingCreateInfoQCOM::flags (%s) includes VK_TILE_SHADING_RENDER_PASS_ENABLE_BIT_QCOM bit", |
| 4596 | + string_VkTileShadingRenderPassFlagsQCOM(rp_tile_shading_ci.flags).c_str()); |
| 4597 | + } |
| 4598 | + } |
| 4599 | + |
| 4600 | + if (has_rp_enable_bit && (cb_state.begin_info_flags & VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT) != 0) { |
| 4601 | + skip |= LogError("VUID-vkCmdBeginRendering-flags-10641", cb_state.Handle(), |
| 4602 | + rendering_info_loc.pNext(Struct::VkRenderPassTileShadingCreateInfoQCOM, Field::flags), |
| 4603 | + "(%s) includes VK_TILE_SHADING_RENDER_PASS_ENABLE_BIT_QCOM bit, but commandBuffer " |
| 4604 | + "is being recorded with VkCommandBufferUsageFlags (%s).", |
| 4605 | + string_VkTileShadingRenderPassFlagsQCOM(rp_tile_shading_ci.flags).c_str(), |
| 4606 | + string_VkCommandBufferUsageFlags(cb_state.begin_info_flags).c_str()); |
| 4607 | + } |
| 4608 | + |
| 4609 | + if (has_rp_per_tile_exec_bit) { |
| 4610 | + skip |= LogError("VUID-vkCmdBeginRendering-flags-10642", cb_state.Handle(), |
| 4611 | + rendering_info_loc.pNext(Struct::VkRenderPassTileShadingCreateInfoQCOM, Field::flags), |
| 4612 | + "(%s) includes VK_TILE_SHADING_RENDER_PASS_PER_TILE_EXECUTION_BIT_QCOM bit.", |
| 4613 | + string_VkTileShadingRenderPassFlagsQCOM(rp_tile_shading_ci.flags).c_str()); |
| 4614 | + } |
| 4615 | + |
| 4616 | + return skip; |
| 4617 | +} |
| 4618 | + |
4543 | 4619 | // Flags validation error if the associated call is made inside a render pass. The apiName routine should ONLY be called outside a |
4544 | 4620 | // render pass. |
4545 | 4621 | bool CoreChecks::InsideRenderPass(const vvl::CommandBuffer& cb_state, const Location& loc, const char* vuid) const { |
@@ -4629,6 +4705,10 @@ bool CoreChecks::ValidateCmdEndRendering(const vvl::CommandBuffer& cb_state, con |
4629 | 4705 | LogError(vuid, objlist, error_obj.location, "query %" PRIu32 " from %s was began in the render pass, but never ended.", |
4630 | 4706 | query.slot, FormatHandle(query.pool).c_str()); |
4631 | 4707 | } |
| 4708 | + if (cb_state.per_tile_execution_model_enabled) { |
| 4709 | + skip |= LogError("VUID-vkCmdEndRendering-None-10645", cb_state.Handle(), error_obj.location, |
| 4710 | + "per-tile execution model is still enabled in this command buffer."); |
| 4711 | + } |
4632 | 4712 |
|
4633 | 4713 | return skip; |
4634 | 4714 | } |
|
0 commit comments