syncval: Add FreeCommandBuffer callback support

Add support for a state tracker callback for command buffer free
operations and implement in sync tracking.

Change-Id: Ic949b53f17477f9d6881a0d20f35aff486538d9b
diff --git a/layers/synchronization_validation.cpp b/layers/synchronization_validation.cpp
index 7dbea33..2c4b577 100644
--- a/layers/synchronization_validation.cpp
+++ b/layers/synchronization_validation.cpp
@@ -863,13 +863,21 @@
     }
 }
 
-void SyncValidator::ResetCommandBuffer(VkCommandBuffer command_buffer) {
+void SyncValidator::ResetCommandBufferCallback(VkCommandBuffer command_buffer) {
     auto *access_context = GetAccessContextNoInsert(command_buffer);
     if (access_context) {
         access_context->Reset();
     }
 }
 
+void SyncValidator::FreeCommandBufferCallback(VkCommandBuffer command_buffer) {
+    auto access_found = cb_access_state.find(command_buffer);
+    if (access_found != cb_access_state.end()) {
+        access_found->second->Reset();
+        cb_access_state.erase(access_found);
+    }
+}
+
 void SyncValidator::ApplyGlobalBarriers(AccessContext *context, VkPipelineStageFlags srcStageMask,
                                         VkPipelineStageFlags dstStageMask, SyncStageAccessFlags src_access_scope,
                                         SyncStageAccessFlags dst_access_scope, uint32_t memoryBarrierCount,
@@ -1126,8 +1134,12 @@
     ValidationObject *validation_data = GetValidationObject(device_object->object_dispatch, LayerObjectTypeSyncValidation);
     SyncValidator *sync_device_state = static_cast<SyncValidator *>(validation_data);
 
-    sync_device_state->SetCommandBufferResetCallback(
-        [sync_device_state](VkCommandBuffer command_buffer) -> void { sync_device_state->ResetCommandBuffer(command_buffer); });
+    sync_device_state->SetCommandBufferResetCallback([sync_device_state](VkCommandBuffer command_buffer) -> void {
+        sync_device_state->ResetCommandBufferCallback(command_buffer);
+    });
+    sync_device_state->SetCommandBufferFreeCallback([sync_device_state](VkCommandBuffer command_buffer) -> void {
+        sync_device_state->FreeCommandBufferCallback(command_buffer);
+    });
 }
 
 void SyncValidator::PostCallRecordBeginCommandBuffer(VkCommandBuffer commandBuffer, const VkCommandBufferBeginInfo *pBeginInfo,