1
0
mirror of https://github.com/doitsujin/dxvk.git synced 2025-03-13 19:29:14 +01:00

[dxvk] Only update buffer object in buffer slices if necessary

Saves CPU cycles when rebinding the same vertex, index and
constant buffers with different offsets.
This commit is contained in:
Philip Rebohle 2019-06-05 20:32:12 +02:00
parent 7e66dc61b9
commit 461a2bec36
2 changed files with 18 additions and 16 deletions

View File

@ -333,6 +333,23 @@ namespace dxvk {
explicit DxvkBufferSlice(const Rc<DxvkBuffer>& buffer)
: DxvkBufferSlice(buffer, 0, buffer->info().size) { }
DxvkBufferSlice(const DxvkBufferSlice& ) = default;
DxvkBufferSlice( DxvkBufferSlice&&) = default;
DxvkBufferSlice& operator = (const DxvkBufferSlice& other) {
if (m_buffer != other.m_buffer)
m_buffer = other.m_buffer;
m_offset = other.m_offset;
m_length = other.m_length;
return *this;
}
DxvkBufferSlice& operator = (DxvkBufferSlice&&) = default;
/**
* \brief Buffer slice offset and length
* \returns Buffer slice offset and length
*/
size_t offset() const { return m_offset; }
size_t length() const { return m_length; }
@ -474,19 +491,6 @@ namespace dxvk {
return this->m_offset == other.m_offset
&& this->m_length == other.m_length;
}
/**
* \brief Changes offset and size, but not the buffer
*
* Slightly faster alternative to overriding the full
* buffer slice object in case only the range changes.
* \param [in] offset New slice offset
* \param [in] length New slice length
*/
void updateRange(VkDeviceSize offset, VkDeviceSize length) {
m_offset = offset;
m_length = length;
}
private:

View File

@ -165,9 +165,7 @@ namespace dxvk {
DxvkContextFlag::CpDirtyResources,
DxvkContextFlag::GpDirtyResources);
} else if (!m_rc[slot].bufferSlice.matchesRange(buffer)) {
m_rc[slot].bufferSlice.updateRange(
buffer.offset(),
buffer.length());
m_rc[slot].bufferSlice = buffer;
m_flags.set(
DxvkContextFlag::CpDirtyDescriptorOffsets,