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:
Diffstat (limited to 'source/blender/gpu/intern/gpu_viewport.c')
-rw-r--r--source/blender/gpu/intern/gpu_viewport.c55
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;