Files
blender/intern/cycles/kernel/osl/osl_services.h
Brecht Van Lommel 1df3b51988 Cycles: replace integrator state argument macros
* Rename struct KernelGlobals to struct KernelGlobalsCPU
* Add KernelGlobals, IntegratorState and ConstIntegratorState typedefs
  that every device can define in its own way.
* Remove INTEGRATOR_STATE_ARGS and INTEGRATOR_STATE_PASS macros and
  replace with these new typedefs.
* Add explicit state argument to INTEGRATOR_STATE and similar macros

In preparation for decoupling main and shadow paths.

Differential Revision: https://developer.blender.org/D12888
2021-10-18 19:02:10 +02:00

331 lines
11 KiB
C++

/*
* Copyright 2011-2013 Blender Foundation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef __OSL_SERVICES_H__
#define __OSL_SERVICES_H__
/* OSL Render Services
*
* Implementation of OSL render services, to retriever matrices, attributes,
* textures and point clouds. In principle this should only be accessing
* kernel data, but currently we also reach back into the Scene to retrieve
* attributes.
*/
#include <OSL/oslclosure.h>
#include <OSL/oslexec.h>
#include <OSL/rendererservices.h>
#ifdef WITH_PTEX
class PtexCache;
#endif
CCL_NAMESPACE_BEGIN
class Object;
class Scene;
class Shader;
struct ShaderData;
struct float3;
struct KernelGlobalsCPU;
/* OSL Texture Handle
*
* OSL texture lookups are string based. If those strings are known at compile
* time, the OSL compiler can cache a texture handle to use instead of a string.
*
* By default it uses TextureSystem::TextureHandle. But since we want to support
* different kinds of textures and color space conversions, this is our own handle
* with additional data.
*
* These are stored in a concurrent hash map, because OSL can compile multiple
* shaders in parallel. */
struct OSLTextureHandle : public OIIO::RefCnt {
enum Type { OIIO, SVM, IES, BEVEL, AO };
OSLTextureHandle(Type type = OIIO, int svm_slot = -1)
: type(type), svm_slot(svm_slot), oiio_handle(NULL), processor(NULL)
{
}
Type type;
int svm_slot;
OSL::TextureSystem::TextureHandle *oiio_handle;
ColorSpaceProcessor *processor;
};
typedef OIIO::intrusive_ptr<OSLTextureHandle> OSLTextureHandleRef;
typedef OIIO::unordered_map_concurrent<ustring, OSLTextureHandleRef, ustringHash>
OSLTextureHandleMap;
/* OSL Render Services
*
* Interface for OSL to access attributes, textures and other scene data. */
class OSLRenderServices : public OSL::RendererServices {
public:
OSLRenderServices(OSL::TextureSystem *texture_system);
~OSLRenderServices();
bool get_matrix(OSL::ShaderGlobals *sg,
OSL::Matrix44 &result,
OSL::TransformationPtr xform,
float time) override;
bool get_inverse_matrix(OSL::ShaderGlobals *sg,
OSL::Matrix44 &result,
OSL::TransformationPtr xform,
float time) override;
bool get_matrix(OSL::ShaderGlobals *sg,
OSL::Matrix44 &result,
ustring from,
float time) override;
bool get_inverse_matrix(OSL::ShaderGlobals *sg,
OSL::Matrix44 &result,
ustring to,
float time) override;
bool get_matrix(OSL::ShaderGlobals *sg,
OSL::Matrix44 &result,
OSL::TransformationPtr xform) override;
bool get_inverse_matrix(OSL::ShaderGlobals *sg,
OSL::Matrix44 &result,
OSL::TransformationPtr xform) override;
bool get_matrix(OSL::ShaderGlobals *sg, OSL::Matrix44 &result, ustring from) override;
bool get_inverse_matrix(OSL::ShaderGlobals *sg, OSL::Matrix44 &result, ustring from) override;
bool get_array_attribute(OSL::ShaderGlobals *sg,
bool derivatives,
ustring object,
TypeDesc type,
ustring name,
int index,
void *val) override;
bool get_attribute(OSL::ShaderGlobals *sg,
bool derivatives,
ustring object,
TypeDesc type,
ustring name,
void *val) override;
bool get_attribute(ShaderData *sd,
bool derivatives,
ustring object_name,
TypeDesc type,
ustring name,
void *val);
bool get_userdata(
bool derivatives, ustring name, TypeDesc type, OSL::ShaderGlobals *sg, void *val) override;
int pointcloud_search(OSL::ShaderGlobals *sg,
ustring filename,
const OSL::Vec3 &center,
float radius,
int max_points,
bool sort,
size_t *out_indices,
float *out_distances,
int derivs_offset) override;
int pointcloud_get(OSL::ShaderGlobals *sg,
ustring filename,
size_t *indices,
int count,
ustring attr_name,
TypeDesc attr_type,
void *out_data) override;
bool pointcloud_write(OSL::ShaderGlobals *sg,
ustring filename,
const OSL::Vec3 &pos,
int nattribs,
const ustring *names,
const TypeDesc *types,
const void **data) override;
bool trace(TraceOpt &options,
OSL::ShaderGlobals *sg,
const OSL::Vec3 &P,
const OSL::Vec3 &dPdx,
const OSL::Vec3 &dPdy,
const OSL::Vec3 &R,
const OSL::Vec3 &dRdx,
const OSL::Vec3 &dRdy) override;
bool getmessage(OSL::ShaderGlobals *sg,
ustring source,
ustring name,
TypeDesc type,
void *val,
bool derivatives) override;
#if OSL_LIBRARY_VERSION_CODE >= 11100
TextureSystem::TextureHandle *get_texture_handle(ustring filename,
OSL::ShadingContext *context) override;
#else
TextureSystem::TextureHandle *get_texture_handle(ustring filename) override;
#endif
bool good(TextureSystem::TextureHandle *texture_handle) override;
bool texture(ustring filename,
TextureSystem::TextureHandle *texture_handle,
TexturePerthread *texture_thread_info,
TextureOpt &options,
OSL::ShaderGlobals *sg,
float s,
float t,
float dsdx,
float dtdx,
float dsdy,
float dtdy,
int nchannels,
float *result,
float *dresultds,
float *dresultdt,
ustring *errormessage) override;
bool texture3d(ustring filename,
TextureHandle *texture_handle,
TexturePerthread *texture_thread_info,
TextureOpt &options,
OSL::ShaderGlobals *sg,
const OSL::Vec3 &P,
const OSL::Vec3 &dPdx,
const OSL::Vec3 &dPdy,
const OSL::Vec3 &dPdz,
int nchannels,
float *result,
float *dresultds,
float *dresultdt,
float *dresultdr,
ustring *errormessage) override;
bool environment(ustring filename,
TextureHandle *texture_handle,
TexturePerthread *texture_thread_info,
TextureOpt &options,
OSL::ShaderGlobals *sg,
const OSL::Vec3 &R,
const OSL::Vec3 &dRdx,
const OSL::Vec3 &dRdy,
int nchannels,
float *result,
float *dresultds,
float *dresultdt,
ustring *errormessage) override;
#if OSL_LIBRARY_VERSION_CODE >= 11100
bool get_texture_info(ustring filename,
TextureHandle *texture_handle,
TexturePerthread *texture_thread_info,
OSL::ShadingContext *shading_context,
int subimage,
ustring dataname,
TypeDesc datatype,
void *data,
ustring *errormessage) override;
#else
bool get_texture_info(OSL::ShaderGlobals *sg,
ustring filename,
TextureHandle *texture_handle,
int subimage,
ustring dataname,
TypeDesc datatype,
void *data) override;
#endif
static bool get_background_attribute(const KernelGlobalsCPU *kg,
ShaderData *sd,
ustring name,
TypeDesc type,
bool derivatives,
void *val);
static bool get_object_standard_attribute(const KernelGlobalsCPU *kg,
ShaderData *sd,
ustring name,
TypeDesc type,
bool derivatives,
void *val);
static ustring u_distance;
static ustring u_index;
static ustring u_world;
static ustring u_camera;
static ustring u_screen;
static ustring u_raster;
static ustring u_ndc;
static ustring u_object_location;
static ustring u_object_color;
static ustring u_object_index;
static ustring u_geom_dupli_generated;
static ustring u_geom_dupli_uv;
static ustring u_material_index;
static ustring u_object_random;
static ustring u_particle_index;
static ustring u_particle_random;
static ustring u_particle_age;
static ustring u_particle_lifetime;
static ustring u_particle_location;
static ustring u_particle_rotation;
static ustring u_particle_size;
static ustring u_particle_velocity;
static ustring u_particle_angular_velocity;
static ustring u_geom_numpolyvertices;
static ustring u_geom_trianglevertices;
static ustring u_geom_polyvertices;
static ustring u_geom_name;
static ustring u_geom_undisplaced;
static ustring u_is_smooth;
static ustring u_is_curve;
static ustring u_curve_thickness;
static ustring u_curve_length;
static ustring u_curve_tangent_normal;
static ustring u_curve_random;
static ustring u_normal_map_normal;
static ustring u_path_ray_length;
static ustring u_path_ray_depth;
static ustring u_path_diffuse_depth;
static ustring u_path_glossy_depth;
static ustring u_path_transparent_depth;
static ustring u_path_transmission_depth;
static ustring u_trace;
static ustring u_hit;
static ustring u_hitdist;
static ustring u_N;
static ustring u_Ng;
static ustring u_P;
static ustring u_I;
static ustring u_u;
static ustring u_v;
static ustring u_empty;
static ustring u_at_bevel;
static ustring u_at_ao;
/* Texture system and texture handle map are part of the services instead of
* globals to be shared between different render sessions. This saves memory,
* and is required because texture handles are cached as part of the shared
* shading system. */
OSL::TextureSystem *texture_system;
OSLTextureHandleMap textures;
};
CCL_NAMESPACE_END
#endif /* __OSL_SERVICES_H__ */