mirror of
https://github.com/RGBCube/serenity
synced 2025-07-27 22:47:44 +00:00
LibGL+LibGPU+LibSoftGPU: Implement glCopyTex(Sub)?Image2d
These two methods copy from the frame buffer to (part of) a texture.
This commit is contained in:
parent
d7f1dc146e
commit
44953a4301
7 changed files with 118 additions and 22 deletions
|
@ -1466,6 +1466,21 @@ void Device::blit_from_color_buffer(Gfx::Bitmap& target)
|
|||
draw_statistics_overlay(target);
|
||||
}
|
||||
|
||||
void Device::blit_from_color_buffer(NonnullRefPtr<GPU::Image> image, u32 level, Vector2<u32> input_size, Vector2<i32> input_offset, Vector3<i32> output_offset)
|
||||
{
|
||||
auto input_layout = color_buffer_data_layout(input_size, input_offset);
|
||||
auto const* input_data = m_frame_buffer->color_buffer()->scanline(0);
|
||||
|
||||
auto const& softgpu_image = reinterpret_cast<Image*>(image.ptr());
|
||||
auto output_layout = softgpu_image->image_data_layout(level, output_offset);
|
||||
auto* output_data = softgpu_image->texel_pointer(0, level, 0, 0, 0);
|
||||
|
||||
PixelConverter converter { input_layout, output_layout };
|
||||
auto conversion_result = converter.convert(input_data, output_data, {});
|
||||
if (conversion_result.is_error())
|
||||
dbgln("Pixel conversion failed: {}", conversion_result.error().string_literal());
|
||||
}
|
||||
|
||||
void Device::blit_from_color_buffer(void* output_data, Vector2<i32> input_offset, GPU::ImageDataLayout const& output_layout)
|
||||
{
|
||||
auto const& output_selection = output_layout.selection;
|
||||
|
@ -1490,6 +1505,21 @@ void Device::blit_from_depth_buffer(void* output_data, Vector2<i32> input_offset
|
|||
dbgln("Pixel conversion failed: {}", conversion_result.error().string_literal());
|
||||
}
|
||||
|
||||
void Device::blit_from_depth_buffer(NonnullRefPtr<GPU::Image> image, u32 level, Vector2<u32> input_size, Vector2<i32> input_offset, Vector3<i32> output_offset)
|
||||
{
|
||||
auto input_layout = depth_buffer_data_layout(input_size, input_offset);
|
||||
auto const* input_data = m_frame_buffer->depth_buffer()->scanline(0);
|
||||
|
||||
auto const& softgpu_image = reinterpret_cast<Image*>(image.ptr());
|
||||
auto output_layout = softgpu_image->image_data_layout(level, output_offset);
|
||||
auto* output_data = softgpu_image->texel_pointer(0, level, 0, 0, 0);
|
||||
|
||||
PixelConverter converter { input_layout, output_layout };
|
||||
auto conversion_result = converter.convert(input_data, output_data, {});
|
||||
if (conversion_result.is_error())
|
||||
dbgln("Pixel conversion failed: {}", conversion_result.error().string_literal());
|
||||
}
|
||||
|
||||
void Device::blit_to_color_buffer_at_raster_position(void const* input_data, GPU::ImageDataLayout const& input_layout)
|
||||
{
|
||||
if (!m_raster_position.valid)
|
||||
|
|
|
@ -53,8 +53,10 @@ public:
|
|||
virtual void clear_depth(GPU::DepthType) override;
|
||||
virtual void clear_stencil(GPU::StencilType) override;
|
||||
virtual void blit_from_color_buffer(Gfx::Bitmap& target) override;
|
||||
virtual void blit_from_color_buffer(NonnullRefPtr<GPU::Image>, u32 level, Vector2<u32> input_size, Vector2<i32> input_offset, Vector3<i32> output_offset) override;
|
||||
virtual void blit_from_color_buffer(void*, Vector2<i32> offset, GPU::ImageDataLayout const&) override;
|
||||
virtual void blit_from_depth_buffer(void*, Vector2<i32> offset, GPU::ImageDataLayout const&) override;
|
||||
virtual void blit_from_depth_buffer(NonnullRefPtr<GPU::Image>, u32 level, Vector2<u32> input_size, Vector2<i32> input_offset, Vector3<i32> output_offset) override;
|
||||
virtual void blit_to_color_buffer_at_raster_position(void const*, GPU::ImageDataLayout const&) override;
|
||||
virtual void blit_to_depth_buffer_at_raster_position(void const*, GPU::ImageDataLayout const&) override;
|
||||
virtual void set_options(GPU::RasterizerOptions const&) override;
|
||||
|
|
|
@ -31,6 +31,8 @@ public:
|
|||
bool height_is_power_of_two() const { return m_height_is_power_of_two; }
|
||||
bool depth_is_power_of_two() const { return m_depth_is_power_of_two; }
|
||||
|
||||
GPU::ImageDataLayout image_data_layout(u32 level, Vector3<i32> offset) const;
|
||||
|
||||
FloatVector4 texel(u32 layer, u32 level, int x, int y, int z) const
|
||||
{
|
||||
return *texel_pointer(layer, level, x, y, z);
|
||||
|
@ -45,9 +47,6 @@ public:
|
|||
virtual void read_texels(u32 layer, u32 level, Vector3<i32> const& input_offset, void* output_data, GPU::ImageDataLayout const&) const override;
|
||||
virtual void copy_texels(GPU::Image const& source, u32 source_layer, u32 source_level, Vector3<u32> const& source_offset, Vector3<u32> const& size, u32 destination_layer, u32 destination_level, Vector3<u32> const& destination_offset) override;
|
||||
|
||||
private:
|
||||
GPU::ImageDataLayout image_data_layout(u32 level, Vector3<i32> offset) const;
|
||||
|
||||
FloatVector4 const* texel_pointer(u32 layer, u32 level, int x, int y, int z) const
|
||||
{
|
||||
return m_mipmap_buffers[layer * m_num_layers + level]->buffer_pointer(x, y, z);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue