[Mesa-dev,03/19] mesa: Optimize unbind_texobj_from_texunits()

Submitted by Fredrik Höglund on April 21, 2014, 9:57 p.m.

Details

Message ID 1398117477-10313-4-git-send-email-fredrik@kde.org
State New
Headers show

Not browsing as part of any series.

Commit Message

Fredrik Höglund April 21, 2014, 9:57 p.m.
The texture can only be bound to the index that corresponds to its
target, so there is no need to loop over all possible indices
for every unit and checking if the texture is bound to it.
---

v2: Restructure the loop to avoid using continue, and use
    &= ~(1 << index) to clear bits in _BoundTextures.

 src/mesa/main/texobj.c | 20 +++++++++++---------
 1 file changed, 11 insertions(+), 9 deletions(-)

Patch hide | download patch | download mbox

diff --git a/src/mesa/main/texobj.c b/src/mesa/main/texobj.c
index 054b41b..7e43472 100644
--- a/src/mesa/main/texobj.c
+++ b/src/mesa/main/texobj.c
@@ -1093,18 +1093,20 @@  static void
 unbind_texobj_from_texunits(struct gl_context *ctx,
                             struct gl_texture_object *texObj)
 {
-   GLuint u, tex;
+   const GLuint index = texObj->TargetIndex;
+   GLuint u;
+
+   if (texObj->Target == 0)
+      return;
 
    for (u = 0; u < Elements(ctx->Texture.Unit); u++) {
       struct gl_texture_unit *unit = &ctx->Texture.Unit[u];
-      for (tex = 0; tex < NUM_TEXTURE_TARGETS; tex++) {
-         if (texObj == unit->CurrentTex[tex]) {
-            _mesa_reference_texobj(&unit->CurrentTex[tex],
-                                   ctx->Shared->DefaultTex[tex]);
-            ASSERT(unit->CurrentTex[tex]);
-            unit->_BoundTextures &= ~(1 << tex);
-            break;
-         }
+
+      if (texObj == unit->CurrentTex[index]) {
+         /* Bind the default texture for this unit/target */
+         _mesa_reference_texobj(&unit->CurrentTex[index],
+                                ctx->Shared->DefaultTex[index]);
+         unit->_BoundTextures &= ~(1 << index);
       }
    }
 }

Comments

On 04/21/2014 03:57 PM, Fredrik Höglund wrote:
> The texture can only be bound to the index that corresponds to its
> target, so there is no need to loop over all possible indices
> for every unit and checking if the texture is bound to it.
> ---
>
> v2: Restructure the loop to avoid using continue, and use
>      &= ~(1 << index) to clear bits in _BoundTextures.
>
>   src/mesa/main/texobj.c | 20 +++++++++++---------
>   1 file changed, 11 insertions(+), 9 deletions(-)
>
> diff --git a/src/mesa/main/texobj.c b/src/mesa/main/texobj.c
> index 054b41b..7e43472 100644
> --- a/src/mesa/main/texobj.c
> +++ b/src/mesa/main/texobj.c
> @@ -1093,18 +1093,20 @@ static void
>   unbind_texobj_from_texunits(struct gl_context *ctx,
>                               struct gl_texture_object *texObj)
>   {
> -   GLuint u, tex;
> +   const GLuint index = texObj->TargetIndex;

Should that be const gl_texture_index index = ... ?


> +   GLuint u;
> +
> +   if (texObj->Target == 0)
> +      return;
>
>      for (u = 0; u < Elements(ctx->Texture.Unit); u++) {
>         struct gl_texture_unit *unit = &ctx->Texture.Unit[u];
> -      for (tex = 0; tex < NUM_TEXTURE_TARGETS; tex++) {
> -         if (texObj == unit->CurrentTex[tex]) {
> -            _mesa_reference_texobj(&unit->CurrentTex[tex],
> -                                   ctx->Shared->DefaultTex[tex]);
> -            ASSERT(unit->CurrentTex[tex]);
> -            unit->_BoundTextures &= ~(1 << tex);
> -            break;
> -         }
> +
> +      if (texObj == unit->CurrentTex[index]) {
> +         /* Bind the default texture for this unit/target */
> +         _mesa_reference_texobj(&unit->CurrentTex[index],
> +                                ctx->Shared->DefaultTex[index]);
> +         unit->_BoundTextures &= ~(1 << index);
>         }
>      }
>   }
>