diff options
| author | Michael Lentine <mlentine@google.com> | 2016-02-10 18:19:48 -0600 |
|---|---|---|
| committer | Tobin Ehlis <tobine@google.com> | 2016-02-11 14:18:19 -0700 |
| commit | 200fc4c05c8ec7e491f27ad016fdbf0eafed1212 (patch) | |
| tree | 23955419a0cb8891b1c9f51ddee019c73acb0e31 /layers/draw_state.cpp | |
| parent | afaea95a570b829fa3caaa17b245423c71e4527b (diff) | |
| download | usermoji-200fc4c05c8ec7e491f27ad016fdbf0eafed1212.tar.xz | |
Validate buffer barrier size and offset.
Diffstat (limited to 'layers/draw_state.cpp')
| -rw-r--r-- | layers/draw_state.cpp | 65 |
1 files changed, 52 insertions, 13 deletions
diff --git a/layers/draw_state.cpp b/layers/draw_state.cpp index ea2919c7..c9c4b221 100644 --- a/layers/draw_state.cpp +++ b/layers/draw_state.cpp @@ -5833,33 +5833,66 @@ VkBool32 ValidateMaskBitsFromLayouts(const layer_data* my_data, VkCommandBuffer return skip_call; } -VkBool32 ValidateBarriers(VkCommandBuffer cmdBuffer, uint32_t memBarrierCount, const VkMemoryBarrier* pMemBarriers, uint32_t imageMemBarrierCount, const VkImageMemoryBarrier *pImageMemBarriers) -{ +VkBool32 ValidateBarriers(VkCommandBuffer cmdBuffer, uint32_t memBarrierCount, + const VkMemoryBarrier *pMemBarriers, + uint32_t bufferBarrierCount, + const VkBufferMemoryBarrier *pBufferMemBarriers, + uint32_t imageMemBarrierCount, + const VkImageMemoryBarrier *pImageMemBarriers) { VkBool32 skip_call = VK_FALSE; layer_data* dev_data = get_my_data_ptr(get_dispatch_key(cmdBuffer), layer_data_map); GLOBAL_CB_NODE* pCB = getCBNode(dev_data, cmdBuffer); if (pCB->activeRenderPass && memBarrierCount) { - for (uint32_t i = 0; i < memBarrierCount; ++i) { - auto mem_barrier = &pMemBarriers[i]; - if (mem_barrier && mem_barrier->sType != VK_STRUCTURE_TYPE_MEMORY_BARRIER) { - skip_call |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, DRAWSTATE_INVALID_BARRIER, "DS", - "Image or Buffers Barriers cannot be used during a render pass."); - } - } if (!dev_data->renderPassMap[pCB->activeRenderPass]->hasSelfDependency[pCB->activeSubpass]) { skip_call |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, DRAWSTATE_INVALID_BARRIER, "DS", "Barriers cannot be set during subpass %d with no self dependency specified.", pCB->activeSubpass); } } - for (uint32_t i = 0; i < imageMemBarrierCount; ++i) { auto mem_barrier = &pImageMemBarriers[i]; + if (pCB->activeRenderPass) { + skip_call |= + log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, + (VkDebugReportObjectTypeEXT)0, 0, __LINE__, + DRAWSTATE_INVALID_BARRIER, "DS", + "Image Barriers cannot be used during a render pass."); + } if (mem_barrier && mem_barrier->sType == VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER) { skip_call |= ValidateMaskBitsFromLayouts(dev_data, cmdBuffer, mem_barrier->srcAccessMask, mem_barrier->oldLayout, "Source"); skip_call |= ValidateMaskBitsFromLayouts(dev_data, cmdBuffer, mem_barrier->dstAccessMask, mem_barrier->newLayout, "Dest"); } } - + for (uint32_t i = 0; i < bufferBarrierCount; ++i) { + auto mem_barrier = &pBufferMemBarriers[i]; + if (pCB->activeRenderPass) { + skip_call |= + log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, + (VkDebugReportObjectTypeEXT)0, 0, __LINE__, + DRAWSTATE_INVALID_BARRIER, "DS", + "Buffer Barriers cannot be used during a render pass."); + } + if (!mem_barrier) + continue; + auto buffer_data = dev_data->bufferMap.find(mem_barrier->buffer); + uint64_t buffer_size = buffer_data->second.create_info + ? reinterpret_cast<uint64_t &>( + buffer_data->second.create_info->size) + : 0; + if (buffer_data != dev_data->bufferMap.end() && + mem_barrier->offset + mem_barrier->size > buffer_size) { + skip_call |= + log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, + (VkDebugReportObjectTypeEXT)0, 0, __LINE__, + DRAWSTATE_INVALID_BARRIER, "DS", + "Buffer Barrier 0x%" PRIx64 " has offset %" PRIu64 + " and size %" PRIu64 + " whos sum is greater than total size %" PRIu64 ".", + reinterpret_cast<const uint64_t &>(mem_barrier->buffer), + reinterpret_cast<const uint64_t &>(mem_barrier->offset), + reinterpret_cast<const uint64_t &>(mem_barrier->size), + buffer_size); + } + } return skip_call; } @@ -5885,7 +5918,10 @@ VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdWaitEvents( skipCall |= report_error_no_cb_begin(dev_data, commandBuffer, "vkCmdWaitEvents()"); } skipCall |= TransitionImageLayouts(commandBuffer, imageMemoryBarrierCount, pImageMemoryBarriers); - skipCall |= ValidateBarriers(commandBuffer, memoryBarrierCount, pMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers); + skipCall |= + ValidateBarriers(commandBuffer, memoryBarrierCount, pMemoryBarriers, + bufferMemoryBarrierCount, pBufferMemoryBarriers, + imageMemoryBarrierCount, pImageMemoryBarriers); } loader_platform_thread_unlock_mutex(&globalLock); if (VK_FALSE == skipCall) @@ -5909,7 +5945,10 @@ VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdPipelineBarrier( if (pCB) { skipCall |= addCmd(dev_data, pCB, CMD_PIPELINEBARRIER, "vkCmdPipelineBarrier()"); skipCall |= TransitionImageLayouts(commandBuffer, imageMemoryBarrierCount, pImageMemoryBarriers); - skipCall |= ValidateBarriers(commandBuffer, memoryBarrierCount, pMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers); + skipCall |= + ValidateBarriers(commandBuffer, memoryBarrierCount, pMemoryBarriers, + bufferMemoryBarrierCount, pBufferMemoryBarriers, + imageMemoryBarrierCount, pImageMemoryBarriers); } loader_platform_thread_unlock_mutex(&globalLock); if (VK_FALSE == skipCall) |
