From 0b0be3539fe1f2cdc9c9caf7cc9831399565d6f4 Mon Sep 17 00:00:00 2001 From: lisyarus Date: Mon, 20 Mar 2023 13:57:31 +0300 Subject: [PATCH] Include mipmaps in texture memory usage --- libs/gfx/include/psemek/gfx/texture.hpp | 30 ++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/libs/gfx/include/psemek/gfx/texture.hpp b/libs/gfx/include/psemek/gfx/texture.hpp index 5ddb343d..5352cfd4 100644 --- a/libs/gfx/include/psemek/gfx/texture.hpp +++ b/libs/gfx/include/psemek/gfx/texture.hpp @@ -82,10 +82,13 @@ namespace psemek::gfx void mirrored_repeat(); void clamp(); + bool uses_mipmaps() const { return uses_mipmaps_; } + protected: GLuint id_ = 0; GLint format_ = 0; geom::vector size_ = geom::vector::zero(); + bool uses_mipmaps_ = true; explicit basic_texture(std::nullptr_t); }; @@ -454,6 +457,7 @@ namespace psemek::gfx bind(); gl::TexParameteri(Target, gl::TEXTURE_MIN_FILTER, gl::NEAREST); gl::TexParameteri(Target, gl::TEXTURE_MAG_FILTER, gl::NEAREST); + uses_mipmaps_ = false; } template @@ -462,6 +466,7 @@ namespace psemek::gfx bind(); gl::TexParameteri(Target, gl::TEXTURE_MIN_FILTER, gl::LINEAR); gl::TexParameteri(Target, gl::TEXTURE_MAG_FILTER, gl::LINEAR); + uses_mipmaps_ = false; } template @@ -470,6 +475,7 @@ namespace psemek::gfx bind(); gl::TexParameteri(Target, gl::TEXTURE_MIN_FILTER, gl::LINEAR_MIPMAP_LINEAR); gl::TexParameteri(Target, gl::TEXTURE_MAG_FILTER, gl::LINEAR); + uses_mipmaps_ = true; } @@ -613,7 +619,29 @@ namespace psemek::gfx auto size = texture.width() * texture.height() * texture.depth(); if (size == 0) return 0; - return size * pixel_size(texture.internal_format()); + + float mipmap_factor = 1.f; + if (texture.uses_mipmaps()) + { + switch (Target) + { + case gl::TEXTURE_1D: + case gl::TEXTURE_1D_ARRAY: + mipmap_factor = 2.f; + break; + case gl::TEXTURE_2D: + case gl::TEXTURE_2D_ARRAY: + mipmap_factor = 4.f / 3.f; + break; + case gl::TEXTURE_3D: + mipmap_factor = 8.f / 7.f; + break; + default: + break; + } + } + + return std::ceil(mipmap_factor * size * pixel_size(texture.internal_format())); } }