39std::shared_ptr<OSL::TextureSystem> ts_shared;
42map<DeviceType, std::shared_ptr<OSL::ShadingSystem>> ss_shared;
44OSL::ErrorHandler errhandler;
46std::atomic<int> OSLCompiler::texture_shared_unique_id = 0;
54 shading_system_free();
55 texture_system_free();
60# ifdef OSL_HAS_BLENDER_CLEANUP_FIX
66 OSL::pvt::LLVM_Util::Cleanup();
72 shading_system_free();
76OSL::TextureSystem *OSLManager::get_texture_system()
79 texture_system_init();
84OSL::ShadingSystem *OSLManager::get_shading_system(
Device *sub_device)
86 return ss_map[sub_device->
info.
type].get();
89void OSLManager::foreach_shading_system(
const std::function<
void(OSL::ShadingSystem *)> &callback)
91 for (
const auto &[device_type, ss] : ss_map) {
96void OSLManager::foreach_render_services(
const std::function<
void(
OSLRenderServices *)> &callback)
98 for (
const auto &[device_type, ss] : ss_map) {
99 callback(
static_cast<OSLRenderServices *
>(ss->renderer()));
103void OSLManager::foreach_osl_device(
Device *device,
104 const std::function<
void(
Device *, OSLGlobals *)> &callback)
109 callback(sub_device, og);
127 shading_system_init(scene->
shader_manager->get_scene_linear_space());
137 foreach_render_services([](OSLRenderServices *services) {
144 scene->
image_manager->set_osl_texture_system((
void *)get_texture_system());
152 const bool reload_kernels)
159 foreach_osl_device(device, [
this, scene](Device *sub_device, OSLGlobals *og) {
160 OSL::ShadingSystem *ss = get_shading_system(sub_device);
162 OSL::ShaderGroupRef group = ss->ShaderGroupBegin(
"camera_group");
163 for (
const auto ¶m : scene->
camera->script_params) {
164 const ustring &
name = param.first;
165 const vector<uint8_t> &
data = param.second.first;
166 const TypeDesc &type = param.second.second;
167 if (type.basetype == TypeDesc::STRING) {
168 const void *
string =
data.data();
169 ss->Parameter(*group,
name, type, (
const void *)&
string);
172 ss->Parameter(*group,
name, type, (
const void *)
data.data());
175 ss->Shader(*group,
"shader", scene->
camera->script_name,
"camera");
176 ss->ShaderGroupEnd(*group);
179 og->ts = get_texture_system();
180 og->services =
static_cast<OSLRenderServices *
>(ss->renderer());
182 og->camera_state = group;
183 og->use_camera =
true;
190 OSLShaderInfo *info = shader_loaded_info(scene->
camera->script_name);
191 const string deriv_args[] = {
"dPdx",
"dPdy",
"dDdx",
"dDdy"};
192 bool explicit_derivs =
false;
193 for (
const auto &arg : deriv_args) {
194 if (info->query.getparam(arg) !=
nullptr) {
195 explicit_derivs =
true;
199 auto add_param = [&](
const char *
name, OIIO::TypeDesc type,
bool derivs,
int offset) {
200 ss->add_symlocs(group.get(),
204 OSL::SymArena::Outputs,
205 offset *
sizeof(
float)));
208 if (explicit_derivs) {
209 add_param(
"dPdx", OIIO::TypeVector,
false, 3);
210 add_param(
"dPdy", OIIO::TypeVector,
false, 6);
211 add_param(
"dDdx", OIIO::TypeVector,
false, 12);
212 add_param(
"dDdy", OIIO::TypeVector,
false, 15);
214 add_param(
"position", OIIO::TypePoint, !explicit_derivs, 0);
215 add_param(
"direction", OIIO::TypeVector, !explicit_derivs, 9);
216 add_param(
"throughput", OIIO::TypeColor,
false, 18);
220 foreach_osl_device(device, [](Device *, OSLGlobals *og) {
221 og->camera_state.reset();
222 og->use_camera =
false;
227 scoped_callback_timer
timer([scene](
double time) {
229 scene->
update_stats->osl.times.add_entry({
"jit", time});
253 foreach_shading_system([](OSL::ShadingSystem *ss) { ss->optimize_all_groups(); });
260 foreach_osl_device(device, [
this, &progress](Device *sub_device, OSLGlobals *og) {
261 if (og->use_shading || og->use_camera) {
262 OSL::ShadingSystem *ss = get_shading_system(sub_device);
265 og->ts = get_texture_system();
266 og->services =
static_cast<OSLRenderServices *
>(ss->renderer());
276 need_update_ =
false;
282 foreach_osl_device(device, [](Device *, OSLGlobals *og) {
283 og->use_shading =
false;
284 og->use_camera =
false;
287 og->camera_state.reset();
292 foreach_render_services([scene](OSLRenderServices *services) {
293 for (
auto it = services->
textures.begin(); it != services->
textures.end();) {
294 if (it->second.handle.get_manager() == scene->
image_manager.get()) {
296 services->
textures.erase(it->first,
false);
308void OSLManager::texture_system_init()
314# if OIIO_VERSION_MAJOR >= 3
315 ts_shared = OSL::TextureSystem::create(
false);
317 ts_shared = std::shared_ptr<OSL::TextureSystem>(
318 OSL::TextureSystem::create(
false),
319 [](OSL::TextureSystem *ts) { OSL::TextureSystem::destroy(ts); });
322 ts_shared->attribute(
"automip", 1);
323 ts_shared->attribute(
"autotile", 64);
324 ts_shared->attribute(
"gray_to_rgb", 1);
327 ts_shared->attribute(
"max_memory_MB", 16384);
334void OSLManager::texture_system_free()
341 if (ts_shared.use_count() == 1) {
349 if (!ss_map.empty()) {
356 foreach_osl_device(device_, [
this, colorspace](Device *sub_device, OSLGlobals *) {
359 if (!ss_shared[device_type]) {
371 const string shader_path = string_to_ansi(
path_get(
"shader"));
373 const string shader_path =
path_get(
"shader");
376 auto ss = std::shared_ptr<OSL::ShadingSystem>(
377 new OSL::ShadingSystem(services, get_texture_system(), &errhandler),
378 [](OSL::ShadingSystem *ss) {
382 ss->attribute(
"lockgeom", 1);
383 ss->attribute(
"commonspace",
"world");
384 ss->attribute(
"searchpath:shader", shader_path);
385 ss->attribute(
"greedyjit", 1);
388 switch (colorspace) {
390 ss->attribute(
"colorspace", OSL::Strings::Rec709);
393 ss->attribute(
"colorspace", OSL::Strings::HDTV);
396 ss->attribute(
"colorspace", OSL::Strings::ACEScg);
402 const char *groupdata_alloc_str = getenv(
"CYCLES_OSL_GROUPDATA_ALLOC");
403 if (groupdata_alloc_str) {
404 ss->attribute(
"max_optix_groupdata_alloc", atoi(groupdata_alloc_str));
407 ss->attribute(
"max_optix_groupdata_alloc", 2048);
410 LOG_INFO <<
"Using shader search path: " << shader_path;
413 static const char *raytypes[] = {
453 const int nraytypes =
sizeof(raytypes) /
sizeof(raytypes[0]);
454 ss->attribute(
"raytypes", TypeDesc(TypeDesc::STRING, nraytypes), (
const void *)raytypes);
457 ss_shared[device_type] = std::move(ss);
459 ss_map[device_type] = ss_shared[device_type];
463void OSLManager::shading_system_free()
470 for (
auto &[device_type, ss] : ss_shared) {
471 if (ss.use_count() == 1) {
476 loaded_shaders.clear();
479bool OSLManager::osl_compile(
const string &inputfile,
const string &outputfile)
483 const string shader_path =
path_get(
"shader");
490 const string include_path_arg = string(
"-I") + shader_path;
491 options.push_back(include_path_arg);
493 stdosl_path =
path_join(shader_path,
"stdcycles.h");
501 OSL::OSLCompiler compiler = OSL::OSLCompiler(&OSL::ErrorHandler::default_handler());
502 const bool ok = compiler.compile(string_view(inputfile),
options, string_view(stdosl_path));
507bool OSLManager::osl_query(OSL::OSLQuery &query,
const string &filepath)
510 return query.open(filepath, searchpath);
513static string shader_filepath_hash(
const string &filepath,
const uint64_t modified_time)
517 md5.
append((
const uint8_t *)filepath.c_str(), filepath.size());
518 md5.
append((
const uint8_t *)&modified_time,
sizeof(modified_time));
523const char *OSLManager::shader_test_loaded(
const string &
hash)
525 const map<string, OSLShaderInfo>::iterator it = loaded_shaders.find(
hash);
526 return (it == loaded_shaders.end()) ?
nullptr : it->first.c_str();
529OSLShaderInfo *OSLManager::shader_loaded_info(
const string &
hash)
531 const map<string, OSLShaderInfo>::iterator it = loaded_shaders.find(
hash);
532 return (it == loaded_shaders.end()) ?
nullptr : &it->second;
535const char *OSLManager::shader_load_filepath(
string filepath)
537 const size_t len = filepath.size();
538 const string extension = filepath.substr(
len - 4);
541 if (extension ==
".osl") {
543 const string osopath = filepath.substr(0,
len - 4) +
".oso";
547 if (oso_modified_time != 0) {
548 const char *
hash = shader_test_loaded(shader_filepath_hash(osopath, oso_modified_time));
556 if (oso_modified_time == 0 || (oso_modified_time < modified_time)) {
557 OSLManager::osl_compile(filepath, osopath);
561 modified_time = oso_modified_time;
567 if (extension ==
".oso") {
580 const char *
hash = shader_test_loaded(shader_filepath_hash(filepath, modified_time));
588 const string bytecode_hash = shader_filepath_hash(filepath, modified_time);
592 LOG_ERROR <<
"Shader graph: failed to read file " << filepath;
593 const OSLShaderInfo info;
594 loaded_shaders[bytecode_hash] = info;
598 return shader_load_bytecode(bytecode_hash, bytecode);
601const char *OSLManager::shader_load_bytecode(
const string &
hash,
const string &bytecode)
603 foreach_shading_system(
604 [
hash, bytecode](OSL::ShadingSystem *ss) { ss->LoadMemoryCompiledShader(
hash, bytecode); });
610 if (!info.query.open_bytecode(bytecode)) {
611 LOG_ERROR <<
"OSL query error: " << info.query.geterror();
615 info.has_surface_emission = (bytecode.find(
"\"emission\"") != string::npos);
616 info.has_surface_transparent = (bytecode.find(
"\"transparent\"") != string::npos);
617 info.has_surface_bssrdf = (bytecode.find(
"\"bssrdf\"") != string::npos);
619 loaded_shaders[
hash] = info;
621 return loaded_shaders.find(
hash)->first.c_str();
624uint64_t OSLShaderManager::get_attribute_id(ustring
name)
633 return stdname.hash();
636void OSLShaderManager::device_update_specific(
Device *device,
641 if (!need_update()) {
647 scene->
update_stats->osl.times.add_entry({
"device_update", time});
654 OSLManager::foreach_osl_device(device, [scene](
Device *sub_device, OSLGlobals *og) {
655 OSL::ShadingSystem *ss = scene->
osl_manager->get_shading_system(sub_device);
660 og->use_shading =
true;
662 og->surface_state.clear();
663 og->volume_state.clear();
664 og->displacement_state.clear();
665 og->bump_state.clear();
666 og->background_state.reset();
677 auto compile = [scene, shader, background_shader](
Device *sub_device, OSLGlobals *) {
678 OSL::ShadingSystem *ss = scene->
osl_manager->get_shading_system(sub_device);
681 compiler.background = (shader == background_shader);
682 compiler.compile(shader);
685 task_pool.push([device, compile] { OSLManager::foreach_osl_device(device, compile); });
695 OSLManager::OSLManager::foreach_osl_device(
696 device, [shader, background_shader](
Device *sub_device, OSLGlobals *og) {
698 const Shader::OSLCache &cache = shader->osl_cache[sub_device];
699 og->surface_state.push_back(cache.surface);
700 og->volume_state.push_back(cache.volume);
701 og->displacement_state.push_back(cache.displacement);
702 og->bump_state.push_back(cache.bump);
704 if (shader == background_shader) {
705 og->background_state = cache.surface;
717 int background_id = scene->
shader_manager->get_shader_id(background_shader);
719 OSLManager::foreach_osl_device(device, [background_id](
Device *, OSLGlobals *og) {
720 og->background_state = og->surface_state[background_id &
SHADER_MASK];
727 update_flags = UPDATE_NONE;
729 device_update_common(device, dscene, scene, progress);
734 device_free_common(device, dscene, scene);
737 OSLManager::foreach_osl_device(device, [](
Device *, OSLGlobals *og) {
738 og->use_shading =
false;
740 og->surface_state.clear();
741 og->volume_state.clear();
742 og->displacement_state.clear();
743 og->bump_state.clear();
744 og->background_state.reset();
752 const std::string &filepath,
753 const std::string &bytecode_hash,
754 const std::string &bytecode)
766 if (!filepath.empty()) {
772 hash = scene->
osl_manager->shader_load_bytecode(bytecode_hash, bytecode);
783 size_t num_inputs = 0;
785 for (
int i = 0;
i < info->query.nparams();
i++) {
786 const OSL::OSLQuery::Parameter *param = info->query.getparam(
i);
789 if (param->varlenarray || param->isstruct || param->type.arraylen > 1) {
793 if (!param->isoutput) {
802 const set<void *> used_sockets;
804 for (
int i = 0;
i < info->query.nparams();
i++) {
805 const OSL::OSLQuery::Parameter *param = info->query.getparam(
i);
808 if (param->varlenarray || param->isstruct || param->type.arraylen > 1) {
815 if (param->isclosure) {
818 else if (param->type.vecsemantics != TypeDesc::NOSEMANTICS) {
819 if (param->type.vecsemantics == TypeDesc::COLOR) {
822 else if (param->type.vecsemantics == TypeDesc::POINT) {
825 else if (param->type.vecsemantics == TypeDesc::VECTOR) {
828 else if (param->type.vecsemantics == TypeDesc::NORMAL) {
835 if (!param->isoutput && param->validdefault) {
837 default_value->
x = param->fdefault[0];
838 default_value->
y = param->fdefault[1];
839 default_value->
z = param->fdefault[2];
842 else if (param->type.aggregate == TypeDesc::SCALAR) {
843 if (param->type.basetype == TypeDesc::INT) {
846 if (!param->isoutput && param->validdefault) {
850 else if (param->type.basetype == TypeDesc::FLOAT) {
853 if (!param->isoutput && param->validdefault) {
857 else if (param->type.basetype == TypeDesc::STRING) {
860 if (!param->isoutput && param->validdefault) {
872 if (param->isoutput) {
878 int socket_flags = 0;
879 if (!param->validdefault) {
882 for (
const OSL::OSLQuery::Parameter &metadata : param->metadata) {
883 if (metadata.type == TypeDesc::STRING) {
884 if (metadata.name ==
"widget" && metadata.sdefault[0] ==
"null") {
887 else if (metadata.name ==
"defaultgeomprop") {
891 if (metadata.sdefault[0] ==
"Nobject") {
894 else if (metadata.sdefault[0] ==
"Nworld") {
897 else if (metadata.sdefault[0] ==
"Pobject") {
900 else if (metadata.sdefault[0] ==
"Pworld") {
903 else if (metadata.sdefault[0] ==
"Tworld") {
906 else if (metadata.sdefault[0] ==
"UV0") {
913 node->
add_input(param->name, socket_type, socket_flags);
918 if (!bytecode_hash.empty()) {
932void OSLShaderManager::osl_image_slots(
Device *device,
934 set<int> &image_slots)
936 set<OSLRenderServices *> services_shared;
939 services_shared.insert(og->services);
943 for (
auto it = services->
textures.begin(); it != services->
textures.end(); ++it) {
944 if (it->second.handle.get_manager() == image_manager) {
945 const int slot = it->second.handle.svm_slot();
946 image_slots.insert(slot);
954OSLCompiler::OSLCompiler(OSL::ShadingSystem *ss,
Scene *scene,
Device *device)
961 current_shader =
nullptr;
968 std::stringstream stream;
972 stream.imbue(std::locale(
"C"));
974 stream <<
"node_" << node->
type->
name <<
"_" << node;
981 string sname(
input->name().string());
985 while ((
i = sname.find(
" ")) != string::npos) {
986 sname.replace(
i, 1,
"");
1002 string sname(
output->name().string());
1006 while ((
i = sname.find(
" ")) != string::npos) {
1007 sname.replace(
i, 1,
"");
1045 if (
input->name() ==
"Height") {
1064 if (
name ==
nullptr) {
1073 if (node_skip_input(node,
input)) {
1080 const string param_name = compatible_name(node,
input);
1081 const SocketType &socket =
input->socket_type;
1082 switch (
input->type()) {
1115 ss->Shader(*current_group,
"surface",
name,
id(node));
1118 ss->Shader(*current_group,
"surface",
name,
id(node));
1121 ss->Shader(*current_group,
"displacement",
name,
id(node));
1124 ss->Shader(*current_group,
"displacement",
name,
id(node));
1133 if (node_skip_input(node,
input)) {
1138 const string id_from = id(
input->link->parent);
1139 const string id_to = id(node);
1140 const string param_from = compatible_name(
input->link->parent,
input->link);
1141 const string param_to = compatible_name(node,
input);
1143 ss->ConnectShaders(*current_group, id_from, param_from, id_to, param_to);
1148 OSLShaderInfo *info =
scene->osl_manager->shader_loaded_info(
name);
1154 OSLNode *oslnode =
static_cast<OSLNode *
>(node);
1157 if (info->has_surface_transparent) {
1158 current_shader->has_surface_transparent =
true;
1160 if (info->has_surface_bssrdf) {
1161 current_shader->has_surface_bssrdf =
true;
1162 current_shader->has_bssrdf_bump =
true;
1164 current_shader->has_bump =
true;
1165 current_shader->has_surface_raytrace =
true;
1169 current_shader->has_surface_spatial_varying =
true;
1174 current_shader->has_volume_spatial_varying =
true;
1177 current_shader->has_volume_attribute_dependency =
true;
1182static TypeDesc array_typedesc(
const TypeDesc typedesc,
const int arraylength)
1184 return TypeDesc((TypeDesc::BASETYPE)typedesc.basetype,
1185 (TypeDesc::AGGREGATE)typedesc.aggregate,
1186 (TypeDesc::VECSEMANTICS)typedesc.vecsemantics,
1192 const ustring uname = ustring(
name);
1195 switch (socket.
type) {
1197 int value = node->
get_bool(socket);
1198 ss->Parameter(*current_group,
name, TypeInt, &value);
1203 ss->Parameter(*current_group, uname, TypeFloat, &value);
1207 int value = node->
get_int(socket);
1208 ss->Parameter(*current_group, uname, TypeInt, &value);
1213 ss->Parameter(*current_group, uname, TypeColor, &value);
1218 ss->Parameter(*current_group, uname, TypeVector, &value);
1223 ss->Parameter(*current_group, uname, TypePoint, &value);
1228 ss->Parameter(*current_group, uname, TypeNormal, &value);
1233 ss->Parameter(*current_group,
1235 TypeDesc(TypeDesc::FLOAT, TypeDesc::VEC2, TypeDesc::POINT),
1241 ss->Parameter(*current_group, uname, TypeString, &value);
1246 ss->Parameter(*current_group, uname, TypeString, &value);
1251 ProjectionTransform projection(value);
1253 ss->Parameter(*current_group, uname, TypeMatrix, &projection);
1259 array<int> intvalue(value.
size());
1260 for (
size_t i = 0;
i < value.
size();
i++) {
1261 intvalue[
i] = value[
i];
1263 ss->Parameter(*current_group, uname, array_typedesc(TypeInt, value.
size()), intvalue.data());
1268 ss->Parameter(*current_group, uname, array_typedesc(TypeFloat, value.
size()), value.
data());
1273 ss->Parameter(*current_group, uname, array_typedesc(TypeInt, value.
size()), value.
data());
1282 switch (socket.
type) {
1284 typedesc = TypeColor;
1287 typedesc = TypeVector;
1290 typedesc = TypePoint;
1293 typedesc = TypeNormal;
1302 array<float> fvalue(value.
size() * 3);
1303 for (
size_t i = 0, j = 0;
i < value.
size();
i++) {
1304 fvalue[j++] = value[
i].x;
1305 fvalue[j++] = value[
i].y;
1306 fvalue[j++] = value[
i].z;
1309 ss->Parameter(*current_group, uname, array_typedesc(typedesc, value.
size()), fvalue.data());
1317 array_typedesc(TypeDesc(TypeDesc::FLOAT, TypeDesc::VEC2, TypeDesc::POINT), value.
size()),
1323 ss->Parameter(*current_group, uname, array_typedesc(TypeString, value.
size()), value.
data());
1328 array<ProjectionTransform> fvalue(value.
size());
1329 for (
size_t i = 0;
i < value.
size();
i++) {
1333 *current_group, uname, array_typedesc(TypeMatrix, fvalue.size()), fvalue.data());
1351 ss->Parameter(*current_group,
name, TypeFloat, &f);
1356 ss->Parameter(*current_group,
name, TypeColor, &f);
1361 ss->Parameter(*current_group,
name, TypePoint, &f);
1366 ss->Parameter(*current_group,
name, TypeNormal, &f);
1371 ss->Parameter(*current_group,
name, TypeVector, &f);
1376 ss->Parameter(*current_group,
name, TypeInt, &f);
1381 ss->Parameter(*current_group,
name, TypeString, (
const void *)&s);
1386 const char *
str = s.c_str();
1387 ss->Parameter(*current_group,
name, TypeString, (
const void *)&
str);
1392 ProjectionTransform projection(tfm);
1394 ss->Parameter(*current_group,
name, TypeMatrix, (
float *)&projection);
1399 TypeDesc type = TypeFloat;
1400 type.arraylen = arraylen;
1401 ss->Parameter(*current_group,
name, type, f);
1407 array<float[3]> table(f.
size());
1409 for (
int i = 0;
i < f.
size(); ++
i) {
1410 table[
i][0] = f[
i].x;
1411 table[
i][1] = f[
i].y;
1412 table[
i][2] = f[
i].z;
1415 TypeDesc type = TypeColor;
1416 type.arraylen = table.size();
1417 ss->Parameter(*current_group,
name, type, table.data());
1434 if (node !=
nullptr && dependencies.find(node) == dependencies.end()) {
1435 for (ShaderInput *
in : node->
inputs) {
1436 if (!node_skip_input(node,
in)) {
1437 find_dependencies(dependencies,
in);
1441 dependencies.insert(node);
1453 for (ShaderNode *node : nodes) {
1454 if (done.find(node) == done.end()) {
1455 bool inputs_done =
true;
1458 if (!node_skip_input(node,
input)) {
1459 if (
input->link && done.find(
input->link->parent) == done.end()) {
1460 inputs_done =
false;
1471 current_shader->has_surface_transparent =
true;
1474 current_shader->has_surface_raytrace =
true;
1477 current_shader->has_surface_spatial_varying =
true;
1480 current_shader->has_surface_bssrdf =
true;
1482 current_shader->has_bssrdf_bump =
true;
1486 current_shader->has_bump =
true;
1491 current_shader->has_volume_spatial_varying =
true;
1500 }
while (!nodes_done);
1505 current_type = type;
1508 std::stringstream
name;
1509 name.imbue(std::locale(
"C"));
1510 name <<
"shader_" << shader->
name.hash();
1512 current_group = ss->ShaderGroupBegin(
name.str());
1519 find_dependencies(dependencies,
output->input(
"Surface"));
1520 generate_nodes(dependencies);
1525 find_dependencies(dependencies,
output->input(
"Normal"));
1526 generate_nodes(dependencies);
1531 find_dependencies(dependencies,
output->input(
"Volume"));
1532 generate_nodes(dependencies);
1537 find_dependencies(dependencies,
output->input(
"Displacement"));
1538 generate_nodes(dependencies);
1545 ss->ShaderGroupEnd(*current_group);
1547 return std::move(current_group);
1553 ShaderGraph *graph = shader->
graph.get();
1554 const bool has_bump = shader->
has_bump;
1556 current_shader = shader;
1558 Shader::OSLCache cache;
1575 shader->osl_cache[device] = std::move(cache);
1598 const ustring filename(
string_printf(
"@svm%d", texture_shared_unique_id++).c_str());
1607 const ustring filename(
string_printf(
"@svm%d", texture_shared_unique_id++).c_str());
BMesh const char void * data
unsigned long long int uint64_t
Shader * get_shader(const Scene *scene)
static ColorSpaceProcessor * get_processor(ustring colorspace)
virtual const string & error_message()
virtual bool load_osl_kernels()
virtual void foreach_device(const std::function< void(Device *)> &callback)
virtual OSLGlobals * get_cpu_osl_memory()
vector< int4 > get_svm_slots() const
void append(const uint8_t *data, const int nbytes)
void parameter_array(const char *name, const float f[], int arraylen)
void add(ShaderNode *node, const char *name, bool isfilepath=false)
void parameter_texture(const char *name, ustring filename, ustring colorspace)
void parameter(ShaderNode *node, const char *name)
void compile(Shader *shader)
void parameter_color_array(const char *name, const array< float3 > &f)
void parameter_texture_ies(const char *name, const int svm_slot)
void parameter_point(const char *name, const float3 f)
void parameter_vector(const char *name, const float3 f)
void parameter_attribute(const char *name, ustring s)
void parameter_color(const char *name, const float3 f)
void parameter_normal(const char *name, const float3 f)
void device_free(Device *device, DeviceScene *dscene, Scene *scene)
void device_update_pre(Device *device, Scene *scene)
static void free_memory()
void device_update_post(Device *device, Scene *scene, Progress &progress, const bool reload_kernels)
OSLManager(Device *device)
void add_input(ustring name, SocketType::Type type, const int flags=0)
static OSLNode * create(ShaderGraph *graph, const size_t num_inputs, const OSLNode *from=nullptr)
void add_output(ustring name, SocketType::Type type)
char * input_default_value()
static ImageManager * image_manager
OSLTextureHandleMap textures
static void register_closures(OSL::ShadingSystem *ss)
void set_error(const string &error_message_)
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()
void create_inputs_outputs(const NodeType *type)
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
T * util_aligned_new(Args... args)
void util_aligned_delete(T *t)
ccl_device_inline ProjectionTransform projection_transpose(const ProjectionTransform a)
CCL_NAMESPACE_BEGIN struct Options options
#define KERNEL_FEATURE_NODE_RAYTRACE
#define CCL_NAMESPACE_END
#define assert(assertion)
VecBase< float, 2 > float2
VecBase< float, 3 > float3
@ SHADER_TYPE_DISPLACEMENT
OSL::ustringhash OSLUStringHash
string path_user_get(const string &sub)
string path_dirname(const string &path)
string path_get(const string &sub)
uint64_t path_modified_time(const string &path)
string path_join(const string &dir, const string &file)
bool path_read_text(const string &path, string &text)
@ SHADER_SPECIAL_TYPE_BUMP
@ SHADER_SPECIAL_TYPE_OUTPUT
@ SHADER_SPECIAL_TYPE_OSL
set< ShaderNode *, ShaderNodeIDComparator > ShaderNodeSet
CCL_NAMESPACE_BEGIN string string_printf(const char *format,...)
static AttributeStandard name_standard(const char *name)
static const char * standard_name(AttributeStandard std)
const SocketType * find_input(ustring name) const
const array< float3 > & get_float3_array(const SocketType &input) const
const array< float > & get_float_array(const SocketType &input) const
const array< int > & get_int_array(const SocketType &input) const
float get_float(const SocketType &input) const
Transform get_transform(const SocketType &input) const
float3 get_float3(const SocketType &input) const
const array< bool > & get_bool_array(const SocketType &input) const
bool get_bool(const SocketType &input) const
int reference_count() const
float2 get_float2(const SocketType &input) const
const array< ustring > & get_string_array(const SocketType &input) const
const array< float2 > & get_float2_array(const SocketType &input) const
ustring get_string(const SocketType &input) const
int get_int(const SocketType &input) const
const array< Transform > & get_transform_array(const SocketType &input) const
unique_ptr< LightManager > light_manager
unique_ptr< SceneUpdateStats > update_stats
unique_ptr_vector< Shader > shaders
unique_ptr< ShaderManager > shader_manager
unique_ptr< OSLManager > osl_manager
unique_ptr< ImageManager > image_manager
std::unique_lock< std::mutex > thread_scoped_lock