[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