diff options
author | Kenneth Graunke <[email protected]> | 2020-01-14 16:25:11 -0800 |
---|---|---|
committer | Kenneth Graunke <[email protected]> | 2020-01-16 00:06:54 -0800 |
commit | e3405f177bdff591423e1fe154defba10d326d55 (patch) | |
tree | 8ad51ec36384ad9b0065a0e709fb791c1da2c7d9 /src/mesa | |
parent | 68abc0731715b2ec3048d0944250b96a5302b4bc (diff) |
st/mesa: Allocate full miplevels if MaxLevel is explicitly set
Some applications explicitly call glTex[ture]Parameteri[v] to set
GL_TEXTURE_MAX_LEVEL and GL_TEXTURE_BASE_LEVEL before uploading any
texture data. Core Mesa initializes MaxLevel to 1000, so if it isn't
that, we know they've set it. (We check for < TEXTURE_MAX_LEVELS to
avoid hardcoding that value, however.)
If MaxLevel - BaseLevel > 0, then the app is trying to tell us that
this texture is going to have multiple miplevels. In that case, go
ahead and allocate the space for it.
Avoids many resource_copy_region calls at texture finalization time
in the Civilization VI benchmark.
Reviewed-by: Michel Dänzer <[email protected]>
Reviewed-by: Eric Anholt <[email protected]>
Reviewed-by: Marek Olšák <[email protected]>
Tested-by: Marge Bot <https://gitlab.freedesktop.org/mesa/mesa/merge_requests/3401>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/merge_requests/3401>
Diffstat (limited to 'src/mesa')
-rw-r--r-- | src/mesa/state_tracker/st_cb_texture.c | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/src/mesa/state_tracker/st_cb_texture.c b/src/mesa/state_tracker/st_cb_texture.c index 21f67659c0d..ff0f1a2efa6 100644 --- a/src/mesa/state_tracker/st_cb_texture.c +++ b/src/mesa/state_tracker/st_cb_texture.c @@ -525,6 +525,17 @@ allocate_full_mipmap(const struct st_texture_object *stObj, if (stImage->base.Level > 0 || stObj->base.GenerateMipmap) return TRUE; + /* If the application has explicitly called glTextureParameter to set + * GL_TEXTURE_MAX_LEVEL, such that (max - base) > 0, then they're trying + * to communicate that they will have multiple miplevels. + * + * Core Mesa will initialize MaxLevel to value much larger than + * MAX_TEXTURE_LEVELS, so we check that to see if it's been set at all. + */ + if (stObj->base.MaxLevel < MAX_TEXTURE_LEVELS && + stObj->base.MaxLevel - stObj->base.BaseLevel > 0) + return TRUE; + if (stImage->base._BaseFormat == GL_DEPTH_COMPONENT || stImage->base._BaseFormat == GL_DEPTH_STENCIL_EXT) /* depth/stencil textures are seldom mipmapped */ |