Mark a buffer GPU modified after the buffers are confirmed, do not double synch them
This commit is contained in:
parent
257a6aa2ba
commit
a764f49910
|
@ -544,7 +544,7 @@ void BufferCache<P>::CommitAsyncFlushesHigh() {
|
||||||
it++;
|
it++;
|
||||||
}
|
}
|
||||||
|
|
||||||
boost::container::small_vector<std::pair<BufferCopy, BufferId>, 1> downloads;
|
boost::container::small_vector<std::pair<BufferCopy, BufferId>, 16> downloads;
|
||||||
u64 total_size_bytes = 0;
|
u64 total_size_bytes = 0;
|
||||||
u64 largest_copy = 0;
|
u64 largest_copy = 0;
|
||||||
for (const IntervalSet& intervals : committed_ranges) {
|
for (const IntervalSet& intervals : committed_ranges) {
|
||||||
|
@ -914,6 +914,11 @@ void BufferCache<P>::BindHostGraphicsStorageBuffers(size_t stage) {
|
||||||
|
|
||||||
const u32 offset = buffer.Offset(binding.cpu_addr);
|
const u32 offset = buffer.Offset(binding.cpu_addr);
|
||||||
const bool is_written = ((channel_state->written_storage_buffers[stage] >> index) & 1) != 0;
|
const bool is_written = ((channel_state->written_storage_buffers[stage] >> index) & 1) != 0;
|
||||||
|
|
||||||
|
if (is_written) {
|
||||||
|
MarkWrittenBuffer(binding.buffer_id, binding.cpu_addr, size);
|
||||||
|
}
|
||||||
|
|
||||||
if constexpr (NEEDS_BIND_STORAGE_INDEX) {
|
if constexpr (NEEDS_BIND_STORAGE_INDEX) {
|
||||||
runtime.BindStorageBuffer(stage, binding_index, buffer, offset, size, is_written);
|
runtime.BindStorageBuffer(stage, binding_index, buffer, offset, size, is_written);
|
||||||
++binding_index;
|
++binding_index;
|
||||||
|
@ -931,6 +936,11 @@ void BufferCache<P>::BindHostGraphicsTextureBuffers(size_t stage) {
|
||||||
const u32 size = binding.size;
|
const u32 size = binding.size;
|
||||||
SynchronizeBuffer(buffer, binding.cpu_addr, size);
|
SynchronizeBuffer(buffer, binding.cpu_addr, size);
|
||||||
|
|
||||||
|
const bool is_written = ((channel_state->written_texture_buffers[stage] >> index) & 1) != 0;
|
||||||
|
if (is_written) {
|
||||||
|
MarkWrittenBuffer(binding.buffer_id, binding.cpu_addr, size);
|
||||||
|
}
|
||||||
|
|
||||||
const u32 offset = buffer.Offset(binding.cpu_addr);
|
const u32 offset = buffer.Offset(binding.cpu_addr);
|
||||||
const PixelFormat format = binding.format;
|
const PixelFormat format = binding.format;
|
||||||
if constexpr (SEPARATE_IMAGE_BUFFERS_BINDINGS) {
|
if constexpr (SEPARATE_IMAGE_BUFFERS_BINDINGS) {
|
||||||
|
@ -962,6 +972,8 @@ void BufferCache<P>::BindHostTransformFeedbackBuffers() {
|
||||||
const u32 size = binding.size;
|
const u32 size = binding.size;
|
||||||
SynchronizeBuffer(buffer, binding.cpu_addr, size);
|
SynchronizeBuffer(buffer, binding.cpu_addr, size);
|
||||||
|
|
||||||
|
MarkWrittenBuffer(binding.buffer_id, binding.cpu_addr, size);
|
||||||
|
|
||||||
const u32 offset = buffer.Offset(binding.cpu_addr);
|
const u32 offset = buffer.Offset(binding.cpu_addr);
|
||||||
host_bindings.buffers.push_back(&buffer);
|
host_bindings.buffers.push_back(&buffer);
|
||||||
host_bindings.offsets.push_back(offset);
|
host_bindings.offsets.push_back(offset);
|
||||||
|
@ -1011,6 +1023,11 @@ void BufferCache<P>::BindHostComputeStorageBuffers() {
|
||||||
const u32 offset = buffer.Offset(binding.cpu_addr);
|
const u32 offset = buffer.Offset(binding.cpu_addr);
|
||||||
const bool is_written =
|
const bool is_written =
|
||||||
((channel_state->written_compute_storage_buffers >> index) & 1) != 0;
|
((channel_state->written_compute_storage_buffers >> index) & 1) != 0;
|
||||||
|
|
||||||
|
if (is_written) {
|
||||||
|
MarkWrittenBuffer(binding.buffer_id, binding.cpu_addr, size);
|
||||||
|
}
|
||||||
|
|
||||||
if constexpr (NEEDS_BIND_STORAGE_INDEX) {
|
if constexpr (NEEDS_BIND_STORAGE_INDEX) {
|
||||||
runtime.BindComputeStorageBuffer(binding_index, buffer, offset, size, is_written);
|
runtime.BindComputeStorageBuffer(binding_index, buffer, offset, size, is_written);
|
||||||
++binding_index;
|
++binding_index;
|
||||||
|
@ -1028,6 +1045,12 @@ void BufferCache<P>::BindHostComputeTextureBuffers() {
|
||||||
const u32 size = binding.size;
|
const u32 size = binding.size;
|
||||||
SynchronizeBuffer(buffer, binding.cpu_addr, size);
|
SynchronizeBuffer(buffer, binding.cpu_addr, size);
|
||||||
|
|
||||||
|
const bool is_written =
|
||||||
|
((channel_state->written_compute_texture_buffers >> index) & 1) != 0;
|
||||||
|
if (is_written) {
|
||||||
|
MarkWrittenBuffer(binding.buffer_id, binding.cpu_addr, size);
|
||||||
|
}
|
||||||
|
|
||||||
const u32 offset = buffer.Offset(binding.cpu_addr);
|
const u32 offset = buffer.Offset(binding.cpu_addr);
|
||||||
const PixelFormat format = binding.format;
|
const PixelFormat format = binding.format;
|
||||||
if constexpr (SEPARATE_IMAGE_BUFFERS_BINDINGS) {
|
if constexpr (SEPARATE_IMAGE_BUFFERS_BINDINGS) {
|
||||||
|
@ -1201,16 +1224,11 @@ void BufferCache<P>::UpdateUniformBuffers(size_t stage) {
|
||||||
|
|
||||||
template <class P>
|
template <class P>
|
||||||
void BufferCache<P>::UpdateStorageBuffers(size_t stage) {
|
void BufferCache<P>::UpdateStorageBuffers(size_t stage) {
|
||||||
const u32 written_mask = channel_state->written_storage_buffers[stage];
|
|
||||||
ForEachEnabledBit(channel_state->enabled_storage_buffers[stage], [&](u32 index) {
|
ForEachEnabledBit(channel_state->enabled_storage_buffers[stage], [&](u32 index) {
|
||||||
// Resolve buffer
|
// Resolve buffer
|
||||||
Binding& binding = channel_state->storage_buffers[stage][index];
|
Binding& binding = channel_state->storage_buffers[stage][index];
|
||||||
const BufferId buffer_id = FindBuffer(binding.cpu_addr, binding.size);
|
const BufferId buffer_id = FindBuffer(binding.cpu_addr, binding.size);
|
||||||
binding.buffer_id = buffer_id;
|
binding.buffer_id = buffer_id;
|
||||||
// Mark buffer as written if needed
|
|
||||||
if (((written_mask >> index) & 1) != 0) {
|
|
||||||
MarkWrittenBuffer(buffer_id, binding.cpu_addr, binding.size);
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1219,10 +1237,6 @@ void BufferCache<P>::UpdateTextureBuffers(size_t stage) {
|
||||||
ForEachEnabledBit(channel_state->enabled_texture_buffers[stage], [&](u32 index) {
|
ForEachEnabledBit(channel_state->enabled_texture_buffers[stage], [&](u32 index) {
|
||||||
Binding& binding = channel_state->texture_buffers[stage][index];
|
Binding& binding = channel_state->texture_buffers[stage][index];
|
||||||
binding.buffer_id = FindBuffer(binding.cpu_addr, binding.size);
|
binding.buffer_id = FindBuffer(binding.cpu_addr, binding.size);
|
||||||
// Mark buffer as written if needed
|
|
||||||
if (((channel_state->written_texture_buffers[stage] >> index) & 1) != 0) {
|
|
||||||
MarkWrittenBuffer(binding.buffer_id, binding.cpu_addr, binding.size);
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1252,7 +1266,6 @@ void BufferCache<P>::UpdateTransformFeedbackBuffer(u32 index) {
|
||||||
.size = size,
|
.size = size,
|
||||||
.buffer_id = buffer_id,
|
.buffer_id = buffer_id,
|
||||||
};
|
};
|
||||||
MarkWrittenBuffer(buffer_id, *cpu_addr, size);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
template <class P>
|
template <class P>
|
||||||
|
@ -1279,10 +1292,6 @@ void BufferCache<P>::UpdateComputeStorageBuffers() {
|
||||||
// Resolve buffer
|
// Resolve buffer
|
||||||
Binding& binding = channel_state->compute_storage_buffers[index];
|
Binding& binding = channel_state->compute_storage_buffers[index];
|
||||||
binding.buffer_id = FindBuffer(binding.cpu_addr, binding.size);
|
binding.buffer_id = FindBuffer(binding.cpu_addr, binding.size);
|
||||||
// Mark as written if needed
|
|
||||||
if (((channel_state->written_compute_storage_buffers >> index) & 1) != 0) {
|
|
||||||
MarkWrittenBuffer(binding.buffer_id, binding.cpu_addr, binding.size);
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1291,18 +1300,11 @@ void BufferCache<P>::UpdateComputeTextureBuffers() {
|
||||||
ForEachEnabledBit(channel_state->enabled_compute_texture_buffers, [&](u32 index) {
|
ForEachEnabledBit(channel_state->enabled_compute_texture_buffers, [&](u32 index) {
|
||||||
Binding& binding = channel_state->compute_texture_buffers[index];
|
Binding& binding = channel_state->compute_texture_buffers[index];
|
||||||
binding.buffer_id = FindBuffer(binding.cpu_addr, binding.size);
|
binding.buffer_id = FindBuffer(binding.cpu_addr, binding.size);
|
||||||
// Mark as written if needed
|
|
||||||
if (((channel_state->written_compute_texture_buffers >> index) & 1) != 0) {
|
|
||||||
MarkWrittenBuffer(binding.buffer_id, binding.cpu_addr, binding.size);
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
template <class P>
|
template <class P>
|
||||||
void BufferCache<P>::MarkWrittenBuffer(BufferId buffer_id, VAddr cpu_addr, u32 size) {
|
void BufferCache<P>::MarkWrittenBuffer(BufferId buffer_id, VAddr cpu_addr, u32 size) {
|
||||||
if (memory_tracker.IsRegionCpuModified(cpu_addr, size)) {
|
|
||||||
SynchronizeBuffer(slot_buffers[buffer_id], cpu_addr, size);
|
|
||||||
}
|
|
||||||
memory_tracker.MarkRegionAsGpuModified(cpu_addr, size);
|
memory_tracker.MarkRegionAsGpuModified(cpu_addr, size);
|
||||||
|
|
||||||
const IntervalType base_interval{cpu_addr, cpu_addr + size};
|
const IntervalType base_interval{cpu_addr, cpu_addr + size};
|
||||||
|
|
Reference in New Issue