mirror of https://github.com/RPCS3/rpcs3.git
gl: Optimize consumption of buffer objects when uploading textures
This commit is contained in:
parent
55e68441cb
commit
3ee27bd434
|
@ -365,10 +365,7 @@ void GLGSRender::on_exit()
|
||||||
// TODO: Move these
|
// TODO: Move these
|
||||||
gl::destroy_compute_tasks();
|
gl::destroy_compute_tasks();
|
||||||
|
|
||||||
if (gl::g_typeless_transfer_buffer)
|
gl::destroy_global_texture_resources();
|
||||||
{
|
|
||||||
gl::g_typeless_transfer_buffer.remove();
|
|
||||||
}
|
|
||||||
|
|
||||||
gl::debug::g_vis_texture.reset(); // TODO
|
gl::debug::g_vis_texture.reset(); // TODO
|
||||||
|
|
||||||
|
|
|
@ -16,6 +16,32 @@ namespace gl
|
||||||
}
|
}
|
||||||
|
|
||||||
buffer g_typeless_transfer_buffer;
|
buffer g_typeless_transfer_buffer;
|
||||||
|
buffer g_upload_transfer_buffer;
|
||||||
|
buffer g_compute_decode_buffer;
|
||||||
|
|
||||||
|
std::pair<buffer*, buffer*> prepare_compute_resources(usz staging_data_length)
|
||||||
|
{
|
||||||
|
if (g_upload_transfer_buffer.size() < staging_data_length)
|
||||||
|
{
|
||||||
|
g_upload_transfer_buffer.remove();
|
||||||
|
g_upload_transfer_buffer.create(staging_data_length, nullptr, buffer::memory_type::host_visible, GL_STREAM_DRAW);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (g_compute_decode_buffer.size() < staging_data_length * 3)
|
||||||
|
{
|
||||||
|
g_compute_decode_buffer.remove();
|
||||||
|
g_compute_decode_buffer.create(std::max<GLsizeiptr>(512, staging_data_length * 3), nullptr, buffer::memory_type::local, GL_STATIC_COPY);
|
||||||
|
}
|
||||||
|
|
||||||
|
return { &g_upload_transfer_buffer, &g_compute_decode_buffer };
|
||||||
|
}
|
||||||
|
|
||||||
|
void destroy_global_texture_resources()
|
||||||
|
{
|
||||||
|
g_typeless_transfer_buffer.remove();
|
||||||
|
g_upload_transfer_buffer.remove();
|
||||||
|
g_compute_decode_buffer.remove();
|
||||||
|
}
|
||||||
|
|
||||||
GLenum get_target(rsx::texture_dimension_extended type)
|
GLenum get_target(rsx::texture_dimension_extended type)
|
||||||
{
|
{
|
||||||
|
@ -663,7 +689,7 @@ namespace gl
|
||||||
{
|
{
|
||||||
bool apply_settings = true;
|
bool apply_settings = true;
|
||||||
bool use_compute_transform = false;
|
bool use_compute_transform = false;
|
||||||
buffer upload_scratch_mem, compute_scratch_mem;
|
buffer *upload_scratch_mem = nullptr, *compute_scratch_mem = nullptr;
|
||||||
image_memory_requirements mem_info;
|
image_memory_requirements mem_info;
|
||||||
pixel_buffer_layout mem_layout;
|
pixel_buffer_layout mem_layout;
|
||||||
|
|
||||||
|
@ -695,8 +721,7 @@ namespace gl
|
||||||
|
|
||||||
if (use_compute_transform)
|
if (use_compute_transform)
|
||||||
{
|
{
|
||||||
upload_scratch_mem.create(staging_buffer.size(), nullptr, buffer::memory_type::host_visible, GL_STREAM_DRAW);
|
std::tie(upload_scratch_mem, compute_scratch_mem) = prepare_compute_resources(staging_buffer.size());
|
||||||
compute_scratch_mem.create(std::max<GLsizeiptr>(512, staging_buffer.size() * 3), nullptr, buffer::memory_type::local, GL_STATIC_COPY);
|
|
||||||
out_pointer = nullptr;
|
out_pointer = nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -706,7 +731,7 @@ namespace gl
|
||||||
{
|
{
|
||||||
const u64 row_pitch = rsx::align2<u64, u64>(layout.width_in_block * block_size_in_bytes, caps.alignment);
|
const u64 row_pitch = rsx::align2<u64, u64>(layout.width_in_block * block_size_in_bytes, caps.alignment);
|
||||||
image_linear_size = row_pitch * layout.height_in_block * layout.depth;
|
image_linear_size = row_pitch * layout.height_in_block * layout.depth;
|
||||||
dst_buffer = { reinterpret_cast<std::byte*>(upload_scratch_mem.map(0, image_linear_size, gl::buffer::access::write)), image_linear_size };
|
dst_buffer = { reinterpret_cast<std::byte*>(upload_scratch_mem->map(0, image_linear_size, gl::buffer::access::write)), image_linear_size };
|
||||||
}
|
}
|
||||||
|
|
||||||
auto op = upload_texture_subresource(dst_buffer, layout, format, is_swizzled, caps);
|
auto op = upload_texture_subresource(dst_buffer, layout, format, is_swizzled, caps);
|
||||||
|
@ -723,10 +748,10 @@ namespace gl
|
||||||
if (use_compute_transform)
|
if (use_compute_transform)
|
||||||
{
|
{
|
||||||
// 1. Unmap buffer
|
// 1. Unmap buffer
|
||||||
upload_scratch_mem.unmap();
|
upload_scratch_mem->unmap();
|
||||||
|
|
||||||
// 2. Upload memory to GPU
|
// 2. Upload memory to GPU
|
||||||
upload_scratch_mem.copy_to(&compute_scratch_mem, 0, 0, image_linear_size);
|
upload_scratch_mem->copy_to(compute_scratch_mem, 0, 0, image_linear_size);
|
||||||
|
|
||||||
// 3. Update configuration
|
// 3. Update configuration
|
||||||
mem_layout.swap_bytes = op.require_swap;
|
mem_layout.swap_bytes = op.require_swap;
|
||||||
|
@ -735,7 +760,7 @@ namespace gl
|
||||||
mem_info.memory_required = 0;
|
mem_info.memory_required = 0;
|
||||||
|
|
||||||
// 4. Dispatch compute routines
|
// 4. Dispatch compute routines
|
||||||
copy_buffer_to_image(cmd, mem_layout, &compute_scratch_mem, dst, nullptr, layout.level, region, & mem_info);
|
copy_buffer_to_image(cmd, mem_layout, compute_scratch_mem, dst, nullptr, layout.level, region, & mem_info);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -748,12 +773,6 @@ namespace gl
|
||||||
dst->copy_from(out_pointer, static_cast<texture::format>(gl_format), static_cast<texture::type>(gl_type), layout.level, region, unpack_settings);
|
dst->copy_from(out_pointer, static_cast<texture::format>(gl_format), static_cast<texture::type>(gl_type), layout.level, region, unpack_settings);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (use_compute_transform)
|
|
||||||
{
|
|
||||||
upload_scratch_mem.remove();
|
|
||||||
compute_scratch_mem.remove();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -124,5 +124,5 @@ namespace gl
|
||||||
extern std::unique_ptr<texture> g_vis_texture;
|
extern std::unique_ptr<texture> g_vis_texture;
|
||||||
}
|
}
|
||||||
|
|
||||||
extern buffer g_typeless_transfer_buffer;
|
void destroy_global_texture_resources();
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue