44 compiler.
compile(shader, *svm_nodes, 0, &summary);
47 <<
"Shader name: " << shader->
name <<
"\n"
62 scene->
update_stats->svm.times.add_entry({
"device_update", time});
68 LOG_INFO <<
"Total " << num_shaders <<
" shaders.";
70 const double start_time =
time_dt();
78 for (
int i = 0;
i < num_shaders;
i++) {
79 task_pool.push([
this, scene, &progress, &shader_svm_nodes,
i] {
91 int svm_nodes_size = num_shaders;
92 for (
int i = 0;
i < num_shaders;
i++) {
94 svm_nodes_size += shader_svm_nodes[
i].size() - 1;
99 int node_offset = num_shaders;
100 for (
int i = 0;
i < num_shaders;
i++) {
111 int4 &global_jump_node = svm_nodes[shader->
id];
112 const int4 &local_jump_node = shader_svm_nodes[
i][0];
114 global_jump_node.
x = NODE_SHADER_JUMP;
115 global_jump_node.
y = local_jump_node.
y - 1 + node_offset;
116 global_jump_node.
z = local_jump_node.
z - 1 + node_offset;
117 global_jump_node.
w = local_jump_node.
w - 1 + node_offset;
119 node_offset += shader_svm_nodes[
i].size() - 1;
123 svm_nodes += num_shaders;
124 for (
int i = 0;
i < num_shaders;
i++) {
125 const int shader_size = shader_svm_nodes[
i].size() - 1;
127 std::copy_n(&shader_svm_nodes[
i][1], shader_size, svm_nodes);
128 svm_nodes += shader_size;
139 LOG_INFO <<
"Shader manager updated " << num_shaders <<
" shaders in " <<
time_dt() - start_time
206 if (num_unused ==
size) {
207 offset =
i + 1 -
size;
210 while (
i >= offset) {
236 for (
int i = 0;
i <
size;
i++) {
248 input->stack_offset =
input->link->stack_offset;
259 input->stack_offset);
277 return input->stack_offset;
287 return output->stack_offset;
292 return (
input->link ||
input->constant_folded_in);
306 if (!
output->links.empty()) {
341 for (
int i = 0;
i <
size;
i++) {
360 bool all_done =
true;
364 if (
in->parent != node && done.find(
in->parent) == done.end()) {
398 return (
x) | (
y << 8) | (
z << 16) | (
w << 24);
427 return scene->shader_manager->get_attribute_id(
name);
432 return scene->shader_manager->get_attribute_id(std);
447 if (node !=
nullptr && done.find(node) == done.end() && node != skip_node &&
448 dependencies.find(node) == dependencies.end())
453 dependencies.insert(node);
491 if (!done_flag[node->id]) {
492 bool inputs_done =
true;
495 if (
input->link && !done_flag[
input->link->parent->id]) {
502 done_flag[node->id] =
true;
509 }
while (!nodes_done);
517 if ((
state->node_feature_mask & node_feature) != node_feature) {
523 if (
in->link !=
nullptr) {
587 if (aov_node->
offset >= 0) {
588 aov_nodes.insert(aov_node);
590 if (
in->link !=
nullptr) {
604 if (
state->closure_done.find(node) !=
state->closure_done.end()) {
608 state->closure_done.insert(node);
621 if (facin && facin->
link) {
638 set_intersection(cl1deps.begin(),
642 std::inserter(shareddeps, shareddeps.begin()),
649 if (root_node != node) {
653 set_intersection(rootdeps.begin(),
657 std::inserter(shareddeps, shareddeps.begin()),
659 set_intersection(rootdeps.begin(),
663 std::inserter(shareddeps, shareddeps.begin()),
672 if (!
state->aov_nodes.empty()) {
673 set_intersection(
state->aov_nodes.begin(),
674 state->aov_nodes.end(),
677 std::inserter(shareddeps, shareddeps.begin()),
679 set_intersection(
state->aov_nodes.begin(),
680 state->aov_nodes.end(),
683 std::inserter(shareddeps, shareddeps.begin()),
687 if (!shareddeps.empty()) {
711 node_jump_skip_index - 1;
727 node_jump_skip_index - 1;
749 state->nodes_done.insert(node);
750 state->nodes_done_flag[node->
id] =
true;
780 clin =
output->input(
"Surface");
783 clin =
output->input(
"Volume");
786 clin =
output->input(
"Displacement");
789 clin =
output->input(
"Normal");
812 if (need_bump_state) {
853 if (!
state.aov_nodes.empty()) {
866 if (need_bump_state) {
893 const int start_num_svm_nodes = svm_nodes.
size();
895 const double time_start =
time_dt();
897 const bool has_bump = shader->
has_bump;
905 svm_nodes[index].y = svm_nodes.
size();
916 svm_nodes[index].y = svm_nodes.
size();
925 svm_nodes[index].z = svm_nodes.
size();
934 svm_nodes[index].w = svm_nodes.
size();
939 if (summary !=
nullptr) {
986 max_id =
max(node->
id, max_id);
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
SIMD_FORCE_INLINE const btScalar & z() const
Return the z value.
SIMD_FORCE_INLINE const btScalar & w() const
Return the w value.
Shader * get_shader(const Scene *scene)
device_vector< int4 > svm_nodes
ShaderGraph * current_graph
void compile_type(Shader *shader, ShaderGraph *graph, ShaderType type)
void find_aov_nodes_and_dependencies(ShaderNodeSet &aov_nodes, ShaderGraph *graph, CompilerState *state)
SVMCompiler(Scene *scene)
int stack_assign_if_not_equal(ShaderInput *input, const float value)
array< int4 > current_svm_nodes
int stack_find_offset(const int size)
void generate_closure_node(ShaderNode *node, CompilerState *state)
void compile(Shader *shader, array< int4 > &svm_nodes, const int index, Summary *summary=nullptr)
void generate_node(ShaderNode *node, ShaderNodeSet &done)
uint encode_uchar4(const uint x, const uint y=0, const uint z=0, const uint w=0)
int stack_assign_if_linked(ShaderInput *input)
void stack_clear_users(ShaderNode *node, ShaderNodeSet &done)
int stack_size(SocketType::Type type)
void find_dependencies(ShaderNodeSet &dependencies, const ShaderNodeSet &done, ShaderInput *input, ShaderNode *skip_node=nullptr)
void stack_clear_temporary(ShaderNode *node)
uint attribute_standard(ustring name)
void add_node(ShaderNodeType type, const int a=0, const int b=0, const int c=0)
void stack_link(ShaderInput *input, ShaderOutput *output)
void generate_svm_nodes(const ShaderNodeSet &nodes, CompilerState *state)
bool is_linked(ShaderInput *input)
void generate_multi_closure(ShaderNode *root_node, ShaderNode *node, CompilerState *state)
uint attribute(ustring name)
void stack_clear_offset(SocketType::Type type, const int offset)
std::atomic_int * svm_node_types_used
void generated_shared_closure_nodes(ShaderNode *root_node, ShaderNode *node, CompilerState *state, const ShaderNodeSet &shared)
int stack_assign(ShaderOutput *output)
void device_update_shader(Scene *scene, Shader *shader, Progress &progress, array< int4 > *svm_nodes)
void device_free(Device *device, DeviceScene *dscene, Scene *scene) override
void device_update_specific(Device *device, DeviceScene *dscene, Scene *scene, Progress &progress) override
~SVMShaderManager() override
unique_ptr_vector< ShaderNode > nodes
void device_update_common(Device *device, DeviceScene *dscene, Scene *scene, Progress &progress)
void device_free_common(Device *device, DeviceScene *dscene, Scene *scene)
ShaderInput * input(const char *name)
virtual bool has_surface_transparent()
virtual uint get_feature()
ShaderNodeSpecialType special_type
virtual bool has_bssrdf_bump()
virtual bool has_spatial_varying()
virtual bool has_attribute_dependency()
unique_ptr_vector< ShaderInput > inputs
virtual bool has_surface_bssrdf()
virtual void compile(SVMCompiler &compiler)=0
unique_ptr_vector< ShaderOutput > outputs
EmissionSampling emission_sampling
NODE_DECLARE unique_ptr< ShaderGraph > graph
void append(const array< T > &from)
void push_back_slow(const T &t)
T * alloc(const size_t width, const size_t height=0)
#define KERNEL_FEATURE_NODE_MASK_DISPLACEMENT
#define KERNEL_FEATURE_NODE_MASK_BUMP
#define KERNEL_FEATURE_NODE_MASK_VOLUME
#define SVM_BUMP_EVAL_STATE_SIZE
#define KERNEL_FEATURE_NODE_MASK_SURFACE
#define SVM_STACK_INVALID
#define KERNEL_FEATURE_NODE_RAYTRACE
#define CCL_NAMESPACE_END
#define assert(assertion)
@ SHADER_TYPE_DISPLACEMENT
@ SHADER_SPECIAL_TYPE_OUTPUT_AOV
@ SHADER_SPECIAL_TYPE_COMBINE_CLOSURE
set< ShaderNode *, ShaderNodeIDComparator > ShaderNodeSet
CCL_NAMESPACE_BEGIN string string_printf(const char *format,...)
static AttributeStandard name_standard(const char *name)
float get_float(const SocketType &input) const
float3 get_float3(const SocketType &input) const
int reference_count() const
int get_int(const SocketType &input) const
vector< bool > nodes_done_flag
CompilerState(ShaderGraph *graph)
double time_generate_volume
double time_generate_surface
double time_generate_bump
string full_report() const
double time_generate_displacement
unique_ptr< LightManager > light_manager
unique_ptr< SceneUpdateStats > update_stats
unique_ptr_vector< Shader > shaders
CCL_NAMESPACE_BEGIN double time_dt()