Browse Source
Merge pull request #3422 from ReinUsesLisp/buffer-flush
surface_base: Implement texture buffer flushes
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
11 additions and
0 deletions
-
src/video_core/renderer_opengl/gl_texture_cache.cpp
-
src/video_core/texture_cache/surface_base.cpp
|
|
|
@ -260,6 +260,13 @@ CachedSurface::~CachedSurface() = default; |
|
|
|
void CachedSurface::DownloadTexture(std::vector<u8>& staging_buffer) { |
|
|
|
MICROPROFILE_SCOPE(OpenGL_Texture_Download); |
|
|
|
|
|
|
|
if (params.IsBuffer()) { |
|
|
|
glGetNamedBufferSubData(texture_buffer.handle, 0, |
|
|
|
static_cast<GLsizeiptr>(params.GetHostSizeInBytes()), |
|
|
|
staging_buffer.data()); |
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
|
SCOPE_EXIT({ glPixelStorei(GL_PACK_ROW_LENGTH, 0); }); |
|
|
|
|
|
|
|
for (u32 level = 0; level < params.emulated_levels; ++level) { |
|
|
|
|
|
|
|
@ -277,6 +277,10 @@ void SurfaceBaseImpl::FlushBuffer(Tegra::MemoryManager& memory_manager, |
|
|
|
SwizzleFunc(MortonSwizzleMode::LinearToMorton, host_ptr, params, |
|
|
|
staging_buffer.data() + host_offset, level); |
|
|
|
} |
|
|
|
} else if (params.IsBuffer()) { |
|
|
|
// Buffers don't have pitch or any fancy layout property. We can just memcpy them to guest
|
|
|
|
// memory.
|
|
|
|
std::memcpy(host_ptr, staging_buffer.data(), guest_memory_size); |
|
|
|
} else { |
|
|
|
ASSERT(params.target == SurfaceTarget::Texture2D); |
|
|
|
ASSERT(params.num_levels == 1); |
|
|
|
|