X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fcore%2Ftexture2dmultisample.cpp;fp=source%2Fcore%2Ftexture2dmultisample.cpp;h=18e21b76ba45eeeaaf585504104aa8558335daa3;hb=cd5f37b066352119cf92d53d0001af7ff99be437;hp=0000000000000000000000000000000000000000;hpb=328b67fa59ce6736949732ea8ff4ef7c6675e200;p=libs%2Fgl.git diff --git a/source/core/texture2dmultisample.cpp b/source/core/texture2dmultisample.cpp new file mode 100644 index 00000000..18e21b76 --- /dev/null +++ b/source/core/texture2dmultisample.cpp @@ -0,0 +1,73 @@ +#include +#include +#include +#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