Blender V4.5
optix/device_impl.h
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2019 NVIDIA Corporation
2 * SPDX-FileCopyrightText: 2019-2022 Blender Foundation
3 *
4 * SPDX-License-Identifier: Apache-2.0 */
5
6#pragma once
7
8#ifdef WITH_OPTIX
9
11# include "device/optix/util.h" // IWYU pragma: keep
12# include "kernel/osl/globals.h"
13
14# include "util/task.h"
15
17
18class BVHOptiX;
20
21/* List of OptiX program groups. */
22enum {
23 /* Ray generation */
24 PG_RGEN_INTERSECT_CLOSEST,
25 PG_RGEN_INTERSECT_SHADOW,
26 PG_RGEN_INTERSECT_SUBSURFACE,
27 PG_RGEN_INTERSECT_VOLUME_STACK,
28 PG_RGEN_INTERSECT_DEDICATED_LIGHT,
29 PG_RGEN_SHADE_BACKGROUND,
30 PG_RGEN_SHADE_LIGHT,
31 PG_RGEN_SHADE_SURFACE,
32 PG_RGEN_SHADE_SURFACE_RAYTRACE,
33 PG_RGEN_SHADE_SURFACE_MNEE,
34 PG_RGEN_SHADE_VOLUME,
35 PG_RGEN_SHADE_SHADOW,
36 PG_RGEN_SHADE_DEDICATED_LIGHT,
37 PG_RGEN_EVAL_DISPLACE,
38 PG_RGEN_EVAL_BACKGROUND,
39 PG_RGEN_EVAL_CURVE_SHADOW_TRANSPARENCY,
40 PG_RGEN_INIT_FROM_CAMERA,
41
42 /* Miss */
43 PG_MISS,
44
45 /* Hit */
46 PG_HITD, /* Default hit group. */
47 PG_HITS, /* __SHADOW_RECORD_ALL__ hit group. */
48 PG_HITL, /* __BVH_LOCAL__ hit group (only used for triangles). */
49 PG_HITV, /* __VOLUME__ hit group. */
50 PG_HITD_MOTION,
51 PG_HITS_MOTION,
52 PG_HITL_MOTION,
53 PG_HITV_MOTION,
54 PG_HITD_POINTCLOUD,
55 PG_HITS_POINTCLOUD,
56 PG_HITV_POINTCLOUD,
57 PG_HITL_POINTCLOUD,
58
59 /* Callable */
60 PG_CALL_SVM_AO,
61 PG_CALL_SVM_BEVEL,
62
63 NUM_PROGRAM_GROUPS
64};
65
66static const int MISS_PROGRAM_GROUP_OFFSET = PG_MISS;
67static const int NUM_MISS_PROGRAM_GROUPS = 1;
68static const int HIT_PROGAM_GROUP_OFFSET = PG_HITD;
69static const int NUM_HIT_PROGRAM_GROUPS = 12;
70static const int CALLABLE_PROGRAM_GROUPS_BASE = PG_CALL_SVM_AO;
71static const int NUM_CALLABLE_PROGRAM_GROUPS = 2;
72
73/* List of OptiX pipelines. */
74enum { PIP_SHADE, PIP_INTERSECT, NUM_PIPELINES };
75
76/* A single shader binding table entry. */
77struct SbtRecord {
78 char header[OPTIX_SBT_RECORD_HEADER_SIZE];
79};
80
81class OptiXDevice : public CUDADevice {
82 public:
83 OptixDeviceContext context = nullptr;
84
85 OptixModule optix_module = nullptr; /* All necessary OptiX kernels are in one module. */
86 OptixModule builtin_modules[2] = {};
87 OptixPipeline pipelines[NUM_PIPELINES] = {};
88 OptixProgramGroup groups[NUM_PROGRAM_GROUPS] = {};
89 OptixPipelineCompileOptions pipeline_options = {};
90
91# ifdef WITH_OSL
92 OSLGlobals osl_globals;
93 vector<OptixModule> osl_modules;
94 vector<OptixProgramGroup> osl_groups;
95 OptixModule osl_camera_module = nullptr;
96 device_vector<uint8_t> osl_colorsystem;
97# endif
98
99 device_vector<SbtRecord> sbt_data;
100 device_only_memory<KernelParamsOptiX> launch_params;
101
102 private:
103 OptixTraversableHandle tlas_handle = 0;
104 vector<unique_ptr<device_only_memory<char>>> delayed_free_bvh_memory;
105 thread_mutex delayed_free_bvh_mutex;
106
107 public:
108 OptiXDevice(const DeviceInfo &info, Stats &stats, Profiler &profiler, bool headless);
109 ~OptiXDevice() override;
110
111 BVHLayoutMask get_bvh_layout_mask(uint /*kernel_features*/) const override;
112
113 string compile_kernel_get_common_cflags(const uint kernel_features);
114
115 void create_optix_module(TaskPool &pool,
116 OptixModuleCompileOptions &module_options,
117 string &ptx_data,
118 OptixModule &module,
119 OptixResult &failure_reason);
120
121 bool load_kernels(const uint kernel_features) override;
122
123 bool load_osl_kernels() override;
124
125 bool build_optix_bvh(BVHOptiX *bvh,
126 OptixBuildOperation operation,
127 const OptixBuildInput &build_input,
128 uint16_t num_motion_steps);
129
130 void build_bvh(BVH *bvh, Progress &progress, bool refit) override;
131
132 void release_bvh(BVH *bvh) override;
133 void free_bvh_memory_delayed();
134
135 void const_copy_to(const char *name, void *host, const size_t size) override;
136
137 void update_launch_params(const size_t offset, void *data, const size_t data_size);
138
139 unique_ptr<DeviceQueue> gpu_queue_create() override;
140
141 OSLGlobals *get_cpu_osl_memory() override;
142};
143
145
146#endif /* WITH_OPTIX */
unsigned int uint
struct TaskPool TaskPool
Definition BLI_task.h:56
float progress
Definition WM_types.hh:1019
BMesh const char void * data
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
Definition btDbvt.cpp:52
void refit(btStridingMeshInterface *triangles, const btVector3 &aabbMin, const btVector3 &aabbMax)
#define CCL_NAMESPACE_END
ccl_device bool BVH_FUNCTION_FULL_NAME BVH(KernelGlobals kg, const ccl_private Ray *ray, ccl_private LocalIntersection *local_isect, const int local_object, ccl_private uint *lcg_state, const int max_hits)
Definition local.h:28
int context(const bContext *C, const char *member, bContextDataResult *result)
int BVHLayoutMask
Definition params.h:50
static struct PyModuleDef module
Definition python.cpp:796
std::mutex thread_mutex
Definition thread.h:27