X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Ftexture.cpp;h=18746e5f2ecad265652b12804c2ec927e5d13fcd;hb=5c5d094255ae5b0a07f99392a5a099ad9c8e8e38;hp=21fc7a6ae9bb41711cf079795e752196c4a2e014;hpb=cdf928f03f4d8383b8fa978abc4c255a850ec061;p=libs%2Fgl.git diff --git a/source/texture.cpp b/source/texture.cpp index 21fc7a6a..18746e5f 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,11 +95,40 @@ DataType Texture::get_alloc_type(PixelFormat fmt) void Texture::set_internal_format(PixelFormat fmt) { - if(MSP_sized_internal_formats) - fmt = get_sized_pixelformat(fmt); + if(!get_component_size(fmt) && MSP_sized_internal_formats) + { + unsigned size = (fmt==DEPTH_COMPONENT ? get_gl_api()==OPENGL_ES2 ? 2 : 4 : 1); + fmt = get_sized_pixelformat(fmt, size); + } + + FormatSwizzle swiz = NO_SWIZZLE; + if(ARB_texture_rg && ARB_texture_swizzle) + { + 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 @@ -126,6 +163,13 @@ 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(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