16 #define MAX_LIGHTING 3
91 switch (interp_type) {
115 return "_tex_single";
140 (transp) ? &
e_data.transp_prepass_sh_cache[wpd->
sh_cfg][datatype][light][tex_type] :
141 &
e_data.opaque_prepass_sh_cache[wpd->
sh_cfg][datatype][tex_type];
143 if (*shader ==
nullptr) {
144 std::string create_info_name =
"workbench";
145 create_info_name += (transp) ?
"_transp" :
"_opaque";
189 if (*shader ==
nullptr) {
190 std::string create_info_name =
"workbench_composite";
199 if (
e_data.merge_infront_sh ==
nullptr) {
202 return e_data.merge_infront_sh;
207 if (
e_data.oit_resolve_sh ==
nullptr) {
210 return e_data.oit_resolve_sh;
215 struct GPUShader **shader = (depth_pass) ? &
e_data.shadow_depth_pass_sh[manifold] :
216 &
e_data.shadow_depth_fail_sh[manifold][cap];
218 if (*shader ==
nullptr) {
219 std::string create_info_name =
"workbench_shadow";
220 create_info_name += (depth_pass) ?
"_pass" :
"_fail";
221 create_info_name += (manifold) ?
"_manifold" :
"_no_manifold";
222 create_info_name += (cap) ?
"_caps" :
"_no_caps";
223 #if DEBUG_SHADOW_VOLUME
224 create_info_name +=
"_debug";
246 if (*shader ==
nullptr) {
247 std::string create_info_name =
"workbench_effect";
248 create_info_name += (cavity) ?
"_cavity" :
"";
249 create_info_name += (curvature) ?
"_curvature" :
"";
257 if (
e_data.outline_sh ==
nullptr) {
269 if (
e_data.dof_prepare_sh ==
nullptr) {
283 *prepare_sh =
e_data.dof_prepare_sh;
285 *blur1_sh =
e_data.dof_blur1_sh;
286 *blur2_sh =
e_data.dof_blur2_sh;
287 *resolve_sh =
e_data.dof_resolve_sh;
292 if (
e_data.aa_accum_sh ==
nullptr) {
295 return e_data.aa_accum_sh;
303 if (*shader ==
nullptr) {
304 std::string create_info_name =
"workbench_smaa_stage_";
316 GPUShader **shader = &
e_data.volume_sh[slice][coba][interp_type][smoke];
318 if (*shader ==
nullptr) {
319 std::string create_info_name =
"workbench_volume";
320 create_info_name += (smoke) ?
"_smoke" :
"_object";
322 create_info_name += (coba) ?
"_coba" :
"_no_coba";
323 create_info_name += (slice) ?
"_slice" :
"_no_slice";
337 for (
int j = 0; j <
sizeof(
e_data.opaque_prepass_sh_cache) /
sizeof(
void *); j++) {
338 struct GPUShader **sh_array = &
e_data.opaque_prepass_sh_cache[0][0][0];
341 for (
int j = 0; j <
sizeof(
e_data.transp_prepass_sh_cache) /
sizeof(
void *); j++) {
342 struct GPUShader **sh_array = &
e_data.transp_prepass_sh_cache[0][0][0][0];
353 for (
int j = 0; j <
sizeof(
e_data.shadow_depth_fail_sh) /
sizeof(
void *); j++) {
357 for (
int j = 0; j <
sizeof(
e_data.cavity_sh) /
sizeof(
void *); j++) {
365 for (
int j = 0; j <
sizeof(
e_data.volume_sh) /
sizeof(
void *); j++) {
#define BLI_assert_msg(a, msg)
#define DRW_SHADER_FREE_SAFE(shader)
struct GPUShader GPUShader
GPUShader * GPU_shader_create_from_info_name(const char *info_name)
#define GPU_SHADER_CFG_LEN
struct GPUShader * downsample_sh
std::string to_string(const T &n)
eWORKBENCH_VolumeInterpType
@ WORKBENCH_VOLUME_INTERP_CUBIC
@ WORKBENCH_VOLUME_INTERP_LINEAR
@ WORKBENCH_VOLUME_INTERP_CLOSEST
@ WORKBENCH_DATATYPE_MESH
@ WORKBENCH_DATATYPE_HAIR
@ WORKBENCH_DATATYPE_POINTCLOUD
struct GPUShader * dof_blur2_sh
static const char * workbench_volume_interp_to_str(eWORKBENCH_VolumeInterpType interp_type)
static struct @270 e_data
struct GPUShader * outline_sh
struct GPUShader * dof_downsample_sh
GPUShader * workbench_shader_shadow_fail_get(bool manifold, bool cap)
struct GPUShader * opaque_prepass_sh_cache[GPU_SHADER_CFG_LEN][WORKBENCH_DATATYPE_MAX][TEXTURE_SH_MAX]
GPUShader * workbench_shader_merge_infront_get(WORKBENCH_PrivateData *UNUSED(wpd))
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)
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)
void workbench_shader_free(void)
static const char * workbench_lighting_mode_to_str(int light)
GPUShader * workbench_shader_antialiasing_get(int stage)
struct GPUShader * merge_infront_sh
struct GPUShader * cavity_sh[2][2]
struct GPUShader * dof_resolve_sh
GPUShader * workbench_shader_antialiasing_accumulation_get(void)
GPUShader * workbench_shader_opaque_image_get(WORKBENCH_PrivateData *wpd, eWORKBENCH_DataType datatype, bool tiled)
struct GPUShader * oit_resolve_sh
struct GPUShader * volume_sh[2][2][3][2]
struct GPUShader * dof_prepare_sh
struct GPUShader * smaa_sh[3]
static eWORKBENCH_TextureType workbench_texture_type_get(bool textured, bool tiled)
GPUShader * workbench_shader_cavity_get(bool cavity, bool curvature)
struct GPUShader * dof_blur1_sh
struct GPUShader * transp_prepass_sh_cache[GPU_SHADER_CFG_LEN][WORKBENCH_DATATYPE_MAX][MAX_LIGHTING][TEXTURE_SH_MAX]
GPUShader * workbench_shader_opaque_get(WORKBENCH_PrivateData *wpd, eWORKBENCH_DataType datatype)
GPUShader * workbench_shader_transparent_resolve_get(WORKBENCH_PrivateData *UNUSED(wpd))
GPUShader * workbench_shader_transparent_get(WORKBENCH_PrivateData *wpd, eWORKBENCH_DataType datatype)
struct GPUShader * opaque_composite_sh[MAX_LIGHTING]
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)
static const char * workbench_datatype_mode_to_str(eWORKBENCH_DataType datatype)
static GPUShader * workbench_shader_get_ex(WORKBENCH_PrivateData *wpd, bool transp, eWORKBENCH_DataType datatype, bool textured, bool tiled)
static const char * workbench_texture_type_to_str(eWORKBENCH_TextureType tex_type)