[Bf-blender-cvs] [ff78b59b7c4] soc-2019-npr: LANPR: GPU mode follow cache size settings.

YimingWu noreply at git.blender.org
Thu Jul 4 06:33:59 CEST 2019


Commit: ff78b59b7c4639b52c2bd4f69374fc85ba81c55d
Author: YimingWu
Date:   Thu Jul 4 12:33:30 2019 +0800
Branches: soc-2019-npr
https://developer.blender.org/rBff78b59b7c4639b52c2bd4f69374fc85ba81c55d

LANPR: GPU mode follow cache size settings.

===================================================================

M	source/blender/draw/engines/lanpr/lanpr_all.h
M	source/blender/draw/engines/lanpr/lanpr_dpix.c
M	source/blender/draw/engines/lanpr/lanpr_engine.c
M	source/blender/makesdna/DNA_scene_types.h
M	source/blender/makesrna/intern/rna_scene.c

===================================================================

diff --git a/source/blender/draw/engines/lanpr/lanpr_all.h b/source/blender/draw/engines/lanpr/lanpr_all.h
index 96c8e39bc93..20951373469 100644
--- a/source/blender/draw/engines/lanpr/lanpr_all.h
+++ b/source/blender/draw/engines/lanpr/lanpr_all.h
@@ -49,6 +49,7 @@
 #include "BKE_customdata.h"
 #include "DEG_depsgraph_query.h"
 #include "GPU_draw.h"
+#include "GPU_texture.h"
 
 #include "BLI_threads.h"
 
@@ -94,6 +95,7 @@ typedef struct LANPR_SharedResource {
   GPUShader *dpix_transform_shader;
   GPUShader *dpix_preview_shader;
   int dpix_shader_error;
+  int texture_size;
 
   /* Software */
   GPUShader *software_shader;
@@ -111,8 +113,6 @@ typedef struct LANPR_SharedResource {
 
 } LANPR_SharedResource;
 
-#define TNS_DPIX_TEXTURE_SIZE 2048
-
 typedef struct LANPR_PassList {
   /* Snake */
   struct DRWPass *depth_pass;
diff --git a/source/blender/draw/engines/lanpr/lanpr_dpix.c b/source/blender/draw/engines/lanpr/lanpr_dpix.c
index bda66b799fe..022e3684600 100644
--- a/source/blender/draw/engines/lanpr/lanpr_dpix.c
+++ b/source/blender/draw/engines/lanpr/lanpr_dpix.c
@@ -31,6 +31,21 @@ extern char datatoc_lanpr_dpix_project_clip_frag_glsl[];
 extern char datatoc_lanpr_dpix_preview_geom_glsl[];
 extern char datatoc_lanpr_dpix_preview_frag_glsl[];
 
+int lanpr_dpix_texture_size(SceneLANPR *lanpr)
+{
+  switch (lanpr->gpu_cache_size) {
+    case LANPR_GPU_CACHE_SIZE_512:
+      return 512;
+    case LANPR_GPU_CACHE_SIZE_1K:
+      return 1024;
+    case LANPR_GPU_CACHE_SIZE_2K:
+      return 2048;
+    case LANPR_GPU_CACHE_SIZE_4K:
+      return 4096;
+  }
+  return 512;
+}
+
 void lanpr_init_atlas_inputs(void *ved)
 {
   lanpr_share.ved_viewport = ved;
@@ -46,23 +61,35 @@ void lanpr_init_atlas_inputs(void *ved)
   Object *camera = (rv3d && rv3d->persp == RV3D_CAMOB) ? v3d->camera : NULL;
   SceneLANPR *lanpr = &draw_ctx->scene->lanpr;
 
+  int texture_size = lanpr_dpix_texture_size(lanpr);
+  lanpr_share.texture_size = texture_size;
+
+  if (txl->dpix_in_pl && GPU_texture_width(txl->dpix_in_pl) != texture_size) {
+    DRW_texture_free(txl->dpix_in_pl);
+    txl->dpix_in_pl = NULL;
+    DRW_texture_free(txl->dpix_in_pr);
+    txl->dpix_in_pr = NULL;
+    DRW_texture_free(txl->dpix_in_nl);
+    txl->dpix_in_nl = NULL;
+    DRW_texture_free(txl->dpix_in_nr);
+    txl->dpix_in_nr = NULL;
+    DRW_texture_free(txl->dpix_out_pl);
+    txl->dpix_out_pl = NULL;
+    DRW_texture_free(txl->dpix_out_pr);
+    txl->dpix_out_pr = NULL;
+    DRW_texture_free(txl->dpix_out_length);
+    txl->dpix_out_length = NULL;
+  }
+
   if (lanpr->reloaded || !txl->dpix_in_pl) {
-    DRW_texture_ensure_2d(
-        &txl->dpix_in_pl, TNS_DPIX_TEXTURE_SIZE, TNS_DPIX_TEXTURE_SIZE, GPU_RGBA32F, 0);
-    DRW_texture_ensure_2d(
-        &txl->dpix_in_pr, TNS_DPIX_TEXTURE_SIZE, TNS_DPIX_TEXTURE_SIZE, GPU_RGBA32F, 0);
-    DRW_texture_ensure_2d(
-        &txl->dpix_in_nl, TNS_DPIX_TEXTURE_SIZE, TNS_DPIX_TEXTURE_SIZE, GPU_RGBA32F, 0);
-    DRW_texture_ensure_2d(
-        &txl->dpix_in_nr, TNS_DPIX_TEXTURE_SIZE, TNS_DPIX_TEXTURE_SIZE, GPU_RGBA32F, 0);
-    DRW_texture_ensure_2d(
-        &txl->dpix_in_edge_mask, TNS_DPIX_TEXTURE_SIZE, TNS_DPIX_TEXTURE_SIZE, GPU_RGBA8, 0);
-    DRW_texture_ensure_2d(
-        &txl->dpix_out_pl, TNS_DPIX_TEXTURE_SIZE, TNS_DPIX_TEXTURE_SIZE, GPU_RGBA32F, 0);
-    DRW_texture_ensure_2d(
-        &txl->dpix_out_pr, TNS_DPIX_TEXTURE_SIZE, TNS_DPIX_TEXTURE_SIZE, GPU_RGBA32F, 0);
-    DRW_texture_ensure_2d(
-        &txl->dpix_out_length, TNS_DPIX_TEXTURE_SIZE, TNS_DPIX_TEXTURE_SIZE, GPU_RGBA32F, 0);
+    DRW_texture_ensure_2d(&txl->dpix_in_pl, texture_size, texture_size, GPU_RGBA32F, 0);
+    DRW_texture_ensure_2d(&txl->dpix_in_pr, texture_size, texture_size, GPU_RGBA32F, 0);
+    DRW_texture_ensure_2d(&txl->dpix_in_nl, texture_size, texture_size, GPU_RGBA32F, 0);
+    DRW_texture_ensure_2d(&txl->dpix_in_nr, texture_size, texture_size, GPU_RGBA32F, 0);
+    DRW_texture_ensure_2d(&txl->dpix_in_edge_mask, texture_size, texture_size, GPU_RGBA8, 0);
+    DRW_texture_ensure_2d(&txl->dpix_out_pl, texture_size, texture_size, GPU_RGBA32F, 0);
+    DRW_texture_ensure_2d(&txl->dpix_out_pr, texture_size, texture_size, GPU_RGBA32F, 0);
+    DRW_texture_ensure_2d(&txl->dpix_out_length, texture_size, texture_size, GPU_RGBA32F, 0);
   }
 
   GPU_framebuffer_ensure_config(&fbl->dpix_transform,
@@ -287,16 +314,16 @@ int lanpr_feed_atlas_data_intersection_cache(void *vedata,
 
 void lanpr_dpix_index_to_coord(int index, float *x, float *y)
 {
-  (*x) = tnsLinearItp(
-      -1, 1, (float)(index % TNS_DPIX_TEXTURE_SIZE + 0.5) / (float)TNS_DPIX_TEXTURE_SIZE);
-  (*y) = tnsLinearItp(
-      -1, 1, (float)(index / TNS_DPIX_TEXTURE_SIZE + 0.5) / (float)TNS_DPIX_TEXTURE_SIZE);
+  int texture_size = lanpr_share.texture_size;
+  (*x) = tnsLinearItp(-1, 1, (float)(index % texture_size + 0.5) / (float)texture_size);
+  (*y) = tnsLinearItp(-1, 1, (float)(index / texture_size + 0.5) / (float)texture_size);
 }
 
 void lanpr_dpix_index_to_coord_absolute(int index, float *x, float *y)
 {
-  (*x) = (float)(index % TNS_DPIX_TEXTURE_SIZE) + 0.5;
-  (*y) = (float)(index / TNS_DPIX_TEXTURE_SIZE) + 0.5;
+  int texture_size = lanpr_share.texture_size;
+  (*x) = (float)(index % texture_size) + 0.5;
+  (*y) = (float)(index / texture_size) + 0.5;
 }
 
 int lanpr_feed_atlas_trigger_preview_obj(void *vedata, Object *ob, int begin_index)
@@ -450,11 +477,13 @@ void lanpr_dpix_draw_scene(LANPR_TextureList *txl,
   }
   /*  XXX: should implement view angle functions for ortho camera. */
 
+  int texture_size = lanpr_share.texture_size;
+
   pd->dpix_viewport[2] = texw;
   pd->dpix_viewport[3] = texh;
   pd->dpix_is_perspective = is_persp;
   pd->dpix_sample_step = 1;
-  pd->dpix_buffer_width = TNS_DPIX_TEXTURE_SIZE;
+  pd->dpix_buffer_width = texture_size;
   pd->dpix_depth_offset = 0.0001;
   pd->dpix_znear = camera ? ((Camera *)camera->data)->clip_start : v3d->clip_start;
   pd->dpix_zfar = camera ? ((Camera *)camera->data)->clip_end : v3d->clip_end;
diff --git a/source/blender/draw/engines/lanpr/lanpr_engine.c b/source/blender/draw/engines/lanpr/lanpr_engine.c
index b2ea2247046..99732b804be 100644
--- a/source/blender/draw/engines/lanpr/lanpr_engine.c
+++ b/source/blender/draw/engines/lanpr/lanpr_engine.c
@@ -183,6 +183,7 @@ static void lanpr_engine_free(void)
 }
 
 void lanpr_calculate_normal_object_vector(LANPR_LineLayer *ll, float *normal_object_direction);
+int lanpr_dpix_texture_size(SceneLANPR *lanpr);
 
 static void lanpr_cache_init(void *vedata)
 {
@@ -212,6 +213,9 @@ static void lanpr_cache_init(void *vedata)
   SceneLANPR *lanpr = &scene->lanpr;
   View3D *v3d = draw_ctx->v3d;
 
+  int texture_size = lanpr_dpix_texture_size(lanpr);
+  lanpr_share.texture_size = texture_size;
+
   psl->color_pass = DRW_pass_create(
       "color Pass", DRW_STATE_WRITE_COLOR | DRW_STATE_DEPTH_LESS_EQUAL | DRW_STATE_WRITE_DEPTH);
   stl->g_data->multipass_shgrp = DRW_shgroup_create(lanpr_share.multichannel_shader,
@@ -397,7 +401,7 @@ static void lanpr_cache_init(void *vedata)
         stl->g_data->dpix_preview_shgrp, "normal_direction", normal_object_direction, 1);
 
     pd->begin_index = 0;
-    int fsize = sizeof(float) * 4 * TNS_DPIX_TEXTURE_SIZE * TNS_DPIX_TEXTURE_SIZE;
+    int fsize = sizeof(float) * 4 * texture_size * texture_size;
 
     if (lanpr->reloaded) {
       pd->atlas_pl = MEM_callocN(fsize, "atlas_point_l");
diff --git a/source/blender/makesdna/DNA_scene_types.h b/source/blender/makesdna/DNA_scene_types.h
index 8a3fbd14466..87968e1eab3 100644
--- a/source/blender/makesdna/DNA_scene_types.h
+++ b/source/blender/makesdna/DNA_scene_types.h
@@ -1682,7 +1682,7 @@ typedef struct SceneLANPR {
 
   /* edge split modifier will cause problems in LANPR. */
   int disable_edge_splits;
-  
+
   int gpu_cache_size; /* enum! */
 
   /* offline render */
diff --git a/source/blender/makesrna/intern/rna_scene.c b/source/blender/makesrna/intern/rna_scene.c
index 4baf34ee949..fd1a2025f66 100644
--- a/source/blender/makesrna/intern/rna_scene.c
+++ b/source/blender/makesrna/intern/rna_scene.c
@@ -7198,7 +7198,6 @@ static void rna_def_scene_lanpr(BlenderRNA *brna)
       {LANPR_GPU_CACHE_SIZE_4K, "S4K", 0, "4K", "4K px texture as cache"},
       {0, NULL, 0, NULL, NULL}};
 
-
   srna = RNA_def_struct(brna, "SceneLANPR", NULL);
   RNA_def_struct_sdna(srna, "SceneLANPR");
   RNA_def_struct_ui_text(srna, "Scene LANPR Config", "LANPR global config");



More information about the Bf-blender-cvs mailing list