aboutsummaryrefslogtreecommitdiff
path: root/layers/core_validation.cpp
diff options
context:
space:
mode:
authorMark Lobodzinski <mark@lunarg.com>2016-06-14 12:11:29 -0600
committerMark Lobodzinski <mark@lunarg.com>2016-06-16 07:38:42 -0600
commitefab294f76f083a03528364f68400ab415cdf74f (patch)
tree4ca944743c8a34ec9c55d748f4a08006abfbf7f7 /layers/core_validation.cpp
parent789776f7754ffcd03eecfb6326ee4eb1a489d841 (diff)
downloadusermoji-efab294f76f083a03528364f68400ab415cdf74f.tar.xz
layers: LX539, Validate mem types
Bind[Image|Buffer]Memory did not validate that the memoryPropertyType matched the memory_requirements memory type flags for the buffer or image. Change-Id: I7007588d78408689c34df66a17cc9201a37569b1
Diffstat (limited to 'layers/core_validation.cpp')
-rw-r--r--layers/core_validation.cpp20
1 files changed, 18 insertions, 2 deletions
diff --git a/layers/core_validation.cpp b/layers/core_validation.cpp
index 2dbfd0ab..5f254f75 100644
--- a/layers/core_validation.cpp
+++ b/layers/core_validation.cpp
@@ -5138,6 +5138,20 @@ VKAPI_ATTR void VKAPI_CALL DestroyImage(VkDevice device, VkImage image, const Vk
}
}
+static bool ValidateMemoryTypes(const layer_data *dev_data, const DEVICE_MEM_INFO *mem_info, const uint32_t memory_type_bits,
+ const char *funcName) {
+ bool skip_call = false;
+ if (((1 << mem_info->allocInfo.memoryTypeIndex) & memory_type_bits) == 0) {
+ skip_call = log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT,
+ reinterpret_cast<const uint64_t &>(mem_info->mem), __LINE__, MEMTRACK_INVALID_MEM_TYPE, "MT",
+ "%s(): MemoryRequirements->memoryTypeBits (0x%X) for this object type are not compatible with the memory "
+ "type (0x%X) of this memory object 0x%" PRIx64 ".",
+ funcName, memory_type_bits, mem_info->allocInfo.memoryTypeIndex,
+ reinterpret_cast<const uint64_t &>(mem_info->mem));
+ }
+ return skip_call;
+}
+
VKAPI_ATTR VkResult VKAPI_CALL
BindBufferMemory(VkDevice device, VkBuffer buffer, VkDeviceMemory mem, VkDeviceSize memoryOffset) {
layer_data *dev_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
@@ -5159,6 +5173,7 @@ BindBufferMemory(VkDevice device, VkBuffer buffer, VkDeviceMemory mem, VkDeviceS
const MEMORY_RANGE range =
insert_memory_ranges(buffer_handle, mem, memoryOffset, memRequirements, mem_info->bufferRanges);
skipCall |= validate_memory_range(dev_data, mem_info->imageRanges, range, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT);
+ skipCall |= ValidateMemoryTypes(dev_data, mem_info, memRequirements.memoryTypeBits, "BindBufferMemory");
}
// Validate memory requirements alignment
@@ -7818,10 +7833,10 @@ bool validateEventStageMask(VkQueue queue, GLOBAL_CB_NODE *pCB, uint32_t eventCo
if (sourceStageMask != stageMask && sourceStageMask != (stageMask | VK_PIPELINE_STAGE_HOST_BIT)) {
skip_call |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__,
DRAWSTATE_INVALID_EVENT, "DS", "Submitting cmdbuffer with call to VkCmdWaitEvents "
- "using srcStageMask 0x%x which must be the bitwise "
+ "using srcStageMask 0x%X which must be the bitwise "
"OR of the stageMask parameters used in calls to "
"vkCmdSetEvent and VK_PIPELINE_STAGE_HOST_BIT if "
- "used with vkSetEvent but instead is 0x%x.",
+ "used with vkSetEvent but instead is 0x%X.",
sourceStageMask, stageMask);
}
return skip_call;
@@ -9521,6 +9536,7 @@ VKAPI_ATTR VkResult VKAPI_CALL BindImageMemory(VkDevice device, VkImage image, V
const MEMORY_RANGE range =
insert_memory_ranges(image_handle, mem, memoryOffset, memRequirements, mem_info->imageRanges);
skipCall |= validate_memory_range(dev_data, mem_info->bufferRanges, range, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT);
+ skipCall |= ValidateMemoryTypes(dev_data, mem_info, memRequirements.memoryTypeBits, "vkBindImageMemory");
}
print_mem_list(dev_data);