#include <msp/gl/extensions/arb_direct_state_access.h>
#include <msp/gl/extensions/arb_texture_swizzle.h>
#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"
{
if(m)
set_manager(m);
- else if(ARB_direct_state_access)
- glCreateTextures(target, 1, &id);
else
- glGenTextures(1, &id);
+ generate_id();
}
Texture::~Texture()
glDeleteTextures(1, &id);
}
+void Texture::generate_id()
+{
+ if(id)
+ throw invalid_operation("Texture::generate_id");
+ if(ARB_direct_state_access)
+ glCreateTextures(target, 1, &id);
+ else
+ glGenTextures(1, &id);
+
+#ifdef DEBUG
+ if(!debug_name.empty() && KHR_debug)
+ glObjectLabel(GL_TEXTURE, id, debug_name.size(), debug_name.c_str());
+#endif
+}
+
void Texture::set_format(PixelFormat fmt)
{
PixelComponents comp = get_components(fmt);
default:;
}
- PixelFormat st_fmt = make_pixelformat(st_comp, get_component_type(fmt));
+ PixelFormat st_fmt = make_pixelformat(st_comp, get_component_type(fmt), is_srgb(fmt));
require_pixelformat(st_fmt);
if(swiz!=NO_SWIZZLE)
static Require _req(ARB_texture_swizzle);
}
}
+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)
levels = 0;
add("external_image", &Loader::external_image);
- add("external_image_srgb", &Loader::external_image);
+ add("external_image_srgb", &Loader::external_image_srgb);
add("filter", &Loader::filter);
add("generate_mipmap", &Loader::generate_mipmap);
add("image_data", &Loader::image_data);
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
-void Texture::Loader::load_external_image(Graphics::Image &img, const std::string &fn)
+void Texture::Loader::load_external_image(Graphics::Image &img, const string &fn)
{
RefPtr<IO::Seekable> io = get_collection().open_raw(fn);
if(!io)
void Texture::Loader::image_data(const string &data)
{
+ if(obj.manager)
+ {
+ obj.set_manager(0);
+ if(!obj.id)
+ obj.generate_id();
+ }
+
Graphics::Image img;
IO::Memory mem(data.data(), data.size());
img.load_io(mem);