]> git.tdb.fi Git - libs/gl.git/blobdiff - source/backends/opengl/texture_backend.cpp
Add support for padding in vertex formats
[libs/gl.git] / source / backends / opengl / texture_backend.cpp
index fe4679f63d4fe0815a7b808a2f13f02d32a1d32b..ebfeb0255b2083d8a04b8b49ff0503302e361333 100644 (file)
@@ -12,23 +12,11 @@ using namespace std;
 namespace Msp {
 namespace GL {
 
-int OpenGLTexture::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,
-       GL_BLUE, GL_GREEN, GL_RED, GL_ALPHA
-};
-
 OpenGLTexture *OpenGLTexture::scratch_binding = 0;
 
-OpenGLTexture::OpenGLTexture(unsigned t, bool create):
-       id(0),
+OpenGLTexture::OpenGLTexture(unsigned t):
        target(t)
 {
-       if(create)
-               generate_id();
-
        static bool alignment_init = false;
        if(!alignment_init)
        {
@@ -37,6 +25,14 @@ OpenGLTexture::OpenGLTexture(unsigned t, bool create):
        }
 }
 
+OpenGLTexture::OpenGLTexture(OpenGLTexture &&other):
+       id(other.id),
+       target(other.target),
+       debug_name(move(other.debug_name))
+{
+       other.id = 0;
+}
+
 OpenGLTexture::~OpenGLTexture()
 {
        if(this==scratch_binding)
@@ -45,10 +41,10 @@ OpenGLTexture::~OpenGLTexture()
                glDeleteTextures(1, &id);
 }
 
-void OpenGLTexture::generate_id()
+void OpenGLTexture::create()
 {
        if(id)
-               throw invalid_operation("OpenGLTexture::generate_id");
+               throw invalid_operation("OpenGLTexture::create");
        if(ARB_direct_state_access)
                glCreateTextures(target, 1, &id);
        else
@@ -67,23 +63,24 @@ void OpenGLTexture::require_swizzle()
 
 void OpenGLTexture::apply_swizzle()
 {
-       Texture::FormatSwizzle swizzle = static_cast<const Texture *>(this)->swizzle;
-       if(swizzle==Texture::NO_SWIZZLE)
+       ComponentSwizzle swizzle = static_cast<const Texture *>(this)->swizzle;
+       if(swizzle==NO_SWIZZLE)
                return;
 
+       const int *swizzle_order = get_gl_swizzle(swizzle);
        if(get_backend_api()==OPENGL_ES)
        {
-               set_parameter_i(GL_TEXTURE_SWIZZLE_R, swizzle_orders[swizzle*4]);
-               set_parameter_i(GL_TEXTURE_SWIZZLE_G, swizzle_orders[swizzle*4+1]);
-               set_parameter_i(GL_TEXTURE_SWIZZLE_B, swizzle_orders[swizzle*4+2]);
-               set_parameter_i(GL_TEXTURE_SWIZZLE_A, swizzle_orders[swizzle*4+3]);
+               set_parameter_i(GL_TEXTURE_SWIZZLE_R, swizzle_order[0]);
+               set_parameter_i(GL_TEXTURE_SWIZZLE_G, swizzle_order[1]);
+               set_parameter_i(GL_TEXTURE_SWIZZLE_B, swizzle_order[2]);
+               set_parameter_i(GL_TEXTURE_SWIZZLE_A, swizzle_order[3]);
        }
        else
        {
                if(ARB_direct_state_access)
-                       glTextureParameteriv(id, GL_TEXTURE_SWIZZLE_RGBA, swizzle_orders+swizzle*4);
+                       glTextureParameteriv(id, GL_TEXTURE_SWIZZLE_RGBA, swizzle_order);
                else
-                       glTexParameteriv(target, GL_TEXTURE_SWIZZLE_RGBA, swizzle_orders+swizzle*4);
+                       glTexParameteriv(target, GL_TEXTURE_SWIZZLE_RGBA, swizzle_order);
        }
 }