gl_rasterizer_cache: Mark surface copy destinations as modified.

This commit is contained in:
bunnei 2019-02-02 22:41:39 -05:00
parent dd1aab5446
commit 35e1118766
2 changed files with 18 additions and 4 deletions

View File

@ -428,7 +428,8 @@ void SwizzleFunc(const MortonSwizzleMode& mode, const SurfaceParams& params,
} }
} }
static void FastCopySurface(const Surface& src_surface, const Surface& dst_surface) { void RasterizerCacheOpenGL::FastCopySurface(const Surface& src_surface,
const Surface& dst_surface) {
const auto& src_params{src_surface->GetSurfaceParams()}; const auto& src_params{src_surface->GetSurfaceParams()};
const auto& dst_params{dst_surface->GetSurfaceParams()}; const auto& dst_params{dst_surface->GetSurfaceParams()};
@ -438,12 +439,15 @@ static void FastCopySurface(const Surface& src_surface, const Surface& dst_surfa
glCopyImageSubData(src_surface->Texture().handle, SurfaceTargetToGL(src_params.target), 0, 0, 0, glCopyImageSubData(src_surface->Texture().handle, SurfaceTargetToGL(src_params.target), 0, 0, 0,
0, dst_surface->Texture().handle, SurfaceTargetToGL(dst_params.target), 0, 0, 0, dst_surface->Texture().handle, SurfaceTargetToGL(dst_params.target), 0, 0,
0, 0, width, height, 1); 0, 0, width, height, 1);
dst_surface->MarkAsModified(true, *this);
} }
MICROPROFILE_DEFINE(OpenGL_CopySurface, "OpenGL", "CopySurface", MP_RGB(128, 192, 64)); MICROPROFILE_DEFINE(OpenGL_CopySurface, "OpenGL", "CopySurface", MP_RGB(128, 192, 64));
static void CopySurface(const Surface& src_surface, const Surface& dst_surface, void RasterizerCacheOpenGL::CopySurface(const Surface& src_surface, const Surface& dst_surface,
const GLuint copy_pbo_handle, const GLenum src_attachment = 0, const GLuint copy_pbo_handle, const GLenum src_attachment,
const GLenum dst_attachment = 0, const std::size_t cubemap_face = 0) { const GLenum dst_attachment,
const std::size_t cubemap_face) {
MICROPROFILE_SCOPE(OpenGL_CopySurface); MICROPROFILE_SCOPE(OpenGL_CopySurface);
ASSERT_MSG(dst_attachment == 0, "Unimplemented"); ASSERT_MSG(dst_attachment == 0, "Unimplemented");
@ -523,6 +527,8 @@ static void CopySurface(const Surface& src_surface, const Surface& dst_surface,
} }
glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0); glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0);
} }
dst_surface->MarkAsModified(true, *this);
} }
CachedSurface::CachedSurface(const SurfaceParams& params) CachedSurface::CachedSurface(const SurfaceParams& params)
@ -1019,6 +1025,8 @@ void RasterizerCacheOpenGL::FastLayeredCopySurface(const Surface& src_surface,
} }
address += layer_size; address += layer_size;
} }
dst_surface->MarkAsModified(true, *this);
} }
static bool BlitSurface(const Surface& src_surface, const Surface& dst_surface, static bool BlitSurface(const Surface& src_surface, const Surface& dst_surface,
@ -1170,6 +1178,8 @@ void RasterizerCacheOpenGL::FermiCopySurface(
BlitSurface(src_surface, dst_surface, src_rect, dst_rect, read_framebuffer.handle, BlitSurface(src_surface, dst_surface, src_rect, dst_rect, read_framebuffer.handle,
draw_framebuffer.handle); draw_framebuffer.handle);
dst_surface->MarkAsModified(true, *this);
} }
void RasterizerCacheOpenGL::AccurateCopySurface(const Surface& src_surface, void RasterizerCacheOpenGL::AccurateCopySurface(const Surface& src_surface,

View File

@ -444,6 +444,10 @@ private:
/// Performs a slow but accurate surface copy, flushing to RAM and reinterpreting the data /// Performs a slow but accurate surface copy, flushing to RAM and reinterpreting the data
void AccurateCopySurface(const Surface& src_surface, const Surface& dst_surface); void AccurateCopySurface(const Surface& src_surface, const Surface& dst_surface);
void FastLayeredCopySurface(const Surface& src_surface, const Surface& dst_surface); void FastLayeredCopySurface(const Surface& src_surface, const Surface& dst_surface);
void FastCopySurface(const Surface& src_surface, const Surface& dst_surface);
void CopySurface(const Surface& src_surface, const Surface& dst_surface,
const GLuint copy_pbo_handle, const GLenum src_attachment = 0,
const GLenum dst_attachment = 0, const std::size_t cubemap_face = 0);
/// The surface reserve is a "backup" cache, this is where we put unique surfaces that have /// The surface reserve is a "backup" cache, this is where we put unique surfaces that have
/// previously been used. This is to prevent surfaces from being constantly created and /// previously been used. This is to prevent surfaces from being constantly created and