X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fvideo%2Fgl%2Fgl_texture.cpp;h=443fa0121e1661b8d465bc8ea1018aa715eea181;hb=aa9dd770ebf02361a846acfaef136864b82b92ce;hp=9618bef7c55ba013fcb4a8ad2ae43ab7727be197;hpb=6c15389f1fb96b800d800e7c0256aa27afa0778f;p=supertux.git diff --git a/src/video/gl/gl_texture.cpp b/src/video/gl/gl_texture.cpp index 9618bef7c..443fa0121 100644 --- a/src/video/gl/gl_texture.cpp +++ b/src/video/gl/gl_texture.cpp @@ -17,12 +17,18 @@ #include "supertux/gameconfig.hpp" #include "video/gl/gl_texture.hpp" +#ifdef USE_GLBINDING + #include +#endif + namespace { +#ifdef GL_VERSION_ES_CM_1_0 inline bool is_power_of_2(int v) { return (v & (v-1)) == 0; } +#endif inline int next_power_of_two(int val) { @@ -35,70 +41,79 @@ inline int next_power_of_two(int val) } // namespace GLTexture::GLTexture(unsigned int width, unsigned int height) : - handle(), - texture_width(), - texture_height(), - image_width(), - image_height() + m_handle(), + m_texture_width(), + m_texture_height(), + m_image_width(), + m_image_height() { #ifdef GL_VERSION_ES_CM_1_0 assert(is_power_of_2(width)); assert(is_power_of_2(height)); #endif - texture_width = width; - texture_height = height; - image_width = width; - image_height = height; + m_texture_width = width; + m_texture_height = height; + m_image_width = width; + m_image_height = height; assert_gl("before creating texture"); - glGenTextures(1, &handle); + glGenTextures(1, &m_handle); try { - glBindTexture(GL_TEXTURE_2D, handle); + glBindTexture(GL_TEXTURE_2D, m_handle); - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, texture_width, - texture_height, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); + glTexImage2D(GL_TEXTURE_2D, 0, static_cast(GL_RGBA), m_texture_width, + m_texture_height, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); set_texture_params(); } catch(...) { - glDeleteTextures(1, &handle); + glDeleteTextures(1, &m_handle); throw; } } GLTexture::GLTexture(SDL_Surface* image) : - handle(), - texture_width(), - texture_height(), - image_width(), - image_height() + m_handle(), + m_texture_width(), + m_texture_height(), + m_image_width(), + m_image_height() { #ifdef GL_VERSION_ES_CM_1_0 - texture_width = next_power_of_two(image->w); - texture_height = next_power_of_two(image->h); + m_texture_width = next_power_of_two(image->w); + m_texture_height = next_power_of_two(image->h); #else +# ifdef USE_GLBINDING + static auto extensions = glbinding::ContextInfo::extensions(); + if (extensions.find(GLextension::GL_ARB_texture_non_power_of_two) != extensions.end()) + { + m_texture_width = image->w; + m_texture_height = image->h; + } +# else if (GLEW_ARB_texture_non_power_of_two) { - texture_width = image->w; - texture_height = image->h; + m_texture_width = image->w; + m_texture_height = image->h; } +# endif else { - texture_width = next_power_of_two(image->w); - texture_height = next_power_of_two(image->h); + m_texture_width = next_power_of_two(image->w); + m_texture_height = next_power_of_two(image->h); } #endif - image_width = image->w; - image_height = image->h; + m_image_width = image->w; + m_image_height = image->h; #if SDL_BYTEORDER == SDL_BIG_ENDIAN - SDL_Surface* convert = SDL_CreateRGBSurface(SDL_SWSURFACE, - texture_width, texture_height, 32, + SDL_Surface* convert = SDL_CreateRGBSurface(0, + m_texture_width, m_texture_height, 32, 0xff000000, 0x00ff0000, 0x0000ff00, 0x000000ff); #else - SDL_Surface* convert = SDL_CreateRGBSurface(SDL_SWSURFACE, - texture_width, texture_height, 32, + SDL_Surface* convert = SDL_CreateRGBSurface(0, + m_texture_width, m_texture_height, 32, 0x000000ff, 0x0000ff00, 0x00ff0000, 0xff000000); #endif @@ -110,7 +125,7 @@ GLTexture::GLTexture(SDL_Surface* image) : SDL_BlitSurface(image, 0, convert, 0); assert_gl("before creating texture"); - glGenTextures(1, &handle); + glGenTextures(1, &m_handle); try { GLenum sdl_format; @@ -123,14 +138,14 @@ GLTexture::GLTexture(SDL_Surface* image) : assert(false); } - glBindTexture(GL_TEXTURE_2D, handle); + glBindTexture(GL_TEXTURE_2D, m_handle); glPixelStorei(GL_UNPACK_ALIGNMENT, 1); -#ifdef GL_UNPACK_ROW_LENGTH +#if defined(GL_UNPACK_ROW_LENGTH) || defined(USE_GLBINDING) glPixelStorei(GL_UNPACK_ROW_LENGTH, convert->pitch/convert->format->BytesPerPixel); #else /* OpenGL ES doesn't support UNPACK_ROW_LENGTH, let's hope SDL didn't add * padding bytes, otherwise we need some extra code here... */ - assert(convert->pitch == texture_width * convert->format->BytesPerPixel); + assert(convert->pitch == m_texture_width * convert->format->BytesPerPixel); #endif if(SDL_MUSTLOCK(convert)) @@ -138,17 +153,14 @@ GLTexture::GLTexture(SDL_Surface* image) : SDL_LockSurface(convert); } - if (true) - { // no not use mipmaps - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, texture_width, - texture_height, 0, sdl_format, + glTexImage2D(GL_TEXTURE_2D, 0, static_cast(GL_RGBA), + m_texture_width, m_texture_height, 0, sdl_format, GL_UNSIGNED_BYTE, convert->pixels); - } - else - { // build mipmaps - gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGBA, texture_width, - texture_height, sdl_format, - GL_UNSIGNED_BYTE, convert->pixels); + + // no not use mipmaps + if(false) + { + glGenerateMipmap(GL_TEXTURE_2D); } if(SDL_MUSTLOCK(convert)) @@ -160,7 +172,7 @@ GLTexture::GLTexture(SDL_Surface* image) : set_texture_params(); } catch(...) { - glDeleteTextures(1, &handle); + glDeleteTextures(1, &m_handle); SDL_FreeSurface(convert); throw; } @@ -169,17 +181,17 @@ GLTexture::GLTexture(SDL_Surface* image) : GLTexture::~GLTexture() { - glDeleteTextures(1, &handle); + glDeleteTextures(1, &m_handle); } void GLTexture::set_texture_params() { - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, static_cast(GL_LINEAR)); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, static_cast(GL_LINEAR)); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, static_cast(GL_CLAMP_TO_EDGE)); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, static_cast(GL_CLAMP_TO_EDGE)); assert_gl("set texture params"); }