mirror of
https://github.com/doitsujin/dxvk.git
synced 2025-03-15 07:29:17 +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)
|
explicit DxvkBufferSlice(const Rc<DxvkBuffer>& buffer)
|
||||||
: DxvkBufferSlice(buffer, 0, buffer->info().size) { }
|
: 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 offset() const { return m_offset; }
|
||||||
size_t length() const { return m_length; }
|
size_t length() const { return m_length; }
|
||||||
|
|
||||||
@ -475,19 +492,6 @@ namespace dxvk {
|
|||||||
&& this->m_length == other.m_length;
|
&& 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:
|
private:
|
||||||
|
|
||||||
Rc<DxvkBuffer> m_buffer = nullptr;
|
Rc<DxvkBuffer> m_buffer = nullptr;
|
||||||
|
@ -165,9 +165,7 @@ namespace dxvk {
|
|||||||
DxvkContextFlag::CpDirtyResources,
|
DxvkContextFlag::CpDirtyResources,
|
||||||
DxvkContextFlag::GpDirtyResources);
|
DxvkContextFlag::GpDirtyResources);
|
||||||
} else if (!m_rc[slot].bufferSlice.matchesRange(buffer)) {
|
} else if (!m_rc[slot].bufferSlice.matchesRange(buffer)) {
|
||||||
m_rc[slot].bufferSlice.updateRange(
|
m_rc[slot].bufferSlice = buffer;
|
||||||
buffer.offset(),
|
|
||||||
buffer.length());
|
|
||||||
|
|
||||||
m_flags.set(
|
m_flags.set(
|
||||||
DxvkContextFlag::CpDirtyDescriptorOffsets,
|
DxvkContextFlag::CpDirtyDescriptorOffsets,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user