diff options
Diffstat (limited to 'source/blender/gpu/intern/gpu_viewport.c')
-rw-r--r-- | source/blender/gpu/intern/gpu_viewport.c | 55 |
1 files changed, 53 insertions, 2 deletions
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; |