summaryrefslogtreecommitdiffstats
path: root/thirdparty/embree/kernels/common/rtcore.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'thirdparty/embree/kernels/common/rtcore.cpp')
-rw-r--r--thirdparty/embree/kernels/common/rtcore.cpp1009
1 files changed, 647 insertions, 362 deletions
diff --git a/thirdparty/embree/kernels/common/rtcore.cpp b/thirdparty/embree/kernels/common/rtcore.cpp
index a6ea55bfc4..eb8d2c0a58 100644
--- a/thirdparty/embree/kernels/common/rtcore.cpp
+++ b/thirdparty/embree/kernels/common/rtcore.cpp
@@ -8,11 +8,14 @@
#include "scene.h"
#include "context.h"
#include "../geometry/filter.h"
-#include "../../include/embree3/rtcore_ray.h"
+#include "../../include/embree4/rtcore_ray.h"
using namespace embree;
RTC_NAMESPACE_BEGIN;
+#define RTC_ENTER_DEVICE(arg) \
+ DeviceEnterLeave enterleave(arg);
+
/* mutex to make API thread safe */
static MutexSys g_mutex;
@@ -27,6 +30,57 @@ RTC_NAMESPACE_BEGIN;
return (RTCDevice) nullptr;
}
+#if defined(EMBREE_SYCL_SUPPORT)
+
+ RTC_API RTCDevice rtcNewSYCLDeviceInternal(sycl::context sycl_context, const char* config)
+ {
+ RTC_CATCH_BEGIN;
+ RTC_TRACE(rtcNewSYCLDevice);
+ Lock<MutexSys> lock(g_mutex);
+
+ DeviceGPU* device = new DeviceGPU(sycl_context,config);
+ return (RTCDevice) device->refInc();
+ RTC_CATCH_END(nullptr);
+ return (RTCDevice) nullptr;
+ }
+
+ RTC_API bool rtcIsSYCLDeviceSupported(const sycl::device device)
+ {
+ RTC_CATCH_BEGIN;
+ RTC_TRACE(rtcIsSYCLDeviceSupported);
+ return rthwifIsSYCLDeviceSupported(device) > 0;
+ RTC_CATCH_END(nullptr);
+ return false;
+ }
+
+ RTC_API int rtcSYCLDeviceSelector(const sycl::device device)
+ {
+ RTC_CATCH_BEGIN;
+ RTC_TRACE(rtcSYCLDeviceSelector);
+ return rthwifIsSYCLDeviceSupported(device);
+ RTC_CATCH_END(nullptr);
+ return -1;
+ }
+
+ RTC_API void rtcSetDeviceSYCLDevice(RTCDevice hdevice, const sycl::device sycl_device)
+ {
+ RTC_CATCH_BEGIN;
+ RTC_TRACE(rtcSetDeviceSYCLDevice);
+ RTC_VERIFY_HANDLE(hdevice);
+
+ Lock<MutexSys> lock(g_mutex);
+
+ DeviceGPU* device = dynamic_cast<DeviceGPU*>((Device*) hdevice);
+ if (device == nullptr)
+ throw_RTCError(RTC_ERROR_INVALID_ARGUMENT, "passed device must be an Embree SYCL device")
+
+ device->setSYCLDevice(sycl_device);
+
+ RTC_CATCH_END(nullptr);
+ }
+
+#endif
+
RTC_API void rtcRetainDevice(RTCDevice hdevice)
{
Device* device = (Device*) hdevice;
@@ -108,6 +162,7 @@ RTC_NAMESPACE_BEGIN;
RTC_CATCH_BEGIN;
RTC_TRACE(rtcNewBuffer);
RTC_VERIFY_HANDLE(hdevice);
+ RTC_ENTER_DEVICE(hdevice);
Buffer* buffer = new Buffer((Device*)hdevice, byteSize);
return (RTCBuffer)buffer->refInc();
RTC_CATCH_END((Device*)hdevice);
@@ -119,6 +174,7 @@ RTC_NAMESPACE_BEGIN;
RTC_CATCH_BEGIN;
RTC_TRACE(rtcNewSharedBuffer);
RTC_VERIFY_HANDLE(hdevice);
+ RTC_ENTER_DEVICE(hdevice);
Buffer* buffer = new Buffer((Device*)hdevice, byteSize, ptr);
return (RTCBuffer)buffer->refInc();
RTC_CATCH_END((Device*)hdevice);
@@ -131,6 +187,7 @@ RTC_NAMESPACE_BEGIN;
RTC_CATCH_BEGIN;
RTC_TRACE(rtcGetBufferData);
RTC_VERIFY_HANDLE(hbuffer);
+ RTC_ENTER_DEVICE(hbuffer);
return buffer->data();
RTC_CATCH_END2(buffer);
return nullptr;
@@ -142,6 +199,7 @@ RTC_NAMESPACE_BEGIN;
RTC_CATCH_BEGIN;
RTC_TRACE(rtcRetainBuffer);
RTC_VERIFY_HANDLE(hbuffer);
+ RTC_ENTER_DEVICE(hbuffer);
buffer->refInc();
RTC_CATCH_END2(buffer);
}
@@ -152,6 +210,7 @@ RTC_NAMESPACE_BEGIN;
RTC_CATCH_BEGIN;
RTC_TRACE(rtcReleaseBuffer);
RTC_VERIFY_HANDLE(hbuffer);
+ RTC_ENTER_DEVICE(hbuffer);
buffer->refDec();
RTC_CATCH_END2(buffer);
}
@@ -161,6 +220,7 @@ RTC_NAMESPACE_BEGIN;
RTC_CATCH_BEGIN;
RTC_TRACE(rtcNewScene);
RTC_VERIFY_HANDLE(hdevice);
+ RTC_ENTER_DEVICE(hdevice);
Scene* scene = new Scene((Device*)hdevice);
return (RTCScene) scene->refInc();
RTC_CATCH_END((Device*)hdevice);
@@ -184,6 +244,7 @@ RTC_NAMESPACE_BEGIN;
RTC_CATCH_BEGIN;
RTC_TRACE(rtcSetSceneProgressMonitorFunction);
RTC_VERIFY_HANDLE(hscene);
+ RTC_ENTER_DEVICE(hscene);
Lock<MutexSys> lock(g_mutex);
scene->setProgressMonitorFunction(progress,ptr);
RTC_CATCH_END2(scene);
@@ -195,13 +256,18 @@ RTC_NAMESPACE_BEGIN;
RTC_CATCH_BEGIN;
RTC_TRACE(rtcSetSceneBuildQuality);
RTC_VERIFY_HANDLE(hscene);
+ RTC_ENTER_DEVICE(hscene);
+ // -- GODOT start --
+ // if (quality != RTC_BUILD_QUALITY_LOW &&
+ // quality != RTC_BUILD_QUALITY_MEDIUM &&
+ // quality != RTC_BUILD_QUALITY_HIGH)
+ // throw std::runtime_error("invalid build quality");
if (quality != RTC_BUILD_QUALITY_LOW &&
quality != RTC_BUILD_QUALITY_MEDIUM &&
- quality != RTC_BUILD_QUALITY_HIGH)
- // -- GODOT start --
- // throw std::runtime_error("invalid build quality");
+ quality != RTC_BUILD_QUALITY_HIGH) {
abort();
- // -- GODOT end --
+ }
+ // -- GODOT end --
scene->setBuildQuality(quality);
RTC_CATCH_END2(scene);
}
@@ -212,6 +278,7 @@ RTC_NAMESPACE_BEGIN;
RTC_CATCH_BEGIN;
RTC_TRACE(rtcSetSceneFlags);
RTC_VERIFY_HANDLE(hscene);
+ RTC_ENTER_DEVICE(hscene);
scene->setSceneFlags(flags);
RTC_CATCH_END2(scene);
}
@@ -222,6 +289,7 @@ RTC_NAMESPACE_BEGIN;
RTC_CATCH_BEGIN;
RTC_TRACE(rtcGetSceneFlags);
RTC_VERIFY_HANDLE(hscene);
+ RTC_ENTER_DEVICE(hscene);
return scene->getSceneFlags();
RTC_CATCH_END2(scene);
return RTC_SCENE_FLAG_NONE;
@@ -233,6 +301,7 @@ RTC_NAMESPACE_BEGIN;
RTC_CATCH_BEGIN;
RTC_TRACE(rtcCommitScene);
RTC_VERIFY_HANDLE(hscene);
+ RTC_ENTER_DEVICE(hscene);
scene->commit(false);
RTC_CATCH_END2(scene);
}
@@ -243,6 +312,7 @@ RTC_NAMESPACE_BEGIN;
RTC_CATCH_BEGIN;
RTC_TRACE(rtcJoinCommitScene);
RTC_VERIFY_HANDLE(hscene);
+ RTC_ENTER_DEVICE(hscene);
scene->commit(true);
RTC_CATCH_END2(scene);
}
@@ -253,6 +323,7 @@ RTC_NAMESPACE_BEGIN;
RTC_CATCH_BEGIN;
RTC_TRACE(rtcGetSceneBounds);
RTC_VERIFY_HANDLE(hscene);
+ RTC_ENTER_DEVICE(hscene);
if (scene->isModified()) throw_RTCError(RTC_ERROR_INVALID_OPERATION,"scene not committed");
BBox3fa bounds = scene->bounds.bounds();
bounds_o->lower_x = bounds.lower.x;
@@ -272,6 +343,7 @@ RTC_NAMESPACE_BEGIN;
RTC_CATCH_BEGIN;
RTC_TRACE(rtcGetSceneBounds);
RTC_VERIFY_HANDLE(hscene);
+ RTC_ENTER_DEVICE(hscene);
if (bounds_o == nullptr)
throw_RTCError(RTC_ERROR_INVALID_OPERATION,"invalid destination pointer");
if (scene->isModified())
@@ -447,7 +519,7 @@ RTC_NAMESPACE_BEGIN;
RTC_CATCH_END2_FALSE(scene);
}
- RTC_API void rtcIntersect1 (RTCScene hscene, RTCIntersectContext* user_context, RTCRayHit* rayhit)
+ RTC_API void rtcIntersect1 (RTCScene hscene, RTCRayHit* rayhit, RTCIntersectArguments* args)
{
Scene* scene = (Scene*) hscene;
RTC_CATCH_BEGIN;
@@ -458,7 +530,21 @@ RTC_NAMESPACE_BEGIN;
if (((size_t)rayhit) & 0x0F) throw_RTCError(RTC_ERROR_INVALID_ARGUMENT, "ray not aligned to 16 bytes");
#endif
STAT3(normal.travs,1,1,1);
- IntersectContext context(scene,user_context);
+
+ RTCIntersectArguments defaultArgs;
+ if (unlikely(args == nullptr)) {
+ rtcInitIntersectArguments(&defaultArgs);
+ args = &defaultArgs;
+ }
+ RTCRayQueryContext* user_context = args->context;
+
+ RTCRayQueryContext defaultContext;
+ if (unlikely(user_context == nullptr)) {
+ rtcInitRayQueryContext(&defaultContext);
+ user_context = &defaultContext;
+ }
+ RayQueryContext context(scene,user_context,args);
+
scene->intersectors.intersect(*rayhit,&context);
#if defined(DEBUG)
((RayHit*)rayhit)->verifyHit();
@@ -466,7 +552,45 @@ RTC_NAMESPACE_BEGIN;
RTC_CATCH_END2(scene);
}
- RTC_API void rtcIntersect4 (const int* valid, RTCScene hscene, RTCIntersectContext* user_context, RTCRayHit4* rayhit)
+ RTC_API void rtcForwardIntersect1 (const RTCIntersectFunctionNArguments* args, RTCScene hscene, RTCRay* iray_, unsigned int instID)
+ {
+ rtcForwardIntersect1Ex(args, hscene, iray_, instID, 0);
+ }
+
+ RTC_API void rtcForwardIntersect1Ex(const RTCIntersectFunctionNArguments* args, RTCScene hscene, RTCRay* iray_, unsigned int instID, unsigned int instPrimID)
+ {
+ Scene* scene = (Scene*) hscene;
+ RTC_CATCH_BEGIN;
+ RTC_TRACE(rtcForwardIntersect1Ex);
+#if defined(DEBUG)
+ RTC_VERIFY_HANDLE(hscene);
+ if (scene->isModified()) throw_RTCError(RTC_ERROR_INVALID_OPERATION,"scene not committed");
+ if (((size_t)iray_) & 0x0F) throw_RTCError(RTC_ERROR_INVALID_ARGUMENT, "ray not aligned to 16 bytes");
+#endif
+
+ Ray* iray = (Ray*) iray_;
+ RayHit* oray = (RayHit*)args->rayhit;
+ RTCRayQueryContext* user_context = args->context;
+ const Vec3ff ray_org_tnear = oray->org;
+ const Vec3ff ray_dir_time = oray->dir;
+ oray->org = iray->org;
+ oray->dir = iray->dir;
+ STAT3(normal.travs,1,1,1);
+
+ RTCIntersectArguments* iargs = ((IntersectFunctionNArguments*) args)->args;
+ RayQueryContext context(scene,user_context,iargs);
+
+ instance_id_stack::push(user_context, instID, instPrimID);
+ scene->intersectors.intersect(*(RTCRayHit*)oray,&context);
+ instance_id_stack::pop(user_context);
+
+ oray->org = ray_org_tnear;
+ oray->dir = ray_dir_time;
+
+ RTC_CATCH_END2(scene);
+ }
+
+ RTC_API void rtcIntersect4 (const int* valid, RTCScene hscene, RTCRayHit4* rayhit, RTCIntersectArguments* args)
{
Scene* scene = (Scene*) hscene;
RTC_CATCH_BEGIN;
@@ -481,23 +605,119 @@ RTC_NAMESPACE_BEGIN;
STAT(size_t cnt=0; for (size_t i=0; i<4; i++) cnt += ((int*)valid)[i] == -1;);
STAT3(normal.travs,cnt,cnt,cnt);
- IntersectContext context(scene,user_context);
-#if !defined(EMBREE_RAY_PACKETS)
- RayHit4* ray4 = (RayHit4*) rayhit;
- for (size_t i=0; i<4; i++) {
- if (!valid[i]) continue;
- RayHit ray1; ray4->get(i,ray1);
- scene->intersectors.intersect((RTCRayHit&)ray1,&context);
- ray4->set(i,ray1);
+ RTCIntersectArguments defaultArgs;
+ if (unlikely(args == nullptr)) {
+ rtcInitIntersectArguments(&defaultArgs);
+ args = &defaultArgs;
+ }
+ RTCRayQueryContext* user_context = args->context;
+
+ RTCRayQueryContext defaultContext;
+ if (unlikely(user_context == nullptr)) {
+ rtcInitRayQueryContext(&defaultContext);
+ user_context = &defaultContext;
+ }
+ RayQueryContext context(scene,user_context,args);
+
+ if (likely(scene->intersectors.intersector4))
+ scene->intersectors.intersect4(valid,*rayhit,&context);
+
+ else {
+ RayHit4* ray4 = (RayHit4*) rayhit;
+ for (size_t i=0; i<4; i++) {
+ if (!valid[i]) continue;
+ RayHit ray1; ray4->get(i,ray1);
+ scene->intersectors.intersect((RTCRayHit&)ray1,&context);
+ ray4->set(i,ray1);
+ }
}
-#else
- scene->intersectors.intersect4(valid,*rayhit,&context);
-#endif
RTC_CATCH_END2(scene);
}
+
+ template<int N> void copy(float* dst, float* src);
+
+ template<>
+ __forceinline void copy<4>(float* dst, float* src) {
+ vfloat4::storeu(&dst[0],vfloat4::loadu(&src[0]));
+ }
+
+ template<>
+ __forceinline void copy<8>(float* dst, float* src) {
+ vfloat4::storeu(&dst[0],vfloat4::loadu(&src[0]));
+ vfloat4::storeu(&dst[4],vfloat4::loadu(&src[4]));
+ }
+
+ template<>
+ __forceinline void copy<16>(float* dst, float* src) {
+ vfloat4::storeu(&dst[0],vfloat4::loadu(&src[0]));
+ vfloat4::storeu(&dst[4],vfloat4::loadu(&src[4]));
+ vfloat4::storeu(&dst[8],vfloat4::loadu(&src[8]));
+ vfloat4::storeu(&dst[12],vfloat4::loadu(&src[12]));
+ }
+
+ template<typename RTCRay, typename RTCRayHit, int N>
+ __forceinline void rtcForwardIntersectN(const int* valid, const RTCIntersectFunctionNArguments* args, RTCScene hscene, RTCRay* iray, unsigned int instID, unsigned int instPrimID)
+ {
+ Scene* scene = (Scene*) hscene;
+ RTCRayHit* oray = (RTCRayHit*)args->rayhit;
+ RTCRayQueryContext* user_context = args->context;
+
+ __aligned(16) float ray_org_x[N];
+ __aligned(16) float ray_org_y[N];
+ __aligned(16) float ray_org_z[N];
+ __aligned(16) float ray_dir_x[N];
+ __aligned(16) float ray_dir_y[N];
+ __aligned(16) float ray_dir_z[N];
+
+ copy<N>(ray_org_x,oray->ray.org_x);
+ copy<N>(ray_org_y,oray->ray.org_y);
+ copy<N>(ray_org_z,oray->ray.org_z);
+ copy<N>(ray_dir_x,oray->ray.dir_x);
+ copy<N>(ray_dir_y,oray->ray.dir_y);
+ copy<N>(ray_dir_z,oray->ray.dir_z);
+
+ copy<N>(oray->ray.org_x,iray->org_x);
+ copy<N>(oray->ray.org_y,iray->org_y);
+ copy<N>(oray->ray.org_z,iray->org_z);
+ copy<N>(oray->ray.dir_x,iray->dir_x);
+ copy<N>(oray->ray.dir_y,iray->dir_y);
+ copy<N>(oray->ray.dir_z,iray->dir_z);
+
+ STAT(size_t cnt=0; for (size_t i=0; i<N; i++) cnt += ((int*)valid)[i] == -1;);
+ STAT3(normal.travs,cnt,cnt,cnt);
+
+ RTCIntersectArguments* iargs = ((IntersectFunctionNArguments*) args)->args;
+ RayQueryContext context(scene,user_context,iargs);
+
+ instance_id_stack::push(user_context, instID, instPrimID);
+ scene->intersectors.intersect(valid,*oray,&context);
+ instance_id_stack::pop(user_context);
+
+ copy<N>(oray->ray.org_x,ray_org_x);
+ copy<N>(oray->ray.org_y,ray_org_y);
+ copy<N>(oray->ray.org_z,ray_org_z);
+ copy<N>(oray->ray.dir_x,ray_dir_x);
+ copy<N>(oray->ray.dir_y,ray_dir_y);
+ copy<N>(oray->ray.dir_z,ray_dir_z);
+ }
+
+ RTC_API void rtcForwardIntersect4(const int* valid, const RTCIntersectFunctionNArguments* args, RTCScene hscene, RTCRay4* iray, unsigned int instID)
+ {
+ RTC_TRACE(rtcForwardIntersect4);
+ return rtcForwardIntersect4Ex(valid, args, hscene, iray, instID, 0);
+ }
+
+ RTC_API void rtcForwardIntersect4Ex(const int* valid, const RTCIntersectFunctionNArguments* args, RTCScene hscene, RTCRay4* iray, unsigned int instID, unsigned int instPrimID)
+ {
+ Scene* scene = (Scene*) hscene;
+ RTC_CATCH_BEGIN;
+ RTC_TRACE(rtcForwardIntersect4);
+ rtcForwardIntersectN<RTCRay4,RTCRayHit4,4>(valid,args,hscene,iray,instID,instPrimID);
+ RTC_CATCH_END2(scene);
+ }
- RTC_API void rtcIntersect8 (const int* valid, RTCScene hscene, RTCIntersectContext* user_context, RTCRayHit8* rayhit)
+ RTC_API void rtcIntersect8 (const int* valid, RTCScene hscene, RTCRayHit8* rayhit, RTCIntersectArguments* args)
{
Scene* scene = (Scene*) hscene;
RTC_CATCH_BEGIN;
@@ -512,25 +732,53 @@ RTC_NAMESPACE_BEGIN;
STAT(size_t cnt=0; for (size_t i=0; i<8; i++) cnt += ((int*)valid)[i] == -1;);
STAT3(normal.travs,cnt,cnt,cnt);
- IntersectContext context(scene,user_context);
-#if !defined(EMBREE_RAY_PACKETS)
- RayHit8* ray8 = (RayHit8*) rayhit;
- for (size_t i=0; i<8; i++) {
- if (!valid[i]) continue;
- RayHit ray1; ray8->get(i,ray1);
- scene->intersectors.intersect((RTCRayHit&)ray1,&context);
- ray8->set(i,ray1);
+ RTCIntersectArguments defaultArgs;
+ if (unlikely(args == nullptr)) {
+ rtcInitIntersectArguments(&defaultArgs);
+ args = &defaultArgs;
}
-#else
- if (likely(scene->intersectors.intersector8))
+ RTCRayQueryContext* user_context = args->context;
+
+ RTCRayQueryContext defaultContext;
+ if (unlikely(user_context == nullptr)) {
+ rtcInitRayQueryContext(&defaultContext);
+ user_context = &defaultContext;
+ }
+ RayQueryContext context(scene,user_context,args);
+
+ if (likely(scene->intersectors.intersector8))
scene->intersectors.intersect8(valid,*rayhit,&context);
+
else
- scene->device->rayStreamFilters.intersectSOA(scene,(char*)rayhit,8,1,sizeof(RTCRayHit8),&context);
-#endif
+ {
+ RayHit8* ray8 = (RayHit8*) rayhit;
+ for (size_t i=0; i<8; i++) {
+ if (!valid[i]) continue;
+ RayHit ray1; ray8->get(i,ray1);
+ scene->intersectors.intersect((RTCRayHit&)ray1,&context);
+ ray8->set(i,ray1);
+ }
+ }
+
RTC_CATCH_END2(scene);
}
-
- RTC_API void rtcIntersect16 (const int* valid, RTCScene hscene, RTCIntersectContext* user_context, RTCRayHit16* rayhit)
+
+ RTC_API void rtcForwardIntersect8(const int* valid, const RTCIntersectFunctionNArguments* args, RTCScene hscene, RTCRay8* iray, unsigned int instID)
+ {
+ RTC_TRACE(rtcForwardIntersect8);
+ return rtcForwardIntersect8Ex(valid, args, hscene, iray, instID, 0);
+ }
+
+ RTC_API void rtcForwardIntersect8Ex(const int* valid, const RTCIntersectFunctionNArguments* args, RTCScene hscene, RTCRay8* iray, unsigned int instID, unsigned int instPrimID)
+ {
+ Scene* scene = (Scene*) hscene;
+ RTC_CATCH_BEGIN;
+ RTC_TRACE(rtcForwardIntersect8Ex);
+ rtcForwardIntersectN<RTCRay8,RTCRayHit8,8>(valid,args,hscene,iray,instID,instPrimID);
+ RTC_CATCH_END2(scene);
+ }
+
+ RTC_API void rtcIntersect16 (const int* valid, RTCScene hscene, RTCRayHit16* rayhit, RTCIntersectArguments* args)
{
Scene* scene = (Scene*) hscene;
RTC_CATCH_BEGIN;
@@ -545,179 +793,121 @@ RTC_NAMESPACE_BEGIN;
STAT(size_t cnt=0; for (size_t i=0; i<16; i++) cnt += ((int*)valid)[i] == -1;);
STAT3(normal.travs,cnt,cnt,cnt);
- IntersectContext context(scene,user_context);
-#if !defined(EMBREE_RAY_PACKETS)
- RayHit16* ray16 = (RayHit16*) rayhit;
- for (size_t i=0; i<16; i++) {
- if (!valid[i]) continue;
- RayHit ray1; ray16->get(i,ray1);
- scene->intersectors.intersect((RTCRayHit&)ray1,&context);
- ray16->set(i,ray1);
+ RTCIntersectArguments defaultArgs;
+ if (unlikely(args == nullptr)) {
+ rtcInitIntersectArguments(&defaultArgs);
+ args = &defaultArgs;
}
-#else
+ RTCRayQueryContext* user_context = args->context;
+
+ RTCRayQueryContext defaultContext;
+ if (unlikely(user_context == nullptr)) {
+ rtcInitRayQueryContext(&defaultContext);
+ user_context = &defaultContext;
+ }
+ RayQueryContext context(scene,user_context,args);
+
if (likely(scene->intersectors.intersector16))
scene->intersectors.intersect16(valid,*rayhit,&context);
- else
- scene->device->rayStreamFilters.intersectSOA(scene,(char*)rayhit,16,1,sizeof(RTCRayHit16),&context);
-#endif
- RTC_CATCH_END2(scene);
- }
-
- RTC_API void rtcIntersect1M (RTCScene hscene, RTCIntersectContext* user_context, RTCRayHit* rayhit, unsigned int M, size_t byteStride)
- {
- Scene* scene = (Scene*) hscene;
- RTC_CATCH_BEGIN;
- RTC_TRACE(rtcIntersect1M);
-
-#if defined (EMBREE_RAY_PACKETS)
-#if defined(DEBUG)
- RTC_VERIFY_HANDLE(hscene);
- if (scene->isModified()) throw_RTCError(RTC_ERROR_INVALID_OPERATION,"scene not committed");
- if (((size_t)rayhit ) & 0x03) throw_RTCError(RTC_ERROR_INVALID_ARGUMENT, "ray not aligned to 4 bytes");
-#endif
- STAT3(normal.travs,M,M,M);
- IntersectContext context(scene,user_context);
- /* fast codepath for single rays */
- if (likely(M == 1)) {
- if (likely(rayhit->ray.tnear <= rayhit->ray.tfar))
- scene->intersectors.intersect(*rayhit,&context);
- }
-
- /* codepath for streams */
else {
- scene->device->rayStreamFilters.intersectAOS(scene,rayhit,M,byteStride,&context);
+ RayHit16* ray16 = (RayHit16*) rayhit;
+ for (size_t i=0; i<16; i++) {
+ if (!valid[i]) continue;
+ RayHit ray1; ray16->get(i,ray1);
+ scene->intersectors.intersect((RTCRayHit&)ray1,&context);
+ ray16->set(i,ray1);
+ }
}
-#else
- throw_RTCError(RTC_ERROR_INVALID_OPERATION,"rtcIntersect1M not supported");
-#endif
+
RTC_CATCH_END2(scene);
}
- RTC_API void rtcIntersect1Mp (RTCScene hscene, RTCIntersectContext* user_context, RTCRayHit** rn, unsigned int M)
+ RTC_API void rtcForwardIntersect16(const int* valid, const RTCIntersectFunctionNArguments* args, RTCScene hscene, RTCRay16* iray, unsigned int instID)
+ {
+ RTC_TRACE(rtcForwardIntersect16);
+ return rtcForwardIntersect16Ex(valid, args, hscene, iray, instID, 0);
+ }
+
+ RTC_API void rtcForwardIntersect16Ex(const int* valid, const RTCIntersectFunctionNArguments* args, RTCScene hscene, RTCRay16* iray, unsigned int instID, unsigned int instPrimID)
{
Scene* scene = (Scene*) hscene;
RTC_CATCH_BEGIN;
- RTC_TRACE(rtcIntersect1Mp);
-
-#if defined (EMBREE_RAY_PACKETS)
-#if defined(DEBUG)
- RTC_VERIFY_HANDLE(hscene);
- if (scene->isModified()) throw_RTCError(RTC_ERROR_INVALID_OPERATION,"scene not committed");
- if (((size_t)rn) & 0x03) throw_RTCError(RTC_ERROR_INVALID_ARGUMENT, "ray not aligned to 4 bytes");
-#endif
- STAT3(normal.travs,M,M,M);
- IntersectContext context(scene,user_context);
-
- /* fast codepath for single rays */
- if (likely(M == 1)) {
- if (likely(rn[0]->ray.tnear <= rn[0]->ray.tfar))
- scene->intersectors.intersect(*rn[0],&context);
- }
-
- /* codepath for streams */
- else {
- scene->device->rayStreamFilters.intersectAOP(scene,rn,M,&context);
- }
-#else
- throw_RTCError(RTC_ERROR_INVALID_OPERATION,"rtcIntersect1Mp not supported");
-#endif
+ RTC_TRACE(rtcForwardIntersect16Ex);
+ rtcForwardIntersectN<RTCRay16,RTCRayHit16,16>(valid,args,hscene,iray,instID,instPrimID);
RTC_CATCH_END2(scene);
}
- RTC_API void rtcIntersectNM (RTCScene hscene, RTCIntersectContext* user_context, struct RTCRayHitN* rayhit, unsigned int N, unsigned int M, size_t byteStride)
+ RTC_API void rtcOccluded1 (RTCScene hscene, RTCRay* ray, RTCOccludedArguments* args)
{
Scene* scene = (Scene*) hscene;
RTC_CATCH_BEGIN;
- RTC_TRACE(rtcIntersectNM);
-
-#if defined (EMBREE_RAY_PACKETS)
+ RTC_TRACE(rtcOccluded1);
+ STAT3(shadow.travs,1,1,1);
#if defined(DEBUG)
RTC_VERIFY_HANDLE(hscene);
if (scene->isModified()) throw_RTCError(RTC_ERROR_INVALID_OPERATION,"scene not committed");
- if (((size_t)rayhit) & 0x03) throw_RTCError(RTC_ERROR_INVALID_ARGUMENT, "ray not aligned to 4 bytes");
+ if (((size_t)ray) & 0x0F) throw_RTCError(RTC_ERROR_INVALID_ARGUMENT, "ray not aligned to 16 bytes");
#endif
- STAT3(normal.travs,N*M,N*M,N*M);
- IntersectContext context(scene,user_context);
- /* code path for single ray streams */
- if (likely(N == 1))
- {
- /* fast code path for streams of size 1 */
- if (likely(M == 1)) {
- if (likely(((RTCRayHit*)rayhit)->ray.tnear <= ((RTCRayHit*)rayhit)->ray.tfar))
- scene->intersectors.intersect(*(RTCRayHit*)rayhit,&context);
- }
- /* normal codepath for single ray streams */
- else {
- scene->device->rayStreamFilters.intersectAOS(scene,(RTCRayHit*)rayhit,M,byteStride,&context);
- }
+ RTCOccludedArguments defaultArgs;
+ if (unlikely(args == nullptr)) {
+ rtcInitOccludedArguments(&defaultArgs);
+ args = &defaultArgs;
}
- /* code path for ray packet streams */
- else {
- scene->device->rayStreamFilters.intersectSOA(scene,(char*)rayhit,N,M,byteStride,&context);
+ RTCRayQueryContext* user_context = args->context;
+
+ RTCRayQueryContext defaultContext;
+ if (unlikely(user_context == nullptr)) {
+ rtcInitRayQueryContext(&defaultContext);
+ user_context = &defaultContext;
}
-#else
- throw_RTCError(RTC_ERROR_INVALID_OPERATION,"rtcIntersectNM not supported");
-#endif
+ RayQueryContext context(scene,user_context,args);
+
+ scene->intersectors.occluded(*ray,&context);
RTC_CATCH_END2(scene);
}
- RTC_API void rtcIntersectNp (RTCScene hscene, RTCIntersectContext* user_context, const RTCRayHitNp* rayhit, unsigned int N)
+ RTC_API void rtcForwardOccluded1 (const RTCOccludedFunctionNArguments* args, RTCScene hscene, RTCRay* iray_, unsigned int instID)
{
- Scene* scene = (Scene*) hscene;
- RTC_CATCH_BEGIN;
- RTC_TRACE(rtcIntersectNp);
-
-#if defined (EMBREE_RAY_PACKETS)
-#if defined(DEBUG)
- RTC_VERIFY_HANDLE(hscene);
- if (scene->isModified()) throw_RTCError(RTC_ERROR_INVALID_OPERATION,"scene not committed");
- if (((size_t)rayhit->ray.org_x ) & 0x03 ) throw_RTCError(RTC_ERROR_INVALID_ARGUMENT, "rayhit->ray.org_x not aligned to 4 bytes");
- if (((size_t)rayhit->ray.org_y ) & 0x03 ) throw_RTCError(RTC_ERROR_INVALID_ARGUMENT, "rayhit->ray.org_y not aligned to 4 bytes");
- if (((size_t)rayhit->ray.org_z ) & 0x03 ) throw_RTCError(RTC_ERROR_INVALID_ARGUMENT, "rayhit->ray.org_z not aligned to 4 bytes");
- if (((size_t)rayhit->ray.dir_x ) & 0x03 ) throw_RTCError(RTC_ERROR_INVALID_ARGUMENT, "rayhit->ray.dir_x not aligned to 4 bytes");
- if (((size_t)rayhit->ray.dir_y ) & 0x03 ) throw_RTCError(RTC_ERROR_INVALID_ARGUMENT, "rayhit->ray.dir_y not aligned to 4 bytes");
- if (((size_t)rayhit->ray.dir_z ) & 0x03 ) throw_RTCError(RTC_ERROR_INVALID_ARGUMENT, "rayhit->ray.dir_z not aligned to 4 bytes");
- if (((size_t)rayhit->ray.tnear ) & 0x03 ) throw_RTCError(RTC_ERROR_INVALID_ARGUMENT, "rayhit->ray.dir_x not aligned to 4 bytes");
- if (((size_t)rayhit->ray.tfar ) & 0x03 ) throw_RTCError(RTC_ERROR_INVALID_ARGUMENT, "rayhit->ray.tnear not aligned to 4 bytes");
- if (((size_t)rayhit->ray.time ) & 0x03 ) throw_RTCError(RTC_ERROR_INVALID_ARGUMENT, "rayhit->ray.time not aligned to 4 bytes");
- if (((size_t)rayhit->ray.mask ) & 0x03 ) throw_RTCError(RTC_ERROR_INVALID_ARGUMENT, "rayhit->ray.mask not aligned to 4 bytes");
- if (((size_t)rayhit->hit.Ng_x ) & 0x03 ) throw_RTCError(RTC_ERROR_INVALID_ARGUMENT, "rayhit->hit.Ng_x not aligned to 4 bytes");
- if (((size_t)rayhit->hit.Ng_y ) & 0x03 ) throw_RTCError(RTC_ERROR_INVALID_ARGUMENT, "rayhit->hit.Ng_y not aligned to 4 bytes");
- if (((size_t)rayhit->hit.Ng_z ) & 0x03 ) throw_RTCError(RTC_ERROR_INVALID_ARGUMENT, "rayhit->hit.Ng_z not aligned to 4 bytes");
- if (((size_t)rayhit->hit.u ) & 0x03 ) throw_RTCError(RTC_ERROR_INVALID_ARGUMENT, "rayhit->hit.u not aligned to 4 bytes");
- if (((size_t)rayhit->hit.v ) & 0x03 ) throw_RTCError(RTC_ERROR_INVALID_ARGUMENT, "rayhit->hit.v not aligned to 4 bytes");
- if (((size_t)rayhit->hit.geomID) & 0x03 ) throw_RTCError(RTC_ERROR_INVALID_ARGUMENT, "rayhit->hit.geomID not aligned to 4 bytes");
- if (((size_t)rayhit->hit.primID) & 0x03 ) throw_RTCError(RTC_ERROR_INVALID_ARGUMENT, "rayhit->hit.primID not aligned to 4 bytes");
- if (((size_t)rayhit->hit.instID) & 0x03 ) throw_RTCError(RTC_ERROR_INVALID_ARGUMENT, "rayhit->hit.instID not aligned to 4 bytes");
-#endif
- STAT3(normal.travs,N,N,N);
- IntersectContext context(scene,user_context);
- scene->device->rayStreamFilters.intersectSOP(scene,rayhit,N,&context);
-#else
- throw_RTCError(RTC_ERROR_INVALID_OPERATION,"rtcIntersectNp not supported");
-#endif
- RTC_CATCH_END2(scene);
+ RTC_TRACE(rtcForwardOccluded1);
+ return rtcForwardOccluded1Ex(args, hscene, iray_, instID, 0);
}
-
- RTC_API void rtcOccluded1 (RTCScene hscene, RTCIntersectContext* user_context, RTCRay* ray)
+
+ RTC_API void rtcForwardOccluded1Ex(const RTCOccludedFunctionNArguments* args, RTCScene hscene, RTCRay* iray_, unsigned int instID, unsigned int instPrimID)
{
Scene* scene = (Scene*) hscene;
RTC_CATCH_BEGIN;
- RTC_TRACE(rtcOccluded1);
+ RTC_TRACE(rtcForwardOccluded1Ex);
STAT3(shadow.travs,1,1,1);
#if defined(DEBUG)
RTC_VERIFY_HANDLE(hscene);
if (scene->isModified()) throw_RTCError(RTC_ERROR_INVALID_OPERATION,"scene not committed");
- if (((size_t)ray) & 0x0F) throw_RTCError(RTC_ERROR_INVALID_ARGUMENT, "ray not aligned to 16 bytes");
+ if (((size_t)iray_) & 0x0F) throw_RTCError(RTC_ERROR_INVALID_ARGUMENT, "ray not aligned to 16 bytes");
#endif
- IntersectContext context(scene,user_context);
- scene->intersectors.occluded(*ray,&context);
+
+ Ray* iray = (Ray*)iray_;
+ Ray* oray = (Ray*)args->ray;
+ RTCRayQueryContext* user_context = args->context;
+ const Vec3ff ray_org_tnear = oray->org;
+ const Vec3ff ray_dir_time = oray->dir;
+ oray->org = iray->org;
+ oray->dir = iray->dir;
+
+ RTCIntersectArguments* iargs = ((OccludedFunctionNArguments*) args)->args;
+ RayQueryContext context(scene,user_context,iargs);
+
+ instance_id_stack::push(user_context, instID, instPrimID);
+ scene->intersectors.occluded(*(RTCRay*)oray,&context);
+ instance_id_stack::pop(user_context);
+
+ oray->org = ray_org_tnear;
+ oray->dir = ray_dir_time;
+
RTC_CATCH_END2(scene);
}
-
- RTC_API void rtcOccluded4 (const int* valid, RTCScene hscene, RTCIntersectContext* user_context, RTCRay4* ray)
+
+ RTC_API void rtcOccluded4 (const int* valid, RTCScene hscene, RTCRay4* ray, RTCOccludedArguments* args)
{
Scene* scene = (Scene*) hscene;
RTC_CATCH_BEGIN;
@@ -732,23 +922,98 @@ RTC_NAMESPACE_BEGIN;
STAT(size_t cnt=0; for (size_t i=0; i<4; i++) cnt += ((int*)valid)[i] == -1;);
STAT3(shadow.travs,cnt,cnt,cnt);
- IntersectContext context(scene,user_context);
-#if !defined(EMBREE_RAY_PACKETS)
- RayHit4* ray4 = (RayHit4*) ray;
- for (size_t i=0; i<4; i++) {
- if (!valid[i]) continue;
- RayHit ray1; ray4->get(i,ray1);
- scene->intersectors.occluded((RTCRay&)ray1,&context);
- ray4->geomID[i] = ray1.geomID;
+ RTCOccludedArguments defaultArgs;
+ if (unlikely(args == nullptr)) {
+ rtcInitOccludedArguments(&defaultArgs);
+ args = &defaultArgs;
+ }
+ RTCRayQueryContext* user_context = args->context;
+
+ RTCRayQueryContext defaultContext;
+ if (unlikely(user_context == nullptr)) {
+ rtcInitRayQueryContext(&defaultContext);
+ user_context = &defaultContext;
+ }
+ RayQueryContext context(scene,user_context,args);
+
+ if (likely(scene->intersectors.intersector4))
+ scene->intersectors.occluded4(valid,*ray,&context);
+
+ else {
+ RayHit4* ray4 = (RayHit4*) ray;
+ for (size_t i=0; i<4; i++) {
+ if (!valid[i]) continue;
+ RayHit ray1; ray4->get(i,ray1);
+ scene->intersectors.occluded((RTCRay&)ray1,&context);
+ ray4->geomID[i] = ray1.geomID;
+ }
}
-#else
- scene->intersectors.occluded4(valid,*ray,&context);
-#endif
RTC_CATCH_END2(scene);
}
+
+ template<typename RTCRay, int N>
+ __forceinline void rtcForwardOccludedN (const int* valid, const RTCOccludedFunctionNArguments* args, RTCScene hscene, RTCRay* iray, unsigned int instID, unsigned int instPrimID)
+ {
+ Scene* scene = (Scene*) hscene;
+ RTCRay* oray = (RTCRay*)args->ray;
+ RTCRayQueryContext* user_context = args->context;
+
+ __aligned(16) float ray_org_x[N];
+ __aligned(16) float ray_org_y[N];
+ __aligned(16) float ray_org_z[N];
+ __aligned(16) float ray_dir_x[N];
+ __aligned(16) float ray_dir_y[N];
+ __aligned(16) float ray_dir_z[N];
+
+ copy<N>(ray_org_x,oray->org_x);
+ copy<N>(ray_org_y,oray->org_y);
+ copy<N>(ray_org_z,oray->org_z);
+ copy<N>(ray_dir_x,oray->dir_x);
+ copy<N>(ray_dir_y,oray->dir_y);
+ copy<N>(ray_dir_z,oray->dir_z);
+
+ copy<N>(oray->org_x,iray->org_x);
+ copy<N>(oray->org_y,iray->org_y);
+ copy<N>(oray->org_z,iray->org_z);
+ copy<N>(oray->dir_x,iray->dir_x);
+ copy<N>(oray->dir_y,iray->dir_y);
+ copy<N>(oray->dir_z,iray->dir_z);
+
+ STAT(size_t cnt=0; for (size_t i=0; i<N; i++) cnt += ((int*)valid)[i] == -1;);
+ STAT3(normal.travs,cnt,cnt,cnt);
+
+ RTCIntersectArguments* iargs = ((IntersectFunctionNArguments*) args)->args;
+ RayQueryContext context(scene,user_context,iargs);
+
+ instance_id_stack::push(user_context, instID, instPrimID);
+ scene->intersectors.occluded(valid,*oray,&context);
+ instance_id_stack::pop(user_context);
+
+ copy<N>(oray->org_x,ray_org_x);
+ copy<N>(oray->org_y,ray_org_y);
+ copy<N>(oray->org_z,ray_org_z);
+ copy<N>(oray->dir_x,ray_dir_x);
+ copy<N>(oray->dir_y,ray_dir_y);
+ copy<N>(oray->dir_z,ray_dir_z);
+ }
+
+ RTC_API void rtcForwardOccluded4(const int* valid, const RTCOccludedFunctionNArguments* args, RTCScene hscene, RTCRay4* iray, unsigned int instID)
+ {
+ RTC_TRACE(rtcForwardOccluded4);
+ return rtcForwardOccluded4Ex(valid, args, hscene, iray, instID, 0);
+ }
+
+ RTC_API void rtcForwardOccluded4Ex(const int* valid, const RTCOccludedFunctionNArguments* args, RTCScene hscene, RTCRay4* iray, unsigned int instID, unsigned int instPrimID)
+ {
+ Scene* scene = (Scene*) hscene;
+ RTC_CATCH_BEGIN;
+ RTC_TRACE(rtcForwardOccluded4);
+ rtcForwardOccludedN<RTCRay4,4>(valid,args,hscene,iray,instID,instPrimID);
+ RTC_CATCH_END2(scene);
+ }
- RTC_API void rtcOccluded8 (const int* valid, RTCScene hscene, RTCIntersectContext* user_context, RTCRay8* ray)
+ RTC_API void rtcOccluded8 (const int* valid, RTCScene hscene, RTCRay8* ray, RTCOccludedArguments* args)
{
Scene* scene = (Scene*) hscene;
RTC_CATCH_BEGIN;
@@ -763,26 +1028,52 @@ RTC_NAMESPACE_BEGIN;
STAT(size_t cnt=0; for (size_t i=0; i<8; i++) cnt += ((int*)valid)[i] == -1;);
STAT3(shadow.travs,cnt,cnt,cnt);
- IntersectContext context(scene,user_context);
-#if !defined(EMBREE_RAY_PACKETS)
- RayHit8* ray8 = (RayHit8*) ray;
- for (size_t i=0; i<8; i++) {
- if (!valid[i]) continue;
- RayHit ray1; ray8->get(i,ray1);
- scene->intersectors.occluded((RTCRay&)ray1,&context);
- ray8->set(i,ray1);
+ RTCOccludedArguments defaultArgs;
+ if (unlikely(args == nullptr)) {
+ rtcInitOccludedArguments(&defaultArgs);
+ args = &defaultArgs;
}
-#else
+ RTCRayQueryContext* user_context = args->context;
+
+ RTCRayQueryContext defaultContext;
+ if (unlikely(user_context == nullptr)) {
+ rtcInitRayQueryContext(&defaultContext);
+ user_context = &defaultContext;
+ }
+ RayQueryContext context(scene,user_context,args);
+
if (likely(scene->intersectors.intersector8))
scene->intersectors.occluded8(valid,*ray,&context);
- else
- scene->device->rayStreamFilters.occludedSOA(scene,(char*)ray,8,1,sizeof(RTCRay8),&context);
-#endif
+
+ else {
+ RayHit8* ray8 = (RayHit8*) ray;
+ for (size_t i=0; i<8; i++) {
+ if (!valid[i]) continue;
+ RayHit ray1; ray8->get(i,ray1);
+ scene->intersectors.occluded((RTCRay&)ray1,&context);
+ ray8->set(i,ray1);
+ }
+ }
RTC_CATCH_END2(scene);
}
-
- RTC_API void rtcOccluded16 (const int* valid, RTCScene hscene, RTCIntersectContext* user_context, RTCRay16* ray)
+
+ RTC_API void rtcForwardOccluded8(const int* valid, const RTCOccludedFunctionNArguments* args, RTCScene hscene, RTCRay8* iray, unsigned int instID)
+ {
+ RTC_TRACE(rtcForwardOccluded8);
+ return rtcForwardOccluded8Ex(valid, args, hscene, iray, instID, 0);
+ }
+
+ RTC_API void rtcForwardOccluded8Ex(const int* valid, const RTCOccludedFunctionNArguments* args, RTCScene hscene, RTCRay8* iray, unsigned int instID, unsigned int instPrimID)
+ {
+ Scene* scene = (Scene*) hscene;
+ RTC_CATCH_BEGIN;
+ RTC_TRACE(rtcForwardOccluded8Ex);
+ rtcForwardOccludedN<RTCRay8,8>(valid, args, hscene, iray, instID, instPrimID);
+ RTC_CATCH_END2(scene);
+ }
+
+ RTC_API void rtcOccluded16 (const int* valid, RTCScene hscene, RTCRay16* ray, RTCOccludedArguments* args)
{
Scene* scene = (Scene*) hscene;
RTC_CATCH_BEGIN;
@@ -797,159 +1088,58 @@ RTC_NAMESPACE_BEGIN;
STAT(size_t cnt=0; for (size_t i=0; i<16; i++) cnt += ((int*)valid)[i] == -1;);
STAT3(shadow.travs,cnt,cnt,cnt);
- IntersectContext context(scene,user_context);
-#if !defined(EMBREE_RAY_PACKETS)
- RayHit16* ray16 = (RayHit16*) ray;
- for (size_t i=0; i<16; i++) {
- if (!valid[i]) continue;
- RayHit ray1; ray16->get(i,ray1);
- scene->intersectors.occluded((RTCRay&)ray1,&context);
- ray16->set(i,ray1);
+ RTCOccludedArguments defaultArgs;
+ if (unlikely(args == nullptr)) {
+ rtcInitOccludedArguments(&defaultArgs);
+ args = &defaultArgs;
}
-#else
+ RTCRayQueryContext* user_context = args->context;
+
+ RTCRayQueryContext defaultContext;
+ if (unlikely(user_context == nullptr)) {
+ rtcInitRayQueryContext(&defaultContext);
+ user_context = &defaultContext;
+ }
+ RayQueryContext context(scene,user_context,args);
+
if (likely(scene->intersectors.intersector16))
scene->intersectors.occluded16(valid,*ray,&context);
- else
- scene->device->rayStreamFilters.occludedSOA(scene,(char*)ray,16,1,sizeof(RTCRay16),&context);
-#endif
-
- RTC_CATCH_END2(scene);
- }
-
- RTC_API void rtcOccluded1M(RTCScene hscene, RTCIntersectContext* user_context, RTCRay* ray, unsigned int M, size_t byteStride)
- {
- Scene* scene = (Scene*) hscene;
- RTC_CATCH_BEGIN;
- RTC_TRACE(rtcOccluded1M);
-#if defined (EMBREE_RAY_PACKETS)
-#if defined(DEBUG)
- RTC_VERIFY_HANDLE(hscene);
- if (scene->isModified()) throw_RTCError(RTC_ERROR_INVALID_OPERATION,"scene not committed");
- if (((size_t)ray) & 0x03) throw_RTCError(RTC_ERROR_INVALID_ARGUMENT, "ray not aligned to 4 bytes");
-#endif
- STAT3(shadow.travs,M,M,M);
- IntersectContext context(scene,user_context);
- /* fast codepath for streams of size 1 */
- if (likely(M == 1)) {
- if (likely(ray->tnear <= ray->tfar))
- scene->intersectors.occluded (*ray,&context);
- }
- /* codepath for normal streams */
else {
- scene->device->rayStreamFilters.occludedAOS(scene,ray,M,byteStride,&context);
+ RayHit16* ray16 = (RayHit16*) ray;
+ for (size_t i=0; i<16; i++) {
+ if (!valid[i]) continue;
+ RayHit ray1; ray16->get(i,ray1);
+ scene->intersectors.occluded((RTCRay&)ray1,&context);
+ ray16->set(i,ray1);
+ }
}
-#else
- throw_RTCError(RTC_ERROR_INVALID_OPERATION,"rtcOccluded1M not supported");
-#endif
- RTC_CATCH_END2(scene);
- }
- RTC_API void rtcOccluded1Mp(RTCScene hscene, RTCIntersectContext* user_context, RTCRay** ray, unsigned int M)
- {
- Scene* scene = (Scene*) hscene;
- RTC_CATCH_BEGIN;
- RTC_TRACE(rtcOccluded1Mp);
-
-#if defined (EMBREE_RAY_PACKETS)
-#if defined(DEBUG)
- RTC_VERIFY_HANDLE(hscene);
- if (scene->isModified()) throw_RTCError(RTC_ERROR_INVALID_OPERATION,"scene not committed");
- if (((size_t)ray) & 0x03) throw_RTCError(RTC_ERROR_INVALID_ARGUMENT, "ray not aligned to 4 bytes");
-#endif
- STAT3(shadow.travs,M,M,M);
- IntersectContext context(scene,user_context);
-
- /* fast codepath for streams of size 1 */
- if (likely(M == 1)) {
- if (likely(ray[0]->tnear <= ray[0]->tfar))
- scene->intersectors.occluded (*ray[0],&context);
- }
- /* codepath for normal streams */
- else {
- scene->device->rayStreamFilters.occludedAOP(scene,ray,M,&context);
- }
-#else
- throw_RTCError(RTC_ERROR_INVALID_OPERATION,"rtcOccluded1Mp not supported");
-#endif
RTC_CATCH_END2(scene);
}
- RTC_API void rtcOccludedNM(RTCScene hscene, RTCIntersectContext* user_context, RTCRayN* ray, unsigned int N, unsigned int M, size_t byteStride)
+ RTC_API void rtcForwardOccluded16(const int* valid, const RTCOccludedFunctionNArguments* args, RTCScene hscene, RTCRay16* iray, unsigned int instID)
{
- Scene* scene = (Scene*) hscene;
- RTC_CATCH_BEGIN;
- RTC_TRACE(rtcOccludedNM);
-
-#if defined (EMBREE_RAY_PACKETS)
-#if defined(DEBUG)
- RTC_VERIFY_HANDLE(hscene);
- if (byteStride < sizeof(RTCRayHit)) throw_RTCError(RTC_ERROR_INVALID_OPERATION,"byteStride too small");
- if (scene->isModified()) throw_RTCError(RTC_ERROR_INVALID_OPERATION,"scene not committed");
- if (((size_t)ray) & 0x03) throw_RTCError(RTC_ERROR_INVALID_ARGUMENT, "ray not aligned to 4 bytes");
-#endif
- STAT3(shadow.travs,N*M,N*N,N*N);
- IntersectContext context(scene,user_context);
-
- /* codepath for single rays */
- if (likely(N == 1))
- {
- /* fast path for streams of size 1 */
- if (likely(M == 1)) {
- if (likely(((RTCRay*)ray)->tnear <= ((RTCRay*)ray)->tfar))
- scene->intersectors.occluded (*(RTCRay*)ray,&context);
- }
- /* codepath for normal ray streams */
- else {
- scene->device->rayStreamFilters.occludedAOS(scene,(RTCRay*)ray,M,byteStride,&context);
- }
- }
- /* code path for ray packet streams */
- else {
- scene->device->rayStreamFilters.occludedSOA(scene,(char*)ray,N,M,byteStride,&context);
- }
-#else
- throw_RTCError(RTC_ERROR_INVALID_OPERATION,"rtcOccludedNM not supported");
-#endif
- RTC_CATCH_END2(scene);
+ RTC_TRACE(rtcForwardOccluded16);
+ return rtcForwardOccluded16Ex(valid, args, hscene, iray, instID, 0);
}
- RTC_API void rtcOccludedNp(RTCScene hscene, RTCIntersectContext* user_context, const RTCRayNp* ray, unsigned int N)
+ RTC_API void rtcForwardOccluded16Ex(const int* valid, const RTCOccludedFunctionNArguments* args, RTCScene hscene, RTCRay16* iray, unsigned int instID, unsigned int instPrimID)
{
Scene* scene = (Scene*) hscene;
RTC_CATCH_BEGIN;
- RTC_TRACE(rtcOccludedNp);
-
-#if defined (EMBREE_RAY_PACKETS)
-#if defined(DEBUG)
- RTC_VERIFY_HANDLE(hscene);
- if (scene->isModified()) throw_RTCError(RTC_ERROR_INVALID_OPERATION,"scene not committed");
- if (((size_t)ray->org_x ) & 0x03 ) throw_RTCError(RTC_ERROR_INVALID_ARGUMENT, "org_x not aligned to 4 bytes");
- if (((size_t)ray->org_y ) & 0x03 ) throw_RTCError(RTC_ERROR_INVALID_ARGUMENT, "org_y not aligned to 4 bytes");
- if (((size_t)ray->org_z ) & 0x03 ) throw_RTCError(RTC_ERROR_INVALID_ARGUMENT, "org_z not aligned to 4 bytes");
- if (((size_t)ray->dir_x ) & 0x03 ) throw_RTCError(RTC_ERROR_INVALID_ARGUMENT, "dir_x not aligned to 4 bytes");
- if (((size_t)ray->dir_y ) & 0x03 ) throw_RTCError(RTC_ERROR_INVALID_ARGUMENT, "dir_y not aligned to 4 bytes");
- if (((size_t)ray->dir_z ) & 0x03 ) throw_RTCError(RTC_ERROR_INVALID_ARGUMENT, "dir_z not aligned to 4 bytes");
- if (((size_t)ray->tnear ) & 0x03 ) throw_RTCError(RTC_ERROR_INVALID_ARGUMENT, "dir_x not aligned to 4 bytes");
- if (((size_t)ray->tfar ) & 0x03 ) throw_RTCError(RTC_ERROR_INVALID_ARGUMENT, "tnear not aligned to 4 bytes");
- if (((size_t)ray->time ) & 0x03 ) throw_RTCError(RTC_ERROR_INVALID_ARGUMENT, "time not aligned to 4 bytes");
- if (((size_t)ray->mask ) & 0x03 ) throw_RTCError(RTC_ERROR_INVALID_ARGUMENT, "mask not aligned to 4 bytes");
-#endif
- STAT3(shadow.travs,N,N,N);
- IntersectContext context(scene,user_context);
- scene->device->rayStreamFilters.occludedSOP(scene,ray,N,&context);
-#else
- throw_RTCError(RTC_ERROR_INVALID_OPERATION,"rtcOccludedNp not supported");
-#endif
+ RTC_TRACE(rtcForwardOccluded16Ex);
+ rtcForwardOccludedN<RTCRay16,16>(valid, args, hscene, iray, instID, instPrimID);
RTC_CATCH_END2(scene);
}
-
+
RTC_API void rtcRetainScene (RTCScene hscene)
{
Scene* scene = (Scene*) hscene;
RTC_CATCH_BEGIN;
RTC_TRACE(rtcRetainScene);
RTC_VERIFY_HANDLE(hscene);
+ RTC_ENTER_DEVICE(hscene);
scene->refInc();
RTC_CATCH_END2(scene);
}
@@ -960,6 +1150,7 @@ RTC_NAMESPACE_BEGIN;
RTC_CATCH_BEGIN;
RTC_TRACE(rtcReleaseScene);
RTC_VERIFY_HANDLE(hscene);
+ RTC_ENTER_DEVICE(hscene);
scene->refDec();
RTC_CATCH_END2(scene);
}
@@ -972,10 +1163,23 @@ RTC_NAMESPACE_BEGIN;
RTC_TRACE(rtcSetGeometryInstancedScene);
RTC_VERIFY_HANDLE(hgeometry);
RTC_VERIFY_HANDLE(hscene);
+ RTC_ENTER_DEVICE(hgeometry);
geometry->setInstancedScene(scene);
RTC_CATCH_END2(geometry);
}
+ RTC_API void rtcSetGeometryInstancedScenes(RTCGeometry hgeometry, RTCScene* scenes, size_t numScenes)
+ {
+ Geometry* geometry = (Geometry*) hgeometry;
+ RTC_CATCH_BEGIN;
+ RTC_TRACE(rtcSetGeometryInstancedScene);
+ RTC_VERIFY_HANDLE(hgeometry);
+ RTC_VERIFY_HANDLE(scenes);
+ RTC_ENTER_DEVICE(hgeometry);
+ geometry->setInstancedScenes(scenes, numScenes);
+ RTC_CATCH_END2(geometry);
+ }
+
AffineSpace3fa loadTransform(RTCFormat format, const float* xfm)
{
AffineSpace3fa space = one;
@@ -1009,43 +1213,14 @@ RTC_NAMESPACE_BEGIN;
return space;
}
- void storeTransform(const AffineSpace3fa& space, RTCFormat format, float* xfm)
- {
- switch (format)
- {
- case RTC_FORMAT_FLOAT3X4_ROW_MAJOR:
- xfm[ 0] = space.l.vx.x; xfm[ 1] = space.l.vy.x; xfm[ 2] = space.l.vz.x; xfm[ 3] = space.p.x;
- xfm[ 4] = space.l.vx.y; xfm[ 5] = space.l.vy.y; xfm[ 6] = space.l.vz.y; xfm[ 7] = space.p.y;
- xfm[ 8] = space.l.vx.z; xfm[ 9] = space.l.vy.z; xfm[10] = space.l.vz.z; xfm[11] = space.p.z;
- break;
-
- case RTC_FORMAT_FLOAT3X4_COLUMN_MAJOR:
- xfm[ 0] = space.l.vx.x; xfm[ 1] = space.l.vx.y; xfm[ 2] = space.l.vx.z;
- xfm[ 3] = space.l.vy.x; xfm[ 4] = space.l.vy.y; xfm[ 5] = space.l.vy.z;
- xfm[ 6] = space.l.vz.x; xfm[ 7] = space.l.vz.y; xfm[ 8] = space.l.vz.z;
- xfm[ 9] = space.p.x; xfm[10] = space.p.y; xfm[11] = space.p.z;
- break;
-
- case RTC_FORMAT_FLOAT4X4_COLUMN_MAJOR:
- xfm[ 0] = space.l.vx.x; xfm[ 1] = space.l.vx.y; xfm[ 2] = space.l.vx.z; xfm[ 3] = 0.f;
- xfm[ 4] = space.l.vy.x; xfm[ 5] = space.l.vy.y; xfm[ 6] = space.l.vy.z; xfm[ 7] = 0.f;
- xfm[ 8] = space.l.vz.x; xfm[ 9] = space.l.vz.y; xfm[10] = space.l.vz.z; xfm[11] = 0.f;
- xfm[12] = space.p.x; xfm[13] = space.p.y; xfm[14] = space.p.z; xfm[15] = 1.f;
- break;
-
- default:
- throw_RTCError(RTC_ERROR_INVALID_OPERATION, "invalid matrix format");
- break;
- }
- }
-
- RTC_API void rtcSetGeometryTransform(RTCGeometry hgeometry, unsigned int timeStep, RTCFormat format, const void* xfm)
+RTC_API void rtcSetGeometryTransform(RTCGeometry hgeometry, unsigned int timeStep, RTCFormat format, const void* xfm)
{
Geometry* geometry = (Geometry*) hgeometry;
RTC_CATCH_BEGIN;
RTC_TRACE(rtcSetGeometryTransform);
RTC_VERIFY_HANDLE(hgeometry);
RTC_VERIFY_HANDLE(xfm);
+ RTC_ENTER_DEVICE(hgeometry);
const AffineSpace3fa transform = loadTransform(format, (const float*)xfm);
geometry->setTransform(transform, timeStep);
RTC_CATCH_END2(geometry);
@@ -1058,6 +1233,7 @@ RTC_NAMESPACE_BEGIN;
RTC_TRACE(rtcSetGeometryTransformQuaternion);
RTC_VERIFY_HANDLE(hgeometry);
RTC_VERIFY_HANDLE(qd);
+ RTC_ENTER_DEVICE(hgeometry);
AffineSpace3fx transform;
transform.l.vx.x = qd->scale_x;
@@ -1090,21 +1266,46 @@ RTC_NAMESPACE_BEGIN;
Geometry* geometry = (Geometry*) hgeometry;
RTC_CATCH_BEGIN;
RTC_TRACE(rtcGetGeometryTransform);
+ //RTC_ENTER_DEVICE(hgeometry); // no allocation required
const AffineSpace3fa transform = geometry->getTransform(time);
storeTransform(transform, format, (float*)xfm);
RTC_CATCH_END2(geometry);
}
- RTC_API void rtcFilterIntersection(const struct RTCIntersectFunctionNArguments* const args_i, const struct RTCFilterFunctionNArguments* filter_args)
+ RTC_API void rtcGetGeometryTransformEx(RTCGeometry hgeometry, unsigned int instPrimID, float time, RTCFormat format, void* xfm)
+ {
+ Geometry* geometry = (Geometry*) hgeometry;
+ RTC_CATCH_BEGIN;
+ RTC_TRACE(rtcGetGeometryTransformEx);
+ //RTC_ENTER_DEVICE(hgeometry); // no allocation required
+ const AffineSpace3fa transform = geometry->getTransform(instPrimID, time);
+ storeTransform(transform, format, (float*)xfm);
+ RTC_CATCH_END2(geometry);
+ }
+
+ RTC_API void rtcGetGeometryTransformFromScene(RTCScene hscene, unsigned int geomID, float time, RTCFormat format, void* xfm)
+ {
+ Scene* scene = (Scene*) hscene;
+ RTC_CATCH_BEGIN;
+ RTC_TRACE(rtcGetGeometryTransformFromScene);
+ //RTC_ENTER_DEVICE(hscene); // no allocation required
+ const AffineSpace3fa transform = scene->get(geomID)->getTransform(time);
+ storeTransform(transform, format, (float*)xfm);
+ RTC_CATCH_END2(scene);
+ }
+
+ RTC_API void rtcInvokeIntersectFilterFromGeometry(const struct RTCIntersectFunctionNArguments* const args_i, const struct RTCFilterFunctionNArguments* filter_args)
{
IntersectFunctionNArguments* args = (IntersectFunctionNArguments*) args_i;
- isa::reportIntersection1(args, filter_args);
+ if (args->geometry->intersectionFilterN)
+ args->geometry->intersectionFilterN(filter_args);
}
- RTC_API void rtcFilterOcclusion(const struct RTCOccludedFunctionNArguments* const args_i, const struct RTCFilterFunctionNArguments* filter_args)
+ RTC_API void rtcInvokeOccludedFilterFromGeometry(const struct RTCOccludedFunctionNArguments* const args_i, const struct RTCFilterFunctionNArguments* filter_args)
{
OccludedFunctionNArguments* args = (OccludedFunctionNArguments*) args_i;
- isa::reportOcclusion1(args,filter_args);
+ if (args->geometry->occlusionFilterN)
+ args->geometry->occlusionFilterN(filter_args);
}
RTC_API RTCGeometry rtcNewGeometry (RTCDevice hdevice, RTCGeometryType type)
@@ -1112,6 +1313,7 @@ RTC_NAMESPACE_BEGIN;
Device* device = (Device*) hdevice;
RTC_CATCH_BEGIN;
RTC_TRACE(rtcNewGeometry);
+ RTC_ENTER_DEVICE(hdevice);
RTC_VERIFY_HANDLE(hdevice);
switch (type)
@@ -1262,6 +1464,18 @@ RTC_NAMESPACE_BEGIN;
#endif
}
+ case RTC_GEOMETRY_TYPE_INSTANCE_ARRAY:
+ {
+#if defined(EMBREE_GEOMETRY_INSTANCE_ARRAY)
+ createInstanceArrayTy createInstanceArray = nullptr;
+ SELECT_SYMBOL_DEFAULT_AVX_AVX2_AVX512(device->enabled_cpu_features,createInstanceArray);
+ Geometry* geom = createInstanceArray(device);
+ return (RTCGeometry) geom->refInc();
+#else
+ throw_RTCError(RTC_ERROR_UNKNOWN,"RTC_GEOMETRY_TYPE_INSTANCE_ARRAY is not supported");
+#endif
+ }
+
case RTC_GEOMETRY_TYPE_GRID:
{
#if defined(EMBREE_GEOMETRY_GRID)
@@ -1288,6 +1502,7 @@ RTC_NAMESPACE_BEGIN;
RTC_CATCH_BEGIN;
RTC_TRACE(rtcSetGeometryUserPrimitiveCount);
RTC_VERIFY_HANDLE(hgeometry);
+ RTC_ENTER_DEVICE(hgeometry);
if (unlikely(geometry->getType() != Geometry::GTY_USER_GEOMETRY))
throw_RTCError(RTC_ERROR_INVALID_OPERATION,"operation only allowed for user geometries");
@@ -1302,6 +1517,7 @@ RTC_NAMESPACE_BEGIN;
RTC_CATCH_BEGIN;
RTC_TRACE(rtcSetGeometryTimeStepCount);
RTC_VERIFY_HANDLE(hgeometry);
+ RTC_ENTER_DEVICE(hgeometry);
if (timeStepCount > RTC_MAX_TIME_STEP_COUNT)
throw_RTCError(RTC_ERROR_INVALID_ARGUMENT,"number of time steps is out of range");
@@ -1316,6 +1532,7 @@ RTC_NAMESPACE_BEGIN;
RTC_CATCH_BEGIN;
RTC_TRACE(rtcSetGeometryTimeRange);
RTC_VERIFY_HANDLE(hgeometry);
+ RTC_ENTER_DEVICE(hgeometry);
if (startTime > endTime)
throw_RTCError(RTC_ERROR_INVALID_ARGUMENT,"startTime has to be smaller or equal to the endTime");
@@ -1330,6 +1547,7 @@ RTC_NAMESPACE_BEGIN;
RTC_CATCH_BEGIN;
RTC_TRACE(rtcSetGeometryVertexAttributeCount);
RTC_VERIFY_HANDLE(hgeometry);
+ RTC_ENTER_DEVICE(hgeometry);
geometry->setVertexAttributeCount(N);
RTC_CATCH_END2(geometry);
}
@@ -1340,6 +1558,7 @@ RTC_NAMESPACE_BEGIN;
RTC_CATCH_BEGIN;
RTC_TRACE(rtcSetGeometryTopologyCount);
RTC_VERIFY_HANDLE(hgeometry);
+ RTC_ENTER_DEVICE(hgeometry);
geometry->setTopologyCount(N);
RTC_CATCH_END2(geometry);
}
@@ -1350,14 +1569,20 @@ RTC_NAMESPACE_BEGIN;
RTC_CATCH_BEGIN;
RTC_TRACE(rtcSetGeometryBuildQuality);
RTC_VERIFY_HANDLE(hgeometry);
+ RTC_ENTER_DEVICE(hgeometry);
+ // -- GODOT start --
+ // if (quality != RTC_BUILD_QUALITY_LOW &&
+ // quality != RTC_BUILD_QUALITY_MEDIUM &&
+ // quality != RTC_BUILD_QUALITY_HIGH &&
+ // quality != RTC_BUILD_QUALITY_REFIT)
+ // throw std::runtime_error("invalid build quality");
if (quality != RTC_BUILD_QUALITY_LOW &&
quality != RTC_BUILD_QUALITY_MEDIUM &&
quality != RTC_BUILD_QUALITY_HIGH &&
- quality != RTC_BUILD_QUALITY_REFIT)
- // -- GODOT start --
- // throw std::runtime_error("invalid build quality");
+ quality != RTC_BUILD_QUALITY_REFIT) {
abort();
- // -- GODOT end --
+ }
+ // -- GODOT end --
geometry->setBuildQuality(quality);
RTC_CATCH_END2(geometry);
}
@@ -1383,6 +1608,7 @@ RTC_NAMESPACE_BEGIN;
RTC_CATCH_BEGIN;
RTC_TRACE(rtcSetGeometryMask);
RTC_VERIFY_HANDLE(hgeometry);
+ RTC_ENTER_DEVICE(hgeometry);
geometry->setMask(mask);
RTC_CATCH_END2(geometry);
}
@@ -1393,6 +1619,7 @@ RTC_NAMESPACE_BEGIN;
RTC_CATCH_BEGIN;
RTC_TRACE(rtcSetGeometrySubdivisionMode);
RTC_VERIFY_HANDLE(hgeometry);
+ RTC_ENTER_DEVICE(hgeometry);
geometry->setSubdivisionMode(topologyID,mode);
RTC_CATCH_END2(geometry);
}
@@ -1403,6 +1630,7 @@ RTC_NAMESPACE_BEGIN;
RTC_CATCH_BEGIN;
RTC_TRACE(rtcSetGeometryVertexAttributeTopology);
RTC_VERIFY_HANDLE(hgeometry);
+ RTC_ENTER_DEVICE(hgeometry);
geometry->setVertexAttributeTopology(vertexAttributeID, topologyID);
RTC_CATCH_END2(geometry);
}
@@ -1415,6 +1643,7 @@ RTC_NAMESPACE_BEGIN;
RTC_TRACE(rtcSetGeometryBuffer);
RTC_VERIFY_HANDLE(hgeometry);
RTC_VERIFY_HANDLE(hbuffer);
+ RTC_ENTER_DEVICE(hgeometry);
if (geometry->device != buffer->device)
throw_RTCError(RTC_ERROR_INVALID_ARGUMENT,"inputs are from different devices");
@@ -1432,10 +1661,11 @@ RTC_NAMESPACE_BEGIN;
RTC_CATCH_BEGIN;
RTC_TRACE(rtcSetSharedGeometryBuffer);
RTC_VERIFY_HANDLE(hgeometry);
+ RTC_ENTER_DEVICE(hgeometry);
if (itemCount > 0xFFFFFFFFu)
throw_RTCError(RTC_ERROR_INVALID_ARGUMENT,"buffer too large");
-
+
Ref<Buffer> buffer = new Buffer(geometry->device, itemCount*byteStride, (char*)ptr + byteOffset);
geometry->setBuffer(type, slot, format, buffer, 0, byteStride, (unsigned int)itemCount);
RTC_CATCH_END2(geometry);
@@ -1447,6 +1677,7 @@ RTC_NAMESPACE_BEGIN;
RTC_CATCH_BEGIN;
RTC_TRACE(rtcSetNewGeometryBuffer);
RTC_VERIFY_HANDLE(hgeometry);
+ RTC_ENTER_DEVICE(hgeometry);
if (itemCount > 0xFFFFFFFFu)
throw_RTCError(RTC_ERROR_INVALID_ARGUMENT,"buffer too large");
@@ -1469,6 +1700,7 @@ RTC_NAMESPACE_BEGIN;
RTC_CATCH_BEGIN;
RTC_TRACE(rtcGetGeometryBufferData);
RTC_VERIFY_HANDLE(hgeometry);
+ RTC_ENTER_DEVICE(hgeometry);
return geometry->getBuffer(type, slot);
RTC_CATCH_END2(geometry);
return nullptr;
@@ -1480,6 +1712,7 @@ RTC_NAMESPACE_BEGIN;
RTC_CATCH_BEGIN;
RTC_TRACE(rtcEnableGeometry);
RTC_VERIFY_HANDLE(hgeometry);
+ RTC_ENTER_DEVICE(hgeometry);
geometry->enable();
RTC_CATCH_END2(geometry);
}
@@ -1490,6 +1723,7 @@ RTC_NAMESPACE_BEGIN;
RTC_CATCH_BEGIN;
RTC_TRACE(rtcUpdateGeometryBuffer);
RTC_VERIFY_HANDLE(hgeometry);
+ RTC_ENTER_DEVICE(hgeometry);
geometry->updateBuffer(type, slot);
RTC_CATCH_END2(geometry);
}
@@ -1500,6 +1734,7 @@ RTC_NAMESPACE_BEGIN;
RTC_CATCH_BEGIN;
RTC_TRACE(rtcDisableGeometry);
RTC_VERIFY_HANDLE(hgeometry);
+ RTC_ENTER_DEVICE(hgeometry);
geometry->disable();
RTC_CATCH_END2(geometry);
}
@@ -1510,6 +1745,7 @@ RTC_NAMESPACE_BEGIN;
RTC_CATCH_BEGIN;
RTC_TRACE(rtcSetGeometryTessellationRate);
RTC_VERIFY_HANDLE(hgeometry);
+ RTC_ENTER_DEVICE(hgeometry);
geometry->setTessellationRate(tessellationRate);
RTC_CATCH_END2(geometry);
}
@@ -1520,6 +1756,7 @@ RTC_NAMESPACE_BEGIN;
RTC_CATCH_BEGIN;
RTC_TRACE(rtcSetGeometryUserData);
RTC_VERIFY_HANDLE(hgeometry);
+ RTC_ENTER_DEVICE(hgeometry);
geometry->setUserData(ptr);
RTC_CATCH_END2(geometry);
}
@@ -1530,17 +1767,34 @@ RTC_NAMESPACE_BEGIN;
RTC_CATCH_BEGIN;
RTC_TRACE(rtcGetGeometryUserData);
RTC_VERIFY_HANDLE(hgeometry);
+ //RTC_ENTER_DEVICE(hgeometry); // do not enable for performance reasons !
return geometry->getUserData();
RTC_CATCH_END2(geometry);
return nullptr;
}
+ RTC_API void* rtcGetGeometryUserDataFromScene (RTCScene hscene, unsigned int geomID)
+ {
+ Scene* scene = (Scene*) hscene;
+ RTC_CATCH_BEGIN;
+ RTC_TRACE(rtcGetGeometryUserDataFromScene);
+#if defined(DEBUG)
+ RTC_VERIFY_HANDLE(hscene);
+ RTC_VERIFY_GEOMID(geomID);
+#endif
+ //RTC_ENTER_DEVICE(hscene); // do not enable for performance reasons
+ return scene->get(geomID)->getUserData();
+ RTC_CATCH_END2(scene);
+ return nullptr;
+ }
+
RTC_API void rtcSetGeometryBoundsFunction (RTCGeometry hgeometry, RTCBoundsFunction bounds, void* userPtr)
{
Geometry* geometry = (Geometry*) hgeometry;
RTC_CATCH_BEGIN;
RTC_TRACE(rtcSetGeometryBoundsFunction);
RTC_VERIFY_HANDLE(hgeometry);
+ RTC_ENTER_DEVICE(hgeometry);
geometry->setBoundsFunction(bounds,userPtr);
RTC_CATCH_END2(geometry);
}
@@ -1551,6 +1805,7 @@ RTC_NAMESPACE_BEGIN;
RTC_CATCH_BEGIN;
RTC_TRACE(rtcSetGeometryDisplacementFunction);
RTC_VERIFY_HANDLE(hgeometry);
+ RTC_ENTER_DEVICE(hgeometry);
geometry->setDisplacementFunction(displacement);
RTC_CATCH_END2(geometry);
}
@@ -1561,6 +1816,7 @@ RTC_NAMESPACE_BEGIN;
RTC_CATCH_BEGIN;
RTC_TRACE(rtcSetGeometryIntersectFunction);
RTC_VERIFY_HANDLE(hgeometry);
+ RTC_ENTER_DEVICE(hgeometry);
geometry->setIntersectFunctionN(intersect);
RTC_CATCH_END2(geometry);
}
@@ -1571,6 +1827,7 @@ RTC_NAMESPACE_BEGIN;
RTC_CATCH_BEGIN;
RTC_TRACE(rtcSetGeometryPointQueryFunction);
RTC_VERIFY_HANDLE(hgeometry);
+ RTC_ENTER_DEVICE(hgeometry);
geometry->setPointQueryFunction(pointQuery);
RTC_CATCH_END2(geometry);
}
@@ -1580,6 +1837,7 @@ RTC_NAMESPACE_BEGIN;
Geometry* geometry = (Geometry*) hgeometry;
RTC_CATCH_BEGIN;
RTC_TRACE(rtcGetGeometryFirstHalfEdge);
+ //RTC_ENTER_DEVICE(hgeometry); // do not enable for performance reasons
return geometry->getFirstHalfEdge(faceID);
RTC_CATCH_END2(geometry);
return -1;
@@ -1590,6 +1848,7 @@ RTC_NAMESPACE_BEGIN;
Geometry* geometry = (Geometry*) hgeometry;
RTC_CATCH_BEGIN;
RTC_TRACE(rtcGetGeometryFace);
+ //RTC_ENTER_DEVICE(hgeometry); // do not enable for performance reasons
return geometry->getFace(edgeID);
RTC_CATCH_END2(geometry);
return -1;
@@ -1600,6 +1859,7 @@ RTC_NAMESPACE_BEGIN;
Geometry* geometry = (Geometry*) hgeometry;
RTC_CATCH_BEGIN;
RTC_TRACE(rtcGetGeometryNextHalfEdge);
+ //RTC_ENTER_DEVICE(hgeometry); // do not enable for performance reasons
return geometry->getNextHalfEdge(edgeID);
RTC_CATCH_END2(geometry);
return -1;
@@ -1610,6 +1870,7 @@ RTC_NAMESPACE_BEGIN;
Geometry* geometry = (Geometry*) hgeometry;
RTC_CATCH_BEGIN;
RTC_TRACE(rtcGetGeometryPreviousHalfEdge);
+ //RTC_ENTER_DEVICE(hgeometry); // do not enable for performance reasons
return geometry->getPreviousHalfEdge(edgeID);
RTC_CATCH_END2(geometry);
return -1;
@@ -1620,6 +1881,7 @@ RTC_NAMESPACE_BEGIN;
Geometry* geometry = (Geometry*) hgeometry;
RTC_CATCH_BEGIN;
RTC_TRACE(rtcGetGeometryOppositeHalfEdge);
+ //RTC_ENTER_DEVICE(hgeometry); // do not enable for performance reasons
return geometry->getOppositeHalfEdge(topologyID,edgeID);
RTC_CATCH_END2(geometry);
return -1;
@@ -1631,6 +1893,7 @@ RTC_NAMESPACE_BEGIN;
RTC_CATCH_BEGIN;
RTC_TRACE(rtcSetOccludedFunctionN);
RTC_VERIFY_HANDLE(hgeometry);
+ RTC_ENTER_DEVICE(hgeometry);
geometry->setOccludedFunctionN(occluded);
RTC_CATCH_END2(geometry);
}
@@ -1641,6 +1904,7 @@ RTC_NAMESPACE_BEGIN;
RTC_CATCH_BEGIN;
RTC_TRACE(rtcSetGeometryIntersectFilterFunction);
RTC_VERIFY_HANDLE(hgeometry);
+ RTC_ENTER_DEVICE(hgeometry);
geometry->setIntersectionFilterFunctionN(filter);
RTC_CATCH_END2(geometry);
}
@@ -1651,10 +1915,22 @@ RTC_NAMESPACE_BEGIN;
RTC_CATCH_BEGIN;
RTC_TRACE(rtcSetGeometryOccludedFilterFunction);
RTC_VERIFY_HANDLE(hgeometry);
+ RTC_ENTER_DEVICE(hgeometry);
geometry->setOcclusionFilterFunctionN(filter);
RTC_CATCH_END2(geometry);
}
+ RTC_API void rtcSetGeometryEnableFilterFunctionFromArguments (RTCGeometry hgeometry, bool enable)
+ {
+ Geometry* geometry = (Geometry*) hgeometry;
+ RTC_CATCH_BEGIN;
+ RTC_TRACE(rtcSetGeometryEnableFilterFunctionFromArguments);
+ RTC_VERIFY_HANDLE(hgeometry);
+ RTC_ENTER_DEVICE(hgeometry);
+ geometry->enableFilterFunctionFromArguments(enable);
+ RTC_CATCH_END2(geometry);
+ }
+
RTC_API void rtcInterpolate(const RTCInterpolateArguments* const args)
{
Geometry* geometry = (Geometry*) args->geometry;
@@ -1663,6 +1939,7 @@ RTC_NAMESPACE_BEGIN;
#if defined(DEBUG)
RTC_VERIFY_HANDLE(args->geometry);
#endif
+ //RTC_ENTER_DEVICE(hgeometry); // do not enable for performance reasons
geometry->interpolate(args);
RTC_CATCH_END2(geometry);
}
@@ -1675,6 +1952,7 @@ RTC_NAMESPACE_BEGIN;
#if defined(DEBUG)
RTC_VERIFY_HANDLE(args->geometry);
#endif
+ // RTC_ENTER_DEVICE(hgeometry); // do not enable for performance reasons
geometry->interpolateN(args);
RTC_CATCH_END2(geometry);
}
@@ -1685,6 +1963,7 @@ RTC_NAMESPACE_BEGIN;
RTC_CATCH_BEGIN;
RTC_TRACE(rtcCommitGeometry);
RTC_VERIFY_HANDLE(hgeometry);
+ RTC_ENTER_DEVICE(hgeometry);
return geometry->commit();
RTC_CATCH_END2(geometry);
}
@@ -1697,6 +1976,7 @@ RTC_NAMESPACE_BEGIN;
RTC_TRACE(rtcAttachGeometry);
RTC_VERIFY_HANDLE(hscene);
RTC_VERIFY_HANDLE(hgeometry);
+ RTC_ENTER_DEVICE(hgeometry);
if (scene->device != geometry->device)
throw_RTCError(RTC_ERROR_INVALID_ARGUMENT,"inputs are from different devices");
return scene->bind(RTC_INVALID_GEOMETRY_ID,geometry);
@@ -1713,6 +1993,7 @@ RTC_NAMESPACE_BEGIN;
RTC_VERIFY_HANDLE(hscene);
RTC_VERIFY_HANDLE(hgeometry);
RTC_VERIFY_GEOMID(geomID);
+ RTC_ENTER_DEVICE(hscene);
if (scene->device != geometry->device)
throw_RTCError(RTC_ERROR_INVALID_ARGUMENT,"inputs are from different devices");
scene->bind(geomID,geometry);
@@ -1726,6 +2007,7 @@ RTC_NAMESPACE_BEGIN;
RTC_TRACE(rtcDetachGeometry);
RTC_VERIFY_HANDLE(hscene);
RTC_VERIFY_GEOMID(geomID);
+ RTC_ENTER_DEVICE(hscene);
scene->detachGeometry(geomID);
RTC_CATCH_END2(scene);
}
@@ -1736,6 +2018,7 @@ RTC_NAMESPACE_BEGIN;
RTC_CATCH_BEGIN;
RTC_TRACE(rtcRetainGeometry);
RTC_VERIFY_HANDLE(hgeometry);
+ RTC_ENTER_DEVICE(hgeometry);
geometry->refInc();
RTC_CATCH_END2(geometry);
}
@@ -1746,6 +2029,7 @@ RTC_NAMESPACE_BEGIN;
RTC_CATCH_BEGIN;
RTC_TRACE(rtcReleaseGeometry);
RTC_VERIFY_HANDLE(hgeometry);
+ RTC_ENTER_DEVICE(hgeometry);
geometry->refDec();
RTC_CATCH_END2(geometry);
}
@@ -1759,6 +2043,7 @@ RTC_NAMESPACE_BEGIN;
RTC_VERIFY_HANDLE(hscene);
RTC_VERIFY_GEOMID(geomID);
#endif
+ //RTC_ENTER_DEVICE(hscene); // do not enable for performance reasons
return (RTCGeometry) scene->get(geomID);
RTC_CATCH_END2(scene);
return nullptr;