Cycles: refactor kernel closure storage to use structs per closure type.
Reviewed By: dingto, sergey Differential Revision: https://developer.blender.org/D2127
This commit is contained in:
@@ -24,6 +24,7 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#include "closure/alloc.h"
|
||||
#include "closure/bsdf_util.h"
|
||||
#include "closure/bsdf.h"
|
||||
#include "closure/emissive.h"
|
||||
@@ -453,22 +454,9 @@ ccl_device void shader_merge_closures(ShaderData *sd)
|
||||
for(int j = i + 1; j < sd->num_closure; j++) {
|
||||
ShaderClosure *scj = &sd->closure[j];
|
||||
|
||||
#ifdef __OSL__
|
||||
if(sci->prim || scj->prim)
|
||||
if(sci->type != scj->type)
|
||||
continue;
|
||||
#endif
|
||||
|
||||
if(!(sci->type == scj->type && sci->data0 == scj->data0 && sci->data1 == scj->data1 && sci->data2 == scj->data2))
|
||||
continue;
|
||||
|
||||
if(CLOSURE_IS_BSDF_OR_BSSRDF(sci->type)) {
|
||||
if(sci->N != scj->N)
|
||||
continue;
|
||||
else if(CLOSURE_IS_BSDF_ANISOTROPIC(sci->type) && sci->T != scj->T)
|
||||
continue;
|
||||
}
|
||||
|
||||
if((sd->flag & SD_BSDF_HAS_CUSTOM) && !(sci->custom1 == scj->custom1 && sci->custom2 == scj->custom2 && sci->custom3 == scj->custom3))
|
||||
if(!bsdf_merge(sci, scj))
|
||||
continue;
|
||||
|
||||
sci->weight += scj->weight;
|
||||
@@ -741,8 +729,9 @@ ccl_device float3 shader_bsdf_ao(KernelGlobals *kg, ShaderData *sd, float ao_fac
|
||||
ShaderClosure *sc = ccl_fetch_array(sd, closure, i);
|
||||
|
||||
if(CLOSURE_IS_BSDF_DIFFUSE(sc->type)) {
|
||||
const DiffuseBsdf *bsdf = (const DiffuseBsdf*)sc;
|
||||
eval += sc->weight*ao_factor;
|
||||
N += sc->N*average(sc->weight);
|
||||
N += bsdf->N*average(sc->weight);
|
||||
}
|
||||
else if(CLOSURE_IS_AMBIENT_OCCLUSION(sc->type)) {
|
||||
eval += sc->weight;
|
||||
@@ -759,6 +748,7 @@ ccl_device float3 shader_bsdf_ao(KernelGlobals *kg, ShaderData *sd, float ao_fac
|
||||
return eval;
|
||||
}
|
||||
|
||||
#ifdef __SUBSURFACE__
|
||||
ccl_device float3 shader_bssrdf_sum(ShaderData *sd, float3 *N_, float *texture_blur_)
|
||||
{
|
||||
float3 eval = make_float3(0.0f, 0.0f, 0.0f);
|
||||
@@ -769,11 +759,12 @@ ccl_device float3 shader_bssrdf_sum(ShaderData *sd, float3 *N_, float *texture_b
|
||||
ShaderClosure *sc = ccl_fetch_array(sd, closure, i);
|
||||
|
||||
if(CLOSURE_IS_BSSRDF(sc->type)) {
|
||||
const Bssrdf *bssrdf = (const Bssrdf*)sc;
|
||||
float avg_weight = fabsf(average(sc->weight));
|
||||
|
||||
N += sc->N*avg_weight;
|
||||
N += bssrdf->N*avg_weight;
|
||||
eval += sc->weight;
|
||||
texture_blur += sc->data1*avg_weight;
|
||||
texture_blur += bssrdf->texture_blur*avg_weight;
|
||||
weight_sum += avg_weight;
|
||||
}
|
||||
}
|
||||
@@ -786,6 +777,7 @@ ccl_device float3 shader_bssrdf_sum(ShaderData *sd, float3 *N_, float *texture_b
|
||||
|
||||
return eval;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Emission */
|
||||
|
||||
@@ -831,6 +823,7 @@ ccl_device void shader_eval_surface(KernelGlobals *kg, ShaderData *sd, ccl_addr_
|
||||
ccl_addr_space PathState *state, float randb, int path_flag, ShaderContext ctx)
|
||||
{
|
||||
ccl_fetch(sd, num_closure) = 0;
|
||||
ccl_fetch(sd, num_closure_extra) = 0;
|
||||
ccl_fetch(sd, randb_closure) = randb;
|
||||
|
||||
#ifdef __OSL__
|
||||
@@ -861,33 +854,33 @@ ccl_device float3 shader_eval_background(KernelGlobals *kg, ShaderData *sd,
|
||||
ccl_addr_space PathState *state, int path_flag, ShaderContext ctx)
|
||||
{
|
||||
ccl_fetch(sd, num_closure) = 0;
|
||||
ccl_fetch(sd, num_closure_extra) = 0;
|
||||
ccl_fetch(sd, randb_closure) = 0.0f;
|
||||
|
||||
#ifdef __SVM__
|
||||
#ifdef __OSL__
|
||||
if(kg->osl) {
|
||||
return OSLShader::eval_background(kg, sd, state, path_flag, ctx);
|
||||
OSLShader::eval_background(kg, sd, state, path_flag, ctx);
|
||||
}
|
||||
else
|
||||
#endif
|
||||
|
||||
{
|
||||
#ifdef __SVM__
|
||||
svm_eval_nodes(kg, sd, state, SHADER_TYPE_SURFACE, path_flag);
|
||||
|
||||
float3 eval = make_float3(0.0f, 0.0f, 0.0f);
|
||||
|
||||
for(int i = 0; i < ccl_fetch(sd, num_closure); i++) {
|
||||
const ShaderClosure *sc = ccl_fetch_array(sd, closure, i);
|
||||
|
||||
if(CLOSURE_IS_BACKGROUND(sc->type))
|
||||
eval += sc->weight;
|
||||
}
|
||||
|
||||
return eval;
|
||||
#else
|
||||
return make_float3(0.8f, 0.8f, 0.8f);
|
||||
#endif
|
||||
}
|
||||
|
||||
float3 eval = make_float3(0.0f, 0.0f, 0.0f);
|
||||
|
||||
for(int i = 0; i < ccl_fetch(sd, num_closure); i++) {
|
||||
const ShaderClosure *sc = ccl_fetch_array(sd, closure, i);
|
||||
|
||||
if(CLOSURE_IS_BACKGROUND(sc->type))
|
||||
eval += sc->weight;
|
||||
}
|
||||
|
||||
return eval;
|
||||
#else
|
||||
return make_float3(0.8f, 0.8f, 0.8f);
|
||||
#endif
|
||||
}
|
||||
|
||||
/* Volume */
|
||||
@@ -1004,6 +997,7 @@ ccl_device void shader_eval_volume(KernelGlobals *kg, ShaderData *sd,
|
||||
/* reset closures once at the start, we will be accumulating the closures
|
||||
* for all volumes in the stack into a single array of closures */
|
||||
sd->num_closure = 0;
|
||||
sd->num_closure_extra = 0;
|
||||
sd->flag = 0;
|
||||
|
||||
for(int i = 0; stack[i].shader != SHADER_NONE; i++) {
|
||||
@@ -1051,6 +1045,7 @@ ccl_device void shader_eval_volume(KernelGlobals *kg, ShaderData *sd,
|
||||
ccl_device void shader_eval_displacement(KernelGlobals *kg, ShaderData *sd, ccl_addr_space PathState *state, ShaderContext ctx)
|
||||
{
|
||||
ccl_fetch(sd, num_closure) = 0;
|
||||
ccl_fetch(sd, num_closure_extra) = 0;
|
||||
ccl_fetch(sd, randb_closure) = 0.0f;
|
||||
|
||||
/* this will modify sd->P */
|
||||
|
Reference in New Issue
Block a user