From 1f7dd9114d3a11add7411280a13c339225747871 Mon Sep 17 00:00:00 2001
From: Gabriel Dube <gdube.475@gmail.com>
Date: Sat, 11 Apr 2020 06:19:22 -0400
Subject: [PATCH] Implement VK_KHR_draw_indirect_count

---
 ash/src/extensions/khr/draw_indirect_count.rs | 74 +++++++++++++++++++
 ash/src/extensions/khr/mod.rs                 |  2 +
 2 files changed, 76 insertions(+)
 create mode 100644 ash/src/extensions/khr/draw_indirect_count.rs

diff --git a/ash/src/extensions/khr/draw_indirect_count.rs b/ash/src/extensions/khr/draw_indirect_count.rs
new file mode 100644
index 0000000..b911282
--- /dev/null
+++ b/ash/src/extensions/khr/draw_indirect_count.rs
@@ -0,0 +1,74 @@
+#![allow(dead_code)]
+use crate::version::{DeviceV1_0, InstanceV1_0};
+use crate::vk;
+use std::ffi::CStr;
+use std::mem;
+
+#[derive(Clone)]
+pub struct DrawIndirectCount {
+    handle: vk::Device,
+    draw_indirect_count_fn: vk::KhrDrawIndirectCountFn,
+}
+
+impl DrawIndirectCount {
+    pub fn new<I: InstanceV1_0, D: DeviceV1_0>(instance: &I, device: &D) -> DrawIndirectCount {
+        let draw_indirect_count_fn = vk::KhrDrawIndirectCountFn::load(|name| unsafe {
+            mem::transmute(instance.get_device_proc_addr(device.handle(), name.as_ptr()))
+        });
+
+        DrawIndirectCount {
+            handle: device.handle(),
+            draw_indirect_count_fn,
+        }
+    }
+
+    pub fn name() -> &'static CStr {
+        vk::KhrDrawIndirectCountFn::name()
+    }
+
+    #[doc = "<https://www.khronos.org/registry/vulkan/specs/1.1-extensions/man/html/vkCmdDrawIndexedIndirectCountKHR.html>"]
+    pub unsafe fn cmd_draw_indexed_indirect_count(
+        &self,
+        command_buffer: vk::CommandBuffer,
+        buffer: vk::Buffer,
+        offset: vk::DeviceSize,
+        count_buffer: vk::Buffer,
+        count_buffer_offset: vk::DeviceSize,
+        max_draw_count: u32,
+        stride: u32,
+    ) {
+        self.draw_indirect_count_fn
+            .cmd_draw_indexed_indirect_count_khr(
+                command_buffer,
+                buffer,
+                offset,
+                count_buffer,
+                count_buffer_offset,
+                max_draw_count,
+                stride,
+            );
+    }
+
+    #[doc = "<https://www.khronos.org/registry/vulkan/specs/1.1-extensions/man/html/vkCmdDrawIndirectCountKHR.html>"]
+    pub unsafe fn cmd_draw_indirect_count(
+        &self,
+        command_buffer: vk::CommandBuffer,
+        buffer: vk::Buffer,
+        offset: vk::DeviceSize,
+        count_buffer: vk::Buffer,
+        count_buffer_offset: vk::DeviceSize,
+        max_draw_count: u32,
+        stride: u32,
+    ) {
+        self.draw_indirect_count_fn
+            .cmd_draw_indexed_indirect_count_khr(
+                command_buffer,
+                buffer,
+                offset,
+                count_buffer,
+                count_buffer_offset,
+                max_draw_count,
+                stride,
+            );
+    }
+}
diff --git a/ash/src/extensions/khr/mod.rs b/ash/src/extensions/khr/mod.rs
index 31a40a7..6b5a788 100644
--- a/ash/src/extensions/khr/mod.rs
+++ b/ash/src/extensions/khr/mod.rs
@@ -1,6 +1,7 @@
 pub use self::android_surface::AndroidSurface;
 pub use self::display::Display;
 pub use self::display_swapchain::DisplaySwapchain;
+pub use self::draw_indirect_count::DrawIndirectCount;
 pub use self::external_memory_fd::ExternalMemoryFd;
 pub use self::push_descriptor::PushDescriptor;
 pub use self::ray_tracing::RayTracing;
@@ -15,6 +16,7 @@ pub use self::xlib_surface::XlibSurface;
 mod android_surface;
 mod display;
 mod display_swapchain;
+mod draw_indirect_count;
 mod external_memory_fd;
 mod push_descriptor;
 mod ray_tracing;