diff --git a/intern/cycles/kernel/kernel_emission.h b/intern/cycles/kernel/kernel_emission.h index b3a5b2bfcb4..513a453b585 100644 --- a/intern/cycles/kernel/kernel_emission.h +++ b/intern/cycles/kernel/kernel_emission.h @@ -27,6 +27,7 @@ __device float3 direct_emissive_eval(KernelGlobals *kg, float rando, ShaderData sd; float3 eval; +#ifdef __BACKGROUND_MIS__ if(ls->type == LIGHT_BACKGROUND) { Ray ray; ray.D = ls->D; @@ -36,7 +37,9 @@ __device float3 direct_emissive_eval(KernelGlobals *kg, float rando, shader_setup_from_background(kg, &sd, &ray); eval = shader_eval_background(kg, &sd, 0); } - else { + else +#endif + { shader_setup_from_sample(kg, &sd, ls->P, ls->Ng, I, ls->shader, ls->object, ls->prim, u, v); ls->Ng = sd.Ng; @@ -164,6 +167,7 @@ __device float3 indirect_background(KernelGlobals *kg, Ray *ray, int path_flag, float3 L = shader_eval_background(kg, &sd, path_flag); shader_release(kg, &sd); +#ifdef __BACKGROUND_MIS__ /* check if background light exists or if we should skip pdf */ int res = kernel_data.integrator.pdf_background_res; @@ -175,6 +179,7 @@ __device float3 indirect_background(KernelGlobals *kg, Ray *ray, int path_flag, return L*mis_weight; } +#endif return L; #else diff --git a/intern/cycles/kernel/kernel_light.h b/intern/cycles/kernel/kernel_light.h index 4c2b69c2716..aa125180a94 100644 --- a/intern/cycles/kernel/kernel_light.h +++ b/intern/cycles/kernel/kernel_light.h @@ -192,6 +192,7 @@ __device void regular_light_sample(KernelGlobals *kg, int point, ls->D = -D; ls->t = FLT_MAX; } +#ifdef __BACKGROUND_MIS__ else if(type == LIGHT_BACKGROUND) { /* infinite area light (e.g. light dome or env light) */ float3 D = background_light_sample(kg, randu, randv, pdf); @@ -201,6 +202,7 @@ __device void regular_light_sample(KernelGlobals *kg, int point, ls->D = -D; ls->t = FLT_MAX; } +#endif else { ls->P = make_float3(data0.y, data0.z, data0.w); diff --git a/intern/cycles/kernel/kernel_shader.h b/intern/cycles/kernel/kernel_shader.h index 1d2cf46aa56..0f04af1275d 100644 --- a/intern/cycles/kernel/kernel_shader.h +++ b/intern/cycles/kernel/kernel_shader.h @@ -26,7 +26,6 @@ * */ - #ifdef __OSL__ #include "osl_shader.h" diff --git a/intern/cycles/kernel/kernel_types.h b/intern/cycles/kernel/kernel_types.h index 9ebe4120e36..477b08f2f87 100644 --- a/intern/cycles/kernel/kernel_types.h +++ b/intern/cycles/kernel/kernel_types.h @@ -70,9 +70,8 @@ CCL_NAMESPACE_BEGIN #ifdef __KERNEL_ADV_SHADING__ #define __MULTI_CLOSURE__ #define __TRANSPARENT_SHADOWS__ -#ifdef __KERNEL_CPU__ #define __PASSES__ -#endif +#define __BACKGROUND_MIS__ #endif //#define __MULTI_LIGHT__ diff --git a/intern/cycles/render/light.cpp b/intern/cycles/render/light.cpp index 777e764558f..405aa800457 100644 --- a/intern/cycles/render/light.cpp +++ b/intern/cycles/render/light.cpp @@ -402,6 +402,16 @@ void LightManager::device_update_points(Device *device, DeviceScene *dscene, Sce float4 *light_data = dscene->light_data.resize(scene->lights.size()*LIGHT_SIZE); + if(!device->info.advanced_shading) { + /* remove unsupported light */ + foreach(Light *light, scene->lights) { + if(light->type == LIGHT_BACKGROUND) { + scene->lights.erase(std::remove(scene->lights.begin(), scene->lights.end(), light), scene->lights.end()); + break; + } + } + } + for(size_t i = 0; i < scene->lights.size(); i++) { Light *light = scene->lights[i]; float3 co = light->co;