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:
parent
7e66dc61b9
commit
461a2bec36
@ -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:
|
||||
|
||||
|
@ -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,
|
||||
|
Loading…
x
Reference in New Issue
Block a user