--- /dev/null
+#include <msp/gl/extensions/arb_direct_state_access.h>
+#include <msp/gl/extensions/arb_texture_multisample.h>
+#include <msp/gl/extensions/arb_texture_storage_multisample.h>
+#include "deviceinfo.h"
+#include "error.h"
+#include "texture2dmultisample.h"
+
+using namespace std;
+
+namespace Msp {
+namespace GL {
+
+Texture2DMultisample::Texture2DMultisample():
+ Texture(GL_TEXTURE_2D_MULTISAMPLE),
+ width(0),
+ height(0)
+{
+ static Require _req(ARB_texture_multisample);
+}
+
+void Texture2DMultisample::storage(PixelFormat fmt, unsigned wd, unsigned ht, unsigned sm)
+{
+ if(width>0)
+ {
+ if(fmt!=format || wd!=width || ht!=height || sm!=samples)
+ throw incompatible_data("Texture2DMultisample::storage");
+ return;
+ }
+ if(wd==0 || ht==0)
+ throw invalid_argument("Texture2DMultisample::storage");
+ if(!sm || sm>Limits::get_global().max_samples)
+ throw invalid_argument("Texture2DMultisample::storage");
+
+ set_format(fmt);
+ width = wd;
+ height = ht;
+ samples = sm;
+
+ bool direct = ARB_texture_storage_multisample && ARB_direct_state_access;
+ if(!direct)
+ {
+ glActiveTexture(GL_TEXTURE0);
+ glBindTexture(target, id);
+ }
+
+ GLenum gl_fmt = get_gl_pixelformat(storage_fmt);
+ if(ARB_texture_storage_multisample)
+ {
+ if(ARB_direct_state_access)
+ glTextureStorage2DMultisample(id, samples, gl_fmt, width, height, false);
+ else
+ glTexStorage2DMultisample(target, samples, gl_fmt, width, height, false);
+ }
+ else
+ glTexImage2DMultisample(target, samples, gl_fmt, width, height, false);
+ apply_swizzle();
+
+ if(!direct)
+ glBindTexture(target, 0);
+}
+
+void Texture2DMultisample::image(const Graphics::Image &, unsigned)
+{
+ throw invalid_operation("Texture2DMultisample::image");
+}
+
+UInt64 Texture2DMultisample::get_data_size() const
+{
+ return id ? width*height*get_pixel_size(format)*samples : 0;
+}
+
+} // namespace GL
+} // namespace Msp