From 9307565269055e39cd71bd2c27bc86ad8fc12b96 Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Mon, 11 Feb 2013 22:41:11 +0000 Subject: Attempted fix for issue with latest CUDA kernel for 32 bit windows/linux/mac, there seems to be some sort of compiler bug in CUDA toolkit 4.2, uninlining a few functions seems to avoid it. --- intern/cycles/kernel/kernel_emission.h | 10 +++++----- intern/cycles/kernel/kernel_light.h | 2 +- intern/cycles/kernel/kernel_shader.h | 6 +++--- intern/cycles/kernel/kernel_types.h | 1 + intern/cycles/render/osl.h | 2 +- 5 files changed, 11 insertions(+), 10 deletions(-) (limited to 'intern') diff --git a/intern/cycles/kernel/kernel_emission.h b/intern/cycles/kernel/kernel_emission.h index 4048bbd9dfc..3b27a1f49c9 100644 --- a/intern/cycles/kernel/kernel_emission.h +++ b/intern/cycles/kernel/kernel_emission.h @@ -20,7 +20,7 @@ CCL_NAMESPACE_BEGIN /* Direction Emission */ -__device float3 direct_emissive_eval(KernelGlobals *kg, float rando, +__device_noinline float3 direct_emissive_eval(KernelGlobals *kg, float rando, LightSample *ls, float u, float v, float3 I, float t, float time) { /* setup shading at emitter */ @@ -74,7 +74,7 @@ __device float3 direct_emissive_eval(KernelGlobals *kg, float rando, return eval; } -__device bool direct_emission(KernelGlobals *kg, ShaderData *sd, int lindex, +__device_noinline bool direct_emission(KernelGlobals *kg, ShaderData *sd, int lindex, float randt, float rando, float randu, float randv, Ray *ray, BsdfEval *eval, bool *is_lamp) { @@ -148,7 +148,7 @@ __device bool direct_emission(KernelGlobals *kg, ShaderData *sd, int lindex, /* Indirect Primitive Emission */ -__device float3 indirect_primitive_emission(KernelGlobals *kg, ShaderData *sd, float t, int path_flag, float bsdf_pdf) +__device_noinline float3 indirect_primitive_emission(KernelGlobals *kg, ShaderData *sd, float t, int path_flag, float bsdf_pdf) { /* evaluate emissive closure */ float3 L = shader_emissive_eval(kg, sd); @@ -171,7 +171,7 @@ __device float3 indirect_primitive_emission(KernelGlobals *kg, ShaderData *sd, f /* Indirect Lamp Emission */ -__device bool indirect_lamp_emission(KernelGlobals *kg, Ray *ray, int path_flag, float bsdf_pdf, float randt, float3 *emission) +__device_noinline bool indirect_lamp_emission(KernelGlobals *kg, Ray *ray, int path_flag, float bsdf_pdf, float randt, float3 *emission) { LightSample ls; int lamp = lamp_light_eval_sample(kg, randt); @@ -200,7 +200,7 @@ __device bool indirect_lamp_emission(KernelGlobals *kg, Ray *ray, int path_flag, /* Indirect Background */ -__device float3 indirect_background(KernelGlobals *kg, Ray *ray, int path_flag, float bsdf_pdf) +__device_noinline float3 indirect_background(KernelGlobals *kg, Ray *ray, int path_flag, float bsdf_pdf) { #ifdef __BACKGROUND__ /* evaluate background closure */ diff --git a/intern/cycles/kernel/kernel_light.h b/intern/cycles/kernel/kernel_light.h index 10a32226f17..f6fbd3599ad 100644 --- a/intern/cycles/kernel/kernel_light.h +++ b/intern/cycles/kernel/kernel_light.h @@ -454,7 +454,7 @@ __device void triangle_light_sample(KernelGlobals *kg, int prim, int object, ls->lamp = ~0; ls->shader |= SHADER_USE_MIS; ls->t = 0.0f; - ls->type = LIGHT_AREA; + ls->type = LIGHT_TRIANGLE; ls->eval_fac = 1.0f; object_transform_light_sample(kg, ls, object, time); diff --git a/intern/cycles/kernel/kernel_shader.h b/intern/cycles/kernel/kernel_shader.h index b7d87427bd3..df86b352697 100644 --- a/intern/cycles/kernel/kernel_shader.h +++ b/intern/cycles/kernel/kernel_shader.h @@ -53,7 +53,7 @@ __device_noinline void shader_setup_object_transforms(KernelGlobals *kg, ShaderD } #endif -__device void shader_setup_from_ray(KernelGlobals *kg, ShaderData *sd, +__device_noinline void shader_setup_from_ray(KernelGlobals *kg, ShaderData *sd, const Intersection *isect, const Ray *ray) { #ifdef __INSTANCING__ @@ -160,7 +160,7 @@ __device void shader_setup_from_ray(KernelGlobals *kg, ShaderData *sd, /* ShaderData setup from position sampled on mesh */ -__device void shader_setup_from_sample(KernelGlobals *kg, ShaderData *sd, +__device_noinline void shader_setup_from_sample(KernelGlobals *kg, ShaderData *sd, const float3 P, const float3 Ng, const float3 I, int shader, int object, int prim, float u, float v, float t, float time, int segment = ~0) { @@ -283,7 +283,7 @@ __device void shader_setup_from_sample(KernelGlobals *kg, ShaderData *sd, /* ShaderData setup for displacement */ -__device void shader_setup_from_displace(KernelGlobals *kg, ShaderData *sd, +__device_noinline void shader_setup_from_displace(KernelGlobals *kg, ShaderData *sd, int object, int prim, float u, float v) { /* Note: no OSLShader::init call here, this is done in shader_setup_from_sample! */ diff --git a/intern/cycles/kernel/kernel_types.h b/intern/cycles/kernel/kernel_types.h index 52bdddc72fb..773ea0c43fb 100644 --- a/intern/cycles/kernel/kernel_types.h +++ b/intern/cycles/kernel/kernel_types.h @@ -299,6 +299,7 @@ typedef enum LightType { LIGHT_AREA, LIGHT_AO, LIGHT_SPOT, + LIGHT_TRIANGLE, LIGHT_STRAND } LightType; diff --git a/intern/cycles/render/osl.h b/intern/cycles/render/osl.h index 3c599caa893..d17f4c81362 100644 --- a/intern/cycles/render/osl.h +++ b/intern/cycles/render/osl.h @@ -36,7 +36,7 @@ class Device; class DeviceScene; class ImageManager; class OSLRenderServices; -class OSLGlobals; +struct OSLGlobals; class Scene; class ShaderGraph; class ShaderNode; -- cgit v1.2.3