1 #include <msp/gl/extensions/arb_direct_state_access.h>
2 #include <msp/gl/extensions/arb_texture_swizzle.h>
3 #include <msp/gl/extensions/ext_framebuffer_object.h>
4 #include <msp/gl/extensions/khr_debug.h>
9 #include "texture_backend.h"
16 OpenGLTexture::OpenGLTexture(unsigned t):
19 static bool alignment_init = false;
22 glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
23 alignment_init = true;
27 OpenGLTexture::OpenGLTexture(OpenGLTexture &&other):
30 debug_name(move(other.debug_name))
35 OpenGLTexture::~OpenGLTexture()
37 if(this==Device::get_current().get_state().scratch_texture)
40 glDeleteTextures(1, &id);
43 void OpenGLTexture::create()
46 throw invalid_operation("OpenGLTexture::create");
47 if(ARB_direct_state_access)
48 glCreateTextures(target, 1, &id);
50 glGenTextures(1, &id);
53 if(!debug_name.empty() && KHR_debug)
54 glObjectLabel(GL_TEXTURE, id, debug_name.size(), debug_name.c_str());
58 void OpenGLTexture::require_swizzle()
60 static Require _req(ARB_texture_swizzle);
63 void OpenGLTexture::apply_swizzle()
65 ComponentSwizzle swizzle = static_cast<const Texture *>(this)->swizzle;
66 if(swizzle==NO_SWIZZLE)
69 const int *swizzle_order = get_gl_swizzle(swizzle);
70 if(get_backend_api()==OPENGL_ES)
72 set_parameter_i(GL_TEXTURE_SWIZZLE_R, swizzle_order[0]);
73 set_parameter_i(GL_TEXTURE_SWIZZLE_G, swizzle_order[1]);
74 set_parameter_i(GL_TEXTURE_SWIZZLE_B, swizzle_order[2]);
75 set_parameter_i(GL_TEXTURE_SWIZZLE_A, swizzle_order[3]);
79 if(ARB_direct_state_access)
80 glTextureParameteriv(id, GL_TEXTURE_SWIZZLE_RGBA, swizzle_order);
82 glTexParameteriv(target, GL_TEXTURE_SWIZZLE_RGBA, swizzle_order);
86 void OpenGLTexture::set_parameter_i(unsigned param, int value) const
88 if(ARB_direct_state_access)
89 glTextureParameteri(id, param, value);
91 glTexParameteri(target, param, value);
94 void OpenGLTexture::generate_mipmap()
96 // glGenerateMipmap is defined here
97 static Require _req(EXT_framebuffer_object);
99 if(ARB_direct_state_access)
100 glGenerateTextureMipmap(id);
104 glGenerateMipmap(target);
108 void OpenGLTexture::set_debug_name(const string &name)
113 glObjectLabel(GL_TEXTURE, id, name.size(), name.c_str());
119 void OpenGLTexture::bind_scratch()
121 const OpenGLTexture *&scratch_binding = Device::get_current().get_state().scratch_texture;
123 glActiveTexture(GL_TEXTURE0);
124 if(scratch_binding!=this)
126 if(scratch_binding && scratch_binding->target!=target)
127 glBindTexture(scratch_binding->target, 0);
128 glBindTexture(target, id);
129 scratch_binding = this;
133 void OpenGLTexture::unbind_scratch()
135 const OpenGLTexture *&scratch_binding = Device::get_current().get_state().scratch_texture;
138 glBindTexture(scratch_binding->target, 0);