79 #define MAX_LIGHTING 3
88 #define VOLUME_SH_MAX (1 << (VOLUME_SH_CUBIC + 1))
184 return (textured) ? (tiled ? 2 : 1) : 0;
197 (transp) ? &
e_data.transp_prepass_sh_cache[wpd->
sh_cfg][datatype][light][color] :
198 &
e_data.opaque_prepass_sh_cache[wpd->
sh_cfg][datatype][color];
217 .vert = (
const char *[]){sh_cfg_data->
lib, vert_src,
NULL},
218 .frag = (
const char *[]){frag_src,
NULL},
219 .defs = (
const char *[]){sh_cfg_data->
def,
221 transp ?
"#define TRANSPARENT_MATERIAL\n" :
222 "#define OPAQUE_MATERIAL\n",
224 "#define UNIFORM_RESOURCE_ID\n"
225 "#define INSTANCED_ATTR\n" :
291 return e_data.merge_infront_sh;
304 return e_data.oit_resolve_sh;
310 &
e_data.shadow_depth_fail_sh[manifold][cap];
313 #if DEBUG_SHADOW_VOLUME
326 .frag = (
const char *[]){shadow_frag,
NULL},
327 .defs = (
const char *[]){(depth_pass) ?
"#define SHADOW_PASS\n" :
"#define SHADOW_FAIL\n",
328 (manifold) ?
"" :
"#define DOUBLE_MANIFOLD\n",
405 *prepare_sh =
e_data.dof_prepare_sh;
407 *blur1_sh =
e_data.dof_blur1_sh;
408 *blur2_sh =
e_data.dof_blur2_sh;
409 *resolve_sh =
e_data.dof_resolve_sh;
422 return e_data.aa_accum_sh;
429 char stage_define[32];
430 BLI_snprintf(stage_define,
sizeof(stage_define),
"#define SMAA_STAGE %d\n",
stage);
435 "#define SMAA_INCLUDE_VS 1\n",
436 "#define SMAA_INCLUDE_PS 0\n",
437 "uniform vec4 viewportMetrics;\n",
444 "#define SMAA_INCLUDE_VS 0\n",
445 "#define SMAA_INCLUDE_PS 1\n",
446 "uniform vec4 viewportMetrics;\n",
453 "#define SMAA_GLSL_3\n",
454 "#define SMAA_RT_METRICS viewportMetrics\n",
455 "#define SMAA_PRESET_HIGH\n",
456 "#define SMAA_LUMA_WEIGHT float4(1.0, 1.0, 1.0, 1.0)\n",
457 "#define SMAA_NO_DISCARD\n",
482 switch (interp_type) {
516 for (
int j = 0; j <
sizeof(
e_data.opaque_prepass_sh_cache) /
sizeof(
void *); j++) {
517 struct GPUShader **sh_array = &
e_data.opaque_prepass_sh_cache[0][0][0];
520 for (
int j = 0; j <
sizeof(
e_data.transp_prepass_sh_cache) /
sizeof(
void *); j++) {
521 struct GPUShader **sh_array = &
e_data.transp_prepass_sh_cache[0][0][0][0];
532 for (
int j = 0; j <
sizeof(
e_data.shadow_depth_fail_sh) /
sizeof(
void *); j++) {
536 for (
int j = 0; j <
sizeof(
e_data.cavity_sh) /
sizeof(
void *); j++) {
544 for (
int j = 0; j <
sizeof(
e_data.volume_sh) /
sizeof(
void *); j++) {
A dynamically sized string ADT.
DynStr * BLI_dynstr_new(void) ATTR_MALLOC ATTR_WARN_UNUSED_RESULT
void BLI_dynstr_free(DynStr *ds) ATTR_NONNULL()
char * BLI_dynstr_get_cstring(DynStr *ds) ATTR_MALLOC ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
void BLI_dynstr_append(DynStr *__restrict ds, const char *cstr) ATTR_NONNULL()
size_t BLI_snprintf(char *__restrict dst, size_t maxncpy, const char *__restrict format,...) ATTR_NONNULL(1
#define DRW_SHADER_LIB_FREE_SAFE(lib)
#define DRW_shader_create_fullscreen(frag, defines)
#define DRW_SHADER_LIB_ADD(lib, lib_name)
#define DRW_SHADER_FREE_SAFE(shader)
#define DRW_shader_create(vert, geom, frag, defines)
#define DRW_shader_create_fullscreen_with_shaderlib(frag, lib, defines)
struct GPUShader GPUShader
const GPUShaderConfigData GPU_shader_cfg_data[GPU_SHADER_CFG_LEN]
#define GPU_shader_create_from_arrays(...)
#define GPU_SHADER_CFG_LEN
DRWShaderLibrary * DRW_shader_library_create(void)
char * DRW_shader_library_create_shader_string(const DRWShaderLibrary *lib, const char *shader_code)
struct GPUShader * downsample_sh
void KERNEL_FUNCTION_FULL_NAME() shader(KernelGlobals *kg, uint4 *input, float4 *output, int type, int filter, int i, int offset, int sample)
void(* MEM_freeN)(void *vmemh)
#define NORMAL_ENCODING_ENABLED()
eWORKBENCH_VolumeInterpType
@ WORKBENCH_VOLUME_INTERP_CUBIC
@ WORKBENCH_VOLUME_INTERP_LINEAR
@ WORKBENCH_VOLUME_INTERP_CLOSEST
@ WORKBENCH_DATATYPE_HAIR
@ WORKBENCH_DATATYPE_POINTCLOUD
struct GPUShader * dof_blur2_sh
char datatoc_workbench_shader_interface_lib_glsl[]
char datatoc_gpu_shader_common_obinfos_lib_glsl[]
char datatoc_workbench_material_lib_glsl[]
GPUShader * workbench_shader_transparent_resolve_get(WORKBENCH_PrivateData *wpd)
char datatoc_common_pointcloud_lib_glsl[]
char datatoc_workbench_volume_frag_glsl[]
char datatoc_workbench_effect_smaa_frag_glsl[]
char datatoc_workbench_prepass_frag_glsl[]
void workbench_shader_library_ensure(void)
static char * workbench_build_defines(WORKBENCH_PrivateData *wpd, bool textured, bool tiled, bool cavity, bool curvature)
struct GPUShader * outline_sh
struct GPUShader * dof_downsample_sh
GPUShader * workbench_shader_shadow_fail_get(bool manifold, bool cap)
char datatoc_workbench_composite_frag_glsl[]
GPUShader * workbench_shader_merge_infront_get(WORKBENCH_PrivateData *UNUSED(wpd))
char datatoc_workbench_prepass_pointcloud_vert_glsl[]
char datatoc_gpu_shader_depth_only_frag_glsl[]
char datatoc_workbench_prepass_vert_glsl[]
GPUShader * workbench_shader_shadow_pass_get(bool manifold)
struct GPUShader * shadow_depth_fail_sh[2][2]
static GPUShader * workbench_shader_shadow_pass_get_ex(bool depth_pass, bool manifold, bool cap)
char datatoc_workbench_shadow_caps_geom_glsl[]
char datatoc_common_smaa_lib_glsl[]
GPUShader * workbench_shader_composite_get(WORKBENCH_PrivateData *wpd)
struct GPUShader * shadow_depth_pass_sh[2]
struct GPUShader * aa_accum_sh
GPUShader * workbench_shader_volume_get(bool slice, bool coba, eWORKBENCH_VolumeInterpType interp_type, bool smoke)
char datatoc_workbench_shadow_geom_glsl[]
void workbench_shader_free(void)
char datatoc_workbench_data_lib_glsl[]
char datatoc_workbench_shadow_vert_glsl[]
struct GPUShader * transp_prepass_sh_cache[GPU_SHADER_CFG_LEN][WORKBENCH_DATATYPE_MAX][MAX_LIGHTING][MAX_COLOR]
char datatoc_workbench_effect_cavity_frag_glsl[]
GPUShader * workbench_shader_antialiasing_get(int stage)
struct GPUShader * merge_infront_sh
struct GPUShader * cavity_sh[2][2]
char datatoc_workbench_curvature_lib_glsl[]
struct GPUShader * dof_resolve_sh
char datatoc_common_hair_lib_glsl[]
GPUShader * workbench_shader_antialiasing_accumulation_get(void)
char datatoc_common_view_lib_glsl[]
GPUShader * workbench_shader_opaque_image_get(WORKBENCH_PrivateData *wpd, eWORKBENCH_DataType datatype, bool tiled)
char datatoc_workbench_merge_infront_frag_glsl[]
struct GPUShader * opaque_prepass_sh_cache[GPU_SHADER_CFG_LEN][WORKBENCH_DATATYPE_MAX][MAX_COLOR]
char datatoc_workbench_cavity_lib_glsl[]
char datatoc_workbench_effect_smaa_vert_glsl[]
static int workbench_color_index(WORKBENCH_PrivateData *UNUSED(wpd), bool textured, bool tiled)
char datatoc_workbench_transparent_resolve_frag_glsl[]
struct DRWShaderLibrary * lib
struct GPUShader * oit_resolve_sh
struct GPUShader * volume_sh[2][2][3][2]
struct GPUShader * dof_prepare_sh
struct GPUShader * smaa_sh[3]
char datatoc_workbench_image_lib_glsl[]
char datatoc_common_math_lib_glsl[]
char datatoc_workbench_volume_vert_glsl[]
GPUShader * workbench_shader_cavity_get(bool cavity, bool curvature)
char datatoc_workbench_effect_dof_frag_glsl[]
char datatoc_workbench_prepass_hair_vert_glsl[]
char datatoc_workbench_effect_taa_frag_glsl[]
char datatoc_workbench_world_light_lib_glsl[]
char datatoc_workbench_shadow_debug_frag_glsl[]
static struct @258 e_data
struct GPUShader * dof_blur1_sh
GPUShader * workbench_shader_opaque_get(WORKBENCH_PrivateData *wpd, eWORKBENCH_DataType datatype)
char datatoc_workbench_matcap_lib_glsl[]
char datatoc_workbench_transparent_accum_frag_glsl[]
char datatoc_workbench_effect_outline_frag_glsl[]
GPUShader * workbench_shader_transparent_get(WORKBENCH_PrivateData *wpd, eWORKBENCH_DataType datatype)
struct GPUShader * opaque_composite_sh[MAX_LIGHTING]
char datatoc_common_math_geom_lib_glsl[]
GPUShader * workbench_shader_transparent_image_get(WORKBENCH_PrivateData *wpd, eWORKBENCH_DataType datatype, bool tiled)
GPUShader * workbench_shader_outline_get(void)
void workbench_shader_depth_of_field_get(GPUShader **prepare_sh, GPUShader **downsample_sh, GPUShader **blur1_sh, GPUShader **blur2_sh, GPUShader **resolve_sh)
char datatoc_workbench_common_lib_glsl[]
static GPUShader * workbench_shader_get_ex(WORKBENCH_PrivateData *wpd, bool transp, eWORKBENCH_DataType datatype, bool textured, bool tiled)