mirror of
https://github.com/EduApps-CDG/OpenDX
synced 2024-12-30 09:45:37 +01:00
[dxvk] Eliminate buffer slice copy when updating buffer descriptors
This commit is contained in:
parent
03a760bec6
commit
539cc77b6e
@ -67,6 +67,18 @@ namespace dxvk {
|
|||||||
bool isInUse() const {
|
bool isInUse() const {
|
||||||
return m_physSlice.resource()->isInUse();
|
return m_physSlice.resource()->isInUse();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Retrieves descriptor info
|
||||||
|
*
|
||||||
|
* \param [in] offset Buffer slice offset
|
||||||
|
* \param [in] length Buffer slice length
|
||||||
|
* \param [in] keepOffset \c false to zero offset
|
||||||
|
* \returns Buffer slice descriptor
|
||||||
|
*/
|
||||||
|
DxvkDescriptorInfo getDescriptor(VkDeviceSize offset, VkDeviceSize length, bool keepOffset) const {
|
||||||
|
return m_physSlice.getDescriptor(offset, length, keepOffset);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* \brief Underlying buffer resource
|
* \brief Underlying buffer resource
|
||||||
@ -191,7 +203,7 @@ namespace dxvk {
|
|||||||
|
|
||||||
size_t offset() const { return m_offset; }
|
size_t offset() const { return m_offset; }
|
||||||
size_t length() const { return m_length; }
|
size_t length() const { return m_length; }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* \brief Underlying buffer
|
* \brief Underlying buffer
|
||||||
* \returns The virtual buffer
|
* \returns The virtual buffer
|
||||||
@ -247,6 +259,16 @@ namespace dxvk {
|
|||||||
DxvkPhysicalBufferSlice physicalSlice() const {
|
DxvkPhysicalBufferSlice physicalSlice() const {
|
||||||
return m_buffer->subSlice(m_offset, m_length);
|
return m_buffer->subSlice(m_offset, m_length);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Retrieves descriptor info
|
||||||
|
*
|
||||||
|
* \param [in] keepOffset \c false to zero offset
|
||||||
|
* \returns Buffer slice descriptor
|
||||||
|
*/
|
||||||
|
DxvkDescriptorInfo getDescriptor(bool keepOffset) const {
|
||||||
|
return m_buffer->getDescriptor(m_offset, m_length, keepOffset);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* \brief Pointer to mapped memory region
|
* \brief Pointer to mapped memory region
|
||||||
@ -258,6 +280,14 @@ namespace dxvk {
|
|||||||
return m_buffer->mapPtr(m_offset + offset);
|
return m_buffer->mapPtr(m_offset + offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Resource pointer
|
||||||
|
* \returns Resource pointer
|
||||||
|
*/
|
||||||
|
Rc<DxvkResource> resource() const {
|
||||||
|
return m_buffer->resource();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* \brief Checks whether two slices are equal
|
* \brief Checks whether two slices are equal
|
||||||
*
|
*
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include "dxvk_descriptor.h"
|
||||||
#include "dxvk_format.h"
|
#include "dxvk_format.h"
|
||||||
#include "dxvk_memory.h"
|
#include "dxvk_memory.h"
|
||||||
#include "dxvk_resource.h"
|
#include "dxvk_resource.h"
|
||||||
@ -88,6 +89,21 @@ namespace dxvk {
|
|||||||
void* mapPtr(VkDeviceSize offset) const {
|
void* mapPtr(VkDeviceSize offset) const {
|
||||||
return m_memory.mapPtr(offset);
|
return m_memory.mapPtr(offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Retrieves descriptor info
|
||||||
|
*
|
||||||
|
* \param [in] offset Buffer slice offset
|
||||||
|
* \param [in] length Buffer slice length
|
||||||
|
* \returns Buffer slice descriptor
|
||||||
|
*/
|
||||||
|
DxvkDescriptorInfo getDescriptor(VkDeviceSize offset, VkDeviceSize length) const {
|
||||||
|
DxvkDescriptorInfo result;
|
||||||
|
result.buffer.buffer = m_handle;
|
||||||
|
result.buffer.offset = offset;
|
||||||
|
result.buffer.range = length;
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* \brief Retrieves a physical buffer slice
|
* \brief Retrieves a physical buffer slice
|
||||||
@ -167,6 +183,19 @@ namespace dxvk {
|
|||||||
DxvkPhysicalBufferSlice subSlice(VkDeviceSize offset, VkDeviceSize length) const {
|
DxvkPhysicalBufferSlice subSlice(VkDeviceSize offset, VkDeviceSize length) const {
|
||||||
return DxvkPhysicalBufferSlice(m_buffer, m_offset + offset, length);
|
return DxvkPhysicalBufferSlice(m_buffer, m_offset + offset, length);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Retrieves descriptor info
|
||||||
|
*
|
||||||
|
* \param [in] offset Buffer slice offset
|
||||||
|
* \param [in] length Buffer slice length
|
||||||
|
* \param [in] keepOffset \c false to zero offset
|
||||||
|
* \returns Buffer slice descriptor
|
||||||
|
*/
|
||||||
|
DxvkDescriptorInfo getDescriptor(VkDeviceSize offset, VkDeviceSize length, bool keepOffset) const {
|
||||||
|
offset = keepOffset ? m_offset + offset : 0;
|
||||||
|
return m_buffer->getDescriptor(offset, length);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* \brief Map pointer
|
* \brief Map pointer
|
||||||
|
@ -2244,13 +2244,9 @@ namespace dxvk {
|
|||||||
case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER:
|
case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER:
|
||||||
if (res.bufferSlice.defined()) {
|
if (res.bufferSlice.defined()) {
|
||||||
updatePipelineState |= bindMask.setBound(i);
|
updatePipelineState |= bindMask.setBound(i);
|
||||||
|
m_descInfos[i] = res.bufferSlice.getDescriptor(true);
|
||||||
|
|
||||||
auto physicalSlice = res.bufferSlice.physicalSlice();
|
m_cmd->trackResource(res.bufferSlice.resource());
|
||||||
m_descInfos[i].buffer.buffer = physicalSlice.handle();
|
|
||||||
m_descInfos[i].buffer.offset = physicalSlice.offset();
|
|
||||||
m_descInfos[i].buffer.range = physicalSlice.length();
|
|
||||||
|
|
||||||
m_cmd->trackResource(physicalSlice.resource());
|
|
||||||
} else {
|
} else {
|
||||||
updatePipelineState |= bindMask.setUnbound(i);
|
updatePipelineState |= bindMask.setUnbound(i);
|
||||||
m_descInfos[i].buffer = m_device->dummyBufferDescriptor();
|
m_descInfos[i].buffer = m_device->dummyBufferDescriptor();
|
||||||
@ -2260,13 +2256,9 @@ namespace dxvk {
|
|||||||
case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC:
|
case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC:
|
||||||
if (res.bufferSlice.defined()) {
|
if (res.bufferSlice.defined()) {
|
||||||
updatePipelineState |= bindMask.setBound(i);
|
updatePipelineState |= bindMask.setBound(i);
|
||||||
|
m_descInfos[i] = res.bufferSlice.getDescriptor(false);
|
||||||
|
|
||||||
auto physicalSlice = res.bufferSlice.physicalSlice();
|
m_cmd->trackResource(res.bufferSlice.resource());
|
||||||
m_descInfos[i].buffer.buffer = physicalSlice.handle();
|
|
||||||
m_descInfos[i].buffer.offset = 0; /* dynamic */
|
|
||||||
m_descInfos[i].buffer.range = physicalSlice.length();
|
|
||||||
|
|
||||||
m_cmd->trackResource(physicalSlice.resource());
|
|
||||||
} else {
|
} else {
|
||||||
updatePipelineState |= bindMask.setUnbound(i);
|
updatePipelineState |= bindMask.setUnbound(i);
|
||||||
m_descInfos[i].buffer = m_device->dummyBufferDescriptor();
|
m_descInfos[i].buffer = m_device->dummyBufferDescriptor();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user