Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source/blender/draw/DRW_engine.h3
-rw-r--r--source/blender/draw/intern/DRW_render.h26
-rw-r--r--source/blender/draw/modes/edit_armature_mode.c5
-rw-r--r--source/blender/draw/modes/edit_curve_mode.c6
-rw-r--r--source/blender/draw/modes/edit_lattice_mode.c6
-rw-r--r--source/blender/draw/modes/object_mode.c7
-rw-r--r--source/blender/gpu/intern/gpu_viewport.c55
-rw-r--r--source/blender/makesrna/intern/rna_userdef.c1
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);