[Bf-blender-cvs] [33356b7be0a] blender2.8: DRW: Add DRW_multisamples_resolve function
Clément Foucault
noreply at git.blender.org
Wed May 2 20:54:33 CEST 2018
Commit: 33356b7be0ace84e1d0ab7235c68541939a7ab9c
Author: Clément Foucault
Date: Mon Apr 23 23:10:59 2018 +0200
Branches: blender2.8
https://developer.blender.org/rB33356b7be0ace84e1d0ab7235c68541939a7ab9c
DRW: Add DRW_multisamples_resolve function
This manually resolve the content of a multisample FB to a single sample FB.
It resolves color (combine the 2 framebuffers in a logical maner keeping
depth buffer occlusion etc..) instead of a plain glBlitFramebuffer copy.
===================================================================
M source/blender/draw/intern/DRW_render.h
M source/blender/draw/intern/draw_manager.c
===================================================================
diff --git a/source/blender/draw/intern/DRW_render.h b/source/blender/draw/intern/DRW_render.h
index 31046377b19..cc0bb01adec 100644
--- a/source/blender/draw/intern/DRW_render.h
+++ b/source/blender/draw/intern/DRW_render.h
@@ -219,6 +219,8 @@ void DRW_uniformbuffer_free(struct GPUUniformBuffer *ubo);
} while (0)
void DRW_transform_to_display(struct GPUTexture *tex);
+void DRW_multisamples_resolve(
+ struct GPUTexture *src_depth, struct GPUTexture *src_color);
/* Shaders */
struct GPUShader *DRW_shader_create(
diff --git a/source/blender/draw/intern/draw_manager.c b/source/blender/draw/intern/draw_manager.c
index d752e64101e..b171d758832 100644
--- a/source/blender/draw/intern/draw_manager.c
+++ b/source/blender/draw/intern/draw_manager.c
@@ -292,6 +292,55 @@ void DRW_transform_to_display(GPUTexture *tex)
/** \} */
+/* -------------------------------------------------------------------- */
+
+/** \name Multisample Resolve
+ * \{ */
+
+/* Use manual multisample resolve pass.
+ * Much quicker than blitting back and forth.
+ * Assume destination fb is bound*/
+void DRW_multisamples_resolve(GPUTexture *src_depth, GPUTexture *src_color)
+{
+ drw_state_set(DRW_STATE_WRITE_COLOR | DRW_STATE_BLEND_PREMUL |
+ DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_LESS);
+
+ int samples = GPU_texture_samples(src_depth);
+
+ BLI_assert(samples > 0);
+ BLI_assert(GPU_texture_samples(src_color) == samples);
+
+ Gwn_Batch *geom = DRW_cache_fullscreen_quad_get();
+
+ int builtin;
+ switch (samples) {
+ case 2: builtin = GPU_SHADER_2D_IMAGE_MULTISAMPLE_2; break;
+ case 4: builtin = GPU_SHADER_2D_IMAGE_MULTISAMPLE_4; break;
+ case 8: builtin = GPU_SHADER_2D_IMAGE_MULTISAMPLE_8; break;
+ case 16: builtin = GPU_SHADER_2D_IMAGE_MULTISAMPLE_16; break;
+ default:
+ BLI_assert(0);
+ }
+
+ GWN_batch_program_set_builtin(geom, builtin);
+
+ GPU_texture_bind(src_depth, 0);
+ GPU_texture_bind(src_color, 1);
+ GWN_batch_uniform_1i(geom, "depthMulti", 0);
+ GWN_batch_uniform_1i(geom, "colorMulti", 1);
+
+ float mat[4][4];
+ unit_m4(mat);
+ GWN_batch_uniform_mat4(geom, "ModelViewProjectionMatrix", mat);
+
+ /* avoid gpuMatrix calls */
+ GWN_batch_program_use_begin(geom);
+ GWN_batch_draw_range_ex(geom, 0, 0, false);
+ GWN_batch_program_use_end(geom);
+}
+
+/** \} */
+
/* -------------------------------------------------------------------- */
/** \name Viewport (DRW_viewport)
More information about the Bf-blender-cvs
mailing list