#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"
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)
{
}
}
+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
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);
}
}
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)
void OpenGLTexture::unbind_scratch()
{
+ const OpenGLTexture *&scratch_binding = Device::get_current().get_state().scratch_texture;
if(scratch_binding)
{
glBindTexture(scratch_binding->target, 0);