1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
// Copyright (c) 2016 The vulkano developers // Licensed under the Apache License, Version 2.0 // <LICENSE-APACHE or // http://www.apache.org/licenses/LICENSE-2.0> or the MIT // license <LICENSE-MIT or http://opensource.org/licenses/MIT>, // at your option. All files in the project carrying such // notice may not be copied, modified, or distributed except // according to those terms. use command_buffer::CommandAddError; use command_buffer::cb::AddCommand; use command_buffer::cb::UnsafeCommandBufferBuilder; use command_buffer::pool::CommandPool; use device::DeviceOwned; use VulkanObject; /// Command that draws indexed vertices. /// /// > **Note**: Unless you are writing a custom implementation of a command buffer, you are /// > encouraged to ignore this struct and use a `CmdDrawIndexed` instead. pub struct CmdDrawIndexedRaw { index_count: u32, instance_count: u32, first_index: u32, vertex_offset: i32, first_instance: u32, } impl CmdDrawIndexedRaw { /// Builds a new command that executes an indexed draw command. /// /// The command will use the vertex buffers, index buffer, dynamic states, descriptor sets, /// push constants, and graphics pipeline currently bound. /// /// This command corresponds to the `vkCmdDrawIndexed` function in Vulkan. It takes the first /// `index_count` indices in the index buffer starting at `first_index`, and adds the value of /// `vertex_offset` to each index. `instance_count` and `first_instance` are related to /// instancing and serve the same purpose as in other drawing commands. /// /// # Safety /// /// While building the command is always safe, care must be taken when it is added to a command /// buffer. A correct combination of graphics pipeline, descriptor set, push constants, vertex /// buffers, index buffer, and dynamic state must have been bound beforehand. /// /// There is no limit to the values of the parameters, but they must be in range of the index /// buffer and vertex buffer. /// #[inline] pub unsafe fn new(index_count: u32, instance_count: u32, first_index: u32, vertex_offset: i32, first_instance: u32) -> CmdDrawIndexedRaw { CmdDrawIndexedRaw { index_count: index_count, instance_count: instance_count, first_index: first_index, vertex_offset: vertex_offset, first_instance: first_instance, } } } unsafe impl<'a, P> AddCommand<&'a CmdDrawIndexedRaw> for UnsafeCommandBufferBuilder<P> where P: CommandPool { type Out = UnsafeCommandBufferBuilder<P>; #[inline] fn add(self, command: &'a CmdDrawIndexedRaw) -> Result<Self::Out, CommandAddError> { unsafe { let vk = self.device().pointers(); let cmd = self.internal_object(); vk.CmdDrawIndexed(cmd, command.index_count, command.instance_count, command.first_index, command.vertex_offset, command.first_instance); } Ok(self) } }