diff options
author | Henri Verbeet <hverbeet@codeweavers.com> | 2016-09-28 14:20:26 +0300 |
---|---|---|
committer | Henri Verbeet <hverbeet@codeweavers.com> | 2016-10-10 18:25:55 +0300 |
commit | 7add62e5525212c8a5fbc4904bfe65357c03ce53 (patch) | |
tree | d4f7af1623fe92d764ed28cb0588736575d0c880 /libs | |
parent | ce509dc70e106b39b3fd221efa51f26c15299d2e (diff) |
libs/vkd3d: Implement d3d12_command_list_IASetVertexBuffers().
Diffstat (limited to 'libs')
-rw-r--r-- | libs/vkd3d/command.c | 26 | ||||
-rw-r--r-- | libs/vkd3d/vkd3d_private.h | 1 |
2 files changed, 26 insertions, 1 deletions
diff --git a/libs/vkd3d/command.c b/libs/vkd3d/command.c index c3863f20..bd57c4b1 100644 --- a/libs/vkd3d/command.c +++ b/libs/vkd3d/command.c @@ -1422,7 +1422,30 @@ static void STDMETHODCALLTYPE d3d12_command_list_IASetIndexBuffer(ID3D12Graphics static void STDMETHODCALLTYPE d3d12_command_list_IASetVertexBuffers(ID3D12GraphicsCommandList *iface, UINT start_slot, UINT view_count, const D3D12_VERTEX_BUFFER_VIEW *views) { - FIXME("iface %p, start_slot %u, view_count %u, views %p stub!\n", iface, start_slot, view_count, views); + struct d3d12_command_list *list = impl_from_ID3D12GraphicsCommandList(iface); + VkDeviceSize offsets[ARRAY_SIZE(list->strides)]; + const struct vkd3d_vk_device_procs *vk_procs; + VkBuffer buffers[ARRAY_SIZE(list->strides)]; + unsigned int i; + + TRACE("iface %p, start_slot %u, view_count %u, views %p.\n", iface, start_slot, view_count, views); + + vk_procs = &list->device->vk_procs; + + if (start_slot >= ARRAY_SIZE(list->strides) || view_count > ARRAY_SIZE(list->strides) - start_slot) + { + WARN("Invalid start slot %u / view count %u.\n", start_slot, view_count); + return; + } + + for (i = 0; i < view_count; ++i) + { + offsets[i] = 0; + buffers[i] = (VkBuffer)views[i].BufferLocation; + list->strides[start_slot + i] = views[i].StrideInBytes; + } + + VK_CALL(vkCmdBindVertexBuffers(list->vk_command_buffer, start_slot, view_count, buffers, offsets)); } static void STDMETHODCALLTYPE d3d12_command_list_SOSetTargets(ID3D12GraphicsCommandList *iface, @@ -1739,6 +1762,7 @@ static HRESULT d3d12_command_list_init(struct d3d12_command_list *list, struct d return hr; } + memset(list->strides, 0, sizeof(list->strides)); list->ia_desc.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO; list->ia_desc.pNext = NULL; list->ia_desc.flags = 0; diff --git a/libs/vkd3d/vkd3d_private.h b/libs/vkd3d/vkd3d_private.h index 8f6de660..225a5271 100644 --- a/libs/vkd3d/vkd3d_private.h +++ b/libs/vkd3d/vkd3d_private.h @@ -229,6 +229,7 @@ struct d3d12_command_list VkCommandBuffer vk_command_buffer; BOOL is_recording; + uint32_t strides[D3D12_IA_VERTEX_INPUT_RESOURCE_SLOT_COUNT]; struct VkPipelineInputAssemblyStateCreateInfo ia_desc; struct d3d12_command_allocator *allocator; |