Include mipmaps in texture memory usage
This commit is contained in:
parent
d824159c2f
commit
0b0be3539f
1 changed files with 29 additions and 1 deletions
|
|
@ -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()));
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue