Cycles: support loading images from arbitrary OpenColorIO color space
[blender.git] / intern / cycles / kernel / osl / osl_globals.h
1 /*
2  * Copyright 2011-2013 Blender Foundation
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 #ifndef __OSL_GLOBALS_H__
18 #define __OSL_GLOBALS_H__
19
20 #ifdef WITH_OSL
21
22 #  include <OSL/oslexec.h>
23
24 #  include <OpenImageIO/refcnt.h>
25 #  include <OpenImageIO/unordered_map_concurrent.h>
26
27 #  include "util/util_map.h"
28 #  include "util/util_param.h"
29 #  include "util/util_thread.h"
30 #  include "util/util_vector.h"
31 #  include "util/util_unique_ptr.h"
32
33 #  ifndef WIN32
34 using std::isfinite;
35 #  endif
36
37 CCL_NAMESPACE_BEGIN
38
39 class OSLRenderServices;
40 class ColorSpaceProcessor;
41
42 /* OSL Texture Handle
43  *
44  * OSL texture lookups are string based. If those strings are known at compile
45  * time, the OSL compiler can cache a texture handle to use instead of a string.
46  *
47  * By default it uses TextureSystem::TextureHandle. But since we want to support
48  * different kinds of textures and color space conversions, this is our own handle
49  * with additional data.
50  *
51  * These are stored in a concurrent hash map, because OSL can compile multiple
52  * shaders in parallel. */
53
54 struct OSLTextureHandle : public OIIO::RefCnt {
55   enum Type { OIIO, SVM, IES, BEVEL, AO };
56
57   OSLTextureHandle(Type type = OIIO, int svm_slot = -1)
58       : type(type), svm_slot(svm_slot), oiio_handle(NULL), processor(NULL)
59   {
60   }
61
62   Type type;
63   int svm_slot;
64   OSL::TextureSystem::TextureHandle *oiio_handle;
65   ColorSpaceProcessor *processor;
66 };
67
68 typedef OIIO::intrusive_ptr<OSLTextureHandle> OSLTextureHandleRef;
69 typedef OIIO::unordered_map_concurrent<ustring, OSLTextureHandleRef, ustringHash>
70     OSLTextureHandleMap;
71
72 /* OSL Globals
73  *
74  * Data needed by OSL render services, that is global to a rendering session.
75  * This includes all OSL shaders, name to attribute mapping and texture handles.
76  * */
77
78 struct OSLGlobals {
79   OSLGlobals()
80   {
81     ss = NULL;
82     ts = NULL;
83     services = NULL;
84     use = false;
85   }
86
87   bool use;
88
89   /* shading system */
90   OSL::ShadingSystem *ss;
91   OSL::TextureSystem *ts;
92   OSLRenderServices *services;
93
94   /* shader states */
95   vector<OSL::ShaderGroupRef> surface_state;
96   vector<OSL::ShaderGroupRef> volume_state;
97   vector<OSL::ShaderGroupRef> displacement_state;
98   vector<OSL::ShaderGroupRef> bump_state;
99   OSL::ShaderGroupRef background_state;
100
101   /* attributes */
102   struct Attribute {
103     TypeDesc type;
104     AttributeDescriptor desc;
105     ParamValue value;
106   };
107
108   typedef unordered_map<ustring, Attribute, ustringHash> AttributeMap;
109   typedef unordered_map<ustring, int, ustringHash> ObjectNameMap;
110
111   vector<AttributeMap> attribute_map;
112   ObjectNameMap object_name_map;
113   vector<ustring> object_names;
114
115   /* textures */
116   OSLTextureHandleMap textures;
117 };
118
119 /* trace() call result */
120 struct OSLTraceData {
121   Ray ray;
122   Intersection isect;
123   ShaderData sd;
124   bool setup;
125   bool init;
126 };
127
128 /* thread key for thread specific data lookup */
129 struct OSLThreadData {
130   OSL::ShaderGlobals globals;
131   OSL::PerThreadInfo *osl_thread_info;
132   OSLTraceData tracedata;
133   OSL::ShadingContext *context;
134   OIIO::TextureSystem::Perthread *oiio_thread_info;
135 };
136
137 CCL_NAMESPACE_END
138
139 #endif
140
141 #endif /* __OSL_GLOBALS_H__ */