67 VLOG(2) <<
"Compilation summary:\n"
68 <<
"Shader name: " <<
shader->name <<
"\n"
82 scene->update_stats->svm.times.add_entry({
"device_update", time});
88 VLOG(1) <<
"Total " << num_shaders <<
" shaders.";
93 device_free(device, dscene,
scene);
98 for (
int i = 0; i < num_shaders; i++) {
104 &shader_svm_nodes[i]));
108 if (progress.get_cancel()) {
114 int svm_nodes_size = num_shaders;
115 for (
int i = 0; i < num_shaders; i++) {
117 svm_nodes_size += shader_svm_nodes[i].size() - 1;
120 int4 *svm_nodes = dscene->svm_nodes.alloc(svm_nodes_size);
122 int node_offset = num_shaders;
123 for (
int i = 0; i < num_shaders; i++) {
127 if (
shader->get_use_mis() &&
shader->has_surface_emission) {
134 int4 &global_jump_node = svm_nodes[
shader->id];
135 int4 &local_jump_node = shader_svm_nodes[i][0];
138 global_jump_node.
y = local_jump_node.
y - 1 + node_offset;
139 global_jump_node.
z = local_jump_node.
z - 1 + node_offset;
140 global_jump_node.
w = local_jump_node.
w - 1 + node_offset;
142 node_offset += shader_svm_nodes[i].size() - 1;
146 svm_nodes += num_shaders;
147 for (
int i = 0; i < num_shaders; i++) {
148 int shader_size = shader_svm_nodes[i].size() - 1;
150 memcpy(svm_nodes, &shader_svm_nodes[i][1],
sizeof(
int4) * shader_size);
151 svm_nodes += shader_size;
154 if (progress.get_cancel()) {
158 dscene->svm_nodes.copy_to_device();
160 device_update_common(device, dscene,
scene, progress);
162 update_flags = UPDATE_NONE;
164 VLOG(1) <<
"Shader manager updated " << num_shaders <<
" shaders in " <<
time_dt() - start_time
225 if (num_unused ==
size) {
226 offset = i + 1 -
size;
239 "Cycles: out of SVM stack space, shader \"%s\" too big.\n",
255 for (
int i = 0; i <
size; i++)
302 return output->stack_offset;
315 if (!
output->links.empty())
331 for (
int i = 0; i <
size; i++)
349 bool all_done =
true;
353 if (in->parent !=
node && done.find(in->parent) == done.end())
384 return (
x) | (
y << 8) | (
z << 16) | (
w << 24);
432 dependencies.find(
node) == dependencies.end()) {
436 dependencies.insert(
node);
442 node->compile(*
this);
447 if (
node->has_spatial_varying())
451 if (
node->has_spatial_varying())
453 if (
node->has_attribute_dependency())
457 if (
node->has_integrator_dependency()) {
472 if (!done_flag[
node->id]) {
473 bool inputs_done =
true;
483 done_flag[
node->id] =
true;
490 }
while (!nodes_done);
497 if (in->link !=
NULL) {
520 if (
node->has_surface_emission())
522 if (
node->has_surface_transparent())
524 if (
node->has_surface_bssrdf()) {
526 if (
node->has_bssrdf_bump())
529 if (
node->has_bump()) {
540 if (shared.find(
node) != shared.end()) {
558 if (aov_node->
slot >= 0) {
559 aov_nodes.insert(aov_node);
561 if (in->link !=
NULL) {
590 if (facin && facin->
link) {
605 set_intersection(cl1deps.begin(),
609 std::inserter(shareddeps, shareddeps.begin()),
616 if (root_node !=
node) {
620 set_intersection(rootdeps.begin(),
624 std::inserter(shareddeps, shareddeps.begin()),
626 set_intersection(rootdeps.begin(),
630 std::inserter(shareddeps, shareddeps.begin()),
639 if (
state->aov_nodes.size()) {
640 set_intersection(
state->aov_nodes.begin(),
641 state->aov_nodes.end(),
644 std::inserter(shareddeps, shareddeps.begin()),
646 set_intersection(
state->aov_nodes.begin(),
647 state->aov_nodes.end(),
650 std::inserter(shareddeps, shareddeps.begin()),
654 if (!shareddeps.empty()) {
677 node_jump_skip_index - 1;
692 node_jump_skip_index - 1;
743 clin =
output->input(
"Surface");
746 clin =
output->input(
"Volume");
749 clin =
output->input(
"Displacement");
752 clin =
output->input(
"Normal");
774 if (need_bump_state) {
787 shader->has_surface =
true;
791 shader->has_volume =
true;
795 shader->has_displacement =
true;
815 if (!
state.aov_nodes.empty()) {
828 if (need_bump_state) {
849 int start_num_svm_nodes = svm_nodes.
size();
851 const double time_start =
time_dt();
854 output->input(
"Surface")->link &&
output->input(
"Displacement")->link;
861 shader->has_integrator_dependency,
867 shader->has_surface =
false;
868 shader->has_surface_emission =
false;
869 shader->has_surface_transparent =
false;
870 shader->has_surface_bssrdf =
false;
871 shader->has_bump = has_bump;
872 shader->has_bssrdf_bump = has_bump;
873 shader->has_volume =
false;
874 shader->has_displacement =
false;
875 shader->has_surface_spatial_varying =
false;
876 shader->has_volume_spatial_varying =
false;
877 shader->has_volume_attribute_dependency =
false;
878 shader->has_integrator_dependency =
false;
884 svm_nodes[index].y = svm_nodes.
size();
895 svm_nodes[index].y = svm_nodes.
size();
904 svm_nodes[index].z = svm_nodes.
size();
912 svm_nodes[index].w = svm_nodes.
size();
917 if (summary !=
NULL) {
930 time_generate_surface(0.0),
931 time_generate_bump(0.0),
932 time_generate_volume(0.0),
933 time_generate_displacement(0.0),
941 report +=
string_printf(
"Number of SVM nodes: %d\n", num_svm_nodes);
942 report +=
string_printf(
"Peak stack usage: %d\n", peak_stack_usage);
946 report +=
string_printf(
" Surface: %f\n", time_generate_surface);
948 report +=
string_printf(
" Volume: %f\n", time_generate_volume);
949 report +=
string_printf(
" Displacement: %f\n", time_generate_displacement);
951 time_generate_surface + time_generate_bump + time_generate_volume +
952 time_generate_displacement);
964 max_id =
max(
node->id, max_id);
966 nodes_done_flag.resize(max_id + 1,
false);
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum const void *lists _GL_VOID_RET _GL_VOID const GLdouble *equation _GL_VOID_RET _GL_VOID GLdouble GLdouble blue _GL_VOID_RET _GL_VOID GLfloat GLfloat blue _GL_VOID_RET _GL_VOID GLint GLint blue _GL_VOID_RET _GL_VOID GLshort GLshort blue _GL_VOID_RET _GL_VOID GLubyte GLubyte blue _GL_VOID_RET _GL_VOID GLuint GLuint blue _GL_VOID_RET _GL_VOID GLushort GLushort blue _GL_VOID_RET _GL_VOID GLbyte GLbyte GLbyte alpha _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble alpha _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat alpha _GL_VOID_RET _GL_VOID GLint GLint GLint alpha _GL_VOID_RET _GL_VOID GLshort GLshort GLshort alpha _GL_VOID_RET _GL_VOID GLubyte GLubyte GLubyte alpha _GL_VOID_RET _GL_VOID GLuint GLuint GLuint alpha _GL_VOID_RET _GL_VOID GLushort GLushort GLushort alpha _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLint GLsizei GLsizei GLenum type _GL_VOID_RET _GL_VOID GLsizei GLenum GLenum const void *pixels _GL_VOID_RET _GL_VOID const void *pointer _GL_VOID_RET _GL_VOID GLdouble v _GL_VOID_RET _GL_VOID GLfloat v _GL_VOID_RET _GL_VOID GLint GLint i2 _GL_VOID_RET _GL_VOID GLint j _GL_VOID_RET _GL_VOID GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble GLdouble GLdouble zFar _GL_VOID_RET _GL_UINT GLdouble *equation _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLenum GLfloat *v _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLfloat *values _GL_VOID_RET _GL_VOID GLushort *values _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLenum GLdouble *params _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_BOOL GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLenum GLfloat param _GL_VOID_RET _GL_VOID GLenum GLint param _GL_VOID_RET _GL_VOID GLushort pattern _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLint const GLdouble *points _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLint GLdouble GLdouble GLint GLint const GLdouble *points _GL_VOID_RET _GL_VOID GLdouble GLdouble u2 _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLdouble GLdouble v2 _GL_VOID_RET _GL_VOID GLenum GLfloat param _GL_VOID_RET _GL_VOID GLenum GLint param _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLdouble GLdouble nz _GL_VOID_RET _GL_VOID GLfloat GLfloat nz _GL_VOID_RET _GL_VOID GLint GLint nz _GL_VOID_RET _GL_VOID GLshort GLshort nz _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_VOID GLsizei const GLfloat *values _GL_VOID_RET _GL_VOID GLsizei const GLushort *values _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID const GLuint const GLclampf *priorities _GL_VOID_RET _GL_VOID GLdouble y _GL_VOID_RET _GL_VOID GLfloat y _GL_VOID_RET _GL_VOID GLint y _GL_VOID_RET _GL_VOID GLshort y _GL_VOID_RET _GL_VOID GLdouble GLdouble z _GL_VOID_RET _GL_VOID GLfloat GLfloat z _GL_VOID_RET _GL_VOID GLint GLint z _GL_VOID_RET _GL_VOID GLshort GLshort z _GL_VOID_RET _GL_VOID GLdouble GLdouble z
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum type
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum const void *lists _GL_VOID_RET _GL_VOID const GLdouble *equation _GL_VOID_RET _GL_VOID GLdouble GLdouble blue _GL_VOID_RET _GL_VOID GLfloat GLfloat blue _GL_VOID_RET _GL_VOID GLint GLint blue _GL_VOID_RET _GL_VOID GLshort GLshort blue _GL_VOID_RET _GL_VOID GLubyte GLubyte blue _GL_VOID_RET _GL_VOID GLuint GLuint blue _GL_VOID_RET _GL_VOID GLushort GLushort blue _GL_VOID_RET _GL_VOID GLbyte GLbyte GLbyte alpha _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble alpha _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat alpha _GL_VOID_RET _GL_VOID GLint GLint GLint alpha _GL_VOID_RET _GL_VOID GLshort GLshort GLshort alpha _GL_VOID_RET _GL_VOID GLubyte GLubyte GLubyte alpha _GL_VOID_RET _GL_VOID GLuint GLuint GLuint alpha _GL_VOID_RET _GL_VOID GLushort GLushort GLushort alpha _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLint y
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
SIMD_FORCE_INLINE const btScalar & w() const
Return the w value.
static AttributeStandard name_standard(const char *name)
Shader * get_shader(const Scene *scene)
device_vector< int4 > svm_nodes
void tag_update(Scene *scene, uint32_t flag)
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)
void add_node(ShaderNodeType type, int a=0, int b=0, int c=0)
SVMCompiler(Scene *scene)
array< int4 > current_svm_nodes
void generate_closure_node(ShaderNode *node, CompilerState *state)
void stack_clear_offset(SocketType::Type type, int offset)
void generate_node(ShaderNode *node, ShaderNodeSet &done)
int stack_assign_if_linked(ShaderInput *input)
void stack_clear_users(ShaderNode *node, ShaderNodeSet &done)
int stack_size(SocketType::Type type)
void stack_clear_temporary(ShaderNode *node)
uint encode_uchar4(uint x, uint y=0, uint z=0, uint w=0)
uint attribute_standard(ustring name)
void stack_link(ShaderInput *input, ShaderOutput *output)
void find_dependencies(ShaderNodeSet &dependencies, const ShaderNodeSet &done, ShaderInput *input, ShaderNode *skip_node=NULL)
void generate_svm_nodes(const ShaderNodeSet &nodes, CompilerState *state)
void generate_multi_closure(ShaderNode *root_node, ShaderNode *node, CompilerState *state)
uint attribute(ustring name)
int stack_find_offset(int size)
void compile(Shader *shader, array< int4 > &svm_nodes, int index, Summary *summary=NULL)
void generated_shared_closure_nodes(ShaderNode *root_node, ShaderNode *node, CompilerState *state, const ShaderNodeSet &shared)
int stack_assign(ShaderOutput *output)
void device_free(Device *device, DeviceScene *dscene, Scene *scene)
void device_update(Device *device, DeviceScene *dscene, Scene *scene, Progress &progress)
void device_update_shader(Scene *scene, Shader *shader, Progress *progress, array< int4 > *svm_nodes)
uint get_attribute_id(ustring name)
void device_free_common(Device *device, DeviceScene *dscene, Scene *scene)
vector< ShaderInput * > inputs
bool has_surface_spatial_varying
bool has_volume_attribute_dependency
bool has_integrator_dependency
bool has_surface_emission
bool has_surface_transparent
bool has_volume_spatial_varying
void append(const array< T > &from)
void push_back_slow(const T &t)
@ SHADER_SPECIAL_TYPE_OUTPUT_AOV
@ SHADER_SPECIAL_TYPE_COMBINE_CLOSURE
set< ShaderNode *, ShaderNodeIDComparator > ShaderNodeSet
#define CCL_NAMESPACE_END
#define make_int4(x, y, z, w)
void KERNEL_FUNCTION_FULL_NAME() shader(KernelGlobals *kg, uint4 *input, float4 *output, int type, int filter, int i, int offset, int sample)
static char * generate(GHash *messages, size_t *r_output_size)
CompilerState(ShaderGraph *graph)
int users[SVM_STACK_SIZE]
double time_generate_volume
double time_generate_surface
double time_generate_bump
string full_report() const
double time_generate_displacement
vector< Shader * > shaders
ShaderManager * shader_manager
LightManager * light_manager
SceneUpdateStats * update_stats
void push(TaskRunFunction &&task)
void wait_work(Summary *stats=NULL)
@ SHADER_TYPE_DISPLACEMENT
#define SVM_BUMP_EVAL_STATE_SIZE
#define SVM_STACK_INVALID
ccl_device_inline int __float_as_int(float f)
CCL_NAMESPACE_BEGIN string string_printf(const char *format,...)
CCL_NAMESPACE_BEGIN double time_dt()