1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-27 13:07:46 +00:00

LibGPU+LibSoftGPU: Move size and pixel format information to GPU::Image

Size and format information are the same for every implementation and do
not need to be virtual. This removes the need to reimplement them for
each driver.
This commit is contained in:
Stephan Unverwerth 2022-12-19 14:25:17 +01:00 committed by Andreas Kling
parent dc8be499e6
commit 3b2ded1d44
6 changed files with 51 additions and 37 deletions

View file

@ -1,5 +1,6 @@
set(SOURCES
Driver.cpp
Image.cpp
)
serenity_lib(LibGPU gpu)

View file

@ -0,0 +1,32 @@
/*
* Copyright (c) 2022, Stephan Unverwerth <s.unverwerth@serenityos.org>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
#include <AK/Math.h>
#include <LibGPU/Image.h>
namespace GPU {
Image::Image(void const* ownership_token, GPU::PixelFormat const& pixel_format, u32 width, u32 height, u32 depth, u32 max_levels)
: m_ownership_token { ownership_token }
, m_pixel_format { pixel_format }
{
VERIFY(width > 0);
VERIFY(height > 0);
VERIFY(depth > 0);
VERIFY(max_levels > 0);
u32 number_of_levels_in_full_chain = max(max(AK::log2(width), AK::log2(height)), AK::log2(depth)) + 1;
m_mipmap_sizes.resize(min(max_levels, number_of_levels_in_full_chain));
for (u32 level = 0; level < m_mipmap_sizes.size(); ++level) {
m_mipmap_sizes[level] = { width, height, depth };
width = max(width / 2, 1);
height = max(height / 2, 1);
depth = max(depth / 2, 1);
}
}
}

View file

@ -8,24 +8,24 @@
#pragma once
#include <AK/RefCounted.h>
#include <AK/Vector.h>
#include <LibGPU/ImageDataLayout.h>
#include <LibGPU/ImageFormat.h>
#include <LibGfx/Vector3.h>
namespace GPU {
class Image : public RefCounted<Image> {
public:
Image(void const* ownership_token)
: m_ownership_token { ownership_token }
{
}
Image(void const* ownership_token, PixelFormat const&, u32 width, u32 height, u32 depth, u32 max_levels);
virtual ~Image() { }
virtual u32 width_at_level(u32 level) const = 0;
virtual u32 height_at_level(u32 level) const = 0;
virtual u32 depth_at_level(u32 level) const = 0;
virtual u32 number_of_levels() const = 0;
u32 width_at_level(u32 level) const { return m_mipmap_sizes[level].x(); }
u32 height_at_level(u32 level) const { return m_mipmap_sizes[level].y(); }
u32 depth_at_level(u32 level) const { return m_mipmap_sizes[level].z(); }
u32 number_of_levels() const { return m_mipmap_sizes.size(); }
PixelFormat pixel_format() const { return m_pixel_format; }
virtual void regenerate_mipmaps() = 0;
@ -38,6 +38,8 @@ public:
private:
void const* const m_ownership_token { nullptr };
Vector<Vector3<u32>> m_mipmap_sizes;
PixelFormat m_pixel_format;
};
}