Browse Source
Merge pull request #4064 from ReinUsesLisp/invalidate-buffers
gl_rasterizer: Mark vertex buffers as dirty after buffer cache invalidation
pull/15/merge
bunnei
6 years ago
committed by
GitHub
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with
19 additions and
8 deletions
-
src/video_core/buffer_cache/buffer_cache.h
-
src/video_core/renderer_opengl/gl_rasterizer.cpp
|
|
|
@ -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}; |
|
|
|
|
|
|
|
bool invalidated; |
|
|
|
std::tie(buffer_ptr, buffer_offset_base, invalidated) = stream_buffer->Map(max_size, 4); |
|
|
|
buffer_offset = buffer_offset_base; |
|
|
|
|
|
|
|
return invalidated; |
|
|
|
} |
|
|
|
|
|
|
|
/// Finishes the upload stream, returns true on bindings invalidation. |
|
|
|
bool Unmap() { |
|
|
|
/// Finishes the upload stream |
|
|
|
void Unmap() { |
|
|
|
std::lock_guard lock{mutex}; |
|
|
|
|
|
|
|
stream_buffer->Unmap(buffer_offset - buffer_offset_base); |
|
|
|
return std::exchange(invalidated, false); |
|
|
|
} |
|
|
|
|
|
|
|
void TickFrame() { |
|
|
|
@ -576,8 +580,6 @@ private: |
|
|
|
std::unique_ptr<StreamBuffer> stream_buffer; |
|
|
|
BufferType stream_buffer_handle{}; |
|
|
|
|
|
|
|
bool invalidated = false; |
|
|
|
|
|
|
|
u8* buffer_ptr = nullptr; |
|
|
|
u64 buffer_offset = 0; |
|
|
|
u64 buffer_offset_base = 0; |
|
|
|
|
|
|
|
@ -617,7 +617,16 @@ void RasterizerOpenGL::Draw(bool is_indexed, bool is_instanced) { |
|
|
|
(Maxwell::MaxConstBufferSize + device.GetUniformBufferAlignment()); |
|
|
|
|
|
|
|
// 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.
|
|
|
|
SetupVertexFormat(); |
|
|
|
|