Merge pull request #1662 from FreddyFunk/CopySurface-Optimization
gl_rasterizer_cache: CopySurface optimization
This commit is contained in:
commit
3bd503d59c
|
@ -715,18 +715,18 @@ static void FastCopySurface(const Surface& src_surface, const Surface& dst_surfa
|
||||||
|
|
||||||
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,
|
static void CopySurface(const Surface& src_surface, const Surface& dst_surface,
|
||||||
GLuint copy_pbo_handle, GLenum src_attachment = 0,
|
const GLuint copy_pbo_handle, const GLenum src_attachment = 0,
|
||||||
GLenum dst_attachment = 0, std::size_t cubemap_face = 0) {
|
const GLenum dst_attachment = 0, const std::size_t cubemap_face = 0) {
|
||||||
MICROPROFILE_SCOPE(OpenGL_CopySurface);
|
MICROPROFILE_SCOPE(OpenGL_CopySurface);
|
||||||
ASSERT_MSG(dst_attachment == 0, "Unimplemented");
|
ASSERT_MSG(dst_attachment == 0, "Unimplemented");
|
||||||
|
|
||||||
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()};
|
||||||
|
|
||||||
auto source_format = GetFormatTuple(src_params.pixel_format, src_params.component_type);
|
const auto source_format = GetFormatTuple(src_params.pixel_format, src_params.component_type);
|
||||||
auto dest_format = GetFormatTuple(dst_params.pixel_format, dst_params.component_type);
|
const auto dest_format = GetFormatTuple(dst_params.pixel_format, dst_params.component_type);
|
||||||
|
|
||||||
std::size_t buffer_size = std::max(src_params.size_in_bytes, dst_params.size_in_bytes);
|
const std::size_t buffer_size = std::max(src_params.size_in_bytes, dst_params.size_in_bytes);
|
||||||
|
|
||||||
glBindBuffer(GL_PIXEL_PACK_BUFFER, copy_pbo_handle);
|
glBindBuffer(GL_PIXEL_PACK_BUFFER, copy_pbo_handle);
|
||||||
glBufferData(GL_PIXEL_PACK_BUFFER, buffer_size, nullptr, GL_STREAM_DRAW_ARB);
|
glBufferData(GL_PIXEL_PACK_BUFFER, buffer_size, nullptr, GL_STREAM_DRAW_ARB);
|
||||||
|
@ -750,13 +750,10 @@ static void CopySurface(const Surface& src_surface, const Surface& dst_surface,
|
||||||
LOG_DEBUG(HW_GPU, "Trying to upload extra texture data from the CPU during "
|
LOG_DEBUG(HW_GPU, "Trying to upload extra texture data from the CPU during "
|
||||||
"reinterpretation but the texture is tiled.");
|
"reinterpretation but the texture is tiled.");
|
||||||
}
|
}
|
||||||
std::size_t remaining_size = dst_params.size_in_bytes - src_params.size_in_bytes;
|
const std::size_t remaining_size = dst_params.size_in_bytes - src_params.size_in_bytes;
|
||||||
std::vector<u8> data(remaining_size);
|
|
||||||
std::memcpy(data.data(), Memory::GetPointer(dst_params.addr + src_params.size_in_bytes),
|
|
||||||
data.size());
|
|
||||||
|
|
||||||
glBufferSubData(GL_PIXEL_PACK_BUFFER, src_params.size_in_bytes, remaining_size,
|
glBufferSubData(GL_PIXEL_PACK_BUFFER, src_params.size_in_bytes, remaining_size,
|
||||||
data.data());
|
Memory::GetPointer(dst_params.addr + src_params.size_in_bytes));
|
||||||
}
|
}
|
||||||
|
|
||||||
glBindBuffer(GL_PIXEL_PACK_BUFFER, 0);
|
glBindBuffer(GL_PIXEL_PACK_BUFFER, 0);
|
||||||
|
|
Loading…
Reference in New Issue