43 lines
1.2 KiB
C++
43 lines
1.2 KiB
C++
#include <glbinding/gl/gl.h>
|
|
#include <SDL2/SDL.h>
|
|
|
|
#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<const int>(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;
|
|
}
|
|
}
|