[Bf-blender-cvs] [a8e894951a0] cycles_embree: Merge branch 'master' of git.blender.org:blender into cycles_embree

Stefan Werner noreply at git.blender.org
Fri Oct 12 12:12:21 CEST 2018


Commit: a8e894951a0b54d7cffd90b347ca64cb0789fe43
Author: Stefan Werner
Date:   Fri Oct 12 12:12:10 2018 +0200
Branches: cycles_embree
https://developer.blender.org/rBa8e894951a0b54d7cffd90b347ca64cb0789fe43

Merge branch 'master' of git.blender.org:blender into cycles_embree

===================================================================



===================================================================

diff --cc intern/cycles/device/device_cpu.cpp
index 563062028f3,7eb73dea3ef..7322086e655
--- a/intern/cycles/device/device_cpu.cpp
+++ b/intern/cycles/device/device_cpu.cpp
@@@ -1034,12 -1032,9 +1035,12 @@@ void device_cpu_info(vector<DeviceInfo>
  	if(system_cpu_support_sse2()) {
  		info.bvh_layout_mask |= BVH_LAYOUT_BVH4;
  	}
- 	if (system_cpu_support_avx2()) {
+ 	if(system_cpu_support_avx2()) {
  		info.bvh_layout_mask |= BVH_LAYOUT_BVH8;
  	}
 +#ifdef WITH_EMBREE
 +	info.bvh_layout_mask |= BVH_LAYOUT_EMBREE;
 +#endif /* WITH_EMBREE */
  	info.has_volume_decoupled = true;
  	info.has_osl = true;
  	info.has_half_images = true;
diff --cc intern/cycles/kernel/bvh/bvh.h
index 36e7e1c3204,d11d999134c..0a5998a6544
--- a/intern/cycles/kernel/bvh/bvh.h
+++ b/intern/cycles/kernel/bvh/bvh.h
@@@ -173,21 -182,9 +186,24 @@@ ccl_device_intersect bool scene_interse
                                            float difl,
                                            float extmax)
  {
+ 	if (!scene_intersect_valid(&ray)) {
+ 		return false;
+ 	}
 +#ifdef __EMBREE__
 +	if(kernel_data.bvh.scene) {
 +		isect->t = ray.t;
 +		CCLIntersectContext ctx(kg, CCLIntersectContext::RAY_REGULAR);
 +		IntersectContext rtc_ctx(&ctx);
 +		RTCRayHit ray_hit;
 +		kernel_embree_setup_rayhit(ray, ray_hit, visibility);
 +		rtcIntersect1(kernel_data.bvh.scene, &rtc_ctx.context, &ray_hit);
 +		if(ray_hit.hit.geomID != RTC_INVALID_GEOMETRY_ID && ray_hit.hit.primID != RTC_INVALID_GEOMETRY_ID) {
 +			kernel_embree_convert_hit(kg, &ray_hit.ray, &ray_hit.hit, isect);
 +			return true;
 +		}
 +		return false;
 +	}
 +#endif /* __EMBREE__ */
  #ifdef __OBJECT_MOTION__
  	if(kernel_data.bvh.have_motion) {
  #  ifdef __HAIR__
@@@ -232,55 -229,9 +248,58 @@@ ccl_device_intersect bool scene_interse
                                                  uint *lcg_state,
                                                  int max_hits)
  {
+ 	if (!scene_intersect_valid(&ray)) {
+ 		return false;
+ 	}
 +#ifdef __EMBREE__
 +	if(kernel_data.bvh.scene) {
 +		CCLIntersectContext ctx(kg, CCLIntersectContext::RAY_SSS);
 +		ctx.lcg_state = lcg_state;
 +		ctx.max_hits = max_hits;
 +		ctx.ss_isect = local_isect;
 +		local_isect->num_hits = 0;
 +		ctx.sss_object_id = local_object;
 +		IntersectContext rtc_ctx(&ctx);
 +		RTCRay rtc_ray;
 +		kernel_embree_setup_ray(ray, rtc_ray, PATH_RAY_ALL_VISIBILITY);
 +
 +		/* Get the Embree scene for this intersection. */
 +		RTCGeometry geom = rtcGetGeometry(kernel_data.bvh.scene, local_object * 2);
 +		if(geom) {
 +			Transform ob_itfm;
 +			float3 P = ray.P;
 +			float3 dir = ray.D;
 +			float3 idir = ray.D;
 +			const int object_flag = kernel_tex_fetch(__object_flag, local_object);
 +			if(!(object_flag & SD_OBJECT_TRANSFORM_APPLIED)) {
 +				Transform ob_itfm;
 +				rtc_ray.tfar = bvh_instance_motion_push(kg,
 +												   local_object,
 +												   &ray,
 +												   &P,
 +												   &dir,
 +												   &idir,
 +												   ray.t,
 +												   &ob_itfm);
 +				/* bvh_instance_motion_push() returns the inverse transform but it's not needed here. */
 +				(void)ob_itfm;
 +
 +				rtc_ray.org_x = P.x;
 +				rtc_ray.org_y = P.y;
 +				rtc_ray.org_z = P.z;
 +				rtc_ray.dir_x = dir.x;
 +				rtc_ray.dir_y = dir.y;
 +				rtc_ray.dir_z = dir.z;
 +			}
 +			RTCScene scene = (RTCScene)rtcGetGeometryUserData(geom);
 +			if(scene) {
 +				rtcOccluded1(scene, &rtc_ctx.context, &rtc_ray);
 +			}
 +		}
 +
 +		return local_isect->num_hits > 0;
 +	}
 +#endif /* __EMBREE__ */
  #ifdef __OBJECT_MOTION__
  	if(kernel_data.bvh.have_motion) {
  		return bvh_intersect_local_motion(kg,
@@@ -308,24 -259,9 +327,27 @@@ ccl_device_intersect bool scene_interse
                                                       uint max_hits,
                                                       uint *num_hits)
  {
+ 	if (!scene_intersect_valid(ray)) {
+ 		return false;
+ 	}
 +#  ifdef __EMBREE__
 +	if(kernel_data.bvh.scene) {
 +		CCLIntersectContext ctx(kg, CCLIntersectContext::RAY_SHADOW_ALL);
 +		ctx.isect_s = isect;
 +		ctx.max_hits = max_hits;
 +		ctx.num_hits = 0;
 +		IntersectContext rtc_ctx(&ctx);
 +		RTCRay rtc_ray;
 +		kernel_embree_setup_ray(*ray, rtc_ray, PATH_RAY_SHADOW);
 +		rtcOccluded1(kernel_data.bvh.scene, &rtc_ctx.context, &rtc_ray);
 +
 +		if(ctx.num_hits > max_hits) {
 +			return true;
 +		}
 +		*num_hits = ctx.num_hits;
 +		return rtc_ray.tfar == -INFINITY;
 +	}
 +#  endif
  #  ifdef __OBJECT_MOTION__
  	if(kernel_data.bvh.have_motion) {
  #    ifdef __HAIR__
@@@ -413,19 -352,9 +438,22 @@@ ccl_device_intersect uint scene_interse
                                                       const uint max_hits,
                                                       const uint visibility)
  {
+ 	if (!scene_intersect_valid(ray)) {
+ 		return false;
+ 	}
 +#  ifdef __EMBREE__
 +	if(kernel_data.bvh.scene) {
 +		CCLIntersectContext ctx(kg, CCLIntersectContext::RAY_VOLUME_ALL);
 +		ctx.isect_s = isect;
 +		ctx.max_hits = max_hits;
 +		ctx.num_hits = 0;
 +		IntersectContext rtc_ctx(&ctx);
 +		RTCRay rtc_ray;
 +		kernel_embree_setup_ray(*ray, rtc_ray, visibility);
 +		rtcOccluded1(kernel_data.bvh.scene, &rtc_ctx.context, &rtc_ray);
 +		return rtc_ray.tfar == -INFINITY;
 +	}
 +#  endif
  #  ifdef __OBJECT_MOTION__
  	if(kernel_data.bvh.have_motion) {
  		return bvh_intersect_volume_all_motion(kg, ray, isect, max_hits, visibility);



More information about the Bf-blender-cvs mailing list