]> git.tdb.fi Git - libs/gl.git/blobdiff - source/core/texture.cpp
Use a scratch binding to modify textures and buffers
[libs/gl.git] / source / core / texture.cpp
index 347634d4c27fa204d169c6a731f39139165f3213..b40046705b32bdfbecd459b56ce5e9b7c81ae4d9 100644 (file)
@@ -21,6 +21,8 @@ int Texture::swizzle_orders[] =
        GL_BLUE, GL_GREEN, GL_RED, GL_ALPHA
 };
 
+Texture *Texture::scratch_binding = 0;
+
 Texture::Texture(GLenum t, ResourceManager *m):
        id(0),
        target(t),
@@ -45,6 +47,8 @@ Texture::Texture(GLenum t, ResourceManager *m):
 
 Texture::~Texture()
 {
+       if(this==scratch_binding)
+               unbind_scratch();
        if(id)
                glDeleteTextures(1, &id);
 }
@@ -139,22 +143,13 @@ void Texture::generate_mipmap()
        // glGenerateMipmap is defined here
        static Require _req(EXT_framebuffer_object);
 
-       if(!ARB_direct_state_access)
-       {
-               glActiveTexture(GL_TEXTURE0);
-               glBindTexture(target, id);
-       }
-       generate_mipmap_();
-       if(!ARB_direct_state_access)
-               glBindTexture(target, 0);
-}
-
-void Texture::generate_mipmap_()
-{
        if(ARB_direct_state_access)
                glGenerateTextureMipmap(id);
        else
+       {
+               bind_scratch();
                glGenerateMipmap(target);
+       }
 }
 
 void Texture::set_auto_generate_mipmap(bool gm)
@@ -194,6 +189,28 @@ void Texture::set_debug_name(const string &name)
 #endif
 }
 
+void Texture::bind_scratch()
+{
+       if(!scratch_binding)
+               glActiveTexture(GL_TEXTURE0);
+       if(scratch_binding!=this)
+       {
+               if(scratch_binding && scratch_binding->target!=target)
+                       glBindTexture(scratch_binding->target, 0);
+               glBindTexture(target, id);
+               scratch_binding = this;
+       }
+}
+
+void Texture::unbind_scratch()
+{
+       if(scratch_binding)
+       {
+               glBindTexture(scratch_binding->target, 0);
+               scratch_binding = 0;
+       }
+}
+
 
 Texture::Loader::Loader(Texture &t):
        DataFile::CollectionObjectLoader<Texture>(t, 0)