mirror of
https://github.com/RGBCube/serenity
synced 2025-05-31 07:08:10 +00:00

A GPU (driver) is now responsible for reading and writing pixels from and to user data. The client (LibGL) is responsible for specifying how the user data must be interpreted or written to. This allows us to centralize all pixel format conversion in one class, `LibSoftGPU::PixelConverter`. For both the input and output image, it takes a specification containing the image dimensions, the pixel type and the selection (basically a clipping rect), and converts the pixels from the input image to the output image. Effectively this means we now support almost all OpenGL 1.5 formats, and all custom logic has disappeared from: - `glDrawPixels` - `glReadPixels` - `glTexImage2D` - `glTexSubImage2D` The new logic is still unoptimized, but on my machine I experienced no noticeable slowdown. :^)
35 lines
1.2 KiB
C++
35 lines
1.2 KiB
C++
/*
|
|
* Copyright (c) 2022, Stephan Unverwerth <s.unverwerth@serenityos.org>
|
|
*
|
|
* SPDX-License-Identifier: BSD-2-Clause
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include <AK/RefCounted.h>
|
|
#include <LibGPU/ImageDataLayout.h>
|
|
#include <LibGfx/Vector3.h>
|
|
|
|
namespace GPU {
|
|
|
|
class Image : public RefCounted<Image> {
|
|
public:
|
|
Image(void const* ownership_token)
|
|
: m_ownership_token { ownership_token }
|
|
{
|
|
}
|
|
|
|
virtual ~Image() { }
|
|
|
|
virtual void write_texels(u32 layer, u32 level, Vector3<i32> const& output_offset, void const* data, ImageDataLayout const&) = 0;
|
|
virtual void read_texels(u32 layer, u32 level, Vector3<i32> const& input_offset, void* data, ImageDataLayout const&) const = 0;
|
|
virtual void copy_texels(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) = 0;
|
|
|
|
void const* ownership_token() const { return m_ownership_token; }
|
|
bool has_same_ownership_token(Image const& other) const { return other.ownership_token() == ownership_token(); }
|
|
|
|
private:
|
|
void const* const m_ownership_token { nullptr };
|
|
};
|
|
|
|
}
|