/// Optional capabilities a device may support, depending on the underlying graphics API and hardware.
/// </summary>
/// <seealso cref="device::check_capability"/>
enumclassdevice_caps
{
/// <summary>
/// Specifies whether compute shaders are supported.
/// If this feature is not present, the <see cref="pipeline_stage::compute_shader"/> stage and <see cref="command_list::dispatch"/> must not be used.
/// </summary>
compute_shader=1,
/// <summary>
/// Specifies whether geometry shaders are supported.
/// If this feature is not present, the <see cref="pipeline_stage::geometry_shader"/> stage must not be used.
/// </summary>
geometry_shader,
/// <summary>
/// Specifies whether hull and domain (tessellation) shaders are supported.
/// If this feature is not present, the <see cref="pipeline_stage::hull_shader"/> and <see cref="pipeline_stage::domain_shader"/> stages must not be used.
/// </summary>
hull_and_domain_shader,
/// <summary>
/// Specifies whether logic operations are available in the blend state.
/// If this feature is not present, <see cref="blend_desc::logic_op_enable"/> and <see cref="blend_desc::logic_op"/> are ignored.
/// </summary>
logic_op,
/// <summary>
/// Specifies whether blend operations which take two sources are supported.
/// If this feature is not present, <see cref="blend_factor::source1_color"/>, <see cref="blend_factor::one_minus_source1_color"/>, <see cref="blend_factor::source1_alpha"/> and <see cref="blend_factor::one_minus_source1_alpha"/> must not be used.
/// </summary>
dual_source_blend,
/// <summary>
/// Specifies whether blend state is controlled independently per render target.
/// If this feature is not present, the blend state settings for all render targets must be identical.
/// </summary>
independent_blend,
/// <summary>
/// Specifies whether point and wireframe fill modes are supported.
/// If this feature is not present, <see cref="fill_mode::point"/> and <see cref="fill_mode::wireframe"/> must not be used.
/// </summary>
fill_mode_non_solid,
/// <summary>
/// Specifies whether conservative rasterization is supported.
/// If this feature is not present, <see cref="rasterizer_desc::conservative_rasterization"/> must be 0.
/// </summary>
conservative_rasterization,
/// <summary>
/// Specifies whether binding individual render target and depth-stencil resource views is supported.
/// If this feature is not present, <see cref="command_list::bind_render_targets_and_depth_stencil"/> must not be used (only render passes).
/// </summary>
bind_render_targets_and_depth_stencil,
/// <summary>
/// Specifies whther more than one viewport is supported.
/// If this feature is not present, the "first" and "count" parameters to <see cref="command_list::bind_viewports"/> and <see cref="command_list::bind_scissor_rects"/> must be 0 and 1.
/// </summary>
multi_viewport,
/// <summary>
/// Specifies whether partial push constant updates are supported.
/// If this feature is not present, the "first" parameter to <see cref="command_list::push_constants"/> must be 0 and "count" must cover the entire constant range.
/// </summary>
partial_push_constant_updates,
/// <summary>
/// Specifies whether partial push descriptor updates are supported.
/// If this feature is not present, the "first" parameter to <see cref="command_list::push_descriptors"/> must be 0 and "count" must cover the entire descriptor range.
/// </summary>
partial_push_descriptor_updates,
/// <summary>
/// Specifies whether instancing is supported.
/// If this feature is not present, the "instance_count" and "first_instance" parameters to <see cref="command_list::draw"/> and <see cref="command_list::draw_indexed"/> must be 1 and 0.
/// </summary>
draw_instanced,
/// <summary>
/// Specifies whether indirect draw or dispatch calls are supported.
/// If this feature is not present, <see cref="command_list::draw_or_dispatch_indirect"/> must not be used.
/// </summary>
draw_or_dispatch_indirect,
/// <summary>
/// Specifies whether copying between buffers is supported.
/// If this feature is not present, <see cref="command_list::copy_buffer_region"/> must not be used.
/// </summary>
copy_buffer_region,
/// <summary>
/// Specifies whether copying between buffers and textures is supported.
/// If this feature is not present, <see cref="command_list::copy_buffer_to_texture"/> and <see cref="command_list::copy_texture_to_buffer"/> must not be used.
/// </summary>
copy_buffer_to_texture,
/// <summary>
/// Specifies whether blitting between resources is supported.
/// If this feature is not present, the "source_box" and "dest_box" parameters to <see cref="command_list::copy_texture_region"/> must have the same dimensions.
/// </summary>
blit,
/// <summary>
/// Specifies whether resolving a region of a resource rather than its entirety is supported.
/// If this feature is not present, the "source_box", "dest_x", "dest_y" and "dest_z" parameters to <see cref="command_list::resolve_texture_region"/> must be <see langword="nullptr"/> and zero.
/// </summary>
resolve_region,
/// <summary>
/// Specifies whether copying query results to a buffer is supported.
/// If this feature is not present, <see cref="command_list::copy_query_heap_results"/> must not be used.
/// </summary>
copy_query_heap_results,
/// <summary>
/// Specifies whether comparison sampling is supported.
/// If this feature is not present, <see cref="sampler_desc::compare_op"/> is ignored and the compare filter types have no effect.
/// </summary>
sampler_compare,
/// <summary>
/// Specifies whether anisotropic filtering is supported.
/// If this feature is not present, <see cref="filter_mode::anisotropic"/> must not be used.
/// </summary>
sampler_anisotropic,
/// <summary>
/// Specifies whether combined sampler and resource view descriptors are supported.
/// If this feature is not present, <see cref="descriptor_type::sampler_with_resource_view"/> must not be used.
/// </summary>
sampler_with_resource_view,
/// <summary>
/// Specifies whether resource sharing is supported.
/// If this feature is not present, <see cref="resource_flags::shared"/> must not be used.
/// </summary>
shared_resource,
/// <summary>
/// Specifies whether resource sharing with NT handles is supported.
/// If this feature is not present, <see cref="resource_flags::shared_nt_handle"/> must not be used.
/// </summary>
shared_resource_nt_handle,
/// <summary>
/// Specifies whether resolving depth-stencil resources is supported.
/// If this feature is not present, <see cref="command_list::resolve_texture_region"/> must not be used with depth-stencil resources.
/// </summary>
resolve_depth_stencil,
/// <summary>
/// Specifies whether fence sharing is supported.
/// If this feature is not present, <see cref="fence_flags::shared"/> must not be used.
/// </summary>
shared_fence,
/// <summary>
/// Specifies whether fence sharing with NT handles is supported.
/// If this feature is not present, <see cref="fence_flags::shared_nt_handle"/> must not be used.
/// </summary>
shared_fence_nt_handle,
/// <summary>
/// Specifies whether amplification and mesh shaders are supported.
/// If this feature is not present, the <see cref="pipeline_stage::amplification_shader"/> and <see cref="pipeline_stage::mesh_shader"/> stages and <see cref="command_list::dispatch_mesh"/> must not be used.
/// </summary>
amplification_and_mesh_shader,
/// <summary>
/// Specifies whether ray tracing is supported.
/// If this feature is not present, <see cref="resource_view_type::acceleration_structure"/>, <see cref="command_list::dispatch_rays"/>, <see cref="command_list::copy_acceleration_structure"/>, <see cref="command_list::build_acceleration_structure"/> and <see cref="command_list::query_acceleration_structures"/> must not be used.
/// Version of the underlying graphics API the device is using.
/// Data is a 32-bit unsigned integer value.
/// The major version is encoded in bit 12-16, the minor version in bit 8-12. So the major version can be extracted with <c>(api_version >> 12) & 0xF</c>, the object with <c>(api_version >> 8) & 0xF</c>.
/// </summary>
api_version=1,
/// <summary>
/// Version of the graphics driver that is being used.
/// The base class for objects provided by the ReShade API.
/// <para>This lets you store and retrieve custom data with objects, e.g. to be able to communicate persistent information between event callbacks.</para>
/// </summary>
struct__declspec(novtable)api_object
{
/// <summary>
/// Gets the underlying native object for this API object.
/// </summary>
/// <remarks>
/// For <see cref="device"/> this will be be a pointer to a 'IDirect3DDevice9', 'ID3D10Device', 'ID3D11Device' or 'ID3D12Device' object or a 'HGLRC' or 'VkDevice' handle.<br/>
/// For <see cref="command_list"/> this will be a pointer to a 'ID3D11DeviceContext' (when recording), 'ID3D11CommandList' (when executing) or 'ID3D12GraphicsCommandList' object or a 'VkCommandBuffer' handle.<br/>
/// For <see cref="command_queue"/> this will be a pointer to a 'ID3D11DeviceContext' or 'ID3D12CommandQueue' object or a 'VkQueue' handle.<br/>
/// For <see cref="swapchain"/> this will be a pointer to a 'IDirect3DSwapChain9' or 'IDXGISwapChain' object or a 'HDC' or 'VkSwapchainKHR' handle.
/// </remarks>
virtualuint64_tget_native()const=0;
/// <summary>
/// Gets a user-defined 64-bit value from the object that was previously set via <see cref="set_private_data"/>, or zero if none associated with the specified <paramref name="guid"/> exists.
/// <param name="desc">Description of the sampler to create.</param>
/// <param name="out_sampler">Pointer to a variable that is set to the handle of the created sampler.</param>
/// <returns><see langword="true"/> if the sampler was successfully created, <see langword="false"/> otherwise (in this case <paramref name="out_sampler"/> is set to zero).</returns>
/// Instantly destroys a sampler that was previously created via <see cref="create_sampler"/>.
/// </summary>
virtualvoiddestroy_sampler(samplersampler)=0;
/// <summary>
/// Allocates and creates a new resource.
/// </summary>
/// <param name="desc">Description of the resource to create.</param>
/// <param name="initial_data">Optional data to upload to the resource after creation. This should point to an array of <see cref="mapped_subresource"/>, one for each subresource (mipmap levels and array layers). Can be <see langword="nullptr"/> to indicate no initial data to upload.</param>
/// <param name="initial_state">Initial state of the resource after creation. This can later be changed via <see cref="command_list::barrier"/>. It should also be part of the <see cref="resource_desc::usage"/> flags of the description.</param>
/// <param name="out_resource">Pointer to a variable that is set to the handle of the created resource.</param>
/// <param name="shared_handle">Optional pointer to a variable of type <c>HANDLE</c> used when <see cref="resource_desc::flags"/> contains <see cref="resource_flags::shared"/>. When that variable is a <see langword="nullptr"/>, it is set to the exported shared handle of the created resource. When that variable is a valid handle, the resource is imported from that shared handle.</param>
/// <returns><see langword="true"/> if the resource was successfully created, <see langword="false"/> otherwise (in this case <paramref name="out_resource"/> is set to zero).</returns>
/// Instantly destroys a resource that was previously created via <see cref="create_resource"/> and frees its memory.
/// Make sure the resource is no longer in use on the GPU (via any command list that may reference it and is still being executed) before doing this (e.g. with <see cref="command_queue::wait_idle"/>) and never try to destroy resources created by the application!
/// </summary>
virtualvoiddestroy_resource(resourceresource)=0;
/// <summary>
/// Gets the description of the specified resource.
/// Creates a new resource view for the specified <paramref name="resource"/>.
/// </summary>
/// <param name="resource">Resource to create the view to.</param>
/// <param name="usage_type">Usage type of the resource view to create. Set to <see cref="resource_usage::shader_resource"/> to create a shader resource view, <see cref="resource_usage::depth_stencil"/> for a depth-stencil view, <see cref="resource_usage::render_target"/> for a render target etc.</param>
/// <param name="desc">Description of the resource view to create.</param>
/// <param name="out_view">Pointer to a variable that is set to the handle of the created resource view.</param>
/// <returns><see langword="true"/> if the resource view was successfully created, <see langword="false"/> otherwise (in this case <paramref name="out_view"/> is set to zero).</returns>
/// Gets the handle to the underlying resource the specified resource <paramref name="view"/> was created for.
/// </summary>
/// <remarks>
/// Resource views may be created without a resource in D3D12, which is used to initialize a null descriptor (reading zeroes, writes are discarded). This may therefore return zero for such views.
/// Maps the memory of a buffer resource into application address space.
/// </summary>
/// <param name="resource">Buffer resource to map to host memory.</param>
/// <param name="offset">Offset (in bytes) into the buffer resource to start mapping.</param>
/// <param name="size">Number of bytes to map. Set to -1 (UINT64_MAX) to indicate that the entire buffer should be mapped.</param>
/// <param name="access">Hint on how the returned data pointer will be accessed.</param>
/// <param name="out_data">Pointer to a variable that is set to a pointer to the memory of the buffer resource.</param>
/// <returns><see langword="true"/> if the memory of the buffer resource was successfully mapped, <see langword="false"/> otherwise (in this case <paramref name="out_data"/> is set to <see langword="nullptr"/>).</returns>
/// Maps the memory of a texture resource into application address space.
/// </summary>
/// <param name="resource">Texture resource to map to host memory.</param>
/// <param name="subresource">Index of the subresource to map (<c>level + (layer * levels)</c>).</param>
/// <param name="box">Optional 3D box (or <see langword="nullptr"/> to reference the entire subresource) that defines the region in the <paramref name="resource"/> to map.</param>
/// <param name="access">Hint on how the returned data pointer will be accessed.</param>
/// <param name="out_data">Pointer to a variable that is set to a pointer to the memory of the texture resource and optionally the row and slice pitch of that data (depending on the resource type).</param>
/// <returns><see langword="true"/> if the memory of the texture resource was successfully mapped, <see langword="false"/> otherwise (in this case <paramref name="out_data"/> is set to <see langword="nullptr"/>).</returns>
/// <param name="data">Pointer to the data to upload.</param>
/// <param name="resource">Texture resource to upload to.</param>
/// <param name="subresource">Index of the subresource to upload to (<c>level + (layer * levels)</c>).</param>
/// <param name="box">Optional 3D box (or <see langword="nullptr"/> to reference the entire subresource) that defines the region in the <paramref name="resource"/> to upload to.</param>
/// <param name="layout">Pipeline layout to use.</param>
/// <param name="subobject_count">Number of sub-objects.</param>
/// <param name="subobjects">Pointer to the first element of an array of sub-objects that describe this pipeline.</param>
/// <param name="out_pipeline">Pointer to a variable that is set to the handle of the created pipeline state object.</param>
/// <returns><see langword="true"/> if the pipeline state object was successfully created, <see langword="false"/> otherwise (in this case <paramref name="out_pipeline"/> is set to zero).</returns>
/// Instantly destroys a pipeline state object that was previously created via <see cref="create_pipeline"/>.
/// </summary>
virtualvoiddestroy_pipeline(pipelinepipeline)=0;
/// <summary>
/// Creates a new pipeline layout.
/// </summary>
/// <param name="param_count">Number of layout parameters.</param>
/// <param name="params">Pointer to the first element of an array of layout parameters that describe this pipeline layout.</param>
/// <param name="out_layout">Pointer to a variable that is set to the handle of the created pipeline layout.</param>
/// <returns><see langword="true"/> if the pipeline layout was successfully created, <see langword="false"/> otherwise (in this case <paramref name="out_layout"/> is set to zero).</returns>
/// Allocates a descriptor table from an internal descriptor heap.
/// </summary>
/// <param name="layout">Pipeline layout that contains a parameter that describes the descriptor table.</param>
/// <param name="param">Index of the pipeline layout parameter that describes the descriptor table.</param>
/// <param name="out_table">Pointer to a a variable that is set to the handles of the created descriptor table.</param>
/// <returns><see langword="true"/> if the descriptor table was successfully allocated, <see langword="false"/> otherwise (in this case <paramref name="out_table"/> is set to zeroe).</returns>
/// Allocates one or more descriptor tables from an internal descriptor heap.
/// </summary>
/// <param name="count">Number of descriptor tables to allocate.</param>
/// <param name="layout">Pipeline layout that contains a parameter that describes the descriptor tables.</param>
/// <param name="param">Index of the pipeline layout parameter that describes the descriptor tables.</param>
/// <param name="out_tables">Pointer to the first element of an array of handles with at least <paramref name="count"/> elements that is filled with the handles of the created descriptor tables.</param>
/// <returns><see langword="true"/> if the descriptor tables were successfully allocated, <see langword="false"/> otherwise (in this case <paramref name="out_tables"/> is filled with zeroes).</returns>
/// Gets the offset (in descriptors) of the specified binding in the underlying descriptor heap of a descriptor table.
/// </summary>
/// <param name="table">Descriptor table to get the offset from.</param>
/// <param name="binding">Binding in the descriptor table to get the offset from.</param>
/// <param name="array_offset">Array index in the specified <paramref name="binding"/>.</param>
/// <param name="out_heap">Pointer to a variable that is set to the handle of the underlying descriptor heap the <paramref name="table"/> was allocated from.</param>
/// <param name="out_offset">Pointer to a variable that is set to the offset of the binding in the underlying descriptor heap.</param>
/// <param name="type">Type of queries that will be used with this query heap.</param>
/// <param name="count">Number of queries to allocate in the query heap.</param>
/// <param name="out_heap">Pointer to a variable that is set to the handle of the created query heap.</param>
/// <returns><see langword="true"/> if the query heap was successfully created, <see langword="false"/> otherwise (in this case <paramref name="out_heap"/> is set to zero).</returns>
/// Instantly destroys a query heap that was previously created via <see cref="create_query_heap"/>.
/// </summary>
virtualvoiddestroy_query_heap(query_heapheap)=0;
/// <summary>
/// Gets the results of queries in a query heap.
/// </summary>
/// <param name="heap">Query heap that contains the queries.</param>
/// <param name="first">Index of the first query in the query heap to copy the results from.</param>
/// <param name="count">Number of query results to copy.</param>
/// <param name="results">Pointer to the first element of an array that is filled with the results. The necessary data type is documented at the <see cref="query_type"/> enumeration.</param>
/// <param name="stride">Size (in bytes) of each element in the <paramref name="results"/> array.</param>
/// <returns><see langword="true"/> if the query results were successfully downloaded from the GPU, <see langword="false"/> otherwise.</returns>
/// <param name="out_fence">Pointer to a variable that is set to the handle of the created fence.</param>
/// <param name="shared_handle">Optional pointer to a variable of type <c>HANDLE</c> used when <paramref name="flags"/> contains <see cref="fence_flags::shared"/>. When that variable is a <see langword="nullptr"/>, it is set to the exported shared handle of the created fence. When that variable is a valid handle, the fence is imported from that shared handle.</param>
/// <returns><see langword="true"/> if the fence was successfully created, <see langword="false"/> otherwise (in this case <paramref name="out_fence"/> is set to zero).</returns>
/// Updates the specified fence to the specified value.
/// </summary>
/// <param name="fence">Fence to update.</param>
/// <param name="value">Value the fence should be set to.</param>
/// <returns><see langword="true"/> if the signal operation was successful, <see langword="false"/> otherwise.</returns>
virtualboolsignal(fencefence,uint64_tvalue)=0;
/// <summary>
/// Gets data for a <paramref name="property"/> of this device.
/// </summary>
/// <param name="property">Property to query.</param>
/// <param name="data">Pointer to a variable that is set to the value of the property. The necessary data type is documented at the <see cref="device_properties"/> enumeration.</param>
/// <returns><see langword="true"/> if the property exists and was retrieved, <see langword="false"/> otherwise.</returns>
/// <param name="input_count">Number of build inputs.</param>
/// <param name="inputs">Pointer to the first element of an array of build inputs describing the geometry of the acceleration structure.</param>
/// <param name="out_size">Pointer to a variable that is set to the required buffer size for the acceleration structure.</param>
/// <param name="out_build_scratch_size">Pointer to a variable that is set to the required scratch buffer size for building the acceleration structure.</param>
/// <param name="out_update_scratch_size">Pointer to a variable that is set to the required scratch buffer size for updating the acceleration structure.</param>
/// Gets the shader group handles for a ray tracing pipeline, to be put into a shader binding table.
/// </summary>
/// <seealso cref="device_caps::ray_tracing"/>
/// <param name="pipeline">Ray tracing pipeline to query.</param>
/// <param name="first">Index of the first shader group in the <see cref="pipeline_subobject_type::shader_groups"/> array that was used to create the pipeline.</param>
/// <param name="count">Number of shader groups to get handles for.</param>
/// <param name="out_handles">Pointer to the first element of an array (with elements of the size reported by <see cref="device_properties::shader_group_handle_size"/>) that is filled with the handles.</param>
/// <returns><see langword="true"/> if the shader group handles were successfully retrieved, <see langword="false"/> otherwise.</returns>
/// Adds a barrier for the specified <paramref name="resource"/> to the command stream.
/// Multiple barriers are more efficiently issued using the <see cref="command_list::barrier"/> overload that takes arrays.
/// When both <paramref name="old_state"/> and <paramref name="new_state"/> are <see cref="resource_usage::unordered_access"/>, a UAV barrier is added, otherwise a state transition is performed.
/// </summary>
/// <param name="resource">Resource to transition.</param>
/// <param name="old_state">Usage flags describing how the <paramref name="resource"/> was used before this barrier.</param>
/// <param name="new_state">Usage flags describing how the <paramref name="resource"/> will be used after this barrier.</param>
/// Adds a barrier for the specified <paramref name="resources"/> to the command stream.
/// </summary>
/// <param name="count">Number of resources to transition.</param>
/// <param name="resources">Pointer to the first element of an array of resources to transition.</param>
/// <param name="old_states">Pointer to the first element of an array of usage flags describing how the <paramref name="resources"/> were used before this barrier.</param>
/// <param name="new_states">Pointer to the first element of an array of usage flags describing how the <paramref name="resources"/> will be used after this barrier.</param>
/// Updates the specfified pipeline <paramref name="state"/> to the specified <paramref name="value"/>.
/// This is only valid for states that have been listed in the dynamic states provided at creation of the currently bound pipeline state object (<see cref="pipeline_subobject_type::dynamic_pipeline_states"/>).
/// </summary>
/// <param name="state">Pipeline state to update.</param>
/// <param name="value">Value to update the pipeline state to.</param>
/// Updates the specfified pipeline <paramref name="states"/> to the specified <paramref name="values"/>.
/// This is only valid for states that have been listed in the dynamic states provided at creation of the currently bound pipeline state object (<see cref="pipeline_subobject_type::dynamic_pipeline_states"/>).
/// </summary>
/// <param name="count">Number of pipeline states to update.</param>
/// <param name="states">Pointer to the first element of an array of pipeline states to update.</param>
/// <param name="values">Pointer to the first element of an array of values to update the pipeline states to, with one for each state in <paramref name="states"/>.</param>
/// Directly updates constant values in the specified shader pipeline stages.
/// <para>In D3D9 this updates the values of uniform registers, in D3D10/11 and OpenGL the constant buffer specified in the pipeline layout, in D3D12 it sets root constants and in Vulkan push constants.</para>
/// <param name="stages">Shader stages that will use the updated constants.</param>
/// <param name="layout">Pipeline layout that describes where the constants are located.</param>
/// <param name="param">Layout parameter index of the constant range in the pipeline <paramref name="layout"/> (root parameter index in D3D12).</param>
/// <param name="first">Start offset (in 32-bit values) to the first constant in the constant range to begin updating.</param>
/// <param name="count">Number of 32-bit values to update.</param>
/// <param name="values">Pointer to the first element of an array of 32-bit values to set the constants to. These can be floating-point, integer or boolean depending on what the shader is expecting.</param>
/// <param name="stages">Shader stages that will use the updated descriptors.</param>
/// <param name="layout">Pipeline layout that describes the descriptors.</param>
/// <param name="param">Layout parameter index of the descriptor table in the pipeline <paramref name="layout"/> (root parameter index in D3D12, descriptor set index in Vulkan).</param>
/// <param name="update">Range of descriptors to update in the temporary descriptor table (<see cref="descriptor_table_update::table"/> is ignored).</param>
/// <param name="stages">Shader stages that will use the descriptors.</param>
/// <param name="layout">Pipeline layout that describes the descriptors.</param>
/// <param name="param">Index of the pipeline <paramref name="layout"/> parameter that describes the descriptor table (root parameter index in D3D12, descriptor set index in Vulkan).</param>
/// <param name="table">Descriptor table to bind.</param>
/// <param name="stages">Shader stages that will use the descriptors.</param>
/// <param name="layout">Pipeline layout that describes the descriptors.</param>
/// <param name="first">Index of the first pipeline <paramref name="layout"/> parameter that describes the first descriptor table to bind (root parameter index in D3D12, descriptor set index in Vulkan).</param>
/// <param name="count">Number of descriptor tables to bind.</param>
/// <param name="tables">Pointer to the first element of an array of descriptor tables to bind.</param>
/// Binds an index buffer to the input-assembler stage.
/// </summary>
/// <param name="buffer">Index buffer resource. This resource must have been created with the <see cref="resource_usage::index_buffer"/> usage.</param>
/// <param name="offset">Offset (in bytes) from the start of the index buffer to the first index to use. In D3D9 this has to be 0.</param>
/// <param name="index_size">Size (in bytes) of each index. Can typically be 2 (16-bit indices) or 4 (32-bit indices).</param>
/// Binds a single vertex buffer to the input-assembler stage.
/// </summary>
/// <param name="index">Input slot for binding.</param>
/// <param name="buffer">Vertex buffer resource. This resources must have been created with the <see cref="resource_usage::vertex_buffer"/> usage.</param>
/// <param name="offset">Offset (in bytes) from the start of the vertex buffer to the first vertex element to use.</param>
/// <param name="stride">Size (in bytes) of the vertex element that will be used from the vertex buffer (is added to an element offset to advance to the next).</param>
/// Binds an array of vertex buffers to the input-assembler stage.
/// </summary>
/// <param name="first">First input slot for binding.</param>
/// <param name="count">Number of vertex buffers to bind.</param>
/// <param name="buffers">Pointer to the first element of an array of vertex buffer resources. These resources must have been created with the <see cref="resource_usage::vertex_buffer"/> usage.</param>
/// <param name="offsets">Pointer to the first element of an array of offset values, one for each buffer. Each offset is the number of bytes from the start of the vertex buffer to the first vertex element to use.</param>
/// <param name="strides">Pointer to the first element of an array of stride values, one for each buffer. Each stride is the size (in bytes) of the vertex element that will be used from that vertex buffer (is added to an element offset to advance to the next).</param>
/// Binds an array of buffers to the stream-output stage.
/// </summary>
/// <param name="first">First stream-output slot for binding.</param>
/// <param name="count">Number of stream-output targets to bind.</param>
/// <param name="buffers">Pointer to the first element of an array of buffer resources. These resources must have been created with the <see cref="resource_usage::stream_output"/> usage.</param>
/// <param name="offsets">Pointer to the first element of an array of offset values, one for each buffer. Each offset is the number of bytes from the start of the buffer to the first element to write to.</param>
/// <param name="max_sizes">Optional pointer to an array of size values, one for each buffer. Can be <see langword="nullptr"/> or have elements set to UINT64_MAX to use the entire buffer.</param>
/// <param name="counter_buffers">Pointer to the first element of an array of counter buffer resources. These resources must have been created with the <see cref="resource_usage::stream_output"/> usage.</param>
/// <param name="counter_offsets">Pointer to the first element of an array of counter offset values, one for each counter buffer. Each offset is the number of bytes from the start of the counter buffer to the first element to write to.</param>
/// Copies the entire contents of the <paramref name="source"/> resource to the <paramref name="dest"/>ination resource. Dimensions of the two resources have to match.
/// </summary>
/// <remarks>
/// The <paramref name="source"/> resource has to be in the <see cref="resource_usage::copy_source"/> state.
/// The <paramref name="dest"/>ination resource has to be in the <see cref="resource_usage::copy_dest"/> state.
/// </remarks>
/// <param name="source">Resource to copy from.</param>
/// <param name="dest">Resource to copy to.</param>
/// <param name="source">Buffer resource to copy from.</param>
/// <param name="source_offset">Offset (in bytes) into the <paramref name="source"/> buffer to start copying at.</param>
/// <param name="row_length">Number of pixels from one row to the next (in the buffer), or zero if data is tightly packed.</param>
/// <param name="slice_height">Number of rows from one slice to the next (in the buffer) or zero if data is tightly packed.</param>
/// <param name="dest">Texture resource to copy to.</param>
/// <param name="dest_subresource">Index of the subresource of the <paramref name="dest"/>ination texture to copy to.</param>
/// <param name="dest_box">Optional 3D box (or <see langword="nullptr"/> to reference the entire subresource) that defines the region in the <paramref name="dest"/>ination texture to copy to.</param>
/// Copies or blits a texture region from the <paramref name="source"/> texture to the <paramref name="dest"/>ination texture.
/// </summary>
/// <remarks>
/// The <paramref name="source"/> resource has to be in the <see cref="resource_usage::copy_source"/> state.
/// The <paramref name="dest"/>ination resource has to be in the <see cref="resource_usage::copy_dest"/> state.
/// </remarks>
/// <seealso cref="device_caps::blit"/>
/// <param name="source">Texture resource to copy from.</param>
/// <param name="source_subresource">Index of the subresource of the <paramref name="source"/> texture to copy from.</param>
/// <param name="source_box">Optional 3D box (or <see langword="nullptr"/> to reference the entire subresource) that defines the region in the <paramref name="source"/> texture to blit from.</param>
/// <param name="dest">Texture resource to copy to.</param>
/// <param name="dest_subresource">Index of the subresource of the <paramref name="dest"/>ination texture to copy to.</param>
/// <param name="dest_box">Optional 3D box (or <see langword="nullptr"/> to reference the entire subresource) that defines the region in the <paramref name="dest"/>ination texture to blit to.</param>
/// <param name="filter">Filter to apply when copy requires scaling.</param>
/// <param name="source">Texture resource to copy from.</param>
/// <param name="source_subresource">Index of the subresource of the <paramref name="source"/> texture to copy from.</param>
/// <param name="source_box">Optional 3D box (or <see langword="nullptr"/> to reference the entire subresource) that defines the region in the <paramref name="source"/> texture to copy from.</param>
/// <param name="dest">Buffer resource to copy to.</param>
/// <param name="dest_offset">Offset (in bytes) into the <paramref name="dest"/>ination buffer to start copying to.</param>
/// <param name="row_length">Number of pixels from one row to the next (in the buffer), or zero if data is tightly packed.</param>
/// <param name="slice_height">Number of rows from one slice to the next (in the buffer), or zero if data is tightly packed.</param>
/// <param name="source">Texture resource to resolve from.</param>
/// <param name="source_subresource">Index of the subresource of the <paramref name="source"/> texture to resolve from.</param>
/// <param name="source_box">Optional 3D box (or <see langword="nullptr"/> to reference the entire subresource) that defines the region in the <paramref name="source"/> texture to resolve.</param>
/// <param name="dest">Texture resource to resolve to.</param>
/// <param name="dest_subresource">Index of the subresource of the <paramref name="dest"/>ination texture to resolve to.</param>
/// <param name="dest_x">Optional X offset (in texels) that defines the region in the <paramref name="dest"/>ination texture to resolve to.</param>
/// <param name="dest_y">Optional Y offset (in texels) that defines the region in the <paramref name="dest"/>ination texture to resolve to.</param>
/// <param name="dest_z">Optional Z offset (in texels) that defines the region in the <paramref name="dest"/>ination texture to resolve to.</param>
/// <param name="format">Format of the resource data.</param>
/// Generates the lower mipmap levels for the specified shader resource view.
/// Uses the largest mipmap level of the view to recursively generate the lower levels of the mipmap chain and stops with the smallest level that is specified by the view.
/// </summary>
/// <remarks>
/// This will invalidate all previous descriptor and pipeline bindings, which will need to be reset by calls to <see cref="bind_descriptor_tables"/> or <see cref="push_descriptors"/> and <see cref="bind_pipeline"/>.
/// The resource the shader resource view points to has to be in the <see cref="resource_usage::shader_resource"/> state and has to have been created with the <see cref="resource_flags::generate_mipmaps"/> flag.
/// </remarks>
/// <param name="srv">Shader resource view to update.</param>
virtualvoidgenerate_mipmaps(resource_viewsrv)=0;
/// <summary>
/// Begins a query.
/// </summary>
/// <param name="heap">Query heap that will manage the results of the query.</param>
/// <param name="type">Type of the query to begin.</param>
/// <param name="index">Index of the query in the query heap.</param>
/// Copies or transforms data from the <paramref name="source"/> acceleration structure to the <paramref name="dest"/>ination acceleration structure.
/// </summary>
/// <remarks>
/// The <paramref name="source"/> and <paramref name="dest"/>ination acceleration structure resources have to be in the <see cref="resource_usage::acceleration_structure"/> state.
/// </remarks>
/// <seealso cref="device_caps::ray_tracing"/>
/// <param name="source">Acceleration structure to copy from.</param>
/// <param name="dest">Acceleration structure to copy to.</param>
/// <param name="mode">Choose between copying or transforming the data in the acceleration structure.</param>
/// Builds or updates an acceleration structure for ray tracing.
/// </summary>
/// <remarks>
/// The build input vertex, index and instance buffers have to be in the <see cref="resource_usage::shader_resource_non_pixel"/> state.
/// The <paramref name="scratch"/> resource has to be in the <see cref="resource_usage::unordered_access"/> state.
/// The <paramref name="source"/> and <paramref name="dest"/>ination acceleration structure resources have to be in the <see cref="resource_usage::acceleration_structure"/> state.
/// </remarks>
/// <seealso cref="device_caps::ray_tracing"/>
/// <param name="type">Type of the acceleration structure to build.</param>
/// <param name="input_count">Number of build inputs.</param>
/// <param name="inputs">Pointer to the first element of an array of build inputs describing the geometry of the acceleration structure to build.</param>
/// <param name="scratch">Buffer resource to use as scratch space during building.</param>
/// <param name="scratch_offset">Offset (in bytes) into the <paramref name="scratch"/> buffer.</param>
/// <param name="source">Acceleration structure to read data from when <paramref name="mode"/> is <see cref="acceleration_structure_build_mode::update"/>, otherwise zero.</param>
/// <param name="dest">Acceleration structure to write data to.</param>
/// <param name="mode">Choose between building a new or updating an existing acceleration structure.</param>
/// <param name="data">Pointer to the data to upload.</param>
/// <param name="dest">Texture resource to upload to.</param>
/// <param name="dest_subresource">Index of the subresource to upload to (<c>level + (layer * levels)</c>).</param>
/// <param name="dest_box">Optional 3D box (or <see langword="nullptr"/> to reference the entire subresource) that defines the region in the <paramref name="resource"/> to upload to.</param>
/// Gets the type of the command queue, which specifies what commands can be executed on it.
/// </summary>
virtualcommand_queue_typeget_type()const=0;
/// <summary>
/// Waits for all issued GPU operations on this queue to finish before returning.
/// This can be used to ensure that e.g. resources are no longer in use on the GPU before destroying them.
/// </summary>
virtualvoidwait_idle()const=0;
/// <summary>
/// Flushes and executes the special immediate command list returned by <see cref="get_immediate_command_list"/> immediately.
/// This can be used to force commands to execute right away instead of waiting for the runtime to flush it automatically at some point.
/// </summary>
virtualvoidflush_immediate_command_list()const=0;
/// <summary>
/// Gets a special command list, on which all issued commands are executed as soon as possible (or right before the application executes its next command list on this queue).
/// This only exists on command queues that contain the <see cref="command_queue_type::graphics"/> flag, on other queues <see langword="nullptr"/> is returned.