commit 55b1acf320f0c193fbb309e5310c60d3fd922ae1
parent a6f79a578c164efef05dede0c938547b0ce9c30d
Author: Vincent Forest <vincent.forest@meso-star.com>
Date: Thu, 28 Jul 2016 12:07:14 +0200
Push further the sample tests on multiple sessions
Diffstat:
1 file changed, 290 insertions(+), 14 deletions(-)
diff --git a/src/test_s3d_session.c b/src/test_s3d_session.c
@@ -97,6 +97,14 @@ static const unsigned plane_ntris = sizeof(plane_ids) / sizeof(unsigned[3]);
/*******************************************************************************
* helper function
******************************************************************************/
+static float
+rand_canonic(void)
+{
+ int r;
+ while((r = rand()) == RAND_MAX);
+ return (float)r / (float)RAND_MAX;
+}
+
static void
get_ids(const unsigned itri, unsigned ids[3], void* data)
{
@@ -183,8 +191,8 @@ test_trace_ray
struct s3d_session* session;
struct s3d_session* session2;
struct s3d_session* session3;
- struct s3d_shape* inst_cube0;
- struct s3d_shape* inst_cube1;
+ struct s3d_shape* inst0;
+ struct s3d_shape* inst1;
struct s3d_hit hit, hit2;
float org[3], dir[3], range[2];
unsigned icube;
@@ -288,19 +296,19 @@ test_trace_ray
CHECK(s3d_session_ref_put(session), RES_OK);
CHECK(s3d_session_ref_put(session2), RES_OK);
- CHECK(s3d_scene_instantiate(scn2, &inst_cube0), RES_OK);
- CHECK(s3d_scene_instantiate(scn2, &inst_cube1), RES_OK);
- CHECK(s3d_shape_get_id(inst_cube0, &iinst0), RES_OK);
- CHECK(s3d_shape_get_id(inst_cube1, &iinst1), RES_OK);
+ CHECK(s3d_scene_instantiate(scn2, &inst0), RES_OK);
+ CHECK(s3d_scene_instantiate(scn2, &inst1), RES_OK);
+ CHECK(s3d_shape_get_id(inst0, &iinst0), RES_OK);
+ CHECK(s3d_shape_get_id(inst1, &iinst1), RES_OK);
CHECK(s3d_instance_translate
- (inst_cube0, S3D_WORLD_TRANSFORM, f3(org,-2.f, 0.f, 0.f)), RES_OK);
+ (inst0, S3D_WORLD_TRANSFORM, f3(org,-2.f, 0.f, 0.f)), RES_OK);
CHECK(s3d_instance_translate
- (inst_cube1, S3D_WORLD_TRANSFORM, f3(org, 2.f, 0.f, 0.f)), RES_OK);
+ (inst1, S3D_WORLD_TRANSFORM, f3(org, 2.f, 0.f, 0.f)), RES_OK);
- CHECK(s3d_scene_attach_shape(scn3, inst_cube0), RES_OK);
- CHECK(s3d_scene_attach_shape(scn3, inst_cube1), RES_OK);
- CHECK(s3d_scene_attach_shape(scn, inst_cube0), RES_OK);
- CHECK(s3d_scene_attach_shape(scn, inst_cube1), RES_OK);
+ CHECK(s3d_scene_attach_shape(scn3, inst0), RES_OK);
+ CHECK(s3d_scene_attach_shape(scn3, inst1), RES_OK);
+ CHECK(s3d_scene_attach_shape(scn, inst0), RES_OK);
+ CHECK(s3d_scene_attach_shape(scn, inst1), RES_OK);
CHECK(s3d_session_create(scn, S3D_TRACE, &session), RES_OK);
CHECK(s3d_session_create(scn3, S3D_TRACE, &session3), RES_OK);
@@ -465,11 +473,278 @@ test_trace_ray
CHECK(s3d_session_ref_put(session), RES_OK);
CHECK(s3d_session_ref_put(session3), RES_OK);
- CHECK(s3d_shape_ref_put(inst_cube0), RES_OK);
- CHECK(s3d_shape_ref_put(inst_cube1), RES_OK);
+ CHECK(s3d_shape_ref_put(inst0), RES_OK);
+ CHECK(s3d_shape_ref_put(inst1), RES_OK);
+ CHECK(s3d_scene_ref_put(scn), RES_OK);
+ CHECK(s3d_scene_ref_put(scn2), RES_OK);
+ CHECK(s3d_scene_ref_put(scn3), RES_OK);
+}
+
+static void
+test_sample
+ (struct s3d_device* dev,
+ struct s3d_shape* cube,
+ struct s3d_shape* plane)
+{
+ #define NSAMPS 512
+ struct s3d_scene* scn;
+ struct s3d_scene* scn2;
+ struct s3d_scene* scn3;
+ struct s3d_session* session;
+ struct s3d_session* session3;
+ struct s3d_shape* inst0;
+ struct s3d_shape* inst1;
+ struct s3d_primitive prims[NSAMPS];
+ float u, v, w, st[2];
+ float pos[3];
+ unsigned icube;
+ unsigned iplane;
+ unsigned iinst0;
+ unsigned iinst1;
+ int nsamps_cube;
+ int nsamps_plane;
+ int nsamps_inst0;
+ int nsamps_inst1;
+ int i;
+
+ CHECK(s3d_scene_create(dev, &scn), RES_OK);
+ CHECK(s3d_scene_create(dev, &scn2), RES_OK);
+ CHECK(s3d_scene_create(dev, &scn3), RES_OK);
+ CHECK(s3d_scene_attach_shape(scn, cube), RES_OK);
+ CHECK(s3d_scene_attach_shape(scn, plane), RES_OK);
+ CHECK(s3d_shape_get_id(cube, &icube), RES_OK);
+ CHECK(s3d_shape_get_id(plane, &iplane), RES_OK);
+
+ CHECK(s3d_session_create(scn, S3D_TRACE, &session), RES_OK);
+ CHECK(s3d_session_sample(session, 0.f, 0.f, 0.f, &prims[0], st), RES_BAD_OP);
+ CHECK(s3d_session_ref_put(session), RES_OK);
+
+ CHECK(s3d_session_create(scn, S3D_SAMPLE, &session), RES_OK);
+ CHECK(s3d_session_sample(session, 0.f, 0.f, 0.f, &prims[0], st), RES_OK);
+ CHECK(prims[0].inst_id, S3D_INVALID_ID);
+ CHECK(prims[0].geom_id == icube || prims[0].geom_id == iplane, 1);
+
+ nsamps_cube = 0;
+ nsamps_plane = 0;
+ srand(0);
+ FOR_EACH(i, 0, NSAMPS) {
+ u = rand_canonic(), v = rand_canonic(), w = rand_canonic();
+ CHECK(s3d_session_sample(session, u, v, w, &prims[i], st), RES_OK);
+ CHECK(prims[i].inst_id, S3D_INVALID_ID);
+ if(prims[i].geom_id == icube) {
+ ++nsamps_cube;
+ } else {
+ CHECK(prims[i].geom_id, iplane);
+ ++nsamps_plane;
+ }
+ }
+ NCHECK(nsamps_cube, 0);
+ NCHECK(nsamps_plane, 0);
+
+ CHECK(s3d_shape_enable(cube, 0), RES_OK);
+ srand(0);
+ FOR_EACH(i, 0, NSAMPS) {
+ struct s3d_primitive prim;
+ u = rand_canonic(), v = rand_canonic(), w = rand_canonic();
+ CHECK(s3d_session_sample(session, u, v, w, &prim, st), RES_OK);
+ CHECK(S3D_PRIMITIVE_EQ(&prim, &prims[i]), 1);
+ }
+
+ CHECK(s3d_session_ref_put(session), RES_OK);
+ CHECK(s3d_session_create(scn, S3D_SAMPLE, &session), RES_OK);
+
+ srand(0);
+ FOR_EACH(i, 0, NSAMPS) {
+ u = rand_canonic(), v = rand_canonic(), w = rand_canonic();
+ CHECK(s3d_session_sample(session, u, v, w, &prims[i], st), RES_OK);
+ CHECK(prims[i].inst_id, S3D_INVALID_ID);
+ CHECK(prims[i].geom_id, iplane);
+ }
+
+ CHECK(s3d_session_ref_put(session), RES_OK);
+
+ CHECK(s3d_shape_enable(cube, 1), RES_OK);
+ CHECK(s3d_scene_attach_shape(scn2, cube), RES_OK);
+ CHECK(s3d_scene_instantiate(scn2, &inst0), RES_OK);
+ CHECK(s3d_scene_instantiate(scn2, &inst1), RES_OK);
+ CHECK(s3d_shape_get_id(inst0, &iinst0), RES_OK);
+ CHECK(s3d_shape_get_id(inst1, &iinst1), RES_OK);
+ CHECK(s3d_instance_translate
+ (inst0, S3D_WORLD_TRANSFORM, f3(pos,-2.f, 0.f, 0.f)), RES_OK);
+ CHECK(s3d_instance_translate
+ (inst1, S3D_WORLD_TRANSFORM, f3(pos, 2.f, 0.f, 0.f)), RES_OK);
+
+ CHECK(s3d_scene_attach_shape(scn, inst0), RES_OK);
+ CHECK(s3d_scene_attach_shape(scn, inst1), RES_OK);
+ CHECK(s3d_scene_attach_shape(scn3, inst0), RES_OK);
+ CHECK(s3d_scene_attach_shape(scn3, inst1), RES_OK);
+
+ CHECK(s3d_session_create(scn, S3D_SAMPLE, &session), RES_OK);
+ CHECK(s3d_session_create(scn3, S3D_SAMPLE, &session3), RES_OK);
+
+ CHECK(s3d_scene_detach_shape(scn2, cube), RES_OK);
+
+ nsamps_cube = 0;
+ nsamps_inst0 = 0;
+ nsamps_inst1 = 0;
+ nsamps_plane = 0;
+ srand(0);
+ FOR_EACH(i, 0, NSAMPS) {
+ u = rand_canonic(), v = rand_canonic(), w = rand_canonic();
+ CHECK(s3d_session_sample(session, u, v, w, &prims[i], st), RES_OK);
+ if(prims[i].inst_id != S3D_INVALID_ID) {
+ CHECK(prims[i].geom_id, icube);
+ if(prims[i].inst_id == iinst0) {
+ ++nsamps_inst0;
+ } else {
+ CHECK(prims[i].inst_id, iinst1);
+ ++nsamps_inst1;
+ }
+ } else {
+ if(prims[i].geom_id == icube) {
+ ++nsamps_cube;
+ } else {
+ CHECK(prims[i].geom_id, iplane);
+ ++nsamps_plane;
+ }
+ }
+
+ }
+ NCHECK(nsamps_cube, 0);
+ NCHECK(nsamps_inst0, 0);
+ NCHECK(nsamps_inst1, 0);
+ NCHECK(nsamps_plane, 0);
+
+ nsamps_inst0 = 0;
+ nsamps_inst1 = 0;
+ srand(0);
+ FOR_EACH(i, 0, NSAMPS) {
+ u = rand_canonic(), v = rand_canonic(), w = rand_canonic();
+ CHECK(s3d_session_sample(session3, u, v, w, &prims[i], st), RES_OK);
+ CHECK(prims[i].geom_id, icube);
+ if(prims[i].inst_id == iinst0) {
+ ++nsamps_inst0;
+ } else {
+ CHECK(prims[i].inst_id, iinst1);
+ ++nsamps_inst1;
+ }
+ }
+ NCHECK(nsamps_inst0, 0);
+ NCHECK(nsamps_inst1, 0);
+
+ CHECK(s3d_session_ref_put(session), RES_OK);
+ CHECK(s3d_session_create(scn, S3D_SAMPLE, &session), RES_OK);
+
+ nsamps_cube = 0;
+ nsamps_plane = 0;
+ srand(0);
+ FOR_EACH(i, 0, NSAMPS) {
+ u = rand_canonic(), v = rand_canonic(), w = rand_canonic();
+ CHECK(s3d_session_sample(session, u, v, w, &prims[i], st), RES_OK);
+ CHECK(prims[i].inst_id, S3D_INVALID_ID);
+ if(prims[i].geom_id == icube) {
+ ++nsamps_cube;
+ } else {
+ CHECK(prims[i].geom_id, iplane);
+ ++nsamps_plane;
+ }
+ }
+ NCHECK(nsamps_cube, 0);
+ NCHECK(nsamps_plane, 0);
+
+ nsamps_inst0 = 0;
+ nsamps_inst1 = 0;
+ srand(0);
+ FOR_EACH(i, 0, NSAMPS) {
+ u = rand_canonic(), v = rand_canonic(), w = rand_canonic();
+ CHECK(s3d_session_sample(session3, u, v, w, &prims[i], st), RES_OK);
+ CHECK(prims[i].geom_id, icube);
+ if(prims[i].inst_id == iinst0) {
+ ++nsamps_inst0;
+ } else {
+ CHECK(prims[i].inst_id, iinst1);
+ ++nsamps_inst1;
+ }
+ }
+ NCHECK(nsamps_inst0, 0);
+ NCHECK(nsamps_inst1, 0);
+
+ CHECK(s3d_scene_attach_shape(scn2, plane), RES_OK);
+
+ CHECK(s3d_session_ref_put(session), RES_OK);
+ CHECK(s3d_session_create(scn, S3D_SAMPLE, &session), RES_OK);
+
+ FOR_EACH(i, 0, NSAMPS) {
+ u = rand_canonic(), v = rand_canonic(), w = rand_canonic();
+ CHECK(s3d_session_sample(session, u, v, w, &prims[i], st), RES_OK);
+ if(prims[i].inst_id != S3D_INVALID_ID) {
+ CHECK(prims[i].geom_id, iplane);
+ if(prims[i].inst_id == iinst0) {
+ ++nsamps_inst0;
+ } else {
+ CHECK(prims[i].inst_id, iinst1);
+ ++nsamps_inst1;
+ }
+ } else {
+ if(prims[i].geom_id == icube) {
+ ++nsamps_cube;
+ } else {
+ CHECK(prims[i].geom_id, iplane);
+ ++nsamps_plane;
+ }
+ }
+
+ }
+ NCHECK(nsamps_cube, 0);
+ NCHECK(nsamps_inst0, 0);
+ NCHECK(nsamps_inst1, 0);
+ NCHECK(nsamps_plane, 0);
+
+ nsamps_inst0 = 0;
+ nsamps_inst1 = 0;
+ srand(0);
+ FOR_EACH(i, 0, NSAMPS) {
+ u = rand_canonic(), v = rand_canonic(), w = rand_canonic();
+ CHECK(s3d_session_sample(session3, u, v, w, &prims[i], st), RES_OK);
+ CHECK(prims[i].geom_id, icube);
+ if(prims[i].inst_id == iinst0) {
+ ++nsamps_inst0;
+ } else {
+ CHECK(prims[i].inst_id, iinst1);
+ ++nsamps_inst1;
+ }
+ }
+ NCHECK(nsamps_inst0, 0);
+ NCHECK(nsamps_inst1, 0);
+
+ CHECK(s3d_session_ref_put(session), RES_OK);
+ CHECK(s3d_session_ref_put(session3), RES_OK);
+
+ CHECK(s3d_session_create(scn3, S3D_SAMPLE, &session3), RES_OK);
+ nsamps_inst0 = 0;
+ nsamps_inst1 = 0;
+ srand(0);
+ FOR_EACH(i, 0, NSAMPS) {
+ u = rand_canonic(), v = rand_canonic(), w = rand_canonic();
+ CHECK(s3d_session_sample(session3, u, v, w, &prims[i], st), RES_OK);
+ CHECK(prims[i].geom_id, iplane);
+ if(prims[i].inst_id == iinst0) {
+ ++nsamps_inst0;
+ } else {
+ CHECK(prims[i].inst_id, iinst1);
+ ++nsamps_inst1;
+ }
+ }
+ NCHECK(nsamps_inst0, 0);
+ NCHECK(nsamps_inst1, 0);
+
+ CHECK(s3d_session_ref_put(session3), RES_OK);
+
CHECK(s3d_scene_ref_put(scn), RES_OK);
CHECK(s3d_scene_ref_put(scn2), RES_OK);
CHECK(s3d_scene_ref_put(scn3), RES_OK);
+ CHECK(s3d_shape_ref_put(inst0), RES_OK);
+ CHECK(s3d_shape_ref_put(inst1), RES_OK);
}
/*******************************************************************************
@@ -508,6 +783,7 @@ main(int argc, char** argv)
test_miscellaneous(dev, cube, plane);
test_trace_ray(dev, cube, plane);
+ test_sample(dev, cube, plane);
CHECK(s3d_shape_ref_put(cube), RES_OK);
CHECK(s3d_shape_ref_put(plane), RES_OK);