Include mipmaps in texture memory usage

This commit is contained in:
Nikita Lisitsa 2023-03-20 13:57:31 +03:00
parent d824159c2f
commit 0b0be3539f

View file

@ -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<std::size_t, D> size_ = geom::vector<std::size_t, D>::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 <std::size_t D, GLenum Target>
@ -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 <std::size_t D, GLenum Target>
@ -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()));
}
}