mirror of
https://github.com/doitsujin/dxvk.git
synced 2025-02-20 19:54:19 +01:00
[dxvk] Always enable robustBufferAccess2 feature
And respect the required alignments when creating buffers.
This commit is contained in:
parent
6f5ae58ccc
commit
e8f48c71ab
@ -1929,9 +1929,6 @@ namespace dxvk {
|
||||
|
||||
enabled.extMemoryPriority.memoryPriority = supported.extMemoryPriority.memoryPriority;
|
||||
|
||||
enabled.extRobustness2.robustBufferAccess2 = supported.extRobustness2.robustBufferAccess2;
|
||||
enabled.extRobustness2.robustImageAccess2 = supported.extRobustness2.robustImageAccess2;
|
||||
|
||||
enabled.extShaderDemoteToHelperInvocation.shaderDemoteToHelperInvocation = supported.extShaderDemoteToHelperInvocation.shaderDemoteToHelperInvocation;
|
||||
|
||||
enabled.extVertexAttributeDivisor.vertexAttributeInstanceRateDivisor = supported.extVertexAttributeDivisor.vertexAttributeInstanceRateDivisor;
|
||||
|
@ -3894,7 +3894,6 @@ namespace dxvk {
|
||||
// Geometry shaders are used for some meta ops
|
||||
enabled.core.features.geometryShader = VK_TRUE;
|
||||
enabled.core.features.robustBufferAccess = VK_TRUE;
|
||||
enabled.extRobustness2.robustBufferAccess2 = supported.extRobustness2.robustBufferAccess2;
|
||||
|
||||
enabled.extMemoryPriority.memoryPriority = supported.extMemoryPriority.memoryPriority;
|
||||
|
||||
|
@ -349,6 +349,8 @@ namespace dxvk {
|
||||
enabledFeatures.ext4444Formats.formatA4B4G4R4 = m_deviceFeatures.ext4444Formats.formatA4B4G4R4;
|
||||
enabledFeatures.ext4444Formats.formatA4R4G4B4 = m_deviceFeatures.ext4444Formats.formatA4R4G4B4;
|
||||
|
||||
enabledFeatures.extRobustness2.robustBufferAccess2 = VK_TRUE;
|
||||
enabledFeatures.extRobustness2.robustImageAccess2 = m_deviceFeatures.extRobustness2.robustImageAccess2;
|
||||
enabledFeatures.extRobustness2.nullDescriptor = VK_TRUE;
|
||||
|
||||
enabledFeatures.extShaderModuleIdentifier.shaderModuleIdentifier =
|
||||
|
@ -135,31 +135,35 @@ namespace dxvk {
|
||||
|
||||
|
||||
VkDeviceSize DxvkBuffer::computeSliceAlignment() const {
|
||||
const auto& devInfo = m_device->properties().core.properties;
|
||||
const auto& devInfo = m_device->properties();
|
||||
|
||||
VkDeviceSize result = sizeof(uint32_t);
|
||||
|
||||
if (m_info.usage & VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT)
|
||||
result = std::max(result, devInfo.limits.minUniformBufferOffsetAlignment);
|
||||
if (m_info.usage & VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT) {
|
||||
result = std::max(result, devInfo.core.properties.limits.minUniformBufferOffsetAlignment);
|
||||
result = std::max(result, devInfo.extRobustness2.robustUniformBufferAccessSizeAlignment);
|
||||
}
|
||||
|
||||
if (m_info.usage & VK_BUFFER_USAGE_STORAGE_BUFFER_BIT)
|
||||
result = std::max(result, devInfo.limits.minStorageBufferOffsetAlignment);
|
||||
if (m_info.usage & VK_BUFFER_USAGE_STORAGE_BUFFER_BIT) {
|
||||
result = std::max(result, devInfo.core.properties.limits.minStorageBufferOffsetAlignment);
|
||||
result = std::max(result, devInfo.extRobustness2.robustStorageBufferAccessSizeAlignment);
|
||||
}
|
||||
|
||||
if (m_info.usage & (VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT | VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT)) {
|
||||
result = std::max(result, devInfo.limits.minTexelBufferOffsetAlignment);
|
||||
result = std::max(result, devInfo.core.properties.limits.minTexelBufferOffsetAlignment);
|
||||
result = std::max(result, VkDeviceSize(16));
|
||||
}
|
||||
|
||||
if (m_info.usage & (VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT)
|
||||
&& m_info.size > (devInfo.limits.optimalBufferCopyOffsetAlignment / 2))
|
||||
result = std::max(result, devInfo.limits.optimalBufferCopyOffsetAlignment);
|
||||
&& m_info.size > (devInfo.core.properties.limits.optimalBufferCopyOffsetAlignment / 2))
|
||||
result = std::max(result, devInfo.core.properties.limits.optimalBufferCopyOffsetAlignment);
|
||||
|
||||
// For some reason, Warhammer Chaosbane breaks otherwise
|
||||
if (m_info.usage & (VK_BUFFER_USAGE_VERTEX_BUFFER_BIT | VK_BUFFER_USAGE_INDEX_BUFFER_BIT))
|
||||
result = std::max(result, VkDeviceSize(256));
|
||||
|
||||
if (m_memFlags & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) {
|
||||
result = std::max(result, devInfo.limits.nonCoherentAtomSize);
|
||||
result = std::max(result, devInfo.core.properties.limits.nonCoherentAtomSize);
|
||||
result = std::max(result, VkDeviceSize(64));
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user