diff options
-rw-r--r-- | source/blender/draw/DRW_engine.h | 3 | ||||
-rw-r--r-- | source/blender/draw/intern/DRW_render.h | 26 | ||||
-rw-r--r-- | source/blender/draw/modes/edit_armature_mode.c | 5 | ||||
-rw-r--r-- | source/blender/draw/modes/edit_curve_mode.c | 6 | ||||
-rw-r--r-- | source/blender/draw/modes/edit_lattice_mode.c | 6 | ||||
-rw-r--r-- | source/blender/draw/modes/object_mode.c | 7 | ||||
-rw-r--r-- | source/blender/gpu/intern/gpu_viewport.c | 55 | ||||
-rw-r--r-- | source/blender/makesrna/intern/rna_userdef.c | 1 |
8 files changed, 104 insertions, 5 deletions
diff --git a/source/blender/draw/DRW_engine.h b/source/blender/draw/DRW_engine.h index b780e86b9ec..3b1dcba1503 100644 --- a/source/blender/draw/DRW_engine.h +++ b/source/blender/draw/DRW_engine.h @@ -48,11 +48,14 @@ struct GPUOffScreen; /* Buffer and textures used by the viewport by default */ typedef struct DefaultFramebufferList { struct GPUFrameBuffer *default_fb; + struct GPUFrameBuffer *multisample_fb; } DefaultFramebufferList; typedef struct DefaultTextureList { struct GPUTexture *color; struct GPUTexture *depth; + struct GPUTexture *multisample_color; + struct GPUTexture *multisample_depth; } DefaultTextureList; void DRW_engines_register(void); diff --git a/source/blender/draw/intern/DRW_render.h b/source/blender/draw/intern/DRW_render.h index 4b0bbc3c175..b546631b8c3 100644 --- a/source/blender/draw/intern/DRW_render.h +++ b/source/blender/draw/intern/DRW_render.h @@ -90,6 +90,29 @@ typedef char DRWViewportEmptyList; DRW_VIEWPORT_LIST_SIZE(*(((ty *)NULL)->stl)) \ } +/* Use of multisample framebuffers. */ +#define MULTISAMPLE_SYNC_ENABLE(dfbl) { \ + if (dfbl->multisample_fb != NULL) { \ + DRW_stats_query_start("Multisample Blit"); \ + DRW_framebuffer_blit(dfbl->default_fb, dfbl->multisample_fb, false); \ + DRW_framebuffer_blit(dfbl->default_fb, dfbl->multisample_fb, true); \ + DRW_framebuffer_bind(dfbl->multisample_fb); \ + DRW_stats_query_end(); \ + } \ +} + +#define MULTISAMPLE_SYNC_DISABLE(dfbl) { \ + if (dfbl->multisample_fb != NULL) { \ + DRW_stats_query_start("Multisample Resolve"); \ + DRW_framebuffer_blit(dfbl->multisample_fb, dfbl->default_fb, false); \ + DRW_framebuffer_blit(dfbl->multisample_fb, dfbl->default_fb, true); \ + DRW_framebuffer_bind(dfbl->default_fb); \ + DRW_stats_query_end(); \ + } \ +} + + + typedef struct DrawEngineDataSize { int fbl_len; int txl_len; @@ -119,11 +142,14 @@ typedef struct DrawEngineType { /* Buffer and textures used by the viewport by default */ typedef struct DefaultFramebufferList { struct GPUFrameBuffer *default_fb; + struct GPUFrameBuffer *multisample_fb; } DefaultFramebufferList; typedef struct DefaultTextureList { struct GPUTexture *color; struct GPUTexture *depth; + struct GPUTexture *multisample_color; + struct GPUTexture *multisample_depth; } DefaultTextureList; #endif diff --git a/source/blender/draw/modes/edit_armature_mode.c b/source/blender/draw/modes/edit_armature_mode.c index 61a56dab244..06756e5a240 100644 --- a/source/blender/draw/modes/edit_armature_mode.c +++ b/source/blender/draw/modes/edit_armature_mode.c @@ -120,11 +120,16 @@ static void EDIT_ARMATURE_cache_populate(void *vedata, Object *ob) static void EDIT_ARMATURE_draw_scene(void *vedata) { EDIT_ARMATURE_PassList *psl = ((EDIT_ARMATURE_Data *)vedata)->psl; + DefaultFramebufferList *dfbl = DRW_viewport_framebuffer_list_get(); + + MULTISAMPLE_SYNC_ENABLE(dfbl) DRW_draw_pass(psl->bone_envelope); DRW_draw_pass(psl->bone_solid); DRW_draw_pass(psl->bone_wire); DRW_draw_pass(psl->relationship); + + MULTISAMPLE_SYNC_DISABLE(dfbl) } #if 0 diff --git a/source/blender/draw/modes/edit_curve_mode.c b/source/blender/draw/modes/edit_curve_mode.c index dc81725d19a..02a35e07798 100644 --- a/source/blender/draw/modes/edit_curve_mode.c +++ b/source/blender/draw/modes/edit_curve_mode.c @@ -264,7 +264,9 @@ static void EDIT_CURVE_draw_scene(void *vedata) DefaultFramebufferList *dfbl = DRW_viewport_framebuffer_list_get(); DefaultTextureList *dtxl = DRW_viewport_texture_list_get(); - UNUSED_VARS(fbl, dfbl, dtxl); + UNUSED_VARS(fbl, dtxl); + + MULTISAMPLE_SYNC_ENABLE(dfbl) /* Show / hide entire passes, swap framebuffers ... whatever you fancy */ /* @@ -280,6 +282,8 @@ static void EDIT_CURVE_draw_scene(void *vedata) DRW_draw_pass(psl->overlay_edge_pass); DRW_draw_pass(psl->overlay_vert_pass); + MULTISAMPLE_SYNC_DISABLE(dfbl) + /* If you changed framebuffer, double check you rebind * the default one with its textures attached before finishing */ } diff --git a/source/blender/draw/modes/edit_lattice_mode.c b/source/blender/draw/modes/edit_lattice_mode.c index 722010148ff..48ea723613a 100644 --- a/source/blender/draw/modes/edit_lattice_mode.c +++ b/source/blender/draw/modes/edit_lattice_mode.c @@ -227,7 +227,9 @@ static void EDIT_LATTICE_draw_scene(void *vedata) DefaultFramebufferList *dfbl = DRW_viewport_framebuffer_list_get(); DefaultTextureList *dtxl = DRW_viewport_texture_list_get(); - UNUSED_VARS(fbl, dfbl, dtxl); + UNUSED_VARS(fbl, dtxl); + + MULTISAMPLE_SYNC_ENABLE(dfbl) /* Show / hide entire passes, swap framebuffers ... whatever you fancy */ /* @@ -242,6 +244,8 @@ static void EDIT_LATTICE_draw_scene(void *vedata) DRW_draw_pass(psl->wire_pass); DRW_draw_pass(psl->vert_pass); + MULTISAMPLE_SYNC_DISABLE(dfbl) + /* If you changed framebuffer, double check you rebind * the default one with its textures attached before finishing */ } diff --git a/source/blender/draw/modes/object_mode.c b/source/blender/draw/modes/object_mode.c index 7fe7e5f0042..bde0a43120f 100644 --- a/source/blender/draw/modes/object_mode.c +++ b/source/blender/draw/modes/object_mode.c @@ -1826,15 +1826,20 @@ static void OBJECT_draw_scene(void *vedata) DRW_stats_group_end(); } + MULTISAMPLE_SYNC_ENABLE(dfbl) + /* This needs to be drawn after the oultine */ // DRW_draw_pass(psl->bone_envelope); /* Never drawn in Object mode currently. */ DRW_draw_pass(psl->bone_wire); DRW_draw_pass(psl->bone_solid); DRW_draw_pass(psl->non_meshes); - DRW_draw_pass(psl->ob_center); DRW_draw_pass(psl->particle); DRW_draw_pass(psl->reference_image); + MULTISAMPLE_SYNC_DISABLE(dfbl) + + DRW_draw_pass(psl->ob_center); + if (!DRW_state_is_select()) { if (e_data.draw_grid) { DRW_draw_pass(psl->grid); diff --git a/source/blender/gpu/intern/gpu_viewport.c b/source/blender/gpu/intern/gpu_viewport.c index 9bd990e9796..f80842364f3 100644 --- a/source/blender/gpu/intern/gpu_viewport.c +++ b/source/blender/gpu/intern/gpu_viewport.c @@ -38,6 +38,7 @@ #include "BLI_string.h" #include "DNA_vec_types.h" +#include "DNA_userdef_types.h" #include "BKE_global.h" @@ -71,6 +72,7 @@ struct GPUViewport { /* debug */ GPUTexture *debug_depth; int size[2]; + int samples; ListBase data; /* ViewportEngineData wrapped in LinkData */ unsigned int data_hash; /* If hash mismatch we free all ViewportEngineData in this viewport */ @@ -312,7 +314,7 @@ void GPU_viewport_bind(GPUViewport *viewport, const rcti *rect) int rect_h = BLI_rcti_size_y(rect) + 1; if (dfbl->default_fb) { - if (rect_w != viewport->size[0] || rect_h != viewport->size[1]) { + if (rect_w != viewport->size[0] || rect_h != viewport->size[1] || U.ogl_multisamples != viewport->samples) { gpu_viewport_buffers_free( (FramebufferList *)viewport->fbl, default_fbl_len, (TextureList *)viewport->txl, default_txl_len); @@ -329,6 +331,56 @@ void GPU_viewport_bind(GPUViewport *viewport, const rcti *rect) gpu_viewport_texture_pool_clear_users(viewport); + /* Multisample Buffer */ + if (U.ogl_multisamples > 0) { + if (!dfbl->default_fb) { + bool ok = true; + viewport->samples = U.ogl_multisamples; + + dfbl->multisample_fb = GPU_framebuffer_create(); + if (!dfbl->multisample_fb) { + ok = false; + goto cleanup_multisample; + } + + /* Color */ + dtxl->multisample_color = GPU_texture_create_2D_multisample(rect_w, rect_h, NULL, U.ogl_multisamples, NULL); + if (!dtxl->multisample_color) { + ok = false; + goto cleanup_multisample; + } + + if (!GPU_framebuffer_texture_attach(dfbl->multisample_fb, dtxl->multisample_color, 0, 0)) { + ok = false; + goto cleanup_multisample; + } + + /* Depth */ + dtxl->multisample_depth = GPU_texture_create_depth_multisample(rect_w, rect_h, U.ogl_multisamples, NULL); + + if (!dtxl->multisample_depth) { + ok = false; + goto cleanup_multisample; + } + + if (!GPU_framebuffer_texture_attach(dfbl->multisample_fb, dtxl->multisample_depth, 0, 0)) { + ok = false; + goto cleanup_multisample; + } + else if (!GPU_framebuffer_check_valid(dfbl->multisample_fb, NULL)) { + ok = false; + goto cleanup_multisample; + } + +cleanup_multisample: + if (!ok) { + GPU_viewport_free(viewport); + MEM_freeN(viewport); + return; + } + } + } + if (!dfbl->default_fb) { bool ok = true; viewport->size[0] = rect_w; @@ -341,7 +393,6 @@ void GPU_viewport_bind(GPUViewport *viewport, const rcti *rect) } /* Color */ - /* No multi samples for now */ dtxl->color = GPU_texture_create_2D(rect_w, rect_h, NULL, NULL); if (!dtxl->color) { ok = false; diff --git a/source/blender/makesrna/intern/rna_userdef.c b/source/blender/makesrna/intern/rna_userdef.c index 1b6f5fd330e..d5f488d549e 100644 --- a/source/blender/makesrna/intern/rna_userdef.c +++ b/source/blender/makesrna/intern/rna_userdef.c @@ -4178,6 +4178,7 @@ static void rna_def_userdef_system(BlenderRNA *brna) RNA_def_property_enum_items(prop, multi_sample_levels); RNA_def_property_ui_text(prop, "MultiSample", "Enable OpenGL multi-sampling, only for systems that support it, requires restart"); + RNA_def_property_update(prop, 0, "rna_userdef_dpi_update"); prop = RNA_def_property(srna, "use_region_overlap", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "uiflag2", USER_REGION_OVERLAP); |