#include #include #include "renderutil.hh" using namespace gl; namespace render { namespace { unsigned ilog2(unsigned in) { unsigned ret = 0u; while (in >>= 1) ++ret; return ret; } } TextureResource create2DTexture(unsigned width, unsigned height, bool alpha, unsigned levels) { TextureResource tex; glGenTextures(1, &tex.get()); glBindTexture(GL_TEXTURE_2D, tex); unsigned logWidth = ilog2(width), logHeight = ilog2(height); if (levels == 0) levels = std::max(logWidth,logHeight)+1u; if(SDL_GL_ExtensionSupported("GL_ARB_texture_storage")) glTexStorage2D(GL_TEXTURE_2D, levels, alpha?GL_RGBA8:GL_RGB8, width, height); else { std::printf("Warning: extension GL_ARB_texture_storage not supported!\n"); for (unsigned i = 0u; i < levels; ++i) { glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, levels-1); glTexImage2D(GL_TEXTURE_2D, i, static_cast(alpha?GL_RGBA8:GL_RGB8), width, height, 0, alpha?GL_RGBA8:GL_RGB8, GL_UNSIGNED_BYTE, NULL); width = std::max(1u, (width / 2u)); height = std::max(1u, (height / 2u)); } } return tex; } }