]> git.tdb.fi Git - libs/gl.git/blobdiff - source/core/texturecube.cpp
Refactor get_level_size in various texture classes
[libs/gl.git] / source / core / texturecube.cpp
index 01820fa8766be6afa5235419c5da9d63062a6388..543bb9d40ec00e954ce894d9699e86c364405dd8 100644 (file)
@@ -1,4 +1,5 @@
 #include <msp/datafile/collection.h>
+#include <msp/gl/extensions/arb_direct_state_access.h>
 #include <msp/gl/extensions/arb_seamless_cube_map.h>
 #include <msp/gl/extensions/arb_texture_cube_map.h>
 #include <msp/gl/extensions/arb_texture_storage.h>
@@ -83,8 +84,11 @@ void TextureCube::allocate(unsigned level)
 
        if(ARB_texture_storage)
        {
-               BindRestore _bind(this);
-               glTexStorage2D(target, levels, storage_fmt, size, size);
+               Conditional<BindRestore> _bind(!ARB_direct_state_access, this);
+               if(ARB_direct_state_access)
+                       glTextureStorage2D(id, levels, storage_fmt, size, size);
+               else
+                       glTexStorage2D(target, levels, storage_fmt, size, size);
                apply_swizzle();
                allocated |= (64<<levels)-1;
        }
@@ -99,10 +103,10 @@ void TextureCube::image(TextureCubeFace face, unsigned level, const void *data)
 {
        if(size==0)
                throw invalid_operation("TextureCube::image");
+       if(level>=levels)
+               throw out_of_range("TextureCube::image");
 
        unsigned s = get_level_size(level);
-       if(s==0)
-               throw out_of_range("TextureCube::image");
 
        if(ARB_texture_storage)
                return sub_image(face, level, 0, 0, s, s, data);
@@ -153,13 +157,18 @@ void TextureCube::sub_image(TextureCubeFace face, unsigned level, int x, int y,
 {
        if(size==0)
                throw invalid_operation("TextureCube::sub_image");
+       if(level>=levels)
+               throw out_of_range("TextureCube::sub_image");
 
-       BindRestore _bind(this);
+       Conditional<BindRestore> _bind(!ARB_direct_state_acess, this);
        allocate(level);
 
        PixelComponents comp = get_components(storage_fmt);
        GLenum type = get_gl_type(get_component_type(storage_fmt));
-       glTexSubImage2D(face, level, x, y, wd, ht, comp, type, data);
+       if(ARB_direct_state_access)
+               glTextureSubImage3D(id, level, x, y, get_face_index(face), wd, ht, 1, comp, type, data);
+       else
+               glTexSubImage2D(face, level, x, y, wd, ht, comp, type, data);
 
        if(auto_gen_mipmap && level==0)
                generate_mipmap();