]> git.tdb.fi Git - libs/gl.git/blobdiff - source/core/texture2dmultisample.cpp
Remove RenderBuffer and always use textures as framebuffer attachments
[libs/gl.git] / source / core / texture2dmultisample.cpp
diff --git a/source/core/texture2dmultisample.cpp b/source/core/texture2dmultisample.cpp
new file mode 100644 (file)
index 0000000..18e21b7
--- /dev/null
@@ -0,0 +1,73 @@
+#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