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:
authorCampbell Barton <ideasman42@gmail.com>2019-04-17 07:17:24 +0300
committerCampbell Barton <ideasman42@gmail.com>2019-04-17 07:21:24 +0300
commite12c08e8d170b7ca40f204a5b0423c23a9fbc2c1 (patch)
tree8cf3453d12edb177a218ef8009357518ec6cab6a /source/blender/draw/engines/workbench/workbench_effect_taa.c
parentb3dabc200a4b0399ec6b81f2ff2730d07b44fcaa (diff)
ClangFormat: apply to source, most of intern
Apply clang format as proposed in T53211. For details on usage and instructions for migrating branches without conflicts, see: https://wiki.blender.org/wiki/Tools/ClangFormat
Diffstat (limited to 'source/blender/draw/engines/workbench/workbench_effect_taa.c')
-rw-r--r--source/blender/draw/engines/workbench/workbench_effect_taa.c486
1 files changed, 242 insertions, 244 deletions
diff --git a/source/blender/draw/engines/workbench/workbench_effect_taa.c b/source/blender/draw/engines/workbench/workbench_effect_taa.c
index cbc0e347d7d..0435a804fab 100644
--- a/source/blender/draw/engines/workbench/workbench_effect_taa.c
+++ b/source/blender/draw/engines/workbench/workbench_effect_taa.c
@@ -20,290 +20,288 @@
* \ingroup draw_engine
*/
-
#include "workbench_private.h"
#include "BLI_jitter_2d.h"
static struct {
- struct GPUShader *effect_taa_sh;
- float jitter_5[5][2];
- float jitter_8[8][2];
- float jitter_11[11][2];
- float jitter_16[16][2];
- float jitter_32[32][2];
+ struct GPUShader *effect_taa_sh;
+ float jitter_5[5][2];
+ float jitter_8[8][2];
+ float jitter_11[11][2];
+ float jitter_16[16][2];
+ float jitter_32[32][2];
} e_data = {NULL};
extern char datatoc_workbench_effect_taa_frag_glsl[];
-
static void workbench_taa_jitter_init_order(float (*table)[2], int num)
{
- BLI_jitter_init(table, num);
-
- /* find closest element to center */
- int closest_index = 0;
- float closest_squared_distance = 1.0f;
-
- for (int index = 0; index < num; index++) {
- const float squared_dist = SQUARE(table[index][0]) + SQUARE(table[index][1]);
- if (squared_dist < closest_squared_distance) {
- closest_squared_distance = squared_dist;
- closest_index = index;
- }
- }
-
- /* move jitter table so that closest sample is in center */
- for (int index = 0; index < num; index++) {
- sub_v2_v2(table[index], table[closest_index]);
- mul_v2_fl(table[index], 2.0f);
- }
-
- /* swap center sample to the start of the table */
- if (closest_index != 0) {
- swap_v2_v2(table[0], table[closest_index]);
- }
-
- /* sort list based on furtest distance with previous */
- for (int i = 0; i < num - 2; i++) {
- float f_squared_dist = 0.0;
- int f_index = i;
- for (int j = i + 1; j < num; j++) {
- const float squared_dist = SQUARE(table[i][0] - table[j][0]) + SQUARE(table[i][1] - table[j][1]);
- if (squared_dist > f_squared_dist) {
- f_squared_dist = squared_dist;
- f_index = j;
- }
- }
- swap_v2_v2(table[i + 1], table[f_index]);
- }
+ BLI_jitter_init(table, num);
+
+ /* find closest element to center */
+ int closest_index = 0;
+ float closest_squared_distance = 1.0f;
+
+ for (int index = 0; index < num; index++) {
+ const float squared_dist = SQUARE(table[index][0]) + SQUARE(table[index][1]);
+ if (squared_dist < closest_squared_distance) {
+ closest_squared_distance = squared_dist;
+ closest_index = index;
+ }
+ }
+
+ /* move jitter table so that closest sample is in center */
+ for (int index = 0; index < num; index++) {
+ sub_v2_v2(table[index], table[closest_index]);
+ mul_v2_fl(table[index], 2.0f);
+ }
+
+ /* swap center sample to the start of the table */
+ if (closest_index != 0) {
+ swap_v2_v2(table[0], table[closest_index]);
+ }
+
+ /* sort list based on furtest distance with previous */
+ for (int i = 0; i < num - 2; i++) {
+ float f_squared_dist = 0.0;
+ int f_index = i;
+ for (int j = i + 1; j < num; j++) {
+ const float squared_dist = SQUARE(table[i][0] - table[j][0]) +
+ SQUARE(table[i][1] - table[j][1]);
+ if (squared_dist > f_squared_dist) {
+ f_squared_dist = squared_dist;
+ f_index = j;
+ }
+ }
+ swap_v2_v2(table[i + 1], table[f_index]);
+ }
}
-
static void workbench_taa_jitter_init(void)
{
- workbench_taa_jitter_init_order(e_data.jitter_5, 5);
- workbench_taa_jitter_init_order(e_data.jitter_8, 8);
- workbench_taa_jitter_init_order(e_data.jitter_11, 11);
- workbench_taa_jitter_init_order(e_data.jitter_16, 16);
- workbench_taa_jitter_init_order(e_data.jitter_32, 32);
+ workbench_taa_jitter_init_order(e_data.jitter_5, 5);
+ workbench_taa_jitter_init_order(e_data.jitter_8, 8);
+ workbench_taa_jitter_init_order(e_data.jitter_11, 11);
+ workbench_taa_jitter_init_order(e_data.jitter_16, 16);
+ workbench_taa_jitter_init_order(e_data.jitter_32, 32);
}
int workbench_taa_calculate_num_iterations(WORKBENCH_Data *vedata)
{
- WORKBENCH_StorageList *stl = vedata->stl;
- WORKBENCH_PrivateData *wpd = stl->g_data;
- int result = 1;
- if (TAA_ENABLED(wpd)) {
- if (DRW_state_is_image_render()) {
- const Scene *scene = DRW_context_state_get()->scene;
- result = (scene->r.mode & R_OSA) ? scene->r.osa : 1;
- }
- else if (IN_RANGE_INCL(
- wpd->preferences->gpu_viewport_quality,
- GPU_VIEWPORT_QUALITY_TAA8, GPU_VIEWPORT_QUALITY_TAA16))
- {
- result = 8;
- }
- else if (IN_RANGE_INCL(
- wpd->preferences->gpu_viewport_quality,
- GPU_VIEWPORT_QUALITY_TAA16, GPU_VIEWPORT_QUALITY_TAA32))
- {
- result = 16;
- }
- else {
- result = 32;
- }
- }
- return result;
+ WORKBENCH_StorageList *stl = vedata->stl;
+ WORKBENCH_PrivateData *wpd = stl->g_data;
+ int result = 1;
+ if (TAA_ENABLED(wpd)) {
+ if (DRW_state_is_image_render()) {
+ const Scene *scene = DRW_context_state_get()->scene;
+ result = (scene->r.mode & R_OSA) ? scene->r.osa : 1;
+ }
+ else if (IN_RANGE_INCL(wpd->preferences->gpu_viewport_quality,
+ GPU_VIEWPORT_QUALITY_TAA8,
+ GPU_VIEWPORT_QUALITY_TAA16)) {
+ result = 8;
+ }
+ else if (IN_RANGE_INCL(wpd->preferences->gpu_viewport_quality,
+ GPU_VIEWPORT_QUALITY_TAA16,
+ GPU_VIEWPORT_QUALITY_TAA32)) {
+ result = 16;
+ }
+ else {
+ result = 32;
+ }
+ }
+ return result;
}
void workbench_taa_engine_init(WORKBENCH_Data *vedata)
{
- WORKBENCH_EffectInfo *effect_info = vedata->stl->effects;
- const DRWContextState *draw_ctx = DRW_context_state_get();
- RegionView3D *rv3d = draw_ctx->rv3d;
-
- if (e_data.effect_taa_sh == NULL) {
- e_data.effect_taa_sh = DRW_shader_create_fullscreen(datatoc_workbench_effect_taa_frag_glsl, NULL);
- workbench_taa_jitter_init();
- }
-
- /* reset complete drawing when navigating. */
- if (effect_info->jitter_index != 0) {
- if (rv3d && rv3d->rflag & RV3D_NAVIGATING) {
- effect_info->jitter_index = 0;
- }
- }
-
- if (effect_info->view_updated) {
- effect_info->jitter_index = 0;
- effect_info->view_updated = false;
- }
-
- {
- float view[4][4];
- float win[4][4];
- DRW_viewport_matrix_get(view, DRW_MAT_VIEW);
- DRW_viewport_matrix_get(win, DRW_MAT_WIN);
- mul_m4_m4m4(effect_info->curr_mat, view, win);
- if (!equals_m4m4(effect_info->curr_mat, effect_info->last_mat)) {
- effect_info->jitter_index = 0;
- }
- }
+ WORKBENCH_EffectInfo *effect_info = vedata->stl->effects;
+ const DRWContextState *draw_ctx = DRW_context_state_get();
+ RegionView3D *rv3d = draw_ctx->rv3d;
+
+ if (e_data.effect_taa_sh == NULL) {
+ e_data.effect_taa_sh = DRW_shader_create_fullscreen(datatoc_workbench_effect_taa_frag_glsl,
+ NULL);
+ workbench_taa_jitter_init();
+ }
+
+ /* reset complete drawing when navigating. */
+ if (effect_info->jitter_index != 0) {
+ if (rv3d && rv3d->rflag & RV3D_NAVIGATING) {
+ effect_info->jitter_index = 0;
+ }
+ }
+
+ if (effect_info->view_updated) {
+ effect_info->jitter_index = 0;
+ effect_info->view_updated = false;
+ }
+
+ {
+ float view[4][4];
+ float win[4][4];
+ DRW_viewport_matrix_get(view, DRW_MAT_VIEW);
+ DRW_viewport_matrix_get(win, DRW_MAT_WIN);
+ mul_m4_m4m4(effect_info->curr_mat, view, win);
+ if (!equals_m4m4(effect_info->curr_mat, effect_info->last_mat)) {
+ effect_info->jitter_index = 0;
+ }
+ }
}
void workbench_taa_engine_free(void)
{
- DRW_SHADER_FREE_SAFE(e_data.effect_taa_sh);
+ DRW_SHADER_FREE_SAFE(e_data.effect_taa_sh);
}
-
DRWPass *workbench_taa_create_pass(WORKBENCH_Data *vedata, GPUTexture **color_buffer_tx)
{
- WORKBENCH_StorageList *stl = vedata->stl;
- WORKBENCH_TextureList *txl = vedata->txl;
- WORKBENCH_EffectInfo *effect_info = stl->effects;
- WORKBENCH_FramebufferList *fbl = vedata->fbl;
- WORKBENCH_PrivateData *wpd = stl->g_data;
- /*
- * jitter_index is not updated yet. This will be done in during draw phase.
- * so for now it is inversed.
- */
- int previous_jitter_index = effect_info->jitter_index;
-
- {
- const eGPUTextureFormat hist_buffer_format = DRW_state_is_image_render() ? GPU_RGBA16F : GPU_RGBA8;
- DRW_texture_ensure_fullscreen_2d(&txl->history_buffer_tx, hist_buffer_format, 0);
- DRW_texture_ensure_fullscreen_2d(&txl->depth_buffer_tx, GPU_DEPTH24_STENCIL8, 0);
- }
-
- {
- GPU_framebuffer_ensure_config(&fbl->effect_taa_fb, {
- GPU_ATTACHMENT_NONE,
- GPU_ATTACHMENT_TEXTURE(txl->history_buffer_tx),
- });
- GPU_framebuffer_ensure_config(&fbl->depth_buffer_fb, {
- GPU_ATTACHMENT_TEXTURE(txl->depth_buffer_tx),
- });
- }
-
-
- DRWPass *pass = DRW_pass_create("Effect TAA", DRW_STATE_WRITE_COLOR);
- DRWShadingGroup *grp = DRW_shgroup_create(e_data.effect_taa_sh, pass);
- DRW_shgroup_uniform_texture_ref(grp, "colorBuffer", color_buffer_tx);
- DRW_shgroup_uniform_texture_ref(grp, "historyBuffer", &txl->history_buffer_tx);
- DRW_shgroup_uniform_float(grp, "mixFactor", &effect_info->taa_mix_factor, 1);
- DRW_shgroup_call_add(grp, DRW_cache_fullscreen_quad_get(), NULL);
-
- /*
- * Set the offset for the cavity shader so every iteration different
- * samples will be selected
- */
- wpd->ssao_params[3] = previous_jitter_index;
-
- return pass;
+ WORKBENCH_StorageList *stl = vedata->stl;
+ WORKBENCH_TextureList *txl = vedata->txl;
+ WORKBENCH_EffectInfo *effect_info = stl->effects;
+ WORKBENCH_FramebufferList *fbl = vedata->fbl;
+ WORKBENCH_PrivateData *wpd = stl->g_data;
+ /*
+ * jitter_index is not updated yet. This will be done in during draw phase.
+ * so for now it is inversed.
+ */
+ int previous_jitter_index = effect_info->jitter_index;
+
+ {
+ const eGPUTextureFormat hist_buffer_format = DRW_state_is_image_render() ? GPU_RGBA16F :
+ GPU_RGBA8;
+ DRW_texture_ensure_fullscreen_2d(&txl->history_buffer_tx, hist_buffer_format, 0);
+ DRW_texture_ensure_fullscreen_2d(&txl->depth_buffer_tx, GPU_DEPTH24_STENCIL8, 0);
+ }
+
+ {
+ GPU_framebuffer_ensure_config(&fbl->effect_taa_fb,
+ {
+ GPU_ATTACHMENT_NONE,
+ GPU_ATTACHMENT_TEXTURE(txl->history_buffer_tx),
+ });
+ GPU_framebuffer_ensure_config(&fbl->depth_buffer_fb,
+ {
+ GPU_ATTACHMENT_TEXTURE(txl->depth_buffer_tx),
+ });
+ }
+
+ DRWPass *pass = DRW_pass_create("Effect TAA", DRW_STATE_WRITE_COLOR);
+ DRWShadingGroup *grp = DRW_shgroup_create(e_data.effect_taa_sh, pass);
+ DRW_shgroup_uniform_texture_ref(grp, "colorBuffer", color_buffer_tx);
+ DRW_shgroup_uniform_texture_ref(grp, "historyBuffer", &txl->history_buffer_tx);
+ DRW_shgroup_uniform_float(grp, "mixFactor", &effect_info->taa_mix_factor, 1);
+ DRW_shgroup_call_add(grp, DRW_cache_fullscreen_quad_get(), NULL);
+
+ /*
+ * Set the offset for the cavity shader so every iteration different
+ * samples will be selected
+ */
+ wpd->ssao_params[3] = previous_jitter_index;
+
+ return pass;
}
void workbench_taa_draw_scene_start(WORKBENCH_Data *vedata)
{
- WORKBENCH_StorageList *stl = vedata->stl;
- WORKBENCH_EffectInfo *effect_info = stl->effects;
- const float *viewport_size = DRW_viewport_size_get();
- int num_samples = 8;
- float (*samples)[2];
- float mix_factor;
-
- num_samples = workbench_taa_calculate_num_iterations(vedata);
- switch (num_samples) {
- default:
- case 5:
- samples = e_data.jitter_5;
- break;
- case 8:
- samples = e_data.jitter_8;
- break;
- case 11:
- samples = e_data.jitter_11;
- break;
- case 16:
- samples = e_data.jitter_16;
- break;
- case 32:
- samples = e_data.jitter_32;
- break;
- }
-
- mix_factor = 1.0f / (effect_info->jitter_index + 1);
-
- const int jitter_index = effect_info->jitter_index;
- const float *transform_offset = samples[jitter_index];
- effect_info->jitter_index = (jitter_index + 1) % num_samples;
-
- /* construct new matrices from transform delta */
- float viewmat[4][4];
- float persmat[4][4];
- DRW_viewport_matrix_get(viewmat, DRW_MAT_VIEW);
- DRW_viewport_matrix_get(persmat, DRW_MAT_PERS);
- DRW_viewport_matrix_get(effect_info->override_winmat, DRW_MAT_WIN);
-
- window_translate_m4(
- effect_info->override_winmat, persmat,
- transform_offset[0] / viewport_size[0],
- transform_offset[1] / viewport_size[1]);
-
- mul_m4_m4m4(effect_info->override_persmat, effect_info->override_winmat, viewmat);
- invert_m4_m4(effect_info->override_persinv, effect_info->override_persmat);
- invert_m4_m4(effect_info->override_wininv, effect_info->override_winmat);
-
- DRW_viewport_matrix_override_set(effect_info->override_persmat, DRW_MAT_PERS);
- DRW_viewport_matrix_override_set(effect_info->override_persinv, DRW_MAT_PERSINV);
- DRW_viewport_matrix_override_set(effect_info->override_winmat, DRW_MAT_WIN);
- DRW_viewport_matrix_override_set(effect_info->override_wininv, DRW_MAT_WININV);
-
- /* weight the mix factor by the jitter index */
- effect_info->taa_mix_factor = mix_factor;
+ WORKBENCH_StorageList *stl = vedata->stl;
+ WORKBENCH_EffectInfo *effect_info = stl->effects;
+ const float *viewport_size = DRW_viewport_size_get();
+ int num_samples = 8;
+ float(*samples)[2];
+ float mix_factor;
+
+ num_samples = workbench_taa_calculate_num_iterations(vedata);
+ switch (num_samples) {
+ default:
+ case 5:
+ samples = e_data.jitter_5;
+ break;
+ case 8:
+ samples = e_data.jitter_8;
+ break;
+ case 11:
+ samples = e_data.jitter_11;
+ break;
+ case 16:
+ samples = e_data.jitter_16;
+ break;
+ case 32:
+ samples = e_data.jitter_32;
+ break;
+ }
+
+ mix_factor = 1.0f / (effect_info->jitter_index + 1);
+
+ const int jitter_index = effect_info->jitter_index;
+ const float *transform_offset = samples[jitter_index];
+ effect_info->jitter_index = (jitter_index + 1) % num_samples;
+
+ /* construct new matrices from transform delta */
+ float viewmat[4][4];
+ float persmat[4][4];
+ DRW_viewport_matrix_get(viewmat, DRW_MAT_VIEW);
+ DRW_viewport_matrix_get(persmat, DRW_MAT_PERS);
+ DRW_viewport_matrix_get(effect_info->override_winmat, DRW_MAT_WIN);
+
+ window_translate_m4(effect_info->override_winmat,
+ persmat,
+ transform_offset[0] / viewport_size[0],
+ transform_offset[1] / viewport_size[1]);
+
+ mul_m4_m4m4(effect_info->override_persmat, effect_info->override_winmat, viewmat);
+ invert_m4_m4(effect_info->override_persinv, effect_info->override_persmat);
+ invert_m4_m4(effect_info->override_wininv, effect_info->override_winmat);
+
+ DRW_viewport_matrix_override_set(effect_info->override_persmat, DRW_MAT_PERS);
+ DRW_viewport_matrix_override_set(effect_info->override_persinv, DRW_MAT_PERSINV);
+ DRW_viewport_matrix_override_set(effect_info->override_winmat, DRW_MAT_WIN);
+ DRW_viewport_matrix_override_set(effect_info->override_wininv, DRW_MAT_WININV);
+
+ /* weight the mix factor by the jitter index */
+ effect_info->taa_mix_factor = mix_factor;
}
void workbench_taa_draw_scene_end(WORKBENCH_Data *vedata)
{
- /*
- * If first frame than the offset is 0.0 and its depth is the depth buffer to use
- * for the rest of the draw engines. We store it in a persistent buffer.
- *
- * If it is not the first frame we copy the persistent buffer back to the
- * default depth buffer
- */
- const WORKBENCH_StorageList *stl = vedata->stl;
- const WORKBENCH_FramebufferList *fbl = vedata->fbl;
- const DefaultFramebufferList *dfbl = DRW_viewport_framebuffer_list_get();
- WORKBENCH_EffectInfo *effect_info = stl->effects;
-
- if (effect_info->jitter_index == 1) {
- GPU_framebuffer_blit(dfbl->depth_only_fb, 0, fbl->depth_buffer_fb, 0, GPU_DEPTH_BIT);
- }
- else {
- GPU_framebuffer_blit(fbl->depth_buffer_fb, 0, dfbl->depth_only_fb, 0, GPU_DEPTH_BIT);
- }
-
- GPU_framebuffer_blit(dfbl->color_only_fb, 0, fbl->effect_taa_fb, 0, GPU_COLOR_BIT);
-
- if (!DRW_state_is_image_render()) {
- DRW_viewport_matrix_override_unset_all();
- }
-
- copy_m4_m4(effect_info->last_mat, effect_info->curr_mat);
- if (effect_info->jitter_index != 0 && !DRW_state_is_image_render()) {
- DRW_viewport_request_redraw();
- }
+ /*
+ * If first frame than the offset is 0.0 and its depth is the depth buffer to use
+ * for the rest of the draw engines. We store it in a persistent buffer.
+ *
+ * If it is not the first frame we copy the persistent buffer back to the
+ * default depth buffer
+ */
+ const WORKBENCH_StorageList *stl = vedata->stl;
+ const WORKBENCH_FramebufferList *fbl = vedata->fbl;
+ const DefaultFramebufferList *dfbl = DRW_viewport_framebuffer_list_get();
+ WORKBENCH_EffectInfo *effect_info = stl->effects;
+
+ if (effect_info->jitter_index == 1) {
+ GPU_framebuffer_blit(dfbl->depth_only_fb, 0, fbl->depth_buffer_fb, 0, GPU_DEPTH_BIT);
+ }
+ else {
+ GPU_framebuffer_blit(fbl->depth_buffer_fb, 0, dfbl->depth_only_fb, 0, GPU_DEPTH_BIT);
+ }
+
+ GPU_framebuffer_blit(dfbl->color_only_fb, 0, fbl->effect_taa_fb, 0, GPU_COLOR_BIT);
+
+ if (!DRW_state_is_image_render()) {
+ DRW_viewport_matrix_override_unset_all();
+ }
+
+ copy_m4_m4(effect_info->last_mat, effect_info->curr_mat);
+ if (effect_info->jitter_index != 0 && !DRW_state_is_image_render()) {
+ DRW_viewport_request_redraw();
+ }
}
void workbench_taa_view_updated(WORKBENCH_Data *vedata)
{
- WORKBENCH_StorageList *stl = vedata->stl;
- if (stl) {
- WORKBENCH_EffectInfo *effect_info = stl->effects;
- if (effect_info) {
- effect_info->view_updated = true;
- }
- }
+ WORKBENCH_StorageList *stl = vedata->stl;
+ if (stl) {
+ WORKBENCH_EffectInfo *effect_info = stl->effects;
+ if (effect_info) {
+ effect_info->view_updated = true;
+ }
+ }
}