X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=blobdiff_plain;f=source%2Ftexture.cpp;h=581ec705690d556320bc412577a7ad8e5f4d0adb;hp=4efa8ac998ad4ab80a3a6fa57a531b9d15422c18;hb=08e19bc2b4eba572bc7699378cf55cd8772ac67e;hpb=b2c8b2238877f76cdea184cca70336b15ddb78d9 diff --git a/source/texture.cpp b/source/texture.cpp index 4efa8ac9..581ec705 100644 --- a/source/texture.cpp +++ b/source/texture.cpp @@ -1,3 +1,4 @@ +#include #include #include #include @@ -63,6 +64,8 @@ Texture::Texture(GLenum t, ResourceManager *m): { if(m) set_manager(m); + else if(ARB_direct_state_access) + glCreateTextures(target, 1, &id); else glGenTextures(1, &id); } @@ -83,7 +86,7 @@ DataType Texture::get_alloc_type(PixelFormat fmt) void Texture::update_parameter(int mask) const { - if(TexUnit::current().get_texture()!=this) + if(!ARB_direct_state_access && TexUnit::current().get_texture()!=this) { TexUnit *unit = TexUnit::find_unit(this); if(!unit) @@ -96,23 +99,39 @@ void Texture::update_parameter(int mask) const } if(mask&MIN_FILTER) - glTexParameteri(target, GL_TEXTURE_MIN_FILTER, min_filter); + set_parameter_i(GL_TEXTURE_MIN_FILTER, min_filter); if(mask&MAG_FILTER) - glTexParameteri(target, GL_TEXTURE_MAG_FILTER, mag_filter); + set_parameter_i(GL_TEXTURE_MAG_FILTER, mag_filter); if(mask&MAX_ANISOTROPY) - glTexParameterf(target, GL_TEXTURE_MAX_ANISOTROPY_EXT, max_anisotropy); + set_parameter_f(GL_TEXTURE_MAX_ANISOTROPY_EXT, max_anisotropy); if(mask&WRAP_S) - glTexParameteri(target, GL_TEXTURE_WRAP_S, wrap_s); + set_parameter_i(GL_TEXTURE_WRAP_S, wrap_s); if(mask&WRAP_T) - glTexParameteri(target, GL_TEXTURE_WRAP_T, wrap_t); + set_parameter_i(GL_TEXTURE_WRAP_T, wrap_t); if(mask&WRAP_R) - glTexParameteri(target, GL_TEXTURE_WRAP_R, wrap_r); + set_parameter_i(GL_TEXTURE_WRAP_R, wrap_r); if(mask&GENERATE_MIPMAP) - glTexParameteri(target, GL_GENERATE_MIPMAP, gen_mipmap); + set_parameter_i(GL_GENERATE_MIPMAP, gen_mipmap); if(mask&COMPARE) - glTexParameteri(target, GL_TEXTURE_COMPARE_MODE, (compare ? GL_COMPARE_R_TO_TEXTURE : GL_NONE)); + set_parameter_i(GL_TEXTURE_COMPARE_MODE, (compare ? GL_COMPARE_R_TO_TEXTURE : GL_NONE)); if(mask&COMPARE_FUNC) - glTexParameteri(target, GL_TEXTURE_COMPARE_FUNC, cmp_func); + set_parameter_i(GL_TEXTURE_COMPARE_FUNC, cmp_func); +} + +void Texture::set_parameter_i(GLenum param, int value) const +{ + if(ARB_direct_state_access) + glTextureParameteri(id, param, value); + else + glTexParameteri(target, param, value); +} + +void Texture::set_parameter_f(GLenum param, float value) const +{ + if(ARB_direct_state_access) + glTextureParameterf(id, param, value); + else + glTexParameterf(target, param, value); } void Texture::set_min_filter(TextureFilter f) @@ -183,7 +202,12 @@ void Texture::auto_generate_mipmap() { // glGenerateMipmap is defined here if(EXT_framebuffer_object) - glGenerateMipmap(target); + { + if(ARB_direct_state_access) + glGenerateTextureMipmap(id); + else + glGenerateMipmap(target); + } } void Texture::set_compare_enabled(bool c)