X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=blobdiff_plain;f=source%2Ftexture.cpp;h=1d2ece8074410ded753c621f4c4dd43418e2694d;hp=b545b16606eaa64a47c2baac3cedd82df39df029;hb=a993091fbb8fdb76a1d02be9de59529c14b59cf0;hpb=8f373af3e375799dd739fe932bc697e8595756b4 diff --git a/source/texture.cpp b/source/texture.cpp index b545b166..1d2ece80 100644 --- a/source/texture.cpp +++ b/source/texture.cpp @@ -1,5 +1,6 @@ #include #include +#include #include #include #include @@ -49,6 +50,13 @@ void operator>>(const LexicalConverter &c, TextureWrap &tw) } +int Texture::swizzle_orders[] = +{ + GL_RED, GL_GREEN, GL_BLUE, GL_ALPHA, + GL_RED, GL_RED, GL_RED, GL_ONE, + GL_RED, GL_RED, GL_RED, GL_GREEN +}; + Texture::Texture(GLenum t, ResourceManager *m): id(0), target(t), @@ -87,14 +95,37 @@ DataType Texture::get_alloc_type(PixelFormat fmt) void Texture::set_internal_format(PixelFormat fmt) { - if(!get_component_size(fmt) && MSP_sized_internal_formats) + if(!get_component_size(fmt) && OES_required_internalformat) + fmt = get_default_sized_pixelformat(fmt); + + FormatSwizzle swiz = NO_SWIZZLE; + if(ARB_texture_rg && ARB_texture_swizzle) { - unsigned size = (fmt==DEPTH_COMPONENT ? get_gl_api()==OPENGL_ES2 ? 2 : 4 : 1); - fmt = get_sized_pixelformat(fmt, size); + if(fmt==LUMINANCE8 || fmt==SLUMINANCE8) + { + fmt = R8; + swiz = R_TO_LUMINANCE; + } + else if(fmt==LUMINANCE8_ALPHA8 || fmt==SLUMINANCE8_ALPHA8) + { + fmt = RG8; + swiz = RG_TO_LUMINANCE_ALPHA; + } } require_pixelformat(fmt); ifmt = fmt; + swizzle = swiz; + if(swizzle) + update_parameter(FORMAT_SWIZZLE); +} + +PixelFormat Texture::get_upload_format(PixelFormat fmt) const +{ + if(fmt==LUMINANCE || fmt==LUMINANCE_ALPHA) + return get_base_pixelformat(ifmt); + else + return fmt; } void Texture::update_parameter(int mask) const @@ -129,6 +160,23 @@ void Texture::update_parameter(int mask) const set_parameter_i(GL_TEXTURE_COMPARE_MODE, (compare ? GL_COMPARE_R_TO_TEXTURE : GL_NONE)); if(mask&COMPARE_FUNC) set_parameter_i(GL_TEXTURE_COMPARE_FUNC, cmp_func); + if(mask&FORMAT_SWIZZLE) + { + if(get_gl_api()==OPENGL_ES2) + { + set_parameter_i(GL_TEXTURE_SWIZZLE_R, swizzle_orders[swizzle*4]); + set_parameter_i(GL_TEXTURE_SWIZZLE_G, swizzle_orders[swizzle*4+1]); + set_parameter_i(GL_TEXTURE_SWIZZLE_B, swizzle_orders[swizzle*4+2]); + set_parameter_i(GL_TEXTURE_SWIZZLE_A, swizzle_orders[swizzle*4+3]); + } + else + { + if(ARB_direct_state_access) + glTextureParameteriv(id, GL_TEXTURE_SWIZZLE_RGBA, swizzle_orders+swizzle*4); + else + glTexParameteriv(target, GL_TEXTURE_SWIZZLE_RGBA, swizzle_orders+swizzle*4); + } + } } void Texture::set_parameter_i(GLenum param, int value) const @@ -202,6 +250,11 @@ void Texture::set_wrap_r(TextureWrap w) update_parameter(WRAP_R); } +bool Texture::can_generate_mipmap() +{ + return (EXT_framebuffer_object || SGIS_generate_mipmap); +} + void Texture::set_generate_mipmap(bool gm) { if(gm && !EXT_framebuffer_object)