gl: Combine RGBA8/D24S8 readback and byteswap into one operation

This commit is contained in:
kd-11 2022-07-17 16:39:40 +03:00 committed by kd-11
parent 1c5b685398
commit 8a8fda3e02
3 changed files with 22 additions and 19 deletions

View File

@ -293,11 +293,11 @@ namespace gl
m_src = fmt::replace_all(raw_data, repl_list);
}
void cs_d24x8_to_ssbo::run(gl::command_context& cmd, gl::viewable_image* src, const gl::buffer* dst, u32 out_offset, const coordu& region, const gl::pixel_buffer_layout& /*layout*/, const gl::pixel_pack_settings& settings)
void cs_d24x8_to_ssbo::run(gl::command_context& cmd, gl::viewable_image* src, const gl::buffer* dst, u32 out_offset, const coordu& region, const gl::pixel_buffer_layout& layout)
{
const auto row_pitch = settings.get_row_length() ? settings.get_row_length() : region.width;
const auto row_pitch = region.width;
m_program.uniforms["swap_bytes"] = settings.get_swap_bytes();
m_program.uniforms["swap_bytes"] = layout.swap_bytes;
m_program.uniforms["output_pitch"] = row_pitch;
m_program.uniforms["region_offset"] = color2i(region.x, region.y);
m_program.uniforms["region_size"] = color2i(region.width, region.height);
@ -332,11 +332,11 @@ namespace gl
m_src = fmt::replace_all(raw_data, repl_list);
}
void cs_rgba8_to_ssbo::run(gl::command_context& cmd, gl::viewable_image* src, const gl::buffer* dst, u32 out_offset, const coordu& region, const gl::pixel_buffer_layout& layout, const gl::pixel_pack_settings& settings)
void cs_rgba8_to_ssbo::run(gl::command_context& cmd, gl::viewable_image* src, const gl::buffer* dst, u32 out_offset, const coordu& region, const gl::pixel_buffer_layout& layout)
{
const auto row_pitch = settings.get_row_length() ? settings.get_row_length() : region.width;
const auto row_pitch = region.width;
m_program.uniforms["swap_bytes"] = settings.get_swap_bytes();
m_program.uniforms["swap_bytes"] = layout.swap_bytes;
m_program.uniforms["output_pitch"] = row_pitch;
m_program.uniforms["region_offset"] = color2i(region.x, region.y);
m_program.uniforms["region_size"] = color2i(region.width, region.height);

View File

@ -345,19 +345,19 @@ namespace gl
struct cs_image_to_ssbo : compute_task
{
virtual void run(gl::command_context& cmd, gl::viewable_image* src, const gl::buffer* dst, u32 out_offset, const coordu& region, const gl::pixel_buffer_layout& layout, const gl::pixel_pack_settings& settings) = 0;
virtual void run(gl::command_context& cmd, gl::viewable_image* src, const gl::buffer* dst, u32 out_offset, const coordu& region, const gl::pixel_buffer_layout& layout) = 0;
};
struct cs_d24x8_to_ssbo : cs_image_to_ssbo
{
cs_d24x8_to_ssbo();
void run(gl::command_context& cmd, gl::viewable_image* src, const gl::buffer* dst, u32 out_offset, const coordu& region, const gl::pixel_buffer_layout& layout, const gl::pixel_pack_settings& settings) override;
void run(gl::command_context& cmd, gl::viewable_image* src, const gl::buffer* dst, u32 out_offset, const coordu& region, const gl::pixel_buffer_layout& layout) override;
};
struct cs_rgba8_to_ssbo : cs_image_to_ssbo
{
cs_rgba8_to_ssbo();
void run(gl::command_context& cmd, gl::viewable_image* src, const gl::buffer* dst, u32 out_offset, const coordu& region, const gl::pixel_buffer_layout& layout, const gl::pixel_pack_settings& settings) override;
void run(gl::command_context& cmd, gl::viewable_image* src, const gl::buffer* dst, u32 out_offset, const coordu& region, const gl::pixel_buffer_layout& layout) override;
};
struct cs_ssbo_to_color_image : compute_task

View File

@ -470,7 +470,7 @@ namespace gl
void* copy_image_to_buffer(gl::command_context& cmd, const pixel_buffer_layout& pack_info, const gl::texture* src, gl::buffer* dst,
u32 dst_offset, const int src_level, const coord3u& src_region, image_memory_requirements* mem_info)
{
auto initialize_scratch_mem = [&]()
auto initialize_scratch_mem = [&]() -> bool // skip_transform
{
const u64 max_mem = (mem_info->memory_required) ? mem_info->memory_required : mem_info->image_size_in_bytes;
if (!(*dst) || max_mem > static_cast<u64>(dst->size()))
@ -490,15 +490,15 @@ namespace gl
gl::get_compute_task<gl::cs_d24x8_to_ssbo>()->run(cmd,
const_cast<gl::viewable_image*>(as_vi), dst, dst_offset,
{ {src_region.x, src_region.y}, {src_region.width, src_region.height} },
pack_info, {});
return;
pack_info);
return true;
case gl::texture::internal_format::rgba8:
case gl::texture::internal_format::bgra8:
gl::get_compute_task<gl::cs_rgba8_to_ssbo>()->run(cmd,
const_cast<gl::viewable_image*>(as_vi), dst, dst_offset,
{ {src_region.x, src_region.y}, {src_region.width, src_region.height} },
pack_info, {});
return;
pack_info);
return true;
default:
break;
}
@ -506,6 +506,7 @@ namespace gl
dst->bind(buffer::target::pixel_pack);
src->copy_to(reinterpret_cast<void*>(static_cast<uintptr_t>(dst_offset)), static_cast<texture::format>(pack_info.format), static_cast<texture::type>(pack_info.type), src_level, src_region, {});
return false;
};
void* result = reinterpret_cast<void*>(static_cast<uintptr_t>(dst_offset));
@ -513,17 +514,19 @@ namespace gl
pack_info.type == GL_UNSIGNED_SHORT ||
pack_info.type == GL_UNSIGNED_INT_24_8)
{
initialize_scratch_mem();
if (auto job = get_trivial_transform_job(pack_info))
if (!initialize_scratch_mem())
{
job->run(cmd, dst, static_cast<u32>(mem_info->image_size_in_bytes), dst_offset);
if (auto job = get_trivial_transform_job(pack_info))
{
job->run(cmd, dst, static_cast<u32>(mem_info->image_size_in_bytes), dst_offset);
}
}
}
else if (pack_info.type == GL_FLOAT)
{
ensure(mem_info->image_size_in_bytes == (mem_info->image_size_in_texels * 4));
mem_info->memory_required = (mem_info->image_size_in_texels * 6);
initialize_scratch_mem();
ensure(!initialize_scratch_mem());
get_compute_task<cs_fconvert_task<f32, f16, false, true>>()->run(cmd, dst, dst_offset,
static_cast<u32>(mem_info->image_size_in_bytes), static_cast<u32>(mem_info->image_size_in_bytes));
@ -533,7 +536,7 @@ namespace gl
{
ensure(mem_info->image_size_in_bytes == (mem_info->image_size_in_texels * 8));
mem_info->memory_required = (mem_info->image_size_in_texels * 12);
initialize_scratch_mem();
ensure(!initialize_scratch_mem());
get_compute_task<cs_shuffle_d32fx8_to_x8d24f>()->run(cmd, dst, dst_offset,
static_cast<u32>(mem_info->image_size_in_bytes), static_cast<u32>(mem_info->image_size_in_texels));