diff --git a/src/dxvk/dxvk_cmdlist.h b/src/dxvk/dxvk_cmdlist.h index a4467e84..28f11cd9 100644 --- a/src/dxvk/dxvk_cmdlist.h +++ b/src/dxvk/dxvk_cmdlist.h @@ -328,6 +328,19 @@ namespace dxvk { } + void cmdBindVertexBuffers2( + uint32_t firstBinding, + uint32_t bindingCount, + const VkBuffer* pBuffers, + const VkDeviceSize* pOffsets, + const VkDeviceSize* pSizes, + const VkDeviceSize* pStrides) { + m_vkd->vkCmdBindVertexBuffers2EXT(m_execBuffer, + firstBinding, bindingCount, pBuffers, pOffsets, + pSizes, pStrides); + } + + void cmdBlitImage( VkImage srcImage, VkImageLayout srcImageLayout, diff --git a/src/dxvk/dxvk_context.cpp b/src/dxvk/dxvk_context.cpp index d80a7517..bad0ac6b 100644 --- a/src/dxvk/dxvk_context.cpp +++ b/src/dxvk/dxvk_context.cpp @@ -4108,6 +4108,7 @@ namespace dxvk { std::array buffers; std::array offsets; + std::array lengths; // Set buffer handles and offsets for active bindings for (uint32_t i = 0; i < m_state.gp.state.il.bindingCount(); i++) { @@ -4118,23 +4119,30 @@ namespace dxvk { buffers[i] = vbo.buffer.buffer; offsets[i] = vbo.buffer.offset; + lengths[i] = vbo.buffer.range; if (m_vbTracked.set(binding)) m_cmd->trackResource(m_state.vi.vertexBuffers[binding].buffer()); } else if (m_features.test(DxvkContextFeature::NullDescriptors)) { buffers[i] = VK_NULL_HANDLE; offsets[i] = 0; + lengths[i] = 0; } else { buffers[i] = m_common->dummyResources().bufferHandle(); offsets[i] = 0; + lengths[i] = VK_WHOLE_SIZE; } } // Vertex bindigs get remapped when compiling the // pipeline, so this actually does the right thing - m_cmd->cmdBindVertexBuffers( - 0, m_state.gp.state.il.bindingCount(), - buffers.data(), offsets.data()); + if (m_features.test(DxvkContextFeature::ExtendedDynamicState)) { + m_cmd->cmdBindVertexBuffers2(0, m_state.gp.state.il.bindingCount(), + buffers.data(), offsets.data(), lengths.data(), nullptr); + } else { + m_cmd->cmdBindVertexBuffers(0, m_state.gp.state.il.bindingCount(), + buffers.data(), offsets.data()); + } }