vulkan: pass VK_LAYER_FUNCTION_DATA_CALLBACK to layers
VK_LAYER_FUNCTION_DATA_CALLBACK effectively allows us to pass
driver::SetDataInternal to layers. It will be called on handles of
potentially unknown types. Add two internal types
VK_DEFINE_HANDLE(InstanceDispatchable)
VK_DEFINE_HANDLE(DeviceDispatchable)
in driver namespace for type safety.
Bug: 28015368
Change-Id: I7389829a7d8c374197cd7046973777b49e436961
diff --git a/vulkan/libvulkan/driver.h b/vulkan/libvulkan/driver.h
index 22db93f..5543792 100644
--- a/vulkan/libvulkan/driver.h
+++ b/vulkan/libvulkan/driver.h
@@ -64,6 +64,9 @@
namespace driver {
+VK_DEFINE_HANDLE(InstanceDispatchable)
+VK_DEFINE_HANDLE(DeviceDispatchable)
+
struct InstanceData {
InstanceData(const VkAllocationCallbacks& alloc)
: opaque_api_data(),
@@ -127,12 +130,15 @@
template <typename DispatchableType>
void StaticAssertDispatchable(DispatchableType) {
- static_assert(std::is_same<DispatchableType, VkInstance>::value ||
- std::is_same<DispatchableType, VkPhysicalDevice>::value ||
- std::is_same<DispatchableType, VkDevice>::value ||
- std::is_same<DispatchableType, VkQueue>::value ||
- std::is_same<DispatchableType, VkCommandBuffer>::value,
- "unrecognized dispatchable type");
+ static_assert(
+ std::is_same<DispatchableType, VkInstance>::value ||
+ std::is_same<DispatchableType, VkPhysicalDevice>::value ||
+ std::is_same<DispatchableType, VkDevice>::value ||
+ std::is_same<DispatchableType, InstanceDispatchable>::value ||
+ std::is_same<DispatchableType, VkQueue>::value ||
+ std::is_same<DispatchableType, VkCommandBuffer>::value ||
+ std::is_same<DispatchableType, DeviceDispatchable>::value,
+ "unrecognized dispatchable type");
}
template <typename DispatchableType>
@@ -170,6 +176,11 @@
return SetDataInternal(physical_dev, &data);
}
+inline bool SetData(InstanceDispatchable dispatchable,
+ const InstanceData& data) {
+ return SetDataInternal(dispatchable, &data);
+}
+
inline bool SetData(VkDevice dev, const DeviceData& data) {
return SetDataInternal(dev, &data);
}
@@ -182,6 +193,10 @@
return SetDataInternal(cmd, &data);
}
+inline bool SetData(DeviceDispatchable dispatchable, const DeviceData& data) {
+ return SetDataInternal(dispatchable, &data);
+}
+
inline InstanceData& GetData(VkInstance instance) {
return *reinterpret_cast<InstanceData*>(GetDataInternal(instance));
}
@@ -190,6 +205,10 @@
return *reinterpret_cast<InstanceData*>(GetDataInternal(physical_dev));
}
+inline InstanceData& GetData(InstanceDispatchable dispatchable) {
+ return *reinterpret_cast<InstanceData*>(GetDataInternal(dispatchable));
+}
+
inline DeviceData& GetData(VkDevice dev) {
return *reinterpret_cast<DeviceData*>(GetDataInternal(dev));
}
@@ -202,6 +221,10 @@
return *reinterpret_cast<DeviceData*>(GetDataInternal(cmd));
}
+inline DeviceData& GetData(DeviceDispatchable dispatchable) {
+ return *reinterpret_cast<DeviceData*>(GetDataInternal(dispatchable));
+}
+
} // namespace driver
} // namespace vulkan