]> git.tdb.fi Git - libs/gl.git/blobdiff - source/backends/opengl/texture_backend.cpp
Check the flat qualifier from the correct member
[libs/gl.git] / source / backends / opengl / texture_backend.cpp
index e8288045f4625fd5766e5b1048809717660ce204..818defdd44c475a103b96adcf2ac20d8acb7f12e 100644 (file)
@@ -2,6 +2,7 @@
 #include <msp/gl/extensions/arb_texture_swizzle.h>
 #include <msp/gl/extensions/ext_framebuffer_object.h>
 #include <msp/gl/extensions/khr_debug.h>
+#include "device.h"
 #include "gl.h"
 #include "error.h"
 #include "texture.h"
@@ -12,18 +13,7 @@ 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):
-       id(0),
        target(t)
 {
        static bool alignment_init = false;
@@ -34,9 +24,17 @@ OpenGLTexture::OpenGLTexture(unsigned t):
        }
 }
 
+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)
+       if(this==Device::get_current().get_state().scratch_texture)
                unbind_scratch();
        if(id)
                glDeleteTextures(1, &id);
@@ -64,23 +62,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);
        }
 }
 
@@ -119,6 +118,7 @@ void OpenGLTexture::set_debug_name(const string &name)
 
 void OpenGLTexture::bind_scratch()
 {
+       const OpenGLTexture *&scratch_binding = Device::get_current().get_state().scratch_texture;
        if(!scratch_binding)
                glActiveTexture(GL_TEXTURE0);
        if(scratch_binding!=this)
@@ -132,6 +132,7 @@ void OpenGLTexture::bind_scratch()
 
 void OpenGLTexture::unbind_scratch()
 {
+       const OpenGLTexture *&scratch_binding = Device::get_current().get_state().scratch_texture;
        if(scratch_binding)
        {
                glBindTexture(scratch_binding->target, 0);