summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/video_core/renderer_opengl/gl_texture_cache.cpp7
-rw-r--r--src/video_core/texture_cache/surface_base.cpp4
2 files changed, 11 insertions, 0 deletions
diff --git a/src/video_core/renderer_opengl/gl_texture_cache.cpp b/src/video_core/renderer_opengl/gl_texture_cache.cpp
index d4b81cd87..5c1ae1418 100644
--- a/src/video_core/renderer_opengl/gl_texture_cache.cpp
+++ b/src/video_core/renderer_opengl/gl_texture_cache.cpp
@@ -260,6 +260,13 @@ CachedSurface::~CachedSurface() = default;
260void CachedSurface::DownloadTexture(std::vector<u8>& staging_buffer) { 260void CachedSurface::DownloadTexture(std::vector<u8>& staging_buffer) {
261 MICROPROFILE_SCOPE(OpenGL_Texture_Download); 261 MICROPROFILE_SCOPE(OpenGL_Texture_Download);
262 262
263 if (params.IsBuffer()) {
264 glGetNamedBufferSubData(texture_buffer.handle, 0,
265 static_cast<GLsizeiptr>(params.GetHostSizeInBytes()),
266 staging_buffer.data());
267 return;
268 }
269
263 SCOPE_EXIT({ glPixelStorei(GL_PACK_ROW_LENGTH, 0); }); 270 SCOPE_EXIT({ glPixelStorei(GL_PACK_ROW_LENGTH, 0); });
264 271
265 for (u32 level = 0; level < params.emulated_levels; ++level) { 272 for (u32 level = 0; level < params.emulated_levels; ++level) {
diff --git a/src/video_core/texture_cache/surface_base.cpp b/src/video_core/texture_cache/surface_base.cpp
index 84469b7ba..002df414f 100644
--- a/src/video_core/texture_cache/surface_base.cpp
+++ b/src/video_core/texture_cache/surface_base.cpp
@@ -277,6 +277,10 @@ void SurfaceBaseImpl::FlushBuffer(Tegra::MemoryManager& memory_manager,
277 SwizzleFunc(MortonSwizzleMode::LinearToMorton, host_ptr, params, 277 SwizzleFunc(MortonSwizzleMode::LinearToMorton, host_ptr, params,
278 staging_buffer.data() + host_offset, level); 278 staging_buffer.data() + host_offset, level);
279 } 279 }
280 } else if (params.IsBuffer()) {
281 // Buffers don't have pitch or any fancy layout property. We can just memcpy them to guest
282 // memory.
283 std::memcpy(host_ptr, staging_buffer.data(), guest_memory_size);
280 } else { 284 } else {
281 ASSERT(params.target == SurfaceTarget::Texture2D); 285 ASSERT(params.target == SurfaceTarget::Texture2D);
282 ASSERT(params.num_levels == 1); 286 ASSERT(params.num_levels == 1);