[Bf-blender-cvs] [40311a59ecb] cycles-x: Cycles X: restore two more volume stack functions
Brecht Van Lommel
noreply at git.blender.org
Mon Jun 28 17:15:24 CEST 2021
Commit: 40311a59ecbc89850695d1bb060f51aa0e66ca0d
Author: Brecht Van Lommel
Date: Thu Jun 17 17:29:25 2021 +0200
Branches: cycles-x
https://developer.blender.org/rB40311a59ecbc89850695d1bb060f51aa0e66ca0d
Cycles X: restore two more volume stack functions
===================================================================
M intern/cycles/kernel/integrator/integrator_volume_stack.h
M intern/cycles/kernel/kernel_volume.h
===================================================================
diff --git a/intern/cycles/kernel/integrator/integrator_volume_stack.h b/intern/cycles/kernel/integrator/integrator_volume_stack.h
index 05855fe0713..c7078cf700c 100644
--- a/intern/cycles/kernel/integrator/integrator_volume_stack.h
+++ b/intern/cycles/kernel/integrator/integrator_volume_stack.h
@@ -277,4 +277,88 @@ ccl_device_inline void volume_stack_clean(INTEGRATOR_STATE_ARGS)
}
}
+template<typename StackReadOp>
+ccl_device float volume_stack_step_size(INTEGRATOR_STATE_ARGS, StackReadOp stack_read)
+{
+ float step_size = FLT_MAX;
+
+ for (int i = 0;; i++) {
+ VolumeStack entry = stack_read(i);
+ if (entry.shader == SHADER_NONE) {
+ break;
+ }
+
+ int shader_flag = kernel_tex_fetch(__shaders, (entry.shader & SHADER_MASK)).flags;
+
+ bool heterogeneous = false;
+
+ if (shader_flag & SD_HETEROGENEOUS_VOLUME) {
+ heterogeneous = true;
+ }
+ else if (shader_flag & SD_NEED_VOLUME_ATTRIBUTES) {
+ /* We want to render world or objects without any volume grids
+ * as homogeneous, but can only verify this at run-time since other
+ * heterogeneous volume objects may be using the same shader. */
+ int object = entry.object;
+ if (object != OBJECT_NONE) {
+ int object_flag = kernel_tex_fetch(__object_flag, object);
+ if (object_flag & SD_OBJECT_HAS_VOLUME_ATTRIBUTES) {
+ heterogeneous = true;
+ }
+ }
+ }
+
+ if (heterogeneous) {
+ float object_step_size = object_volume_step_size(kg, entry.object);
+ object_step_size *= kernel_data.integrator.volume_step_rate;
+ step_size = fminf(object_step_size, step_size);
+ }
+ }
+
+ return step_size;
+}
+
+template<typename StackReadOp>
+ccl_device int volume_stack_sampling_method(INTEGRATOR_STATE_ARGS, StackReadOp stack_read)
+{
+ if (kernel_data.integrator.num_all_lights == 0)
+ return 0;
+
+ int method = -1;
+
+ for (int i = 0;; i++) {
+ VolumeStack entry = stack_read(i);
+ if (entry.shader == SHADER_NONE) {
+ break;
+ }
+
+ int shader_flag = kernel_tex_fetch(__shaders, (entry.shader & SHADER_MASK)).flags;
+
+ if (shader_flag & SD_VOLUME_MIS) {
+ /* Multiple importance sampling. */
+ return SD_VOLUME_MIS;
+ }
+ else if (shader_flag & SD_VOLUME_EQUIANGULAR) {
+ /* Distance + equiangular sampling -> multiple importance sampling. */
+ if (method == 0) {
+ return SD_VOLUME_MIS;
+ }
+
+ /* Only equiangular sampling. */
+ method = SD_VOLUME_EQUIANGULAR;
+ }
+ else {
+ /* Distance + equiangular sampling -> multiple importance sampling. */
+ if (method == SD_VOLUME_EQUIANGULAR) {
+ return SD_VOLUME_MIS;
+ }
+
+ /* Distance sampling only. */
+ method = 0;
+ }
+ }
+
+ return method;
+}
+
CCL_NAMESPACE_END
diff --git a/intern/cycles/kernel/kernel_volume.h b/intern/cycles/kernel/kernel_volume.h
index 25b8bae6d05..efdc44e184e 100644
--- a/intern/cycles/kernel/kernel_volume.h
+++ b/intern/cycles/kernel/kernel_volume.h
@@ -24,71 +24,6 @@ CCL_NAMESPACE_BEGIN
* work in volumes and subsurface scattering. */
#define VOLUME_THROUGHPUT_EPSILON 1e-6f
-ccl_device float volume_stack_step_size(const KernelGlobals *kg, ccl_addr_space VolumeStack *stack)
-{
- float step_size = FLT_MAX;
-
- for (int i = 0; stack[i].shader != SHADER_NONE; i++) {
- int shader_flag = kernel_tex_fetch(__shaders, (stack[i].shader & SHADER_MASK)).flags;
-
- bool heterogeneous = false;
-
- if (shader_flag & SD_HETEROGENEOUS_VOLUME) {
- heterogeneous = true;
- }
- else if (shader_flag & SD_NEED_VOLUME_ATTRIBUTES) {
- /* We want to render world or objects without any volume grids
- * as homogeneous, but can only verify this at run-time since other
- * heterogeneous volume objects may be using the same shader. */
- int object = stack[i].object;
- if (object != OBJECT_NONE) {
- int object_flag = kernel_tex_fetch(__object_flag, object);
- if (object_flag & SD_OBJECT_HAS_VOLUME_ATTRIBUTES) {
- heterogeneous = true;
- }
- }
- }
-
- if (heterogeneous) {
- float object_step_size = object_volume_step_size(kg, stack[i].object);
- object_step_size *= kernel_data.integrator.volume_step_rate;
- step_size = fminf(object_step_size, step_size);
- }
- }
-
- return step_size;
-}
-
-ccl_device int volume_stack_sampling_method(const KernelGlobals *kg, VolumeStack *stack)
-{
- if (kernel_data.integrator.num_all_lights == 0)
- return 0;
-
- int method = -1;
-
- for (int i = 0; stack[i].shader != SHADER_NONE; i++) {
- int shader_flag = kernel_tex_fetch(__shaders, (stack[i].shader & SHADER_MASK)).flags;
-
- if (shader_flag & SD_VOLUME_MIS) {
- return SD_VOLUME_MIS;
- }
- else if (shader_flag & SD_VOLUME_EQUIANGULAR) {
- if (method == 0)
- return SD_VOLUME_MIS;
-
- method = SD_VOLUME_EQUIANGULAR;
- }
- else {
- if (method == SD_VOLUME_EQUIANGULAR)
- return SD_VOLUME_MIS;
-
- method = 0;
- }
- }
-
- return method;
-}
-
ccl_device_inline void kernel_volume_step_init(const KernelGlobals *kg,
ccl_addr_space PathState *state,
const float object_step_size,
More information about the Bf-blender-cvs
mailing list