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 mirrored_repeat();
void clamp(); void clamp();
bool uses_mipmaps() const { return uses_mipmaps_; }
protected: protected:
GLuint id_ = 0; GLuint id_ = 0;
GLint format_ = 0; GLint format_ = 0;
geom::vector<std::size_t, D> size_ = geom::vector<std::size_t, D>::zero(); geom::vector<std::size_t, D> size_ = geom::vector<std::size_t, D>::zero();
bool uses_mipmaps_ = true;
explicit basic_texture(std::nullptr_t); explicit basic_texture(std::nullptr_t);
}; };
@ -454,6 +457,7 @@ namespace psemek::gfx
bind(); bind();
gl::TexParameteri(Target, gl::TEXTURE_MIN_FILTER, gl::NEAREST); gl::TexParameteri(Target, gl::TEXTURE_MIN_FILTER, gl::NEAREST);
gl::TexParameteri(Target, gl::TEXTURE_MAG_FILTER, gl::NEAREST); gl::TexParameteri(Target, gl::TEXTURE_MAG_FILTER, gl::NEAREST);
uses_mipmaps_ = false;
} }
template <std::size_t D, GLenum Target> template <std::size_t D, GLenum Target>
@ -462,6 +466,7 @@ namespace psemek::gfx
bind(); bind();
gl::TexParameteri(Target, gl::TEXTURE_MIN_FILTER, gl::LINEAR); gl::TexParameteri(Target, gl::TEXTURE_MIN_FILTER, gl::LINEAR);
gl::TexParameteri(Target, gl::TEXTURE_MAG_FILTER, gl::LINEAR); gl::TexParameteri(Target, gl::TEXTURE_MAG_FILTER, gl::LINEAR);
uses_mipmaps_ = false;
} }
template <std::size_t D, GLenum Target> template <std::size_t D, GLenum Target>
@ -470,6 +475,7 @@ namespace psemek::gfx
bind(); bind();
gl::TexParameteri(Target, gl::TEXTURE_MIN_FILTER, gl::LINEAR_MIPMAP_LINEAR); gl::TexParameteri(Target, gl::TEXTURE_MIN_FILTER, gl::LINEAR_MIPMAP_LINEAR);
gl::TexParameteri(Target, gl::TEXTURE_MAG_FILTER, gl::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(); auto size = texture.width() * texture.height() * texture.depth();
if (size == 0) if (size == 0)
return 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()));
} }
} }