layers: Simplified CastFromHandle argument deduction

By putting the return value as the first template arguement, only the
first argument is needed typically (the second can be deduced).

Change-Id: I4d0900bc03980f856c0c3bec87ab7eb1bd98aa44
diff --git a/layers/core_validation.cpp b/layers/core_validation.cpp
index d2b7c66..9c3ed38 100644
--- a/layers/core_validation.cpp
+++ b/layers/core_validation.cpp
@@ -13202,23 +13202,23 @@
 
 void CoreChecks::CoreLayerDestroyValidationCacheEXT(VkDevice device, VkValidationCacheEXT validationCache,
                                                     const VkAllocationCallbacks *pAllocator) {
-    delete CastFromHandle<VkValidationCacheEXT, ValidationCache *>(validationCache);
+    delete CastFromHandle<ValidationCache *>(validationCache);
 }
 
 VkResult CoreChecks::CoreLayerGetValidationCacheDataEXT(VkDevice device, VkValidationCacheEXT validationCache, size_t *pDataSize,
                                                         void *pData) {
     size_t inSize = *pDataSize;
-    CastFromHandle<VkValidationCacheEXT, ValidationCache *>(validationCache)->Write(pDataSize, pData);
+    CastFromHandle<ValidationCache *>(validationCache)->Write(pDataSize, pData);
     return (pData && *pDataSize != inSize) ? VK_INCOMPLETE : VK_SUCCESS;
 }
 
 VkResult CoreChecks::CoreLayerMergeValidationCachesEXT(VkDevice device, VkValidationCacheEXT dstCache, uint32_t srcCacheCount,
                                                        const VkValidationCacheEXT *pSrcCaches) {
     bool skip = false;
-    auto dst = CastFromHandle<VkValidationCacheEXT, ValidationCache *>(dstCache);
+    auto dst = CastFromHandle<ValidationCache *>(dstCache);
     VkResult result = VK_SUCCESS;
     for (uint32_t i = 0; i < srcCacheCount; i++) {
-        auto src = CastFromHandle<const VkValidationCacheEXT, const ValidationCache *>(pSrcCaches[i]);
+        auto src = CastFromHandle<const ValidationCache *>(pSrcCaches[i]);
         if (src == dst) {
             skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_VALIDATION_CACHE_EXT, 0,
                             "VUID-vkMergeValidationCachesEXT-dstCache-01536",
diff --git a/layers/shader_validation.cpp b/layers/shader_validation.cpp
index 3482a18..9292c33 100644
--- a/layers/shader_validation.cpp
+++ b/layers/shader_validation.cpp
@@ -2534,7 +2534,7 @@
 static ValidationCache *GetValidationCacheInfo(VkShaderModuleCreateInfo const *pCreateInfo) {
     const auto validation_cache_ci = lvl_find_in_chain<VkShaderModuleValidationCacheCreateInfoEXT>(pCreateInfo->pNext);
     if (validation_cache_ci) {
-        return CastFromHandle<VkValidationCacheEXT, ValidationCache *>(validation_cache_ci->validationCache);
+        return CastFromHandle<ValidationCache *>(validation_cache_ci->validationCache);
     }
     return nullptr;
 }
diff --git a/layers/vk_layer_utils.h b/layers/vk_layer_utils.h
index e59d7bc..bf28fce 100644
--- a/layers/vk_layer_utils.h
+++ b/layers/vk_layer_utils.h
@@ -167,7 +167,7 @@
     static_assert(sizeof(HandleType) >= sizeof(ValueType), "HandleType must large enough to hold internal value");
     *handle = CastFromUint64<HandleType>(CastToUint64<ValueType>(value));
 }
-// This form is conveniently "inline" but inconveniently requires both template arguments.
+// This form is conveniently "inline", you should only need to specify the handle type (the value type being deducible from the arg
 template <typename HandleType, typename ValueType>
 HandleType CastToHandle(ValueType value) {
     HandleType handle;
@@ -175,12 +175,12 @@
     return handle;
 }
 
-template <typename HandleType, typename ValueType>
+template <typename ValueType, typename HandleType>
 void CastFromHandle(HandleType handle, ValueType *value) {
     static_assert(sizeof(HandleType) >= sizeof(ValueType), "HandleType must large enough to hold internal value");
     *value = CastFromUint64<ValueType>(CastToUint64<HandleType>(handle));
 }
-template <typename HandleType, typename ValueType>
+template <typename ValueType, typename HandleType>
 ValueType CastFromHandle(HandleType handle) {
     ValueType value;
     CastFromHandle(handle, &value);