X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fbackends%2Fopengl%2Ftexture_backend.cpp;h=818defdd44c475a103b96adcf2ac20d8acb7f12e;hb=HEAD;hp=fe4679f63d4fe0815a7b808a2f13f02d32a1d32b;hpb=160e9eea29bd10034733d59507fa1bcca36be401;p=libs%2Fgl.git diff --git a/source/backends/opengl/texture_backend.cpp b/source/backends/opengl/texture_backend.cpp index fe4679f6..818defdd 100644 --- a/source/backends/opengl/texture_backend.cpp +++ b/source/backends/opengl/texture_backend.cpp @@ -2,6 +2,7 @@ #include #include #include +#include "device.h" #include "gl.h" #include "error.h" #include "texture.h" @@ -12,23 +13,9 @@ 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,18 +24,26 @@ 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) + if(this==Device::get_current().get_state().scratch_texture) unbind_scratch(); if(id) 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 +62,24 @@ void OpenGLTexture::require_swizzle() void OpenGLTexture::apply_swizzle() { - Texture::FormatSwizzle swizzle = static_cast(this)->swizzle; - if(swizzle==Texture::NO_SWIZZLE) + ComponentSwizzle swizzle = static_cast(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); } } @@ -122,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) @@ -135,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);