Blender  V2.93
eevee_shaders.c
Go to the documentation of this file.
1 /*
2  * This program is free software; you can redistribute it and/or
3  * modify it under the terms of the GNU General Public License
4  * as published by the Free Software Foundation; either version 2
5  * of the License, or (at your option) any later version.
6  *
7  * This program is distributed in the hope that it will be useful,
8  * but WITHOUT ANY WARRANTY; without even the implied warranty of
9  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10  * GNU General Public License for more details.
11  *
12  * You should have received a copy of the GNU General Public License
13  * along with this program; if not, write to the Free Software Foundation,
14  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
15  *
16  * Copyright 2016, Blender Foundation.
17  */
18 
23 #include "DRW_render.h"
24 
25 #include "BKE_lib_id.h"
26 #include "BKE_node.h"
27 
28 #include "BLI_dynstr.h"
29 #include "BLI_string_utils.h"
30 
31 #include "DNA_world_types.h"
32 
33 #include "MEM_guardedalloc.h"
34 
35 #include "GPU_capabilities.h"
36 #include "GPU_material.h"
37 #include "GPU_shader.h"
38 
39 #include "NOD_shader.h"
40 
41 #include "eevee_engine.h"
42 #include "eevee_private.h"
43 
44 static const char *filter_defines =
45 #if defined(IRRADIANCE_SH_L2)
46  "#define IRRADIANCE_SH_L2\n";
47 #elif defined(IRRADIANCE_HL2)
48  "#define IRRADIANCE_HL2\n";
49 #endif
50 
51 static struct {
52  /* Lookdev */
55 
56  /* Probes */
65 
66  /* Velocity Resolve */
68 
69  /* Temporal Anti Aliasing */
72 
73  /* Bloom */
78 
79  /* Depth Of Field */
88  struct GPUShader *dof_scatter_sh[2][2];
89  struct GPUShader *dof_resolve_sh[2][2];
90 
91  /* General purpose Shaders. */
94 
95  /* Down-sample Depth */
105 
106  /* Simple Down-sample. */
110 
111  /* Mist */
113 
114  /* Motion Blur */
120 
121  /* Ground Truth Ambient Occlusion */
125 
126  /* GGX LUT */
129 
130  /* Render Passes */
133 
134  /* Screen Space Reflection */
137 
138  /* Shadows */
141 
142  /* Subsurface */
143  struct GPUShader *sss_sh[3];
144 
145  /* Volume */
152 
153  /* Shader strings */
157 
159 
160  /* LookDev Materials */
163 
165 
167 
168  /* Default Material */
169  struct {
176 
177  struct {
178  bNodeTree *ntree;
180  } world;
181 } e_data = {NULL}; /* Engine data */
182 
183 extern char datatoc_common_hair_lib_glsl[];
184 extern char datatoc_common_math_lib_glsl[];
186 extern char datatoc_common_view_lib_glsl[];
188 
190 extern char datatoc_background_vert_glsl[];
191 extern char datatoc_bsdf_common_lib_glsl[];
192 extern char datatoc_bsdf_lut_frag_glsl[];
193 extern char datatoc_bsdf_sampling_lib_glsl[];
194 extern char datatoc_btdf_lut_frag_glsl[];
195 extern char datatoc_closure_type_lib_glsl[];
197 extern char datatoc_common_utiltex_lib_glsl[];
198 extern char datatoc_cryptomatte_frag_glsl[];
199 extern char datatoc_cubemap_lib_glsl[];
200 extern char datatoc_default_frag_glsl[];
201 extern char datatoc_lookdev_world_frag_glsl[];
202 extern char datatoc_effect_bloom_frag_glsl[];
209 extern char datatoc_effect_dof_lib_glsl[];
217 extern char datatoc_effect_gtao_frag_glsl[];
219 extern char datatoc_effect_mist_frag_glsl[];
225 extern char datatoc_effect_temporal_aa_glsl[];
229 extern char datatoc_irradiance_lib_glsl[];
235 extern char datatoc_lightprobe_geom_glsl[];
239 extern char datatoc_lightprobe_lib_glsl[];
245 extern char datatoc_lightprobe_vert_glsl[];
246 extern char datatoc_lights_lib_glsl[];
247 extern char datatoc_closure_eval_lib_glsl[];
252 extern char datatoc_ltc_lib_glsl[];
253 extern char datatoc_object_motion_frag_glsl[];
254 extern char datatoc_object_motion_vert_glsl[];
255 extern char datatoc_octahedron_lib_glsl[];
256 extern char datatoc_prepass_frag_glsl[];
257 extern char datatoc_prepass_vert_glsl[];
258 extern char datatoc_random_lib_glsl[];
259 extern char datatoc_raytrace_lib_glsl[];
260 extern char datatoc_renderpass_lib_glsl[];
262 extern char datatoc_shadow_accum_frag_glsl[];
263 extern char datatoc_shadow_frag_glsl[];
264 extern char datatoc_shadow_vert_glsl[];
265 extern char datatoc_ssr_lib_glsl[];
266 extern char datatoc_surface_frag_glsl[];
267 extern char datatoc_surface_geom_glsl[];
268 extern char datatoc_surface_lib_glsl[];
269 extern char datatoc_surface_vert_glsl[];
270 extern char datatoc_update_noise_frag_glsl[];
272 extern char datatoc_volumetric_frag_glsl[];
273 extern char datatoc_volumetric_geom_glsl[];
275 extern char datatoc_volumetric_lib_glsl[];
278 extern char datatoc_volumetric_vert_glsl[];
279 
280 /* *********** FUNCTIONS *********** */
281 
283 {
284  if (e_data.lib == NULL) {
286  /* NOTE: These need to be ordered by dependencies. */
287  DRW_SHADER_LIB_ADD(e_data.lib, common_math_lib);
288  DRW_SHADER_LIB_ADD(e_data.lib, common_math_geom_lib);
289  DRW_SHADER_LIB_ADD(e_data.lib, common_hair_lib);
290  DRW_SHADER_LIB_ADD(e_data.lib, common_view_lib);
291  DRW_SHADER_LIB_ADD(e_data.lib, common_uniforms_lib);
292  DRW_SHADER_LIB_ADD(e_data.lib, gpu_shader_common_obinfos_lib);
293  DRW_SHADER_LIB_ADD(e_data.lib, random_lib);
294  DRW_SHADER_LIB_ADD(e_data.lib, renderpass_lib);
295  DRW_SHADER_LIB_ADD(e_data.lib, bsdf_common_lib);
296  DRW_SHADER_LIB_ADD(e_data.lib, common_utiltex_lib);
297  DRW_SHADER_LIB_ADD(e_data.lib, bsdf_sampling_lib);
298  DRW_SHADER_LIB_ADD(e_data.lib, cubemap_lib);
299  DRW_SHADER_LIB_ADD(e_data.lib, raytrace_lib);
300  DRW_SHADER_LIB_ADD(e_data.lib, ambient_occlusion_lib);
301  DRW_SHADER_LIB_ADD(e_data.lib, octahedron_lib);
302  DRW_SHADER_LIB_ADD(e_data.lib, irradiance_lib);
303  DRW_SHADER_LIB_ADD(e_data.lib, lightprobe_lib);
304  DRW_SHADER_LIB_ADD(e_data.lib, ltc_lib);
305  DRW_SHADER_LIB_ADD(e_data.lib, lights_lib);
306  DRW_SHADER_LIB_ADD(e_data.lib, surface_lib);
307  DRW_SHADER_LIB_ADD(e_data.lib, volumetric_lib);
308  DRW_SHADER_LIB_ADD(e_data.lib, ssr_lib);
309  DRW_SHADER_LIB_ADD(e_data.lib, effect_dof_lib);
310  DRW_SHADER_LIB_ADD(e_data.lib, effect_reflection_lib);
311  DRW_SHADER_LIB_ADD(e_data.lib, closure_type_lib);
312  DRW_SHADER_LIB_ADD(e_data.lib, closure_eval_lib);
313  DRW_SHADER_LIB_ADD(e_data.lib, closure_eval_diffuse_lib);
314  DRW_SHADER_LIB_ADD(e_data.lib, closure_eval_glossy_lib);
315  DRW_SHADER_LIB_ADD(e_data.lib, closure_eval_translucent_lib);
316  DRW_SHADER_LIB_ADD(e_data.lib, closure_eval_refraction_lib);
317 
320 
321  e_data.surface_prepass_frag = DRW_shader_library_create_shader_string(
323 
324  e_data.surface_geom_barycentric = DRW_shader_library_create_shader_string(
326  }
327 }
328 
330 {
332 }
333 
335 {
337  return e_data.lib;
338 }
339 
341 {
342  if (e_data.probe_filter_glossy_sh == NULL) {
343  e_data.probe_filter_glossy_sh = DRW_shader_create_with_shaderlib(
347  e_data.lib,
349  }
350  return e_data.probe_filter_glossy_sh;
351 }
352 
354 {
355  if (e_data.probe_filter_diffuse_sh == NULL) {
356  e_data.probe_filter_diffuse_sh = DRW_shader_create_fullscreen_with_shaderlib(
358  }
359  return e_data.probe_filter_diffuse_sh;
360 }
361 
363 {
364  if (e_data.probe_filter_visibility_sh == NULL) {
365  e_data.probe_filter_visibility_sh = DRW_shader_create_fullscreen_with_shaderlib(
367  }
368  return e_data.probe_filter_visibility_sh;
369 }
370 
372 {
373  if (e_data.probe_grid_fill_sh == NULL) {
376  }
377  return e_data.probe_grid_fill_sh;
378 }
379 
381 {
382  if (e_data.probe_planar_downsample_sh == NULL) {
383  e_data.probe_planar_downsample_sh = DRW_shader_create_with_shaderlib(
387  e_data.lib,
388  NULL);
389  }
390  return e_data.probe_planar_downsample_sh;
391 }
392 
394 {
395  if (e_data.studiolight_probe_sh == NULL) {
397  NULL,
399  e_data.lib,
401  }
402  return e_data.studiolight_probe_sh;
403 }
404 
406 {
407  if (e_data.studiolight_background_sh == NULL) {
408  e_data.studiolight_background_sh = DRW_shader_create_with_shaderlib(
410  NULL,
412  e_data.lib,
413  "#define LOOKDEV_BG\n" SHADER_DEFINES);
414  }
415  return e_data.studiolight_background_sh;
416 }
417 
419 {
420  if (e_data.probe_cube_display_sh == NULL) {
421  e_data.probe_cube_display_sh = DRW_shader_create_with_shaderlib(
423  NULL,
425  e_data.lib,
427  }
428  return e_data.probe_cube_display_sh;
429 }
430 
432 {
433  if (e_data.probe_grid_display_sh == NULL) {
434  e_data.probe_grid_display_sh = DRW_shader_create_with_shaderlib(
436  NULL,
438  e_data.lib,
440  }
441  return e_data.probe_grid_display_sh;
442 }
443 
445 {
446  if (e_data.probe_planar_display_sh == NULL) {
447  e_data.probe_planar_display_sh = DRW_shader_create_with_shaderlib(
449  NULL,
451  e_data.lib,
452  NULL);
453  }
454  return e_data.probe_planar_display_sh;
455 }
456 
457 /* -------------------------------------------------------------------- */
462 {
463  if (e_data.color_copy_sh == NULL) {
465  datatoc_effect_downsample_frag_glsl, e_data.lib, "#define COPY_SRC\n");
466  }
467  return e_data.color_copy_sh;
468 }
469 
471 {
472  if (e_data.downsample_sh == NULL) {
475  }
476  return e_data.downsample_sh;
477 }
478 
480 {
481  if (e_data.downsample_cube_sh == NULL) {
482  e_data.downsample_cube_sh = DRW_shader_create_with_shaderlib(
486  e_data.lib,
487  NULL);
488  }
489  return e_data.downsample_cube_sh;
490 }
491 
493 {
494  if (e_data.minz_downlevel_sh == NULL) {
496  "#define MIN_PASS\n");
497  }
498  return e_data.minz_downlevel_sh;
499 }
500 
502 {
503  if (e_data.maxz_downlevel_sh == NULL) {
505  "#define MAX_PASS\n");
506  }
507  return e_data.maxz_downlevel_sh;
508 }
509 
511 {
512  if (e_data.minz_downdepth_sh == NULL) {
514  "#define MIN_PASS\n");
515  }
516  return e_data.minz_downdepth_sh;
517 }
518 
520 {
521  if (e_data.maxz_downdepth_sh == NULL) {
523  "#define MAX_PASS\n");
524  }
525  return e_data.maxz_downdepth_sh;
526 }
527 
529 {
530  if (e_data.minz_downdepth_layer_sh == NULL) {
532  "#define MIN_PASS\n"
533  "#define LAYERED\n");
534  }
535  return e_data.minz_downdepth_layer_sh;
536 }
537 
539 {
540  if (e_data.maxz_downdepth_layer_sh == NULL) {
542  "#define MAX_PASS\n"
543  "#define LAYERED\n");
544  }
545  return e_data.maxz_downdepth_layer_sh;
546 }
547 
549 {
550  if (e_data.maxz_copydepth_layer_sh == NULL) {
552  "#define MAX_PASS\n"
553  "#define COPY_DEPTH\n"
554  "#define LAYERED\n");
555  }
556  return e_data.maxz_copydepth_layer_sh;
557 }
558 
560 {
561  if (e_data.minz_copydepth_sh == NULL) {
563  "#define MIN_PASS\n"
564  "#define COPY_DEPTH\n");
565  }
566  return e_data.minz_copydepth_sh;
567 }
568 
570 {
571  if (e_data.maxz_copydepth_sh == NULL) {
573  "#define MAX_PASS\n"
574  "#define COPY_DEPTH\n");
575  }
576  return e_data.maxz_copydepth_sh;
577 }
578 
581 /* -------------------------------------------------------------------- */
586 {
587  if (e_data.ggx_lut_sh == NULL) {
590  }
591  return e_data.ggx_lut_sh;
592 }
593 
595 {
596  if (e_data.ggx_refraction_lut_sh == NULL) {
597  e_data.ggx_refraction_lut_sh = DRW_shader_create_fullscreen_with_shaderlib(
599  }
600  return e_data.ggx_refraction_lut_sh;
601 }
602 
605 /* -------------------------------------------------------------------- */
610 {
611  if (e_data.mist_sh == NULL) {
613  datatoc_effect_mist_frag_glsl, e_data.lib, "#define FIRST_PASS\n");
614  }
615  return e_data.mist_sh;
616 }
617 
620 /* -------------------------------------------------------------------- */
624 #define TILE_SIZE_STR "#define EEVEE_VELOCITY_TILE_SIZE " STRINGIFY(EEVEE_VELOCITY_TILE_SIZE) "\n"
626 {
627  if (e_data.motion_blur_sh == NULL) {
630  }
631  return e_data.motion_blur_sh;
632 }
633 
635 {
636  if (e_data.motion_blur_object_sh == NULL) {
637  e_data.motion_blur_object_sh = DRW_shader_create_with_shaderlib(
639  }
640  return e_data.motion_blur_object_sh;
641 }
642 
644 {
645  if (e_data.motion_blur_hair_sh == NULL) {
647  NULL,
649  e_data.lib,
650  "#define HAIR\n");
651  }
652  return e_data.motion_blur_hair_sh;
653 }
654 
656 {
657  if (e_data.velocity_tiles_sh == NULL) {
659  "#define TILE_GATHER\n" TILE_SIZE_STR);
660  }
661  return e_data.velocity_tiles_sh;
662 }
663 
665 {
666  if (e_data.velocity_tiles_expand_sh == NULL) {
667  e_data.velocity_tiles_expand_sh = DRW_shader_create_fullscreen(
668  datatoc_effect_velocity_tile_frag_glsl, "#define TILE_EXPANSION\n" TILE_SIZE_STR);
669  }
670  return e_data.velocity_tiles_expand_sh;
671 }
672 
673 #undef TILE_SIZE_STR
674 
677 /* -------------------------------------------------------------------- */
682 {
683  if (e_data.gtao_sh == NULL) {
686  }
687  return e_data.gtao_sh;
688 }
689 
691 {
692  if (e_data.gtao_debug_sh == NULL) {
695  e_data.lib,
696  "#define DEBUG_AO\n"
697  "#define ENABLE_DEFERED_AO");
698  }
699  return e_data.gtao_debug_sh;
700 }
701 
704 /* -------------------------------------------------------------------- */
709 {
710  if (e_data.postprocess_sh == NULL) {
713  }
714  return e_data.postprocess_sh;
715 }
716 
719 /* -------------------------------------------------------------------- */
724 {
725  const int index = is_hair ? 1 : 0;
726  if (e_data.cryptomatte_sh[index] == NULL) {
727  DynStr *ds = BLI_dynstr_new();
729 
730  if (is_hair) {
731  BLI_dynstr_append(ds, "#define HAIR_SHADER\n");
732  }
733  else {
734  BLI_dynstr_append(ds, "#define MESH_SHADER\n");
735  }
736  char *defines = BLI_dynstr_get_cstring(ds);
737  e_data.cryptomatte_sh[index] = DRW_shader_create_with_shaderlib(
739  BLI_dynstr_free(ds);
740  MEM_freeN(defines);
741  }
742  return e_data.cryptomatte_sh[index];
743 }
744 
747 /* -------------------------------------------------------------------- */
752 {
753  if (e_data.reflection_trace == NULL) {
756  e_data.lib,
757  SHADER_DEFINES "#define STEP_RAYTRACE\n");
758  }
759  return e_data.reflection_trace;
760 }
761 
763 {
764  if (e_data.reflection_resolve == NULL) {
767  e_data.lib,
768  SHADER_DEFINES "#define STEP_RESOLVE\n");
769  }
770  return e_data.reflection_resolve;
771 }
772 
775 /* -------------------------------------------------------------------- */
780 {
781  if (e_data.shadow_sh == NULL) {
784  }
785  return e_data.shadow_sh;
786 }
787 
789 {
790  if (e_data.shadow_accum_sh == NULL) {
793  }
794  return e_data.shadow_accum_sh;
795 }
796 
799 /* -------------------------------------------------------------------- */
804 {
805  if (e_data.sss_sh[0] == NULL) {
807  datatoc_effect_subsurface_frag_glsl, e_data.lib, "#define FIRST_PASS\n");
808  }
809  return e_data.sss_sh[0];
810 }
811 
813 {
814  if (e_data.sss_sh[1] == NULL) {
816  datatoc_effect_subsurface_frag_glsl, e_data.lib, "#define SECOND_PASS\n");
817  }
818  return e_data.sss_sh[1];
819 }
820 
822 {
823  if (e_data.sss_sh[2] == NULL) {
826  e_data.lib,
827  "#define EEVEE_TRANSLUCENCY\n" SHADER_DEFINES);
828  }
829  return e_data.sss_sh[2];
830 }
831 
833 /* -------------------------------------------------------------------- */
838 {
839  if (e_data.volumetric_clear_sh == NULL) {
843  e_data.lib,
845  "#define VOLUMETRICS\n"
846  "#define CLEAR\n");
847  }
848  return e_data.volumetric_clear_sh;
849 }
850 
852 {
853  if (e_data.scatter_sh == NULL) {
857  e_data.lib,
859  "#define VOLUMETRICS\n"
860  "#define VOLUME_SHADOW\n");
861  }
862  return e_data.scatter_sh;
863 }
864 
866 {
867  if (e_data.scatter_with_lights_sh == NULL) {
868  e_data.scatter_with_lights_sh = DRW_shader_create_with_shaderlib(
872  e_data.lib,
874  "#define VOLUMETRICS\n"
875  "#define VOLUME_LIGHTING\n"
876  "#define VOLUME_SHADOW\n");
877  }
878  return e_data.scatter_with_lights_sh;
879 }
880 
882 {
883  if (e_data.volumetric_integration_sh == NULL) {
884  e_data.volumetric_integration_sh = DRW_shader_create_with_shaderlib(
888  e_data.lib,
889  USE_VOLUME_OPTI ? "#extension GL_ARB_shader_image_load_store: enable\n"
890  "#extension GL_ARB_shading_language_420pack: enable\n"
891  "#define USE_VOLUME_OPTI\n" SHADER_DEFINES :
893  }
894  return e_data.volumetric_integration_sh;
895 }
896 
898 {
899  const int index = accum ? 1 : 0;
900  if (e_data.volumetric_resolve_sh[index] == NULL) {
901  e_data.volumetric_resolve_sh[index] = DRW_shader_create_fullscreen_with_shaderlib(
903  e_data.lib,
904  accum ? "#define VOLUMETRICS_ACCUM\n" SHADER_DEFINES : SHADER_DEFINES);
905  }
906  return e_data.volumetric_resolve_sh[index];
907 }
908 
910 {
911  if (e_data.volumetric_accum_sh == NULL) {
914  }
915  return e_data.volumetric_accum_sh;
916 }
917 
921 {
922  if (e_data.velocity_resolve_sh == NULL) {
925  }
926  return e_data.velocity_resolve_sh;
927 }
928 
930 {
931  if (e_data.update_noise_sh == NULL) {
934  }
935  return e_data.update_noise_sh;
936 }
937 
939 {
940  GPUShader **sh;
941  const char *define = NULL;
942  if (enabled_effects & EFFECT_TAA_REPROJECT) {
943  sh = &e_data.taa_resolve_reproject_sh;
944  define = "#define USE_REPROJECTION\n";
945  }
946  else {
947  sh = &e_data.taa_resolve_sh;
948  }
949  if (*sh == NULL) {
952  }
953 
954  return *sh;
955 }
956 
957 /* -------------------------------------------------------------------- */
962 {
963  int index = high_quality ? 1 : 0;
964 
965  if (e_data.bloom_blit_sh[index] == NULL) {
966  const char *define = high_quality ? "#define STEP_BLIT\n"
967  "#define HIGH_QUALITY\n" :
968  "#define STEP_BLIT\n";
971  }
972  return e_data.bloom_blit_sh[index];
973 }
974 
976 {
977  int index = high_quality ? 1 : 0;
978 
979  if (e_data.bloom_downsample_sh[index] == NULL) {
980  const char *define = high_quality ? "#define STEP_DOWNSAMPLE\n"
981  "#define HIGH_QUALITY\n" :
982  "#define STEP_DOWNSAMPLE\n";
983  e_data.bloom_downsample_sh[index] = DRW_shader_create_fullscreen_with_shaderlib(
985  }
986  return e_data.bloom_downsample_sh[index];
987 }
988 
990 {
991  int index = high_quality ? 1 : 0;
992 
993  if (e_data.bloom_upsample_sh[index] == NULL) {
994  const char *define = high_quality ? "#define STEP_UPSAMPLE\n"
995  "#define HIGH_QUALITY\n" :
996  "#define STEP_UPSAMPLE\n";
997  e_data.bloom_upsample_sh[index] = DRW_shader_create_fullscreen_with_shaderlib(
999  }
1000  return e_data.bloom_upsample_sh[index];
1001 }
1002 
1004 {
1005  int index = high_quality ? 1 : 0;
1006 
1007  if (e_data.bloom_resolve_sh[index] == NULL) {
1008  const char *define = high_quality ? "#define STEP_RESOLVE\n"
1009  "#define HIGH_QUALITY\n" :
1010  "#define STEP_RESOLVE\n";
1011  e_data.bloom_resolve_sh[index] = DRW_shader_create_fullscreen_with_shaderlib(
1012  datatoc_effect_bloom_frag_glsl, e_data.lib, define);
1013  }
1014  return e_data.bloom_resolve_sh[index];
1015 }
1016 
1019 /* -------------------------------------------------------------------- */
1024 {
1025  if (e_data.dof_bokeh_sh == NULL) {
1028  }
1029  return e_data.dof_bokeh_sh;
1030 }
1031 
1033 {
1034  if (e_data.dof_setup_sh == NULL) {
1037  }
1038  return e_data.dof_setup_sh;
1039 }
1040 
1042 {
1043  if (e_data.dof_flatten_tiles_sh == NULL) {
1044  e_data.dof_flatten_tiles_sh = DRW_shader_create_fullscreen_with_shaderlib(
1046  }
1047  return e_data.dof_flatten_tiles_sh;
1048 }
1049 
1051 {
1052  int pass = b_pass;
1053  if (e_data.dof_dilate_tiles_sh[pass] == NULL) {
1054  e_data.dof_dilate_tiles_sh[pass] = DRW_shader_create_fullscreen_with_shaderlib(
1056  e_data.lib,
1057  (pass == 0) ? DOF_SHADER_DEFINES "#define DILATE_MODE_MIN_MAX\n" :
1058  DOF_SHADER_DEFINES "#define DILATE_MODE_MIN_ABS\n");
1059  }
1060  return e_data.dof_dilate_tiles_sh[pass];
1061 }
1062 
1064 {
1065  if (e_data.dof_downsample_sh == NULL) {
1068  }
1069  return e_data.dof_downsample_sh;
1070 }
1071 
1073 {
1074  int is_copy_pass = b_is_copy_pass;
1075  if (e_data.dof_reduce_sh[is_copy_pass] == NULL) {
1076  e_data.dof_reduce_sh[is_copy_pass] = DRW_shader_create_fullscreen_with_shaderlib(
1078  e_data.lib,
1079  (is_copy_pass) ? DOF_SHADER_DEFINES "#define COPY_PASS\n" :
1080  DOF_SHADER_DEFINES "#define REDUCE_PASS\n");
1081  }
1082  return e_data.dof_reduce_sh[is_copy_pass];
1083 }
1084 
1086 {
1087  int use_bokeh_tx = b_use_bokeh_tx;
1088  if (e_data.dof_gather_sh[pass][use_bokeh_tx] == NULL) {
1089  DynStr *ds = BLI_dynstr_new();
1090 
1092 
1093  switch (pass) {
1094  case DOF_GATHER_FOREGROUND:
1095  BLI_dynstr_append(ds, "#define DOF_FOREGROUND_PASS\n");
1096  break;
1097  case DOF_GATHER_BACKGROUND:
1098  BLI_dynstr_append(ds, "#define DOF_BACKGROUND_PASS\n");
1099  break;
1100  case DOF_GATHER_HOLEFILL:
1101  BLI_dynstr_append(ds,
1102  "#define DOF_BACKGROUND_PASS\n"
1103  "#define DOF_HOLEFILL_PASS\n");
1104  break;
1105  default:
1106  break;
1107  }
1108 
1109  if (use_bokeh_tx) {
1110  BLI_dynstr_append(ds, "#define DOF_BOKEH_TEXTURE\n");
1111  }
1112 
1113  char *define = BLI_dynstr_get_cstring(ds);
1114  BLI_dynstr_free(ds);
1115 
1116  e_data.dof_gather_sh[pass][use_bokeh_tx] = DRW_shader_create_fullscreen_with_shaderlib(
1118 
1119  MEM_freeN(define);
1120  }
1121  return e_data.dof_gather_sh[pass][use_bokeh_tx];
1122 }
1123 
1125 {
1126  if (e_data.dof_filter_sh == NULL) {
1129  }
1130  return e_data.dof_filter_sh;
1131 }
1132 
1133 GPUShader *EEVEE_shaders_depth_of_field_scatter_get(bool b_is_foreground, bool b_use_bokeh_tx)
1134 {
1135  int is_foreground = b_is_foreground;
1136  int use_bokeh_tx = b_use_bokeh_tx;
1137  if (e_data.dof_scatter_sh[is_foreground][use_bokeh_tx] == NULL) {
1138  DynStr *ds = BLI_dynstr_new();
1139 
1142  ds, (is_foreground) ? "#define DOF_FOREGROUND_PASS\n" : "#define DOF_BACKGROUND_PASS\n");
1143 
1144  if (use_bokeh_tx) {
1145  BLI_dynstr_append(ds, "#define DOF_BOKEH_TEXTURE\n");
1146  }
1147 
1148  char *define = BLI_dynstr_get_cstring(ds);
1149  BLI_dynstr_free(ds);
1150 
1151  e_data.dof_scatter_sh[is_foreground][use_bokeh_tx] = DRW_shader_create_with_shaderlib(
1153  NULL,
1155  e_data.lib,
1156  define);
1157 
1158  MEM_freeN(define);
1159  }
1160  return e_data.dof_scatter_sh[is_foreground][use_bokeh_tx];
1161 }
1162 
1163 GPUShader *EEVEE_shaders_depth_of_field_resolve_get(bool b_use_bokeh_tx, bool b_use_hq_gather)
1164 {
1165  int use_hq_gather = b_use_hq_gather;
1166  int use_bokeh_tx = b_use_bokeh_tx;
1167  if (e_data.dof_resolve_sh[use_bokeh_tx][use_hq_gather] == NULL) {
1168  DynStr *ds = BLI_dynstr_new();
1169 
1171  BLI_dynstr_append(ds, "#define DOF_RESOLVE_PASS\n");
1172 
1173  if (use_bokeh_tx) {
1174  BLI_dynstr_append(ds, "#define DOF_BOKEH_TEXTURE\n");
1175  }
1176 
1177  BLI_dynstr_appendf(ds, "#define DOF_SLIGHT_FOCUS_DENSITY %d\n", use_hq_gather ? 4 : 2);
1178 
1179  char *define = BLI_dynstr_get_cstring(ds);
1180  BLI_dynstr_free(ds);
1181 
1182  e_data.dof_resolve_sh[use_bokeh_tx][use_hq_gather] =
1185 
1186  MEM_freeN(define);
1187  }
1188  return e_data.dof_resolve_sh[use_bokeh_tx][use_hq_gather];
1189 }
1190 
1194 {
1195  if (!e_data.diffuse_mat) {
1196  Material *ma = BKE_id_new_nomain(ID_MA, "EEVEEE default diffuse");
1197 
1198  bNodeTree *ntree = ntreeAddTree(NULL, "Shader Nodetree", ntreeType_Shader->idname);
1199  ma->nodetree = ntree;
1200  ma->use_nodes = true;
1201 
1203  bNodeSocket *base_color = nodeFindSocket(bsdf, SOCK_IN, "Color");
1204  copy_v3_fl(((bNodeSocketValueRGBA *)base_color->default_value)->value, 0.8f);
1205 
1207 
1209  bsdf,
1210  nodeFindSocket(bsdf, SOCK_OUT, "BSDF"),
1211  output,
1212  nodeFindSocket(output, SOCK_IN, "Surface"));
1213 
1215  e_data.diffuse_mat = ma;
1216  }
1217  return e_data.diffuse_mat;
1218 }
1219 
1221 {
1222  if (!e_data.glossy_mat) {
1223  Material *ma = BKE_id_new_nomain(ID_MA, "EEVEEE default metal");
1224 
1225  bNodeTree *ntree = ntreeAddTree(NULL, "Shader Nodetree", ntreeType_Shader->idname);
1226  ma->nodetree = ntree;
1227  ma->use_nodes = true;
1228 
1230  bNodeSocket *base_color = nodeFindSocket(bsdf, SOCK_IN, "Color");
1231  copy_v3_fl(((bNodeSocketValueRGBA *)base_color->default_value)->value, 1.0f);
1232  bNodeSocket *roughness = nodeFindSocket(bsdf, SOCK_IN, "Roughness");
1233  ((bNodeSocketValueFloat *)roughness->default_value)->value = 0.0f;
1234 
1236 
1238  bsdf,
1239  nodeFindSocket(bsdf, SOCK_OUT, "BSDF"),
1240  output,
1241  nodeFindSocket(output, SOCK_IN, "Surface"));
1242 
1244  e_data.glossy_mat = ma;
1245  }
1246  return e_data.glossy_mat;
1247 }
1248 
1250 {
1251  if (!e_data.error_mat) {
1252  Material *ma = BKE_id_new_nomain(ID_MA, "EEVEEE default metal");
1253 
1254  bNodeTree *ntree = ntreeAddTree(NULL, "Shader Nodetree", ntreeType_Shader->idname);
1255  ma->nodetree = ntree;
1256  ma->use_nodes = true;
1257 
1258  /* Use emission and output material to be compatible with both World and Material. */
1260  bNodeSocket *color = nodeFindSocket(bsdf, SOCK_IN, "Color");
1261  copy_v3_fl3(((bNodeSocketValueRGBA *)color->default_value)->value, 1.0f, 0.0f, 1.0f);
1262 
1264 
1266  bsdf,
1267  nodeFindSocket(bsdf, SOCK_OUT, "Emission"),
1268  output,
1269  nodeFindSocket(output, SOCK_IN, "Surface"));
1270 
1272  e_data.error_mat = ma;
1273  }
1274  return e_data.error_mat;
1275 }
1276 
1277 /* Configure a default nodetree with the given material. */
1279 {
1280  /* WARNING: This function is not threadsafe. Which is not a problem for the moment. */
1281  if (!e_data.surface.ntree) {
1282  bNodeTree *ntree = ntreeAddTree(NULL, "Shader Nodetree", ntreeType_Shader->idname);
1285  bNodeSocket *bsdf_out = nodeFindSocket(bsdf, SOCK_OUT, "BSDF");
1286  bNodeSocket *output_in = nodeFindSocket(output, SOCK_IN, "Surface");
1287  nodeAddLink(ntree, bsdf, bsdf_out, output, output_in);
1289 
1290  e_data.surface.color_socket = nodeFindSocket(bsdf, SOCK_IN, "Base Color")->default_value;
1291  e_data.surface.metallic_socket = nodeFindSocket(bsdf, SOCK_IN, "Metallic")->default_value;
1292  e_data.surface.roughness_socket = nodeFindSocket(bsdf, SOCK_IN, "Roughness")->default_value;
1293  e_data.surface.specular_socket = nodeFindSocket(bsdf, SOCK_IN, "Specular")->default_value;
1294  e_data.surface.ntree = ntree;
1295  }
1296  /* Update */
1297  copy_v3_fl3(e_data.surface.color_socket->value, ma->r, ma->g, ma->b);
1298  e_data.surface.metallic_socket->value = ma->metallic;
1299  e_data.surface.roughness_socket->value = ma->roughness;
1300  e_data.surface.specular_socket->value = ma->spec;
1301 
1302  return e_data.surface.ntree;
1303 }
1304 
1305 /* Configure a default nodetree with the given world. */
1307 {
1308  /* WARNING: This function is not threadsafe. Which is not a problem for the moment. */
1309  if (!e_data.world.ntree) {
1310  bNodeTree *ntree = ntreeAddTree(NULL, "Shader Nodetree", ntreeType_Shader->idname);
1313  bNodeSocket *bg_out = nodeFindSocket(bg, SOCK_OUT, "Background");
1314  bNodeSocket *output_in = nodeFindSocket(output, SOCK_IN, "Surface");
1315  nodeAddLink(ntree, bg, bg_out, output, output_in);
1317 
1318  e_data.world.color_socket = nodeFindSocket(bg, SOCK_IN, "Color")->default_value;
1319  e_data.world.ntree = ntree;
1320  }
1321 
1322  copy_v3_fl3(e_data.world.color_socket->value, wo->horr, wo->horg, wo->horb);
1323 
1324  return e_data.world.ntree;
1325 }
1326 
1328 {
1329  if (e_data.default_world == NULL) {
1330  e_data.default_world = BKE_id_new_nomain(ID_WO, "EEVEEE default world");
1331  copy_v3_fl(&e_data.default_world->horr, 0.0f);
1332  e_data.default_world->use_nodes = 0;
1333  e_data.default_world->nodetree = NULL;
1334  BLI_listbase_clear(&e_data.default_world->gpumaterial);
1335  }
1336  return e_data.default_world;
1337 }
1338 
1339 static char *eevee_get_defines(int options)
1340 {
1341  char *str = NULL;
1342 
1343  DynStr *ds = BLI_dynstr_new();
1345 
1346  if ((options & VAR_WORLD_BACKGROUND) != 0) {
1347  BLI_dynstr_append(ds, "#define WORLD_BACKGROUND\n");
1348  }
1349  if ((options & VAR_MAT_VOLUME) != 0) {
1350  BLI_dynstr_append(ds, "#define VOLUMETRICS\n");
1351  }
1352  if ((options & VAR_MAT_MESH) != 0) {
1353  BLI_dynstr_append(ds, "#define MESH_SHADER\n");
1354  }
1355  if ((options & VAR_MAT_DEPTH) != 0) {
1356  BLI_dynstr_append(ds, "#define DEPTH_SHADER\n");
1357  }
1358  if ((options & VAR_MAT_HAIR) != 0) {
1359  BLI_dynstr_append(ds, "#define HAIR_SHADER\n");
1360  }
1361  if ((options & VAR_WORLD_PROBE) != 0) {
1362  BLI_dynstr_append(ds, "#define PROBE_CAPTURE\n");
1363  }
1364  if ((options & VAR_MAT_HASH) != 0) {
1365  BLI_dynstr_append(ds, "#define USE_ALPHA_HASH\n");
1366  }
1367  if ((options & VAR_MAT_BLEND) != 0) {
1368  BLI_dynstr_append(ds, "#define USE_ALPHA_BLEND\n");
1369  }
1370  if ((options & VAR_MAT_REFRACT) != 0) {
1371  BLI_dynstr_append(ds, "#define USE_REFRACTION\n");
1372  }
1373  if ((options & VAR_MAT_LOOKDEV) != 0) {
1374  BLI_dynstr_append(ds, "#define LOOKDEV\n");
1375  }
1376  if ((options & VAR_MAT_HOLDOUT) != 0) {
1377  BLI_dynstr_append(ds, "#define HOLDOUT\n");
1378  }
1379 
1381  BLI_dynstr_free(ds);
1382 
1383  return str;
1384 }
1385 
1386 static char *eevee_get_vert(int options)
1387 {
1388  char *str = NULL;
1389 
1390  if ((options & VAR_MAT_VOLUME) != 0) {
1392  }
1393  else if ((options & (VAR_WORLD_PROBE | VAR_WORLD_BACKGROUND)) != 0) {
1395  }
1396  else {
1398  }
1399 
1400  return str;
1401 }
1402 
1403 static char *eevee_get_geom(int options)
1404 {
1405  char *str = NULL;
1406 
1407  if ((options & VAR_MAT_VOLUME) != 0) {
1409  }
1410 
1411  return str;
1412 }
1413 
1414 static char *eevee_get_frag(int options)
1415 {
1416  char *str = NULL;
1417 
1418  if ((options & VAR_MAT_VOLUME) != 0) {
1420  }
1421  else if ((options & VAR_MAT_DEPTH) != 0) {
1422  str = BLI_strdup(e_data.surface_prepass_frag);
1423  }
1424  else {
1425  str = BLI_strdup(e_data.surface_lit_frag);
1426  }
1427 
1428  return str;
1429 }
1430 
1432  int options,
1433  const char **UNUSED(vert_code),
1434  const char **geom_code,
1435  const char **UNUSED(frag_lib),
1436  const char **UNUSED(defines))
1437 {
1438  const bool is_hair = (options & VAR_MAT_HAIR) != 0;
1439  const bool is_mesh = (options & VAR_MAT_MESH) != 0;
1440 
1441  /* Force geometry usage if GPU_BARYCENTRIC_DIST or GPU_BARYCENTRIC_TEXCO are used.
1442  * Note: GPU_BARYCENTRIC_TEXCO only requires it if the shader is not drawing hairs. */
1443  if (!is_hair && is_mesh && GPU_material_flag_get(mat, GPU_MATFLAG_BARYCENTRIC) &&
1444  *geom_code == NULL) {
1445  *geom_code = e_data.surface_geom_barycentric;
1446  }
1447 }
1448 
1450  struct Scene *scene, Material *ma, World *wo, int options, bool deferred)
1451 {
1452  BLI_assert(ma || wo);
1453  const bool is_volume = (options & VAR_MAT_VOLUME) != 0;
1454  const bool is_default = (options & VAR_DEFAULT) != 0;
1455  const void *engine = &DRW_engine_viewport_eevee_type;
1456 
1457  GPUMaterial *mat = NULL;
1458 
1459  if (ma) {
1460  mat = DRW_shader_find_from_material(ma, engine, options, deferred);
1461  }
1462  else {
1463  mat = DRW_shader_find_from_world(wo, engine, options, deferred);
1464  }
1465 
1466  if (mat) {
1467  return mat;
1468  }
1469 
1470  char *defines = eevee_get_defines(options);
1471  char *vert = eevee_get_vert(options);
1472  char *geom = eevee_get_geom(options);
1473  char *frag = eevee_get_frag(options);
1474 
1475  if (ma) {
1477 
1480  scene, ma, ntree, engine, options, is_volume, vert, geom, frag, defines, deferred, cbfn);
1481  }
1482  else {
1483  bNodeTree *ntree = !is_default ? wo->nodetree : EEVEE_shader_default_world_nodetree(wo);
1485  scene, wo, ntree, engine, options, is_volume, vert, geom, frag, defines, deferred, NULL);
1486  }
1487 
1488  MEM_SAFE_FREE(defines);
1489  MEM_SAFE_FREE(vert);
1490  MEM_SAFE_FREE(geom);
1491  MEM_SAFE_FREE(frag);
1492 
1493  return mat;
1494 }
1495 
1496 /* Note: Compilation is not deferred. */
1498 {
1501  BLI_assert(def_ma->use_nodes && def_ma->nodetree);
1502 
1503  return eevee_material_get_ex(scene, def_ma, NULL, options, false);
1504 }
1505 
1507  EEVEE_Data *vedata, struct Scene *scene, Material *ma, World *wo, int options)
1508 {
1509  if ((ma && (!ma->use_nodes || !ma->nodetree)) || (wo && (!wo->use_nodes || !wo->nodetree))) {
1510  options |= VAR_DEFAULT;
1511  }
1512 
1513  /* Meh, implicit option. World probe cannot be deferred because they need
1514  * to be rendered immediately. */
1515  const bool deferred = (options & VAR_WORLD_PROBE) == 0;
1516 
1517  GPUMaterial *mat = eevee_material_get_ex(scene, ma, wo, options, deferred);
1518 
1519  int status = GPU_material_status(mat);
1520  switch (status) {
1521  case GPU_MAT_SUCCESS:
1522  break;
1523  case GPU_MAT_QUEUED:
1524  vedata->stl->g_data->queued_shaders_count++;
1526  break;
1527  case GPU_MAT_FAILED:
1528  default:
1530  mat = eevee_material_get_ex(scene, ma, NULL, options, false);
1531  break;
1532  }
1533  /* Returned material should be ready to be drawn. */
1535  return mat;
1536 }
1537 
1539 {
1540  MEM_SAFE_FREE(e_data.surface_prepass_frag);
1541  MEM_SAFE_FREE(e_data.surface_lit_frag);
1542  MEM_SAFE_FREE(e_data.surface_geom_barycentric);
1543  DRW_SHADER_FREE_SAFE(e_data.lookdev_background);
1544  DRW_SHADER_FREE_SAFE(e_data.update_noise_sh);
1545  DRW_SHADER_FREE_SAFE(e_data.color_copy_sh);
1546  DRW_SHADER_FREE_SAFE(e_data.downsample_sh);
1547  DRW_SHADER_FREE_SAFE(e_data.downsample_cube_sh);
1548  DRW_SHADER_FREE_SAFE(e_data.minz_downlevel_sh);
1549  DRW_SHADER_FREE_SAFE(e_data.maxz_downlevel_sh);
1550  DRW_SHADER_FREE_SAFE(e_data.minz_downdepth_sh);
1551  DRW_SHADER_FREE_SAFE(e_data.maxz_downdepth_sh);
1552  DRW_SHADER_FREE_SAFE(e_data.minz_downdepth_layer_sh);
1553  DRW_SHADER_FREE_SAFE(e_data.maxz_downdepth_layer_sh);
1554  DRW_SHADER_FREE_SAFE(e_data.maxz_copydepth_layer_sh);
1555  DRW_SHADER_FREE_SAFE(e_data.minz_copydepth_sh);
1556  DRW_SHADER_FREE_SAFE(e_data.maxz_copydepth_sh);
1557  DRW_SHADER_FREE_SAFE(e_data.ggx_lut_sh);
1558  DRW_SHADER_FREE_SAFE(e_data.ggx_refraction_lut_sh);
1559  DRW_SHADER_FREE_SAFE(e_data.mist_sh);
1560  DRW_SHADER_FREE_SAFE(e_data.motion_blur_sh);
1561  DRW_SHADER_FREE_SAFE(e_data.motion_blur_object_sh);
1562  DRW_SHADER_FREE_SAFE(e_data.motion_blur_hair_sh);
1563  DRW_SHADER_FREE_SAFE(e_data.velocity_tiles_sh);
1564  DRW_SHADER_FREE_SAFE(e_data.velocity_tiles_expand_sh);
1565  DRW_SHADER_FREE_SAFE(e_data.gtao_sh);
1566  DRW_SHADER_FREE_SAFE(e_data.gtao_layer_sh);
1567  DRW_SHADER_FREE_SAFE(e_data.gtao_debug_sh);
1568  DRW_SHADER_FREE_SAFE(e_data.velocity_resolve_sh);
1569  DRW_SHADER_FREE_SAFE(e_data.postprocess_sh);
1570  DRW_SHADER_FREE_SAFE(e_data.shadow_sh);
1571  DRW_SHADER_FREE_SAFE(e_data.shadow_accum_sh);
1572  DRW_SHADER_FREE_SAFE(e_data.sss_sh[0]);
1573  DRW_SHADER_FREE_SAFE(e_data.sss_sh[1]);
1574  DRW_SHADER_FREE_SAFE(e_data.sss_sh[2]);
1575  DRW_SHADER_FREE_SAFE(e_data.volumetric_clear_sh);
1576  DRW_SHADER_FREE_SAFE(e_data.scatter_sh);
1577  DRW_SHADER_FREE_SAFE(e_data.scatter_with_lights_sh);
1578  DRW_SHADER_FREE_SAFE(e_data.volumetric_integration_sh);
1579  DRW_SHADER_FREE_SAFE(e_data.volumetric_resolve_sh[0]);
1580  DRW_SHADER_FREE_SAFE(e_data.volumetric_resolve_sh[1]);
1581  DRW_SHADER_FREE_SAFE(e_data.volumetric_accum_sh);
1582  DRW_SHADER_FREE_SAFE(e_data.probe_filter_glossy_sh);
1583  DRW_SHADER_FREE_SAFE(e_data.probe_filter_diffuse_sh);
1584  DRW_SHADER_FREE_SAFE(e_data.probe_filter_visibility_sh);
1585  DRW_SHADER_FREE_SAFE(e_data.probe_grid_fill_sh);
1586  DRW_SHADER_FREE_SAFE(e_data.probe_planar_downsample_sh);
1587  DRW_SHADER_FREE_SAFE(e_data.studiolight_probe_sh);
1588  DRW_SHADER_FREE_SAFE(e_data.studiolight_background_sh);
1589  DRW_SHADER_FREE_SAFE(e_data.probe_grid_display_sh);
1590  DRW_SHADER_FREE_SAFE(e_data.probe_cube_display_sh);
1591  DRW_SHADER_FREE_SAFE(e_data.probe_planar_display_sh);
1592  DRW_SHADER_FREE_SAFE(e_data.velocity_resolve_sh);
1593  DRW_SHADER_FREE_SAFE(e_data.taa_resolve_sh);
1594  DRW_SHADER_FREE_SAFE(e_data.taa_resolve_reproject_sh);
1595  DRW_SHADER_FREE_SAFE(e_data.dof_bokeh_sh);
1596  DRW_SHADER_FREE_SAFE(e_data.dof_setup_sh);
1597  DRW_SHADER_FREE_SAFE(e_data.dof_flatten_tiles_sh);
1598  DRW_SHADER_FREE_SAFE(e_data.dof_dilate_tiles_sh[0]);
1599  DRW_SHADER_FREE_SAFE(e_data.dof_dilate_tiles_sh[1]);
1600  DRW_SHADER_FREE_SAFE(e_data.dof_downsample_sh);
1601  DRW_SHADER_FREE_SAFE(e_data.dof_reduce_sh[0]);
1602  DRW_SHADER_FREE_SAFE(e_data.dof_reduce_sh[1]);
1603  for (int i = 0; i < DOF_GATHER_MAX_PASS; i++) {
1604  DRW_SHADER_FREE_SAFE(e_data.dof_gather_sh[i][0]);
1605  DRW_SHADER_FREE_SAFE(e_data.dof_gather_sh[i][1]);
1606  }
1607  DRW_SHADER_FREE_SAFE(e_data.dof_filter_sh);
1608  DRW_SHADER_FREE_SAFE(e_data.dof_scatter_sh[0][0]);
1609  DRW_SHADER_FREE_SAFE(e_data.dof_scatter_sh[0][1]);
1610  DRW_SHADER_FREE_SAFE(e_data.dof_scatter_sh[1][0]);
1611  DRW_SHADER_FREE_SAFE(e_data.dof_scatter_sh[1][1]);
1612  DRW_SHADER_FREE_SAFE(e_data.dof_resolve_sh[0][0]);
1613  DRW_SHADER_FREE_SAFE(e_data.dof_resolve_sh[0][1]);
1614  DRW_SHADER_FREE_SAFE(e_data.dof_resolve_sh[1][0]);
1615  DRW_SHADER_FREE_SAFE(e_data.dof_resolve_sh[1][1]);
1616  DRW_SHADER_FREE_SAFE(e_data.cryptomatte_sh[0]);
1617  DRW_SHADER_FREE_SAFE(e_data.cryptomatte_sh[1]);
1618  for (int i = 0; i < 2; i++) {
1619  DRW_SHADER_FREE_SAFE(e_data.bloom_blit_sh[i]);
1620  DRW_SHADER_FREE_SAFE(e_data.bloom_downsample_sh[i]);
1621  DRW_SHADER_FREE_SAFE(e_data.bloom_upsample_sh[i]);
1622  DRW_SHADER_FREE_SAFE(e_data.bloom_resolve_sh[i]);
1623  }
1624  DRW_SHADER_FREE_SAFE(e_data.reflection_trace);
1625  DRW_SHADER_FREE_SAFE(e_data.reflection_resolve);
1627 
1628  if (e_data.default_world) {
1629  BKE_id_free(NULL, e_data.default_world);
1630  e_data.default_world = NULL;
1631  }
1632  if (e_data.glossy_mat) {
1633  BKE_id_free(NULL, e_data.glossy_mat);
1634  e_data.glossy_mat = NULL;
1635  }
1636  if (e_data.diffuse_mat) {
1637  BKE_id_free(NULL, e_data.diffuse_mat);
1638  e_data.diffuse_mat = NULL;
1639  }
1640  if (e_data.error_mat) {
1641  BKE_id_free(NULL, e_data.error_mat);
1642  e_data.error_mat = NULL;
1643  }
1644  if (e_data.surface.ntree) {
1645  ntreeFreeEmbeddedTree(e_data.surface.ntree);
1646  MEM_freeN(e_data.surface.ntree);
1647  e_data.surface.ntree = NULL;
1648  }
1649  if (e_data.world.ntree) {
1650  ntreeFreeEmbeddedTree(e_data.world.ntree);
1651  MEM_freeN(e_data.world.ntree);
1652  e_data.world.ntree = NULL;
1653  }
1654 }
void * BKE_id_new_nomain(const short type, const char *name)
Definition: lib_id.c:1196
void BKE_id_free(struct Main *bmain, void *idv)
struct Material * BKE_material_default_surface(void)
Definition: material.c:1829
struct Material * BKE_material_default_volume(void)
Definition: material.c:1834
#define SH_NODE_OUTPUT_WORLD
Definition: BKE_node.h:996
#define SH_NODE_BSDF_PRINCIPLED
Definition: BKE_node.h:1058
#define SH_NODE_EMISSION
Definition: BKE_node.h:1009
void ntreeFreeEmbeddedTree(struct bNodeTree *ntree)
Definition: node.cc:3021
struct bNodeLink * nodeAddLink(struct bNodeTree *ntree, struct bNode *fromnode, struct bNodeSocket *fromsock, struct bNode *tonode, struct bNodeSocket *tosock)
Definition: node.cc:2189
#define SH_NODE_BACKGROUND
Definition: BKE_node.h:1001
struct bNodeSocket * nodeFindSocket(const struct bNode *node, eNodeSocketInOut in_out, const char *identifier)
struct bNodeTree * ntreeAddTree(struct Main *bmain, const char *name, const char *idname)
Definition: node.cc:2529
struct bNode * nodeAddStaticNode(const struct bContext *C, struct bNodeTree *ntree, int type)
Definition: node.cc:2004
void nodeSetActive(struct bNodeTree *ntree, struct bNode *node)
Definition: node.cc:3694
#define BLI_assert(a)
Definition: BLI_assert.h:58
A dynamically sized string ADT.
DynStr * BLI_dynstr_new(void) ATTR_MALLOC ATTR_WARN_UNUSED_RESULT
Definition: BLI_dynstr.c:71
void BLI_dynstr_free(DynStr *ds) ATTR_NONNULL()
Definition: BLI_dynstr.c:358
void BLI_dynstr_appendf(DynStr *__restrict ds, const char *__restrict format,...) ATTR_PRINTF_FORMAT(2
char * BLI_dynstr_get_cstring(DynStr *ds) ATTR_MALLOC ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
Definition: BLI_dynstr.c:323
void BLI_dynstr_append(DynStr *__restrict ds, const char *cstr) ATTR_NONNULL()
Definition: BLI_dynstr.c:107
BLI_INLINE void BLI_listbase_clear(struct ListBase *lb)
Definition: BLI_listbase.h:128
MINLINE void copy_v3_fl3(float v[3], float x, float y, float z)
MINLINE void copy_v3_fl(float r[3], float f)
char * BLI_strdup(const char *str) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL() ATTR_MALLOC
Definition: string.c:70
#define UNUSED(x)
@ ID_WO
Definition: DNA_ID_enums.h:71
@ ID_MA
Definition: DNA_ID_enums.h:63
@ SOCK_OUT
@ SOCK_IN
#define DRW_SHADER_LIB_FREE_SAFE(lib)
Definition: DRW_render.h:298
#define DRW_shader_create_fullscreen(frag, defines)
Definition: DRW_render.h:241
#define DRW_SHADER_LIB_ADD(lib, lib_name)
Definition: DRW_render.h:291
void(* GPUMaterialEvalCallbackFn)(struct GPUMaterial *mat, int options, const char **vert_code, const char **geom_code, const char **frag_lib, const char **defines)
Definition: DRW_render.h:200
#define DRW_SHADER_FREE_SAFE(shader)
Definition: DRW_render.h:279
#define DRW_shader_create_with_shaderlib(vert, geom, frag, lib, defines)
Definition: DRW_render.h:239
#define DRW_shader_create_fullscreen_with_shaderlib(frag, lib, defines)
Definition: DRW_render.h:243
@ GPU_MATFLAG_BARYCENTRIC
Definition: GPU_material.h:113
eGPUMaterialStatus GPU_material_status(GPUMaterial *mat)
Definition: gpu_material.c:619
@ GPU_MAT_QUEUED
Definition: GPU_material.h:128
@ GPU_MAT_FAILED
Definition: GPU_material.h:127
@ GPU_MAT_SUCCESS
Definition: GPU_material.h:129
bool GPU_material_flag_get(GPUMaterial *mat, eGPUMatFlag flag)
Definition: gpu_material.c:646
struct GPUShader GPUShader
Definition: GPU_shader.h:33
Read Guarded memory(de)allocation.
#define MEM_SAFE_FREE(v)
struct bNodeTreeType * ntreeType_Shader
Group RGB to Bright Vector Camera Vector Combine Material Light Line Style Layer Add Ambient SH_NODE_BSDF_DIFFUSE
Group RGB to Bright Vector Camera Vector Combine Material Light Line Style Layer Add Ambient Diffuse SH_NODE_BSDF_GLOSSY
Group RGB to Bright Vector Camera Vector Combine SH_NODE_OUTPUT_MATERIAL
#define output
CCL_NAMESPACE_BEGIN struct Options options
Scene scene
GPUMaterial * DRW_shader_find_from_material(Material *ma, const void *engine_type, const int options, bool deferred)
GPUMaterial * DRW_shader_create_from_world(struct Scene *scene, World *wo, struct bNodeTree *ntree, const void *engine_type, const int options, const bool is_volume_shader, const char *vert, const char *geom, const char *frag_lib, const char *defines, bool deferred, GPUMaterialEvalCallbackFn callback)
DRWShaderLibrary * DRW_shader_library_create(void)
GPUMaterial * DRW_shader_create_from_material(struct Scene *scene, Material *ma, struct bNodeTree *ntree, const void *engine_type, const int options, const bool is_volume_shader, const char *vert, const char *geom, const char *frag_lib, const char *defines, bool deferred, GPUMaterialEvalCallbackFn callback)
char * DRW_shader_library_create_shader_string(const DRWShaderLibrary *lib, const char *shader_code)
GPUMaterial * DRW_shader_find_from_world(World *wo, const void *engine_type, const int options, bool deferred)
RenderEngineType DRW_engine_viewport_eevee_type
Definition: eevee_engine.c:639
EEVEE_DofGatherPass
@ DOF_GATHER_HOLEFILL
@ DOF_GATHER_FOREGROUND
@ DOF_GATHER_BACKGROUND
@ DOF_GATHER_MAX_PASS
@ VAR_WORLD_BACKGROUND
@ VAR_MAT_HOLDOUT
@ VAR_MAT_BLEND
@ VAR_MAT_HASH
@ VAR_MAT_DEPTH
@ VAR_DEFAULT
@ VAR_WORLD_PROBE
@ VAR_MAT_LOOKDEV
@ VAR_MAT_VOLUME
@ VAR_MAT_REFRACT
@ VAR_MAT_MESH
@ VAR_MAT_HAIR
#define DOF_SHADER_DEFINES
EEVEE_EffectsFlag
@ EFFECT_TAA_REPROJECT
#define SHADER_DEFINES
Definition: eevee_private.h:75
#define USE_VOLUME_OPTI
Definition: eevee_private.h:90
char datatoc_lightprobe_cube_display_frag_glsl[]
struct GPUShader * EEVEE_shaders_volumes_clear_sh_get()
GPUShader * EEVEE_shaders_effect_motion_blur_velocity_tiles_sh_get(void)
GPUShader * EEVEE_shaders_probe_planar_display_sh_get(void)
char datatoc_object_motion_vert_glsl[]
char datatoc_btdf_lut_frag_glsl[]
static char * eevee_get_geom(int options)
char datatoc_effect_dof_gather_frag_glsl[]
struct GPUShader * volumetric_clear_sh
GPUShader * EEVEE_shaders_effect_maxz_copydepth_sh_get(void)
char datatoc_lightprobe_grid_display_vert_glsl[]
char datatoc_gpu_shader_common_obinfos_lib_glsl[]
GPUShader * EEVEE_shaders_ggx_refraction_lut_sh_get(void)
char datatoc_lightprobe_grid_display_frag_glsl[]
char datatoc_renderpass_lib_glsl[]
char datatoc_lightprobe_filter_diffuse_frag_glsl[]
struct GPUShader * probe_grid_display_sh
Definition: eevee_shaders.c:57
struct GPUShader * maxz_downdepth_sh
Definition: eevee_shaders.c:99
void EEVEE_shaders_free(void)
char datatoc_prepass_frag_glsl[]
char datatoc_effect_temporal_aa_glsl[]
struct GPUShader * dof_bokeh_sh
Definition: eevee_shaders.c:80
char datatoc_cubemap_lib_glsl[]
struct GPUShader * reflection_trace
char datatoc_volumetric_geom_glsl[]
DRWShaderLibrary * EEVEE_shader_lib_get(void)
char datatoc_closure_type_lib_glsl[]
char datatoc_surface_lib_glsl[]
char datatoc_background_vert_glsl[]
struct GPUShader * dof_downsample_sh
Definition: eevee_shaders.c:84
char datatoc_effect_downsample_cube_frag_glsl[]
GPUShader * EEVEE_shaders_effect_motion_blur_hair_sh_get(void)
struct GPUShader * probe_filter_diffuse_sh
Definition: eevee_shaders.c:61
GPUShader * EEVEE_shaders_depth_of_field_gather_get(EEVEE_DofGatherPass pass, bool b_use_bokeh_tx)
GPUShader * EEVEE_shaders_effect_motion_blur_object_sh_get(void)
char datatoc_surface_frag_glsl[]
char datatoc_closure_eval_lib_glsl[]
char datatoc_effect_velocity_tile_frag_glsl[]
char datatoc_effect_dof_lib_glsl[]
struct GPUShader * downsample_cube_sh
char datatoc_effect_dof_dilate_tiles_frag_glsl[]
bNodeSocketValueFloat * metallic_socket
GPUShader * EEVEE_shaders_effect_ambient_occlusion_debug_sh_get(void)
static char * eevee_get_defines(int options)
struct GPUShader * EEVEE_shaders_subsurface_second_pass_sh_get()
char datatoc_common_uniforms_lib_glsl[]
char datatoc_bsdf_lut_frag_glsl[]
struct GPUShader * motion_blur_hair_sh
struct GPUShader * taa_resolve_reproject_sh
Definition: eevee_shaders.c:71
char datatoc_effect_velocity_resolve_frag_glsl[]
char datatoc_shadow_vert_glsl[]
GPUShader * EEVEE_shaders_bloom_upsample_get(bool high_quality)
char datatoc_effect_gtao_frag_glsl[]
struct GPUShader * bloom_resolve_sh[2]
Definition: eevee_shaders.c:77
char datatoc_effect_dof_downsample_frag_glsl[]
char datatoc_cryptomatte_frag_glsl[]
GPUShader * EEVEE_shaders_depth_of_field_setup_get(void)
struct GPUShader * reflection_resolve
char datatoc_ssr_lib_glsl[]
struct GPUShader * velocity_tiles_sh
char datatoc_effect_dof_filter_frag_glsl[]
static void eevee_material_post_eval(GPUMaterial *mat, int options, const char **UNUSED(vert_code), const char **geom_code, const char **UNUSED(frag_lib), const char **UNUSED(defines))
char datatoc_effect_dof_bokeh_frag_glsl[]
char datatoc_irradiance_lib_glsl[]
char datatoc_closure_eval_diffuse_lib_glsl[]
char datatoc_effect_motion_blur_frag_glsl[]
GPUShader * EEVEE_shaders_taa_resolve_sh_get(EEVEE_EffectsFlag enabled_effects)
char datatoc_effect_subsurface_frag_glsl[]
char datatoc_lightprobe_cube_display_vert_glsl[]
struct GPUShader * velocity_tiles_expand_sh
char datatoc_volumetric_resolve_frag_glsl[]
World * EEVEE_world_default_get(void)
GPUShader * EEVEE_shaders_bloom_resolve_get(bool high_quality)
static const char * filter_defines
Definition: eevee_shaders.c:44
struct GPUShader * EEVEE_shaders_volumes_scatter_with_lights_sh_get()
GPUShader * EEVEE_shaders_studiolight_background_sh_get(void)
struct GPUShader * minz_downdepth_sh
Definition: eevee_shaders.c:98
char datatoc_effect_reflection_lib_glsl[]
char datatoc_common_utiltex_lib_glsl[]
struct GPUShader * update_noise_sh
Definition: eevee_shaders.c:93
struct GPUShader * bloom_downsample_sh[2]
Definition: eevee_shaders.c:75
GPUShader * EEVEE_shaders_probe_filter_diffuse_sh_get(void)
struct GPUShader * maxz_downdepth_layer_sh
struct GPUShader * dof_gather_sh[DOF_GATHER_MAX_PASS][2]
Definition: eevee_shaders.c:86
struct GPUShader * ggx_refraction_lut_sh
GPUShader * EEVEE_shaders_depth_of_field_reduce_get(bool b_is_copy_pass)
struct GPUShader * maxz_copydepth_layer_sh
char datatoc_volumetric_scatter_frag_glsl[]
GPUShader * EEVEE_shaders_bloom_downsample_get(bool high_quality)
GPUShader * EEVEE_shaders_depth_of_field_flatten_tiles_get(void)
struct GPUShader * gtao_debug_sh
struct GPUShader * volumetric_integration_sh
struct GPUShader * shadow_accum_sh
struct GPUShader * bloom_upsample_sh[2]
Definition: eevee_shaders.c:76
GPUShader * EEVEE_shaders_effect_downsample_sh_get(void)
GPUShader * EEVEE_shaders_effect_mist_sh_get(void)
char datatoc_prepass_vert_glsl[]
struct GPUShader * gtao_sh
Material * EEVEE_material_default_diffuse_get(void)
struct GPUShader * maxz_downlevel_sh
Definition: eevee_shaders.c:97
Material * error_mat
struct GPUShader * shadow_sh
GPUShader * EEVEE_shaders_effect_minz_downdepth_sh_get(void)
GPUShader * EEVEE_shaders_effect_ambient_occlusion_sh_get(void)
char datatoc_effect_mist_frag_glsl[]
char * surface_geom_barycentric
struct GPUShader * EEVEE_shaders_effect_reflection_trace_sh_get(void)
struct GPUShader * dof_reduce_sh[2]
Definition: eevee_shaders.c:85
char datatoc_effect_dof_resolve_frag_glsl[]
static struct @203 e_data
char datatoc_lightprobe_planar_display_vert_glsl[]
GPUShader * EEVEE_shaders_probe_filter_glossy_sh_get(void)
char datatoc_lightprobe_planar_downsample_frag_glsl[]
Material * EEVEE_material_default_glossy_get(void)
struct GPUShader * EEVEE_shaders_effect_reflection_resolve_sh_get(void)
struct GPUShader * EEVEE_shaders_subsurface_translucency_sh_get()
struct GPUShader * dof_dilate_tiles_sh[2]
Definition: eevee_shaders.c:83
struct GPUShader * probe_grid_fill_sh
Definition: eevee_shaders.c:63
char datatoc_ltc_lib_glsl[]
GPUShader * EEVEE_shaders_effect_maxz_downdepth_layer_sh_get(void)
struct bNodeTree * EEVEE_shader_default_surface_nodetree(Material *ma)
char datatoc_effect_dof_setup_frag_glsl[]
struct GPUShader * cryptomatte_sh[2]
char datatoc_common_hair_lib_glsl[]
char datatoc_surface_vert_glsl[]
char datatoc_lightprobe_filter_visibility_frag_glsl[]
GPUShader * EEVEE_shaders_effect_minz_copydepth_sh_get(void)
GPUShader * EEVEE_shaders_depth_of_field_resolve_get(bool b_use_bokeh_tx, bool b_use_hq_gather)
char datatoc_effect_dof_flatten_tiles_frag_glsl[]
char datatoc_effect_minmaxz_frag_glsl[]
static struct GPUMaterial * eevee_material_get_ex(struct Scene *scene, Material *ma, World *wo, int options, bool deferred)
char datatoc_common_view_lib_glsl[]
struct GPUShader * postprocess_sh
char * surface_lit_frag
static char * eevee_get_vert(int options)
struct GPUShader * ggx_lut_sh
GPUShader * EEVEE_shaders_effect_maxz_downlevel_sh_get(void)
Material * diffuse_mat
char datatoc_effect_reflection_trace_frag_glsl[]
char datatoc_lightprobe_planar_downsample_vert_glsl[]
struct GPUShader * gtao_layer_sh
struct GPUMaterial * EEVEE_material_default_get(struct Scene *scene, Material *ma, int options)
char datatoc_default_frag_glsl[]
char datatoc_lightprobe_planar_downsample_geom_glsl[]
char datatoc_update_noise_frag_glsl[]
struct GPUShader * motion_blur_object_sh
struct bNodeTree * EEVEE_shader_default_world_nodetree(World *wo)
struct GPUShader * sss_sh[3]
struct GPUShader * probe_planar_downsample_sh
Definition: eevee_shaders.c:64
struct GPUShader * dof_flatten_tiles_sh
Definition: eevee_shaders.c:82
char datatoc_effect_dof_scatter_frag_glsl[]
char datatoc_random_lib_glsl[]
char * surface_prepass_frag
GPUShader * EEVEE_shaders_effect_minz_downlevel_sh_get(void)
GPUShader * EEVEE_shaders_probe_cube_display_sh_get(void)
GPUShader * EEVEE_shaders_probe_grid_fill_sh_get(void)
bNodeTree * ntree
struct GPUShader * mist_sh
static char * eevee_get_frag(int options)
struct GPUShader * studiolight_probe_sh
Definition: eevee_shaders.c:53
struct GPUShader * probe_cube_display_sh
Definition: eevee_shaders.c:58
char datatoc_common_math_lib_glsl[]
DRWShaderLibrary * lib
GPUShader * EEVEE_shaders_bloom_blit_get(bool high_quality)
char datatoc_lightprobe_grid_fill_frag_glsl[]
GPUShader * EEVEE_shaders_effect_maxz_copydepth_layer_sh_get(void)
GPUShader * EEVEE_shaders_update_noise_sh_get(void)
GPUShader * EEVEE_shaders_studiolight_probe_sh_get(void)
struct GPUShader * bloom_blit_sh[2]
Definition: eevee_shaders.c:74
char datatoc_bsdf_sampling_lib_glsl[]
struct GPUShader * probe_planar_display_sh
Definition: eevee_shaders.c:59
struct GPUShader * volumetric_accum_sh
struct GPUShader * minz_downlevel_sh
Definition: eevee_shaders.c:96
char datatoc_lightprobe_lib_glsl[]
char datatoc_shadow_frag_glsl[]
GPUShader * EEVEE_shaders_effect_downsample_cube_sh_get(void)
struct GPUShader * EEVEE_shaders_shadow_accum_sh_get()
struct @203::@204 surface
struct GPUShader * EEVEE_shaders_volumes_integration_sh_get()
struct GPUShader * probe_filter_visibility_sh
Definition: eevee_shaders.c:62
struct GPUShader * downsample_sh
struct GPUShader * motion_blur_sh
GPUShader * EEVEE_shaders_depth_of_field_bokeh_get(void)
GPUShader * EEVEE_shaders_ggx_lut_sh_get(void)
char datatoc_surface_geom_glsl[]
struct GPUShader * taa_resolve_sh
Definition: eevee_shaders.c:70
#define TILE_SIZE_STR
struct GPUShader * EEVEE_shaders_volumes_accum_sh_get()
struct GPUMaterial * EEVEE_material_get(EEVEE_Data *vedata, struct Scene *scene, Material *ma, World *wo, int options)
bNodeSocketValueFloat * specular_socket
Material * EEVEE_material_default_error_get(void)
struct GPUShader * dof_setup_sh
Definition: eevee_shaders.c:81
struct GPUShader * studiolight_background_sh
Definition: eevee_shaders.c:54
Material * glossy_mat
char datatoc_raytrace_lib_glsl[]
GPUShader * EEVEE_shaders_depth_of_field_filter_get(void)
char datatoc_effect_bloom_frag_glsl[]
char datatoc_closure_eval_translucent_lib_glsl[]
struct GPUShader * EEVEE_shaders_subsurface_first_pass_sh_get()
struct GPUShader * velocity_resolve_sh
Definition: eevee_shaders.c:67
char datatoc_octahedron_lib_glsl[]
struct GPUShader * maxz_copydepth_sh
GPUShader * EEVEE_shaders_velocity_resolve_sh_get(void)
GPUShader * EEVEE_shaders_renderpasses_post_process_sh_get(void)
char datatoc_object_motion_frag_glsl[]
GPUShader * EEVEE_shaders_cryptomatte_sh_get(bool is_hair)
char datatoc_bsdf_common_lib_glsl[]
GPUShader * EEVEE_shaders_effect_minz_downdepth_layer_sh_get(void)
bNodeSocketValueRGBA * color_socket
char datatoc_lightprobe_planar_display_frag_glsl[]
char datatoc_lightprobe_filter_glossy_frag_glsl[]
GPUShader * EEVEE_shaders_depth_of_field_dilate_tiles_get(bool b_pass)
GPUShader * EEVEE_shaders_effect_maxz_downdepth_sh_get(void)
GPUShader * EEVEE_shaders_probe_grid_display_sh_get(void)
struct GPUShader * scatter_with_lights_sh
struct @203::@205 world
struct GPUShader * EEVEE_shaders_volumes_resolve_sh_get(bool accum)
struct GPUShader * color_copy_sh
GPUShader * EEVEE_shaders_effect_motion_blur_sh_get(void)
struct GPUShader * minz_copydepth_sh
GPUShader * EEVEE_shaders_probe_planar_downsample_sh_get(void)
GPUShader * EEVEE_shaders_effect_color_copy_sh_get(void)
char datatoc_volumetric_integration_frag_glsl[]
struct GPUShader * dof_scatter_sh[2][2]
Definition: eevee_shaders.c:88
char datatoc_lookdev_world_frag_glsl[]
char datatoc_lights_lib_glsl[]
struct GPUShader * dof_filter_sh
Definition: eevee_shaders.c:87
char datatoc_effect_reflection_resolve_frag_glsl[]
char datatoc_volumetric_frag_glsl[]
char datatoc_volumetric_vert_glsl[]
char datatoc_lightprobe_geom_glsl[]
char datatoc_effect_dof_reduce_frag_glsl[]
struct GPUShader * minz_downdepth_layer_sh
World * default_world
char datatoc_volumetric_accum_frag_glsl[]
bNodeSocketValueFloat * roughness_socket
char datatoc_effect_downsample_frag_glsl[]
struct GPUShader * probe_filter_glossy_sh
Definition: eevee_shaders.c:60
char datatoc_ambient_occlusion_lib_glsl[]
char datatoc_shadow_accum_frag_glsl[]
GPUShader * EEVEE_shaders_probe_filter_visibility_sh_get(void)
char datatoc_renderpass_postprocess_frag_glsl[]
struct GPUShader * dof_resolve_sh[2][2]
Definition: eevee_shaders.c:89
char datatoc_volumetric_lib_glsl[]
char datatoc_common_math_geom_lib_glsl[]
GPUShader * EEVEE_shaders_depth_of_field_scatter_get(bool b_is_foreground, bool b_use_bokeh_tx)
char datatoc_effect_translucency_frag_glsl[]
struct GPUShader * scatter_sh
void EEVEE_shaders_material_shaders_init(void)
char datatoc_closure_eval_refraction_lib_glsl[]
GPUShader * EEVEE_shaders_depth_of_field_downsample_get(void)
char datatoc_lightprobe_vert_glsl[]
static void eevee_shader_library_ensure(void)
struct GPUShader * volumetric_resolve_sh[2]
struct GPUShader * EEVEE_shaders_shadow_sh_get()
struct GPUShader * EEVEE_shaders_volumes_scatter_sh_get()
GPUShader * EEVEE_shaders_effect_motion_blur_velocity_tiles_expand_sh_get(void)
struct GPUShader * lookdev_background
Definition: eevee_shaders.c:92
char datatoc_closure_eval_glossy_lib_glsl[]
char datatoc_effect_dof_scatter_vert_glsl[]
#define str(s)
void(* MEM_freeN)(void *vmemh)
Definition: mallocn.c:41
static const pxr::TfToken roughness("roughness", pxr::TfToken::Immortal)
EEVEE_StorageList * stl
struct EEVEE_PrivateData * g_data
Material * ma
Definition: gpu_material.c:67
eGPUMaterialStatus status
Definition: gpu_material.c:69
struct bNodeTree * nodetree
struct bNodeTree * nodetree
float horg
short use_nodes
float horb
float horr
void * default_value
char idname[64]
Definition: BKE_node.h:381