]> git.tdb.fi Git - libs/gl.git/blobdiff - source/core/texture.cpp
Mark constant data as const
[libs/gl.git] / source / core / texture.cpp
index 3adc511e23ca2640d0ed7e5a4fc6644b50a65c40..e607792c9dc6f50103c2bd30d195343d107976b3 100644 (file)
@@ -3,7 +3,6 @@
 #include <msp/gl/extensions/ext_framebuffer_object.h>
 #include <msp/gl/extensions/khr_debug.h>
 #include <msp/io/memory.h>
-#include "bindable.h"
 #include "error.h"
 #include "resourcemanager.h"
 #include "resources.h"
@@ -14,7 +13,7 @@ using namespace std;
 namespace Msp {
 namespace GL {
 
-int Texture::swizzle_orders[] =
+const int Texture::swizzle_orders[] =
 {
        GL_RED, GL_GREEN, GL_BLUE, GL_ALPHA,
        GL_RED, GL_RED, GL_RED, GL_ONE,
@@ -22,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),
@@ -46,6 +47,8 @@ Texture::Texture(GLenum t, ResourceManager *m):
 
 Texture::~Texture()
 {
+       if(this==scratch_binding)
+               unbind_scratch();
        if(id)
                glDeleteTextures(1, &id);
 }
@@ -130,45 +133,18 @@ void Texture::set_parameter_i(GLenum param, int value) const
                glTexParameteri(target, param, value);
 }
 
-bool Texture::can_generate_mipmap()
-{
-       return EXT_framebuffer_object;
-}
-
 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)
-{
-       if(gm)
-               static Require _req(EXT_framebuffer_object);
-
-       auto_gen_mipmap = gm;
-}
-
-void Texture::load_image(const string &fn, bool)
-{
-       load_image(fn, 0U);
+       }
 }
 
 void Texture::load_image(const string &fn, unsigned lv)
@@ -179,11 +155,6 @@ void Texture::load_image(const string &fn, unsigned lv)
        image(img, lv);
 }
 
-void Texture::image(const Graphics::Image &img, bool)
-{
-       image(img, 0U);
-}
-
 void Texture::set_debug_name(const string &name)
 {
 #ifdef DEBUG
@@ -195,6 +166,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)
@@ -219,6 +212,12 @@ void Texture::Loader::init()
        add("mipmap_levels", &Loader::mipmap_levels);
 }
 
+void Texture::Loader::finish()
+{
+       if(obj.auto_gen_mipmap)
+               obj.generate_mipmap();
+}
+
 void Texture::Loader::load_external_image(Graphics::Image &img, const string &fn)
 {
        RefPtr<IO::Seekable> io = get_collection().open_raw(fn);
@@ -253,7 +252,7 @@ void Texture::Loader::external_image_common(const string &fn)
 
 void Texture::Loader::generate_mipmap(bool gm)
 {
-       obj.set_auto_generate_mipmap(gm);
+       obj.auto_gen_mipmap = gm;
 }
 
 void Texture::Loader::image_data(const string &data)