]> git.tdb.fi Git - libs/gl.git/blobdiff - source/texture.cpp
Use DSA for binding textures if available
[libs/gl.git] / source / texture.cpp
index 1d2ece8074410ded753c621f4c4dd43418e2694d..f095fe98aadcb99500ecad562275027453d14dcf 100644 (file)
@@ -63,6 +63,7 @@ Texture::Texture(GLenum t, ResourceManager *m):
        ifmt(RGB),
        min_filter(NEAREST_MIPMAP_LINEAR),
        mag_filter(LINEAR),
+       max_anisotropy(1.0f),
        wrap_s(REPEAT),
        wrap_t(REPEAT),
        wrap_r(REPEAT),
@@ -220,7 +221,8 @@ void Texture::set_max_anisotropy(float a)
        else if(a>1.0f)
                static Require _req(EXT_texture_filter_anisotropic);
        max_anisotropy = a;
-       update_parameter(MAX_ANISOTROPY);
+       if(EXT_texture_filter_anisotropic)
+               update_parameter(MAX_ANISOTROPY);
 }
 
 void Texture::set_wrap(TextureWrap w)
@@ -319,15 +321,20 @@ void Texture::bind_to(unsigned i) const
                if(manager)
                        manager->resource_used(*this);
 
-               unit.bind();
-               if(unit.supports_legacy())
+               if(ARB_direct_state_access && !unit.supports_legacy())
+                       glBindTextureUnit(i, id);
+               else
                {
-                       if(old && old->target!=target)
-                               glDisable(old->target);
-                       if(!old || old->target!=target)
-                               glEnable(target);
+                       unit.bind();
+                       if(unit.supports_legacy())
+                       {
+                               if(old && old->target!=target)
+                                       glDisable(old->target);
+                               if((!old || old->target!=target))
+                                       glEnable(target);
+                       }
+                       glBindTexture(target, id);
                }
-               glBindTexture(target, id);
 
                if(dirty_params)
                {
@@ -348,10 +355,15 @@ void Texture::unbind_from(unsigned i)
        const Texture *cur = unit.get_texture();
        if(unit.set_texture(0))
        {
-               unit.bind();
-               glBindTexture(cur->target, 0);
-               if(unit.supports_legacy())
-                       glDisable(cur->target);
+               if(ARB_direct_state_access && !unit.supports_legacy())
+                       glBindTextureUnit(i, 0);
+               else
+               {
+                       unit.bind();
+                       glBindTexture(cur->target, 0);
+                       if(unit.supports_legacy())
+                               glDisable(cur->target);
+               }
        }
 }