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();
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) {
346void OSLManager::shading_system_init()
349 if (!ss_map.empty()) {
356 foreach_osl_device(device_, [
this](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),
379 ss->attribute(
"lockgeom", 1);
380 ss->attribute(
"commonspace",
"world");
381 ss->attribute(
"searchpath:shader", shader_path);
382 ss->attribute(
"greedyjit", 1);
384 const char *groupdata_alloc_str = getenv(
"CYCLES_OSL_GROUPDATA_ALLOC");
385 if (groupdata_alloc_str) {
386 ss->attribute(
"max_optix_groupdata_alloc", atoi(groupdata_alloc_str));
389 ss->attribute(
"max_optix_groupdata_alloc", 2048);
392 VLOG_INFO <<
"Using shader search path: " << shader_path;
395 static const char *raytypes[] = {
435 const int nraytypes =
sizeof(raytypes) /
sizeof(raytypes[0]);
436 ss->attribute(
"raytypes",
TypeDesc(TypeDesc::STRING, nraytypes), (
const void *)raytypes);
439 ss_shared[device_type] = std::move(ss);
441 ss_map[device_type] = ss_shared[device_type];
445void OSLManager::shading_system_free()
452 for (
auto &[device_type, ss] : ss_shared) {
453 if (ss.use_count() == 1) {
458 loaded_shaders.clear();
461bool OSLManager::osl_compile(
const string &inputfile,
const string &outputfile)
465 const string shader_path =
path_get(
"shader");
472 const string include_path_arg = string(
"-I") + shader_path;
473 options.push_back(include_path_arg);
475 stdosl_path =
path_join(shader_path,
"stdcycles.h");
483 OSL::OSLCompiler compiler = OSL::OSLCompiler(&OSL::ErrorHandler::default_handler());
484 const bool ok = compiler.compile(string_view(inputfile),
options, string_view(stdosl_path));
489bool OSLManager::osl_query(OSL::OSLQuery &query,
const string &filepath)
492 return query.open(filepath, searchpath);
495static string shader_filepath_hash(
const string &filepath,
const uint64_t modified_time)
499 md5.
append((
const uint8_t *)filepath.c_str(), filepath.size());
500 md5.
append((
const uint8_t *)&modified_time,
sizeof(modified_time));
505const char *OSLManager::shader_test_loaded(
const string &
hash)
507 const map<string, OSLShaderInfo>::iterator it = loaded_shaders.find(
hash);
508 return (it == loaded_shaders.end()) ?
nullptr : it->first.c_str();
511OSLShaderInfo *OSLManager::shader_loaded_info(
const string &
hash)
513 const map<string, OSLShaderInfo>::iterator it = loaded_shaders.find(
hash);
514 return (it == loaded_shaders.end()) ?
nullptr : &it->second;
517const char *OSLManager::shader_load_filepath(
string filepath)
519 const size_t len = filepath.size();
520 const string extension = filepath.substr(
len - 4);
523 if (extension ==
".osl") {
525 const string osopath = filepath.substr(0,
len - 4) +
".oso";
529 if (oso_modified_time != 0) {
530 const char *
hash = shader_test_loaded(shader_filepath_hash(osopath, oso_modified_time));
538 if (oso_modified_time == 0 || (oso_modified_time < modified_time)) {
539 OSLManager::osl_compile(filepath, osopath);
543 modified_time = oso_modified_time;
549 if (extension ==
".oso") {
562 const char *
hash = shader_test_loaded(shader_filepath_hash(filepath, modified_time));
570 const string bytecode_hash = shader_filepath_hash(filepath, modified_time);
574 fprintf(stderr,
"Cycles shader graph: failed to read file %s\n", filepath.c_str());
575 const OSLShaderInfo info;
576 loaded_shaders[bytecode_hash] = info;
580 return shader_load_bytecode(bytecode_hash, bytecode);
583const char *OSLManager::shader_load_bytecode(
const string &
hash,
const string &bytecode)
585 shading_system_init();
587 foreach_shading_system(
588 [
hash, bytecode](OSL::ShadingSystem *ss) { ss->LoadMemoryCompiledShader(
hash, bytecode); });
594 if (!info.query.open_bytecode(bytecode)) {
595 fprintf(stderr,
"OSL query error: %s\n", info.query.geterror().c_str());
599 info.has_surface_emission = (bytecode.find(
"\"emission\"") != string::npos);
600 info.has_surface_transparent = (bytecode.find(
"\"transparent\"") != string::npos);
601 info.has_surface_bssrdf = (bytecode.find(
"\"bssrdf\"") != string::npos);
603 loaded_shaders[
hash] = info;
605 return loaded_shaders.find(
hash)->first.c_str();
608uint64_t OSLShaderManager::get_attribute_id(ustring name)
617 return stdname.hash();
620void OSLShaderManager::device_update_specific(
Device *device,
625 if (!need_update()) {
631 scene->
update_stats->osl.times.add_entry({
"device_update", time});
638 OSLManager::foreach_osl_device(device, [scene](
Device *sub_device, OSLGlobals *og) {
639 OSL::ShadingSystem *ss = scene->
osl_manager->get_shading_system(sub_device);
644 og->use_shading =
true;
646 og->surface_state.clear();
647 og->volume_state.clear();
648 og->displacement_state.clear();
649 og->bump_state.clear();
650 og->background_state.reset();
661 auto compile = [scene, shader, background_shader](
Device *sub_device, OSLGlobals *) {
662 OSL::ShadingSystem *ss = scene->
osl_manager->get_shading_system(sub_device);
665 compiler.background = (shader == background_shader);
666 compiler.compile(shader);
669 task_pool.push([device, compile] { OSLManager::foreach_osl_device(device, compile); });
679 OSLManager::OSLManager::foreach_osl_device(
680 device, [shader, background_shader](
Device *, OSLGlobals *og) {
682 og->surface_state.push_back(shader->osl_surface_ref);
683 og->volume_state.push_back(shader->osl_volume_ref);
684 og->displacement_state.push_back(shader->osl_displacement_ref);
685 og->bump_state.push_back(shader->osl_surface_bump_ref);
687 if (shader == background_shader) {
688 og->background_state = shader->osl_surface_ref;
700 int background_id = scene->
shader_manager->get_shader_id(background_shader);
702 OSLManager::foreach_osl_device(device, [background_id](
Device *, OSLGlobals *og) {
703 og->background_state = og->surface_state[background_id &
SHADER_MASK];
710 update_flags = UPDATE_NONE;
712 device_update_common(device, dscene, scene,
progress);
717 device_free_common(device, dscene, scene);
720 OSLManager::foreach_osl_device(device, [](
Device *, OSLGlobals *og) {
721 og->use_shading =
false;
723 og->surface_state.clear();
724 og->volume_state.clear();
725 og->displacement_state.clear();
726 og->bump_state.clear();
727 og->background_state.reset();
735 const std::string &filepath,
736 const std::string &bytecode_hash,
737 const std::string &bytecode)
746 if (!filepath.empty()) {
752 hash = scene->
osl_manager->shader_load_bytecode(bytecode_hash, bytecode);
763 size_t num_inputs = 0;
765 for (
int i = 0;
i < info->query.nparams();
i++) {
766 const OSL::OSLQuery::Parameter *param = info->query.getparam(
i);
769 if (param->varlenarray || param->isstruct || param->type.arraylen > 1) {
773 if (!param->isoutput) {
782 const set<void *> used_sockets;
784 for (
int i = 0;
i < info->query.nparams();
i++) {
785 const OSL::OSLQuery::Parameter *param = info->query.getparam(
i);
788 if (param->varlenarray || param->isstruct || param->type.arraylen > 1) {
795 if (param->isclosure) {
798 else if (param->type.vecsemantics != TypeDesc::NOSEMANTICS) {
799 if (param->type.vecsemantics == TypeDesc::COLOR) {
802 else if (param->type.vecsemantics == TypeDesc::POINT) {
805 else if (param->type.vecsemantics == TypeDesc::VECTOR) {
808 else if (param->type.vecsemantics == TypeDesc::NORMAL) {
815 if (!param->isoutput && param->validdefault) {
817 default_value->
x = param->fdefault[0];
818 default_value->
y = param->fdefault[1];
819 default_value->
z = param->fdefault[2];
822 else if (param->type.aggregate == TypeDesc::SCALAR) {
823 if (param->type.basetype == TypeDesc::INT) {
826 if (!param->isoutput && param->validdefault) {
830 else if (param->type.basetype == TypeDesc::FLOAT) {
833 if (!param->isoutput && param->validdefault) {
837 else if (param->type.basetype == TypeDesc::STRING) {
840 if (!param->isoutput && param->validdefault) {
852 if (param->isoutput) {
858 int socket_flags = 0;
859 if (!param->validdefault) {
862 for (
const OSL::OSLQuery::Parameter &metadata : param->metadata) {
863 if (metadata.type == TypeDesc::STRING) {
864 if (metadata.name ==
"widget" && metadata.sdefault[0] ==
"null") {
867 else if (metadata.name ==
"defaultgeomprop") {
871 if (metadata.sdefault[0] ==
"Nobject") {
874 else if (metadata.sdefault[0] ==
"Nworld") {
877 else if (metadata.sdefault[0] ==
"Pobject") {
880 else if (metadata.sdefault[0] ==
"Pworld") {
883 else if (metadata.sdefault[0] ==
"Tworld") {
886 else if (metadata.sdefault[0] ==
"UV0") {
893 node->
add_input(param->name, socket_type, socket_flags);
898 if (!bytecode_hash.empty()) {
912void OSLShaderManager::osl_image_slots(
Device *device,
914 set<int> &image_slots)
916 set<OSLRenderServices *> services_shared;
919 services_shared.insert(og->services);
923 for (
auto it = services->
textures.begin(); it != services->
textures.end(); ++it) {
924 if (it->second.handle.get_manager() == image_manager) {
925 const int slot = it->second.handle.svm_slot();
926 image_slots.insert(slot);
934OSLCompiler::OSLCompiler(OSL::ShadingSystem *ss,
Scene *scene)
935 : scene(scene), services(static_cast<
OSLRenderServices *>(ss->renderer())), ss(ss)
938 current_shader =
nullptr;
945 std::stringstream stream;
949 stream.imbue(std::locale(
"C"));
951 stream <<
"node_" << node->
type->
name <<
"_" << node;
958 string sname(
input->name().string());
962 while ((
i = sname.find(
" ")) != string::npos) {
963 sname.replace(
i, 1,
"");
979 string sname(
output->name().string());
983 while ((
i = sname.find(
" ")) != string::npos) {
984 sname.replace(
i, 1,
"");
1022 if (
input->name() ==
"Height") {
1039 name =
scene->osl_manager->shader_load_filepath(name);
1041 if (name ==
nullptr) {
1050 if (node_skip_input(node,
input)) {
1057 const string param_name = compatible_name(node,
input);
1058 const SocketType &socket =
input->socket_type;
1059 switch (
input->type()) {
1092 ss->Shader(*current_group,
"surface", name,
id(node));
1095 ss->Shader(*current_group,
"surface", name,
id(node));
1098 ss->Shader(*current_group,
"displacement", name,
id(node));
1101 ss->Shader(*current_group,
"displacement", name,
id(node));
1110 if (node_skip_input(node,
input)) {
1115 const string id_from = id(
input->link->parent);
1116 const string id_to = id(node);
1117 const string param_from = compatible_name(
input->link->parent,
input->link);
1118 const string param_to = compatible_name(node,
input);
1120 ss->ConnectShaders(*current_group, id_from, param_from, id_to, param_to);
1125 OSLShaderInfo *info =
scene->osl_manager->shader_loaded_info(name);
1131 OSLNode *oslnode =
static_cast<OSLNode *
>(node);
1134 if (info->has_surface_transparent) {
1135 current_shader->has_surface_transparent =
true;
1137 if (info->has_surface_bssrdf) {
1138 current_shader->has_surface_bssrdf =
true;
1139 current_shader->has_bssrdf_bump =
true;
1141 current_shader->has_bump =
true;
1142 current_shader->has_surface_raytrace =
true;
1146 current_shader->has_surface_spatial_varying =
true;
1151 current_shader->has_volume_spatial_varying =
true;
1154 current_shader->has_volume_attribute_dependency =
true;
1159static TypeDesc array_typedesc(
const TypeDesc typedesc,
const int arraylength)
1161 return TypeDesc((TypeDesc::BASETYPE)typedesc.basetype,
1162 (TypeDesc::AGGREGATE)typedesc.aggregate,
1163 (TypeDesc::VECSEMANTICS)typedesc.vecsemantics,
1169 const ustring uname = ustring(name);
1172 switch (socket.
type) {
1174 int value = node->
get_bool(socket);
1175 ss->Parameter(*current_group, name, TypeInt, &value);
1180 ss->Parameter(*current_group, uname, TypeFloat, &value);
1184 int value = node->
get_int(socket);
1185 ss->Parameter(*current_group, uname, TypeInt, &value);
1190 ss->Parameter(*current_group, uname, TypeColor, &value);
1195 ss->Parameter(*current_group, uname, TypeVector, &value);
1200 ss->Parameter(*current_group, uname, TypePoint, &value);
1205 ss->Parameter(*current_group, uname, TypeNormal, &value);
1210 ss->Parameter(*current_group,
1212 TypeDesc(TypeDesc::FLOAT, TypeDesc::VEC2, TypeDesc::POINT),
1218 ss->Parameter(*current_group, uname, TypeString, &value);
1223 ss->Parameter(*current_group, uname, TypeString, &value);
1228 ProjectionTransform projection(value);
1230 ss->Parameter(*current_group, uname, TypeMatrix, &projection);
1236 array<int> intvalue(value.
size());
1237 for (
size_t i = 0;
i < value.
size();
i++) {
1238 intvalue[
i] = value[
i];
1240 ss->Parameter(*current_group, uname, array_typedesc(TypeInt, value.
size()), intvalue.data());
1245 ss->Parameter(*current_group, uname, array_typedesc(TypeFloat, value.
size()), value.
data());
1250 ss->Parameter(*current_group, uname, array_typedesc(TypeInt, value.
size()), value.
data());
1259 switch (socket.
type) {
1261 typedesc = TypeColor;
1264 typedesc = TypeVector;
1267 typedesc = TypePoint;
1270 typedesc = TypeNormal;
1279 array<float> fvalue(value.
size() * 3);
1280 for (
size_t i = 0, j = 0;
i < value.
size();
i++) {
1281 fvalue[j++] = value[
i].x;
1282 fvalue[j++] = value[
i].y;
1283 fvalue[j++] = value[
i].z;
1286 ss->Parameter(*current_group, uname, array_typedesc(typedesc, value.
size()), fvalue.data());
1294 array_typedesc(
TypeDesc(TypeDesc::FLOAT, TypeDesc::VEC2, TypeDesc::POINT), value.
size()),
1300 ss->Parameter(*current_group, uname, array_typedesc(TypeString, value.
size()), value.
data());
1305 array<ProjectionTransform> fvalue(value.
size());
1306 for (
size_t i = 0;
i < value.
size();
i++) {
1310 *current_group, uname, array_typedesc(TypeMatrix, fvalue.size()), fvalue.data());
1328 ss->Parameter(*current_group, name, TypeFloat, &f);
1333 ss->Parameter(*current_group, name, TypeColor, &f);
1338 ss->Parameter(*current_group, name, TypePoint, &f);
1343 ss->Parameter(*current_group, name, TypeNormal, &f);
1348 ss->Parameter(*current_group, name, TypeVector, &f);
1353 ss->Parameter(*current_group, name, TypeInt, &f);
1358 ss->Parameter(*current_group, name, TypeString, (
const void *)&s);
1363 const char *
str = s.c_str();
1364 ss->Parameter(*current_group, name, TypeString, (
const void *)&
str);
1369 ProjectionTransform projection(tfm);
1371 ss->Parameter(*current_group, name, TypeMatrix, (
float *)&projection);
1377 type.arraylen = arraylen;
1378 ss->Parameter(*current_group, name, type, f);
1384 array<float[3]> table(f.
size());
1386 for (
int i = 0;
i < f.
size(); ++
i) {
1387 table[
i][0] = f[
i].x;
1388 table[
i][1] = f[
i].y;
1389 table[
i][2] = f[
i].z;
1393 type.arraylen = table.size();
1394 ss->Parameter(*current_group, name, type, table.data());
1400 parameter(name, (
string(
"geom:") + s.c_str()).c_str());
1411 if (node !=
nullptr && dependencies.find(node) == dependencies.end()) {
1412 for (ShaderInput *
in : node->
inputs) {
1413 if (!node_skip_input(node,
in)) {
1414 find_dependencies(dependencies,
in);
1418 dependencies.insert(node);
1430 for (ShaderNode *node : nodes) {
1431 if (done.find(node) == done.end()) {
1432 bool inputs_done =
true;
1435 if (!node_skip_input(node,
input)) {
1436 if (
input->link && done.find(
input->link->parent) == done.end()) {
1437 inputs_done =
false;
1448 current_shader->has_surface_transparent =
true;
1451 current_shader->has_surface_raytrace =
true;
1454 current_shader->has_surface_spatial_varying =
true;
1457 current_shader->has_surface_bssrdf =
true;
1459 current_shader->has_bssrdf_bump =
true;
1463 current_shader->has_bump =
true;
1468 current_shader->has_volume_spatial_varying =
true;
1477 }
while (!nodes_done);
1482 current_type = type;
1485 std::stringstream name;
1486 name.imbue(std::locale(
"C"));
1487 name <<
"shader_" << shader->
name.hash();
1489 current_group = ss->ShaderGroupBegin(name.str());
1496 find_dependencies(dependencies,
output->input(
"Surface"));
1497 generate_nodes(dependencies);
1502 find_dependencies(dependencies,
output->input(
"Normal"));
1503 generate_nodes(dependencies);
1508 find_dependencies(dependencies,
output->input(
"Volume"));
1509 generate_nodes(dependencies);
1514 find_dependencies(dependencies,
output->input(
"Displacement"));
1515 generate_nodes(dependencies);
1522 ss->ShaderGroupEnd(*current_group);
1524 return std::move(current_group);
1530 ShaderGraph *graph = shader->
graph.get();
1531 ShaderNode *
output = (graph) ? graph->
output() :
nullptr;
1532 const bool has_bump = shader->
has_bump;
1534 current_shader = shader;
1554 shader->osl_surface_bump_ref = OSL::ShaderGroupRef();
1560 shader->osl_surface_ref = OSL::ShaderGroupRef();
1561 shader->osl_surface_bump_ref = OSL::ShaderGroupRef();
1570 shader->osl_volume_ref = OSL::ShaderGroupRef();
1575 shader->osl_displacement_ref = compile_type(
1580 shader->osl_displacement_ref = OSL::ShaderGroupRef();
1604 const ustring filename(
string_printf(
"@svm%d", texture_shared_unique_id++).c_str());
1613 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)
virtual bool has_surface_transparent()
ShaderNodeSpecialType special_type
virtual bool has_bssrdf_bump()
virtual bool has_spatial_varying()
virtual int get_feature()
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
bool has_surface_spatial_varying
bool has_volume_attribute_dependency
EmissionSampling emission_sampling
bool has_surface_raytrace
bool has_surface_transparent
NODE_DECLARE unique_ptr< ShaderGraph > graph
bool has_volume_spatial_varying
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
VecBase< float, 2 > float2
#define assert(assertion)
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