#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"
#include "texture.h"
-#include "texunit.h"
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,
GL_BLUE, GL_GREEN, GL_RED, GL_ALPHA
};
+Texture *Texture::scratch_binding = 0;
+
Texture::Texture(GLenum t, ResourceManager *m):
id(0),
target(t),
- format(RGB8),
- storage_fmt(RGB8),
+ format(NO_PIXELFORMAT),
+ storage_fmt(format),
swizzle(NO_SWIZZLE),
use_srgb_format(false),
auto_gen_mipmap(false)
set_manager(m);
else
generate_id();
+
+ static bool alignment_init = false;
+ if(!alignment_init)
+ {
+ glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
+ alignment_init = true;
+ }
}
Texture::~Texture()
{
- while(TexUnit *unit = TexUnit::find_unit(this))
- unbind_from(unit->get_index());
-
+ if(this==scratch_binding)
+ unbind_scratch();
if(id)
glDeleteTextures(1, &id);
}
}
}
-void Texture::set_parameter_i(GLenum param, int value) const
+void Texture::set_parameter_i(unsigned param, int value) const
{
if(ARB_direct_state_access)
glTextureParameteri(id, param, value);
glTexParameteri(target, param, value);
}
-bool Texture::can_generate_mipmap()
-{
- return EXT_framebuffer_object;
-}
-
void Texture::generate_mipmap()
{
// glGenerateMipmap is defined here
glGenerateTextureMipmap(id);
else
{
- BindRestore _bind(this);
+ 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)
{
Graphics::Image img;
image(img, lv);
}
-void Texture::image(const Graphics::Image &img, bool)
+void Texture::set_debug_name(const string &name)
{
- image(img, 0U);
+#ifdef DEBUG
+ debug_name = name;
+ if(id && KHR_debug)
+ glObjectLabel(GL_TEXTURE, id, name.size(), name.c_str());
+#else
+ (void)name;
+#endif
}
-void Texture::bind_to(unsigned i) const
+void Texture::bind_scratch()
{
- if(!id)
- {
- if(manager)
- manager->resource_used(*this);
- if(!id)
- {
- unbind_from(i);
- return;
- }
- }
-
- TexUnit &unit = TexUnit::get_unit(i);
- if(unit.set_texture(this))
+ if(!scratch_binding)
+ glActiveTexture(GL_TEXTURE0);
+ if(scratch_binding!=this)
{
- if(manager)
- manager->resource_used(*this);
-
- if(ARB_direct_state_access)
- glBindTextureUnit(i, id);
- else
- {
- unit.bind();
- glBindTexture(target, id);
- }
+ if(scratch_binding && scratch_binding->target!=target)
+ glBindTexture(scratch_binding->target, 0);
+ glBindTexture(target, id);
+ scratch_binding = this;
}
}
-const Texture *Texture::current(unsigned i)
-{
- return TexUnit::get_unit(i).get_texture();
-}
-
-void Texture::unbind_from(unsigned i)
+void Texture::unbind_scratch()
{
- TexUnit &unit = TexUnit::get_unit(i);
- const Texture *cur = unit.get_texture();
- if(unit.set_texture(0))
+ if(scratch_binding)
{
- if(ARB_direct_state_access)
- glBindTextureUnit(i, 0);
- else
- {
- unit.bind();
- glBindTexture(cur->target, 0);
- }
+ glBindTexture(scratch_binding->target, 0);
+ scratch_binding = 0;
}
}
-void Texture::set_debug_name(const string &name)
-{
-#ifdef DEBUG
- debug_name = name;
- if(id && KHR_debug)
- glObjectLabel(GL_TEXTURE, id, name.size(), name.c_str());
-#else
- (void)name;
-#endif
-}
-
Texture::Loader::Loader(Texture &t):
DataFile::CollectionObjectLoader<Texture>(t, 0)
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);
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)