diff options
| author | Mark Lobodzinski <mark@lunarg.com> | 2016-06-09 17:01:19 -0600 |
|---|---|---|
| committer | Mark Lobodzinski <mark@lunarg.com> | 2016-06-10 15:42:06 -0600 |
| commit | 48c40c950c223c23dac71a5f37513950c71a20a5 (patch) | |
| tree | 793d43476a5408badaeb8eeddffad43f90b374fe /layers/parameter_validation.cpp | |
| parent | 9913c6f30caf8b0e9d5059e3f474683f47d83832 (diff) | |
| download | usermoji-48c40c950c223c23dac71a5f37513950c71a20a5.tar.xz | |
layers: GH536, Update CmdFillBuffer validation
Was ignoring VK_WHOLE_SIZE. Moved validation cases for Update/FillBuffer
to Parameter Validation layer (as they were stateless) and added the
remaining additional stateless valid usage checks.
Change-Id: I0f41c6ba55f218a6db9fb34736a2abc52f856edf
Diffstat (limited to 'layers/parameter_validation.cpp')
| -rw-r--r-- | layers/parameter_validation.cpp | 57 |
1 files changed, 47 insertions, 10 deletions
diff --git a/layers/parameter_validation.cpp b/layers/parameter_validation.cpp index fe9e391c..4be50316 100644 --- a/layers/parameter_validation.cpp +++ b/layers/parameter_validation.cpp @@ -4137,29 +4137,66 @@ VKAPI_ATTR void VKAPI_CALL CmdCopyImageToBuffer(VkCommandBuffer commandBuffer, V } } -VKAPI_ATTR void VKAPI_CALL CmdUpdateBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, - VkDeviceSize dstOffset, VkDeviceSize dataSize, const uint32_t *pData) { - bool skipCall = false; +VKAPI_ATTR void VKAPI_CALL CmdUpdateBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset, + VkDeviceSize dataSize, const uint32_t *pData) { + bool skip_call = false; layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map); assert(my_data != NULL); - skipCall |= parameter_validation_vkCmdUpdateBuffer(my_data->report_data, dstBuffer, dstOffset, dataSize, pData); + skip_call |= parameter_validation_vkCmdUpdateBuffer(my_data->report_data, dstBuffer, dstOffset, dataSize, pData); - if (!skipCall) { + if (dstOffset & 3) { + skip_call |= + log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__, INVALID_USAGE, + "PARAMCHECK", "CmdUpdateBuffer parameter, VkDeviceSize dstOffset (0x%" PRIxLEAST64 "), is not a multiple of 4", + dstOffset); + } + + if ((dataSize <= 0) || (dataSize > 65536)) { + skip_call |= log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__, + INVALID_USAGE, "PARAMCHECK", "CmdUpdateBuffer parameter, VkDeviceSize dataSize (0x%" PRIxLEAST64 + "), must be greater than zero and less than or equal to 65536", + dataSize); + } else if (dataSize & 3) { + skip_call |= + log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__, INVALID_USAGE, + "PARAMCHECK", "CmdUpdateBuffer parameter, VkDeviceSize dataSize (0x%" PRIxLEAST64 "), is not a multiple of 4", + dataSize); + } + + if (!skip_call) { get_dispatch_table(pc_device_table_map, commandBuffer) ->CmdUpdateBuffer(commandBuffer, dstBuffer, dstOffset, dataSize, pData); } } -VKAPI_ATTR void VKAPI_CALL -CmdFillBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize size, uint32_t data) { - bool skipCall = false; +VKAPI_ATTR void VKAPI_CALL CmdFillBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset, + VkDeviceSize size, uint32_t data) { + bool skip_call = false; layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map); assert(my_data != NULL); - skipCall |= parameter_validation_vkCmdFillBuffer(my_data->report_data, dstBuffer, dstOffset, size, data); + skip_call |= parameter_validation_vkCmdFillBuffer(my_data->report_data, dstBuffer, dstOffset, size, data); - if (!skipCall) { + if (dstOffset & 3) { + skip_call |= log_msg( + my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__, INVALID_USAGE, "DL", + "vkCmdFillBuffer parameter, VkDeviceSize dstOffset (0x%" PRIxLEAST64 "), is not a multiple of 4", dstOffset); + } + + if (size != VK_WHOLE_SIZE) { + if (size <= 0) { + skip_call |= log_msg( + my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__, INVALID_USAGE, + "DL", "vkCmdFillBuffer parameter, VkDeviceSize size (0x%" PRIxLEAST64 "), must be greater than zero", size); + } else if (size & 3) { + skip_call |= log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__, + INVALID_USAGE, "DL", + "vkCmdFillBuffer parameter, VkDeviceSize size (0x%" PRIxLEAST64 "), is not a multiple of 4", size); + } + } + + if (!skip_call) { get_dispatch_table(pc_device_table_map, commandBuffer)->CmdFillBuffer(commandBuffer, dstBuffer, dstOffset, size, data); } } |
