[Bf-committers] [Bf-blender-cvs] SVN commit: /data/svn/bf-blender [51393] trunk/blender/intern/cycles: Attempts to fix CUDA issues on sm 2.0 cards, still no luck getting motion blur
Daniel Salazar - 3Developer.com
zanqdo at gmail.com
Thu Oct 18 01:05:27 CEST 2012
Gah still crashes here
http://www.pasteall.org/36362
Daniel Salazar
patazstudio.com
On Wed, Oct 17, 2012 at 4:48 PM, Brecht Van Lommel
<brechtvanlommel at pandora.be> wrote:
> Revision: 51393
> http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=51393
> Author: blendix
> Date: 2012-10-17 22:48:29 +0000 (Wed, 17 Oct 2012)
> Log Message:
> -----------
> Attempts to fix CUDA issues on sm 2.0 cards, still no luck getting motion blur
> working, but this should make it not crash.
>
> Also fix for wrong shutter time, should have been shorter.
>
> Modified Paths:
> --------------
> trunk/blender/intern/cycles/kernel/kernel_bvh.h
> trunk/blender/intern/cycles/kernel/kernel_camera.h
> trunk/blender/intern/cycles/kernel/kernel_displace.h
> trunk/blender/intern/cycles/kernel/kernel_emission.h
> trunk/blender/intern/cycles/kernel/kernel_light.h
> trunk/blender/intern/cycles/kernel/kernel_object.h
> trunk/blender/intern/cycles/kernel/kernel_shader.h
> trunk/blender/intern/cycles/render/object.cpp
>
> Modified: trunk/blender/intern/cycles/kernel/kernel_bvh.h
> ===================================================================
> --- trunk/blender/intern/cycles/kernel/kernel_bvh.h 2012-10-17 20:06:58 UTC (rev 51392)
> +++ trunk/blender/intern/cycles/kernel/kernel_bvh.h 2012-10-17 22:48:29 UTC (rev 51393)
> @@ -87,7 +87,7 @@
> __device_inline void bvh_instance_motion_push(KernelGlobals *kg, int object, const Ray *ray, float3 *P, float3 *idir, float *t, Transform *tfm, const float tmax)
> {
> Transform itfm;
> - *tfm = object_fetch_transform_motion(kg, object, ray->time, &itfm);
> + *tfm = object_fetch_transform_motion_test(kg, object, ray->time, &itfm);
>
> *P = transform_point(&itfm, ray->P);
>
> @@ -104,9 +104,8 @@
>
> __device_inline void bvh_instance_motion_pop(KernelGlobals *kg, int object, const Ray *ray, float3 *P, float3 *idir, float *t, Transform *tfm, const float tmax)
> {
> - if(*t != FLT_MAX) {
> + if(*t != FLT_MAX)
> *t *= len(transform_direction(tfm, 1.0f/(*idir)));
> - }
>
> *P = ray->P;
> *idir = bvh_inverse_direction(ray->D);
> @@ -163,7 +162,7 @@
>
> /* Sven Woop's algorithm */
> __device_inline void bvh_triangle_intersect(KernelGlobals *kg, Intersection *isect,
> - float3 P, float3 idir, uint visibility, int object, int triAddr, Transform *tfm)
> + float3 P, float3 idir, uint visibility, int object, int triAddr)
> {
> /* compute and check intersection t-value */
> float4 v00 = kernel_tex_fetch(__tri_woop, triAddr*TRI_NODE_SIZE+0);
> @@ -285,7 +284,7 @@
> /* triangle intersection */
> while(primAddr < primAddr2) {
> /* intersect ray against triangle */
> - bvh_triangle_intersect(kg, isect, P, idir, visibility, object, primAddr, NULL);
> + bvh_triangle_intersect(kg, isect, P, idir, visibility, object, primAddr);
>
> /* shadow ray early termination */
> if(visibility == PATH_RAY_SHADOW_OPAQUE && isect->prim != ~0)
> @@ -405,7 +404,7 @@
> /* triangle intersection */
> while(primAddr < primAddr2) {
> /* intersect ray against triangle */
> - bvh_triangle_intersect(kg, isect, P, idir, visibility, object, primAddr, &ob_tfm);
> + bvh_triangle_intersect(kg, isect, P, idir, visibility, object, primAddr);
>
> /* shadow ray early termination */
> if(visibility == PATH_RAY_SHADOW_OPAQUE && isect->prim != ~0)
> @@ -444,7 +443,8 @@
>
> __device_inline bool scene_intersect(KernelGlobals *kg, const Ray *ray, const uint visibility, Intersection *isect)
> {
> -#ifdef __OBJECT_MOTION__
> + /* todo: fix cuda sm 2.0 motion blur */
> +#if defined(__OBJECT_MOTION__) && (!defined(__KERNEL_CUDA) || (__CUDA_ARCH__ >= 210))
> if(kernel_data.bvh.have_motion)
> return bvh_intersect_motion(kg, ray, visibility, isect);
> else
>
> Modified: trunk/blender/intern/cycles/kernel/kernel_camera.h
> ===================================================================
> --- trunk/blender/intern/cycles/kernel/kernel_camera.h 2012-10-17 20:06:58 UTC (rev 51392)
> +++ trunk/blender/intern/cycles/kernel/kernel_camera.h 2012-10-17 22:48:29 UTC (rev 51393)
> @@ -217,7 +217,7 @@
> if(kernel_data.cam.shuttertime == 0.0f)
> ray->time = TIME_INVALID;
> else
> - ray->time = 0.5f + (time - 0.5f)*kernel_data.cam.shuttertime;
> + ray->time = 0.5f + 0.5f*(time - 0.5f)*kernel_data.cam.shuttertime;
> #endif
>
> /* sample */
>
> Modified: trunk/blender/intern/cycles/kernel/kernel_displace.h
> ===================================================================
> --- trunk/blender/intern/cycles/kernel/kernel_displace.h 2012-10-17 20:06:58 UTC (rev 51392)
> +++ trunk/blender/intern/cycles/kernel/kernel_displace.h 2012-10-17 22:48:29 UTC (rev 51393)
> @@ -47,6 +47,9 @@
> ray.P = make_float3(0.0f, 0.0f, 0.0f);
> ray.D = equirectangular_to_direction(u, v);
> ray.t = 0.0f;
> +#ifdef __CAMERA_MOTION__
> + ray.time = 0.5f;
> +#endif
>
> #ifdef __RAY_DIFFERENTIALS__
> ray.dD.dx = make_float3(0.0f, 0.0f, 0.0f);
>
> Modified: trunk/blender/intern/cycles/kernel/kernel_emission.h
> ===================================================================
> --- trunk/blender/intern/cycles/kernel/kernel_emission.h 2012-10-17 20:06:58 UTC (rev 51392)
> +++ trunk/blender/intern/cycles/kernel/kernel_emission.h 2012-10-17 22:48:29 UTC (rev 51393)
> @@ -34,6 +34,9 @@
> ray.P = ls->P;
> ray.dP.dx = make_float3(0.0f, 0.0f, 0.0f);
> ray.dP.dy = make_float3(0.0f, 0.0f, 0.0f);
> +#ifdef __CAMERA_MOTION__
> + ray.time = time;
> +#endif
> shader_setup_from_background(kg, &sd, &ray);
> eval = shader_eval_background(kg, &sd, 0);
> }
>
> Modified: trunk/blender/intern/cycles/kernel/kernel_light.h
> ===================================================================
> --- trunk/blender/intern/cycles/kernel/kernel_light.h 2012-10-17 20:06:58 UTC (rev 51392)
> +++ trunk/blender/intern/cycles/kernel/kernel_light.h 2012-10-17 22:48:29 UTC (rev 51393)
> @@ -303,7 +303,7 @@
> if(ls->object >= 0) {
> #ifdef __OBJECT_MOTION__
> Transform itfm;
> - Transform tfm = object_fetch_transform_motion(kg, ls->object, time, &itfm);
> + Transform tfm = object_fetch_transform_motion_test(kg, object, time, &itfm);
> #else
> Transform tfm = object_fetch_transform(kg, ls->object, OBJECT_TRANSFORM);
> Transform itfm = object_fetch_transform(kg, ls->object, OBJECT_INVERSE_TRANSFORM);
>
> Modified: trunk/blender/intern/cycles/kernel/kernel_object.h
> ===================================================================
> --- trunk/blender/intern/cycles/kernel/kernel_object.h 2012-10-17 20:06:58 UTC (rev 51392)
> +++ trunk/blender/intern/cycles/kernel/kernel_object.h 2012-10-17 22:48:29 UTC (rev 51393)
> @@ -25,7 +25,7 @@
> OBJECT_TRANSFORM_MOTION_PRE = 8,
> OBJECT_TRANSFORM_MOTION_MID = 12,
> OBJECT_TRANSFORM_MOTION_POST = 16,
> - OBJECT_DUPLI = 18
> + OBJECT_DUPLI = 20
> };
>
> __device_inline Transform object_fetch_transform(KernelGlobals *kg, int object, enum ObjectTransform type)
> @@ -42,48 +42,52 @@
> }
>
> #ifdef __OBJECT_MOTION__
> -__device_inline Transform object_fetch_transform_motion(KernelGlobals *kg, int object, float time, Transform *itfm)
> +__device_inline Transform object_fetch_transform_motion(KernelGlobals *kg, int object, float time)
> {
> - Transform tfm;
> + MotionTransform motion;
>
> - int object_flag = kernel_tex_fetch(__object_flag, object);
> + int offset = object*OBJECT_SIZE + (int)OBJECT_TRANSFORM_MOTION_PRE;
>
> - /* if we do motion blur */
> - if(object_flag & SD_OBJECT_MOTION) {
> - /* fetch motion transforms */
> - MotionTransform motion;
> + motion.pre.x = kernel_tex_fetch(__objects, offset + 0);
> + motion.pre.y = kernel_tex_fetch(__objects, offset + 1);
> + motion.pre.z = kernel_tex_fetch(__objects, offset + 2);
> + motion.pre.w = kernel_tex_fetch(__objects, offset + 3);
>
> - int offset = object*OBJECT_SIZE + (int)OBJECT_TRANSFORM_MOTION_PRE;
> + motion.mid.x = kernel_tex_fetch(__objects, offset + 4);
> + motion.mid.y = kernel_tex_fetch(__objects, offset + 5);
> + motion.mid.z = kernel_tex_fetch(__objects, offset + 6);
> + motion.mid.w = kernel_tex_fetch(__objects, offset + 7);
>
> - motion.pre.x = kernel_tex_fetch(__objects, offset + 0);
> - motion.pre.y = kernel_tex_fetch(__objects, offset + 1);
> - motion.pre.z = kernel_tex_fetch(__objects, offset + 2);
> - motion.pre.w = kernel_tex_fetch(__objects, offset + 3);
> + motion.post.x = kernel_tex_fetch(__objects, offset + 8);
> + motion.post.y = kernel_tex_fetch(__objects, offset + 9);
> + motion.post.z = kernel_tex_fetch(__objects, offset + 10);
> + motion.post.w = kernel_tex_fetch(__objects, offset + 11);
>
> - motion.mid.x = kernel_tex_fetch(__objects, offset + 4);
> - motion.mid.y = kernel_tex_fetch(__objects, offset + 5);
> - motion.mid.z = kernel_tex_fetch(__objects, offset + 6);
> - motion.mid.w = kernel_tex_fetch(__objects, offset + 7);
> + Transform tfm;
> + transform_motion_interpolate(&tfm, &motion, time);
>
> - motion.post.x = kernel_tex_fetch(__objects, offset + 8);
> - motion.post.y = kernel_tex_fetch(__objects, offset + 9);
> - motion.post.z = kernel_tex_fetch(__objects, offset + 10);
> - motion.post.w = kernel_tex_fetch(__objects, offset + 11);
> + return tfm;
> +}
>
> - transform_motion_interpolate(&tfm, &motion, time);
> +__device_inline Transform object_fetch_transform_motion_test(KernelGlobals *kg, int object, float time, Transform *itfm)
> +{
> + int object_flag = kernel_tex_fetch(__object_flag, object);
>
> - /* invert */
> + if(object_flag & SD_OBJECT_MOTION) {
> + /* if we do motion blur */
> + Transform tfm = object_fetch_transform_motion(kg, object, time);
> +
> if(itfm)
> *itfm = transform_quick_inverse(tfm);
> +
> + return tfm;
> }
> else {
> - tfm = object_fetch_transform(kg, object, OBJECT_TRANSFORM);
> + Transform tfm = object_fetch_transform(kg, object, OBJECT_TRANSFORM);
> + *itfm = object_fetch_transform(kg, object, OBJECT_INVERSE_TRANSFORM);
>
> - if(itfm)
> - *itfm = object_fetch_transform(kg, object, OBJECT_INVERSE_TRANSFORM);
> + return tfm;
> }
> -
> - return tfm;
> }
> #endif
>
> @@ -271,6 +275,5 @@
> return make_float3(f3.z, f3.w, f4.x);
> }
>
> -
> CCL_NAMESPACE_END
>
>
> Modified: trunk/blender/intern/cycles/kernel/kernel_shader.h
> ===================================================================
> --- trunk/blender/intern/cycles/kernel/kernel_shader.h 2012-10-17 20:06:58 UTC (rev 51392)
> +++ trunk/blender/intern/cycles/kernel/kernel_shader.h 2012-10-17 22:48:29 UTC (rev 51393)
> @@ -43,6 +43,22 @@
>
> /* ShaderData setup from incoming ray */
>
> +#ifdef __OBJECT_MOTION__
> +__device_noinline void shader_setup_object_transforms(KernelGlobals *kg, ShaderData *sd, float time)
> +{
> + /* note that this is a separate non-inlined function to work around crash
> + * on CUDA sm 2.0, otherwise kernel execution crashes (compiler bug?) */
> + if(sd->flag & SD_OBJECT_MOTION) {
> + sd->ob_tfm = object_fetch_transform_motion(kg, sd->object, time);
> + sd->ob_itfm= transform_quick_inverse(sd->ob_tfm);
> + }
> + else {
> + sd->ob_tfm = object_fetch_transform(kg, sd->object, OBJECT_TRANSFORM);
> + sd->ob_itfm = object_fetch_transform(kg, sd->object, OBJECT_INVERSE_TRANSFORM);
> + }
> +}
> +#endif
> +
> __device_inline void shader_setup_from_ray(KernelGlobals *kg, ShaderData *sd,
> const Intersection *isect, const Ray *ray)
> {
> @@ -72,14 +88,7 @@
>
> /* matrices and time */
> #ifdef __OBJECT_MOTION__
> - if(sd->flag & SD_OBJECT_MOTION) {
> - sd->ob_tfm = object_fetch_transform_motion(kg, sd->object, ray->time, &sd->ob_itfm);
> - }
> - else {
> - sd->ob_tfm = object_fetch_transform(kg, sd->object, OBJECT_TRANSFORM);
> - sd->ob_itfm = object_fetch_transform(kg, sd->object, OBJECT_INVERSE_TRANSFORM);
> - }
> -
> + shader_setup_object_transforms(kg, sd, ray->time);
> sd->time = ray->time;
> #endif
>
> @@ -181,13 +190,7 @@
> sd->flag |= kernel_tex_fetch(__object_flag, sd->object);
>
>
> @@ Diff output truncated at 10240 characters. @@
> _______________________________________________
> Bf-blender-cvs mailing list
> Bf-blender-cvs at blender.org
> http://lists.blender.org/mailman/listinfo/bf-blender-cvs
More information about the Bf-committers
mailing list