Add user preference "GPU Mipmap Generation" under the System/OpenGL
authorAntony Riakiotakis <kalast@gmail.com>
Mon, 11 Jun 2012 16:23:10 +0000 (16:23 +0000)
committerAntony Riakiotakis <kalast@gmail.com>
Mon, 11 Jun 2012 16:23:10 +0000 (16:23 +0000)
subpanel to calculate image mipmapping on the GPU, saving upload and
calculation time. Default is off just in case.

release/scripts/startup/bl_ui/space_userpref.py
source/blender/gpu/GPU_draw.h
source/blender/gpu/intern/gpu_draw.c
source/blender/makesdna/DNA_userdef_types.h
source/blender/makesrna/intern/rna_userdef.c
source/blender/windowmanager/intern/wm_init_exit.c

index dec3960f37685d4cc21cfca146b08342fc368991..2d349931dc48a4086ee616947c682f423375ffdd 100644 (file)
@@ -434,6 +434,7 @@ class USERPREF_PT_system(Panel):
         col.label(text="OpenGL:")
         col.prop(system, "gl_clip_alpha", slider=True)
         col.prop(system, "use_mipmaps")
+        col.prop(system, "use_gpu_mipmap")
         col.prop(system, "use_16bit_textures")
         col.label(text="Anisotropic Filtering")
         col.prop(system, "anisotropic_filter", text="")
index 89976699114586ba79d069a19e16e61bbade162c..438cfd6b741d6691f5dc8231255dfdbd35831a4f 100644 (file)
@@ -112,6 +112,9 @@ void GPU_paint_set_mipmap(int mipmap);
 void GPU_set_anisotropic(float value);
 float GPU_get_anisotropic(void);
 
+/* enable gpu mipmapping */
+void GPU_set_gpu_mipmapping(int gpu_mipmap);
+
 /* Image updates and free
  * - these deal with images bound as opengl textures */
 
index 3e53f2f3836d62759f336bb16ddebe05d5f06d09..a1bd8dcb3a39bb6260235f4da67e3b48a5bd4227 100644 (file)
@@ -234,11 +234,23 @@ static struct GPUTextureState {
 
        int alphablend;
        float anisotropic;
+       int gpu_mipmap;
        MTFace *lasttface;
-} GTS = {0, 0, 0, 0, 0, 0, 0, 0, NULL, NULL, 1, 0, 0, -1, 1.f, NULL};
+} GTS = {0, 0, 0, 0, 0, 0, 0, 0, NULL, NULL, 1, 0, 0, -1, 1.f, 0, NULL};
 
 /* Mipmap settings */
 
+void GPU_set_gpu_mipmapping(int gpu_mipmap){
+       int old_value = GTS.gpu_mipmap;
+
+       /* only actually enable if it's supported */
+       GTS.gpu_mipmap = gpu_mipmap && GLEW_EXT_framebuffer_object;
+
+       if(old_value != GTS.gpu_mipmap) {
+               GPU_free_images();
+       }
+}
+
 void GPU_set_mipmap(int mipmap)
 {
        if (GTS.domipmap != (mipmap != 0)) {
@@ -632,10 +644,19 @@ int GPU_verify_image(Image *ima, ImageUser *iuser, int tftile, int compare, int
                glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, gpu_get_mipmap_filter(1));
        }
        else {
-               if (use_high_bit_depth)
-                       gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGBA16, rectw, recth, GL_RGBA, GL_FLOAT, frect);
-               else
-                       gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGBA, rectw, recth, GL_RGBA, GL_UNSIGNED_BYTE, rect);
+               if(GTS.gpu_mipmap) {
+                       if (use_high_bit_depth)
+                               glTexImage2D(GL_TEXTURE_2D, 0,  GL_RGBA16,  rectw, recth, 0, GL_RGBA, GL_FLOAT, frect);
+                       else
+                               glTexImage2D(GL_TEXTURE_2D, 0,  GL_RGBA,  rectw, recth, 0, GL_RGBA, GL_UNSIGNED_BYTE, rect);
+
+                       glGenerateMipmapEXT(GL_TEXTURE_2D);
+               } else {
+                       if (use_high_bit_depth)
+                               gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGBA16, rectw, recth, GL_RGBA, GL_FLOAT, frect);
+                       else
+                               gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGBA, rectw, recth, GL_RGBA, GL_UNSIGNED_BYTE, rect);
+               }
                glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, gpu_get_mipmap_filter(0));
                glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, gpu_get_mipmap_filter(1));
 
index 5465dbf6e3c259953af54e4079d7f5671fd4c3ff..1c2844cd8a7b96149970d426903fb16b57fc2aae 100644 (file)
@@ -412,7 +412,7 @@ typedef struct UserDef {
        
        short widget_unit;              /* defaults to 20 for 72 DPI setting */
        short anisotropic_filter;
-       short use_16bit_textures, pad8;
+       short use_16bit_textures, use_gpu_mipmap;
 
        float ndof_sensitivity; /* overall sensitivity of 3D mouse */
        int ndof_flag;                  /* flags for 3D mouse */
index 84723e95e80d2db2b7af5fed9623a392f9cf02c5..42eb06b137ab10f70757e3767765881b9f7df815 100644 (file)
@@ -144,6 +144,11 @@ static void rna_userdef_anisotropic_update(Main *bmain, Scene *scene, PointerRNA
        rna_userdef_update(bmain, scene, ptr);
 }
 
+static void rna_userdef_gl_gpu_mipmaps(Main *bmain, Scene *scene, PointerRNA *ptr) {
+       GPU_set_gpu_mipmapping(U.use_gpu_mipmap);
+       rna_userdef_update(bmain, scene, ptr);
+}
+
 static void rna_userdef_gl_texture_limit_update(Main *bmain, Scene *scene, PointerRNA *ptr)
 {
        GPU_free_images();
@@ -3143,6 +3148,11 @@ static void rna_def_userdef_system(BlenderRNA *brna)
        RNA_def_property_ui_text(prop, "16 Bit Float Textures", "Use 16 bit per component texture for float images");
        RNA_def_property_update(prop, 0, "rna_userdef_gl_use_16bit_textures");
 
+       prop = RNA_def_property(srna, "use_gpu_mipmap", PROP_BOOLEAN, PROP_NONE);
+       RNA_def_property_boolean_sdna(prop, NULL, "use_gpu_mipmap", 1);
+       RNA_def_property_ui_text(prop, "GPU Mipmap Generation", "Generate Image Mipmaps on the GPU");
+       RNA_def_property_update(prop, 0, "rna_userdef_gl_gpu_mipmaps");
+
        prop = RNA_def_property(srna, "use_vertex_buffer_objects", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_negative_sdna(prop, NULL, "gameflags", USER_DISABLE_VBO);
        RNA_def_property_ui_text(prop, "VBOs",
index ab377d53ec747fcda3837b35c46b5f09529f06c7..c82cae8ac926bcf260a80ba02c847b4a3bc30e61 100644 (file)
@@ -178,7 +178,8 @@ void WM_init(bContext *C, int argc, const char **argv)
                GPU_extensions_init();
                GPU_set_mipmap(!(U.gameflags & USER_DISABLE_MIPMAP));
                GPU_set_anisotropic(U.anisotropic_filter);
-       
+               GPU_set_gpu_mipmapping(U.use_gpu_mipmap);
+
                UI_init();
        }