/* SPDX-FileCopyrightText: 2011-2022 Blender Foundation * * SPDX-License-Identifier: Apache-2.0 */ #pragma once #ifdef WITH_OSL # include # include "util/map.h" # include "util/param.h" # include "util/vector.h" # include "kernel/types.h" # include "kernel/osl/compat.h" # include "kernel/osl/types.h" # ifndef WIN32 using std::isfinite; # endif CCL_NAMESPACE_BEGIN class OSLRenderServices; class ColorSpaceProcessor; struct ThreadKernelGlobalsCPU; /* OSL Globals * * Data needed by OSL render services, that is global to a rendering session. * This includes all OSL shaders, name to attribute mapping and texture handles. */ struct OSLGlobals { OSLGlobals() { ss = nullptr; services = nullptr; use_shading = false; use_camera = false; } bool use_shading; bool use_camera; /* shading system */ OSL::ShadingSystem *ss; OSLRenderServices *services; /* shader states */ vector surface_state; vector volume_state; vector displacement_state; vector bump_state; OSL::ShaderGroupRef background_state; OSL::ShaderGroupRef camera_state; /* attributes */ using ObjectNameMap = unordered_map; ObjectNameMap object_name_map; vector object_names; }; /* trace() call result */ struct OSLTraceData { Ray ray; Intersection isect; ShaderData sd; bool setup; bool init; bool hit; bool self_hit; }; /* thread key for thread specific data lookup */ struct OSLThreadData { /* Global Data */ OSLGlobals *globals = nullptr; OSL::ShadingSystem *ss = nullptr; /* Per-thread data. */ int thread_index = -1; mutable ShaderGlobals shader_globals; mutable OSLTraceData tracedata; OSL::PerThreadInfo *osl_thread_info = nullptr; OSL::ShadingContext *context = nullptr; OSLThreadData(OSLGlobals *globals, const int thread_index); ~OSLThreadData(); OSLThreadData(OSLThreadData &other) = delete; OSLThreadData(OSLThreadData &&other) noexcept; OSLThreadData &operator=(const OSLThreadData &other) = delete; OSLThreadData &operator=(OSLThreadData &&other) = delete; }; CCL_NAMESPACE_END #endif