Merge pull request #4064 from ReinUsesLisp/invalidate-buffers

gl_rasterizer: Mark vertex buffers as dirty after buffer cache invalidation
This commit is contained in:
bunnei 2020-06-14 00:29:16 -04:00 committed by GitHub
commit 92021a344c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 19 additions and 8 deletions

View File

@ -110,19 +110,23 @@ public:
}); });
} }
void Map(std::size_t max_size) { /// Prepares the buffer cache for data uploading
/// @param max_size Maximum number of bytes that will be uploaded
/// @return True when a stream buffer invalidation was required, false otherwise
bool Map(std::size_t max_size) {
std::lock_guard lock{mutex}; std::lock_guard lock{mutex};
bool invalidated;
std::tie(buffer_ptr, buffer_offset_base, invalidated) = stream_buffer->Map(max_size, 4); std::tie(buffer_ptr, buffer_offset_base, invalidated) = stream_buffer->Map(max_size, 4);
buffer_offset = buffer_offset_base; buffer_offset = buffer_offset_base;
return invalidated;
} }
/// Finishes the upload stream, returns true on bindings invalidation. /// Finishes the upload stream
bool Unmap() { void Unmap() {
std::lock_guard lock{mutex}; std::lock_guard lock{mutex};
stream_buffer->Unmap(buffer_offset - buffer_offset_base); stream_buffer->Unmap(buffer_offset - buffer_offset_base);
return std::exchange(invalidated, false);
} }
void TickFrame() { void TickFrame() {
@ -576,8 +580,6 @@ private:
std::unique_ptr<StreamBuffer> stream_buffer; std::unique_ptr<StreamBuffer> stream_buffer;
BufferType stream_buffer_handle{}; BufferType stream_buffer_handle{};
bool invalidated = false;
u8* buffer_ptr = nullptr; u8* buffer_ptr = nullptr;
u64 buffer_offset = 0; u64 buffer_offset = 0;
u64 buffer_offset_base = 0; u64 buffer_offset_base = 0;

View File

@ -617,7 +617,16 @@ void RasterizerOpenGL::Draw(bool is_indexed, bool is_instanced) {
(Maxwell::MaxConstBufferSize + device.GetUniformBufferAlignment()); (Maxwell::MaxConstBufferSize + device.GetUniformBufferAlignment());
// Prepare the vertex array. // Prepare the vertex array.
buffer_cache.Map(buffer_size); const bool invalidated = buffer_cache.Map(buffer_size);
if (invalidated) {
// When the stream buffer has been invalidated, we have to consider vertex buffers as dirty
auto& dirty = gpu.dirty.flags;
dirty[Dirty::VertexBuffers] = true;
for (int index = Dirty::VertexBuffer0; index <= Dirty::VertexBuffer31; ++index) {
dirty[index] = true;
}
}
// Prepare vertex array format. // Prepare vertex array format.
SetupVertexFormat(); SetupVertexFormat();