#include "supertux/gameconfig.hpp"
#include "video/gl/gl_texture.hpp"
+#ifdef USE_GLBINDING
+ #include <glbinding/ContextInfo.h>
+#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)
{
} // 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<GLint>(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
SDL_BlitSurface(image, 0, convert, 0);
assert_gl("before creating texture");
- glGenTextures(1, &handle);
+ glGenTextures(1, &m_handle);
try {
GLenum sdl_format;
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))
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<GLint>(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))
set_texture_params();
} catch(...) {
- glDeleteTextures(1, &handle);
+ glDeleteTextures(1, &m_handle);
SDL_FreeSurface(convert);
throw;
}
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<GLint>(GL_LINEAR));
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, static_cast<GLint>(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<GLint>(GL_CLAMP_TO_EDGE));
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, static_cast<GLint>(GL_CLAMP_TO_EDGE));
assert_gl("set texture params");
}