diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/video_core/renderer_opengl/gl_texture_cache.cpp | 7 | ||||
| -rw-r--r-- | src/video_core/texture_cache/surface_base.cpp | 4 |
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; | |||
| 260 | void CachedSurface::DownloadTexture(std::vector<u8>& staging_buffer) { | 260 | void 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); |