mirror of
https://github.com/doitsujin/dxvk.git
synced 2025-04-01 09:25:24 +02:00
[dxvk] Always use vkCmdBindIndexBuffer2 for index buffer robustness
This commit is contained in:
parent
a5de2e458a
commit
8ca0592017
@ -47,10 +47,6 @@ namespace dxvk {
|
|||||||
if (m_device->features().core.features.variableMultisampleRate)
|
if (m_device->features().core.features.variableMultisampleRate)
|
||||||
m_features.set(DxvkContextFeature::VariableMultisampleRate);
|
m_features.set(DxvkContextFeature::VariableMultisampleRate);
|
||||||
|
|
||||||
// Maintenance5 introduced a bounded BindIndexBuffer function
|
|
||||||
if (m_device->features().khrMaintenance5.maintenance5)
|
|
||||||
m_features.set(DxvkContextFeature::IndexBufferRobustness);
|
|
||||||
|
|
||||||
// Check whether we can batch direct draws
|
// Check whether we can batch direct draws
|
||||||
if (m_device->features().extMultiDraw.multiDraw
|
if (m_device->features().extMultiDraw.multiDraw
|
||||||
&& m_device->properties().extMultiDraw.maxMultiDrawCount >= DirectMultiDrawBatchSize)
|
&& m_device->properties().extMultiDraw.maxMultiDrawCount >= DirectMultiDrawBatchSize)
|
||||||
@ -6801,20 +6797,13 @@ namespace dxvk {
|
|||||||
m_flags.clr(DxvkContextFlag::GpDirtyIndexBuffer);
|
m_flags.clr(DxvkContextFlag::GpDirtyIndexBuffer);
|
||||||
auto bufferInfo = m_state.vi.indexBuffer.getDescriptor();
|
auto bufferInfo = m_state.vi.indexBuffer.getDescriptor();
|
||||||
|
|
||||||
if (m_features.test(DxvkContextFeature::IndexBufferRobustness)) {
|
VkDeviceSize align = m_state.vi.indexType == VK_INDEX_TYPE_UINT16 ? 2 : 4;
|
||||||
VkDeviceSize align = m_state.vi.indexType == VK_INDEX_TYPE_UINT16 ? 2 : 4;
|
VkDeviceSize range = bufferInfo.buffer.range & ~(align - 1);
|
||||||
VkDeviceSize range = bufferInfo.buffer.range & ~(align - 1);
|
|
||||||
|
|
||||||
m_cmd->cmdBindIndexBuffer2(
|
m_cmd->cmdBindIndexBuffer2(
|
||||||
bufferInfo.buffer.buffer,
|
bufferInfo.buffer.buffer,
|
||||||
bufferInfo.buffer.offset,
|
bufferInfo.buffer.offset,
|
||||||
range, m_state.vi.indexType);
|
range, m_state.vi.indexType);
|
||||||
} else {
|
|
||||||
m_cmd->cmdBindIndexBuffer(
|
|
||||||
bufferInfo.buffer.buffer,
|
|
||||||
bufferInfo.buffer.offset,
|
|
||||||
m_state.vi.indexType);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (unlikely(m_state.vi.indexBuffer.buffer()->hasGfxStores())) {
|
if (unlikely(m_state.vi.indexBuffer.buffer()->hasGfxStores())) {
|
||||||
accessBuffer(DxvkCmdBuffer::ExecBuffer, m_state.vi.indexBuffer,
|
accessBuffer(DxvkCmdBuffer::ExecBuffer, m_state.vi.indexBuffer,
|
||||||
|
@ -74,7 +74,6 @@ namespace dxvk {
|
|||||||
enum class DxvkContextFeature : uint32_t {
|
enum class DxvkContextFeature : uint32_t {
|
||||||
TrackGraphicsPipeline,
|
TrackGraphicsPipeline,
|
||||||
VariableMultisampleRate,
|
VariableMultisampleRate,
|
||||||
IndexBufferRobustness,
|
|
||||||
DebugUtils,
|
DebugUtils,
|
||||||
DirectMultiDraw,
|
DirectMultiDraw,
|
||||||
FeatureCount
|
FeatureCount
|
||||||
|
@ -1822,17 +1822,13 @@ namespace dxvk {
|
|||||||
|
|
||||||
void DxvkMemoryAllocator::determineBufferUsageFlagsPerMemoryType() {
|
void DxvkMemoryAllocator::determineBufferUsageFlagsPerMemoryType() {
|
||||||
VkBufferUsageFlags flags = VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT
|
VkBufferUsageFlags flags = VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT
|
||||||
|
| VK_BUFFER_USAGE_INDEX_BUFFER_BIT
|
||||||
| VK_BUFFER_USAGE_VERTEX_BUFFER_BIT
|
| VK_BUFFER_USAGE_VERTEX_BUFFER_BIT
|
||||||
| VK_BUFFER_USAGE_STORAGE_BUFFER_BIT
|
| VK_BUFFER_USAGE_STORAGE_BUFFER_BIT
|
||||||
| VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT
|
| VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT
|
||||||
| VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT
|
| VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT
|
||||||
| VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
|
| VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
|
||||||
|
|
||||||
// Also lock index buffer usage to maintenance5 support since we
|
|
||||||
// cannot explicitly specify a buffer range otherwise.
|
|
||||||
if (m_device->features().khrMaintenance5.maintenance5)
|
|
||||||
flags |= VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
|
|
||||||
|
|
||||||
if (m_device->features().extTransformFeedback.transformFeedback) {
|
if (m_device->features().extTransformFeedback.transformFeedback) {
|
||||||
flags |= VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT
|
flags |= VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT
|
||||||
| VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT;
|
| VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user