summaryrefslogtreecommitdiffstats
path: root/src/mesa/state_tracker
diff options
context:
space:
mode:
authorKenneth Graunke <[email protected]>2020-01-14 16:25:11 -0800
committerKenneth Graunke <[email protected]>2020-01-16 00:06:54 -0800
commite3405f177bdff591423e1fe154defba10d326d55 (patch)
tree8ad51ec36384ad9b0065a0e709fb791c1da2c7d9 /src/mesa/state_tracker
parent68abc0731715b2ec3048d0944250b96a5302b4bc (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/state_tracker')
-rw-r--r--src/mesa/state_tracker/st_cb_texture.c11
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 */