commit b230ebbce26e91418b39693d22985641316fda39
parent b695e6b6ce02976610a0532c485ed9aa9d72a1f0
Author: Vincent Forest <vincent.forest@meso-star.com>
Date: Thu, 19 Jul 2018 15:48:36 +0200
The init/release of the BSDF/fresnel/microfacet/phase types can be NULL
Diffstat:
16 files changed, 119 insertions(+), 181 deletions(-)
diff --git a/src/ssf.h b/src/ssf.h
@@ -62,8 +62,8 @@ enum ssf_bxdf_flag {
* consequence the reflected or refracted direction `wi' must point on the same
* side or on the opposite side of `N', respectively. */
struct ssf_bsdf_type {
- res_T (*init)(struct mem_allocator* allocator, void* bsdf);
- void (*release)(void* bsdf);
+ res_T (*init)(struct mem_allocator* allocator, void* bsdf); /* Can be NULL */
+ void (*release)(void* bsdf); /* Can be NULL */
/* Sample a direction `wi' wrt `wo' whose pdf is BSDF(wo, wi) |wi.n|. Return
* the value of BSDF(wo, wi) */
@@ -94,15 +94,15 @@ struct ssf_bsdf_type {
const double wi[3]);/* Normalized incoming direction */
size_t sizeof_bsdf; /* In Bytes */
- size_t alignof_bsdf; /* In Bytes */
+ size_t alignof_bsdf; /* In Bytes. Must be a power of 2 */
};
#define SSF_BSDF_TYPE_NULL__ {NULL, NULL, NULL, NULL, NULL, 0, 1}
static const struct ssf_bsdf_type SSF_BXDF_TYPE_NULL = SSF_BSDF_TYPE_NULL__;
/* Generic Fresnel term descriptor */
struct ssf_fresnel_type {
- res_T (*init)(struct mem_allocator* allocator, void* fresnel);
- void (*release)(void* bxdf);
+ res_T (*init)(struct mem_allocator* allocator, void* fresnel); /* Can be NULL */
+ void (*release)(void* bxdf); /* Can be NULL */
double
(*eval)
@@ -110,7 +110,7 @@ struct ssf_fresnel_type {
const double cos_wi_N); /* Cosine between facet normal and incoming dir */
size_t sizeof_fresnel; /* In Bytes */
- size_t alignof_fresnel; /* In Bytes */
+ size_t alignof_fresnel; /* In Bytes. Must be a power of 2 */
};
#define SSF_FRESNEL_TYPE_NULL__ {NULL, NULL, NULL, 0, 1}
static const struct ssf_fresnel_type SSF_FRESNEL_TYPE_NULL =
@@ -118,8 +118,8 @@ static const struct ssf_fresnel_type SSF_FRESNEL_TYPE_NULL =
/* Generic descriptor of a microfacet distribution */
struct ssf_microfacet_distribution_type {
- res_T (*init)(struct mem_allocator* allocator, void* distrib);
- void (*release)(void* distrib);
+ res_T (*init)(struct mem_allocator* allocator, void* distrib); /* Can be NULL */
+ void (*release)(void* distrib); /* Can be NULL */
void
(*sample)
@@ -142,7 +142,7 @@ struct ssf_microfacet_distribution_type {
const double wh[3]); /* Normalized half vector */
size_t sizeof_distribution; /* In Bytes */
- size_t alignof_distribution; /* In Bytes */
+ size_t alignof_distribution; /* In Bytes. Must be a Power of 2 */
};
#define SSF_MICROFACET_DISTRIBUTION_TYPE_NULL__ \
{NULL, NULL, NULL, NULL, NULL, 0, 1}
@@ -153,12 +153,11 @@ SSF_MICROFACET_DISTRIBUTION_TYPE_NULL = SSF_MICROFACET_DISTRIBUTION_TYPE_NULL__;
* direction `wo' and the incoming direction `wi' point outward the scattering
* point */
struct ssf_phase_type {
- res_T (*init)(struct mem_allocator* allocator, void* bsdf);
- void (*release)(void* bsdf);
+ res_T (*init)(struct mem_allocator* allocator, void* bsdf); /*Can be NULL*/
+ void (*release)(void* bsdf); /* Can be NULL */
- /* Sample a direction `wi' wrt `wo'. TODO comment the PDF and the return
- * value */
- double
+ /* Sample a direction `wi' wrt `wo'. TODO comment the PDF */
+ double /* FIXME */
(*sample)
(void* phase,
struct ssp_rng* rng, /* Random number generator */
@@ -180,7 +179,7 @@ struct ssf_phase_type {
const double wi[3]); /* Normalized incoming direction */
size_t sizeof_phase; /* In Bytes */
- size_t alignof_phase; /* In Bytes */
+ size_t alignof_phase; /* In Bytes. Must be a power of 2 */
};
#define SSF_PHASE_TYPE_NULL__ {NULL,NULL,NULL,NULL,NULL,0,1}
static const struct ssf_phase_type SSF_PHASE_TYPE_NULL = SSF_PHASE_TYPE_NULL__;
@@ -303,6 +302,10 @@ SSF_API const struct ssf_microfacet_distribution_type ssf_pillbox_distribution;
* TODO add comments */
SSF_API const struct ssf_phase_type ssf_phase_hg;
+/* Rayleigh phase function
+ * TODO add comments */
+SSF_API const struct ssf_phase_type ssf_phase_rayleigh;
+
/*******************************************************************************
* BSDF API - Bidirectional Scattering Distribution Function. Describes the way
* the light is scattered by a surface. Note that by convention the outgoing
diff --git a/src/ssf_beckmann_distribution.c b/src/ssf_beckmann_distribution.c
@@ -37,10 +37,6 @@ beckmann_distribution_init(struct mem_allocator* allocator, void* distrib)
return RES_OK;
}
-static void
-beckmann_distribution_release(void* distrib)
-{ (void)distrib; }
-
static double
beckmann_distribution_eval
(void* distrib, const double N[3], const double wh[3])
@@ -121,7 +117,7 @@ beckmann_distribution_pdf
******************************************************************************/
const struct ssf_microfacet_distribution_type ssf_beckmann_distribution = {
beckmann_distribution_init,
- beckmann_distribution_release,
+ NULL,
beckmann_distribution_sample,
beckmann_distribution_eval,
beckmann_distribution_pdf,
diff --git a/src/ssf_blinn_distribution.c b/src/ssf_blinn_distribution.c
@@ -37,10 +37,6 @@ blinn_distribution_init(struct mem_allocator* allocator, void* distrib)
return RES_OK;
}
-static void
-blinn_distribution_release(void* distrib)
-{ (void)distrib; }
-
static double
blinn_distribution_eval(void* distrib, const double N[3], const double wh[3])
{
@@ -102,7 +98,7 @@ blinn_distribution_pdf(void* distrib, const double N[3], const double wh[3])
******************************************************************************/
const struct ssf_microfacet_distribution_type ssf_blinn_distribution = {
blinn_distribution_init,
- blinn_distribution_release,
+ NULL,
blinn_distribution_sample,
blinn_distribution_eval,
blinn_distribution_pdf,
diff --git a/src/ssf_bsdf.c b/src/ssf_bsdf.c
@@ -29,8 +29,6 @@ static INLINE int
check_bsdf_type(const struct ssf_bsdf_type* type)
{
return type
- && type->init
- && type->release
&& type->sample
&& type->eval
&& type->pdf
@@ -43,7 +41,7 @@ bsdf_release(ref_T* ref)
struct ssf_bsdf* bsdf = CONTAINER_OF(ref, struct ssf_bsdf, ref);
ASSERT(ref);
if(bsdf->data) {
- bsdf->type.release(bsdf->data);
+ if(bsdf->type.release) bsdf->type.release(bsdf->data);
MEM_RM(bsdf->allocator, bsdf->data);
}
MEM_RM(bsdf->allocator, bsdf);
@@ -76,15 +74,19 @@ ssf_bsdf_create
bsdf->allocator = mem_allocator;
bsdf->type = *type;
- bsdf->data = MEM_ALLOC_ALIGNED
- (bsdf->allocator, bsdf->type.sizeof_bsdf, bsdf->type.alignof_bsdf);
- if(!bsdf->data) {
- res = RES_MEM_ERR;
- goto error;
+ if(bsdf->type.sizeof_bsdf) {
+ bsdf->data = MEM_ALLOC_ALIGNED
+ (bsdf->allocator, bsdf->type.sizeof_bsdf, bsdf->type.alignof_bsdf);
+ if(!bsdf->data) {
+ res = RES_MEM_ERR;
+ goto error;
+ }
+ memset(bsdf->data, 0, bsdf->type.sizeof_bsdf);
+ if(bsdf->type.init) {
+ res = bsdf->type.init(mem_allocator, bsdf->data);
+ if(res != RES_OK) goto error;
+ }
}
- memset(bsdf->data, 0, bsdf->type.sizeof_bsdf);
- res = bsdf->type.init(mem_allocator, bsdf->data);
- if(res != RES_OK) goto error;
exit:
if(out_bsdf) *out_bsdf = bsdf;
diff --git a/src/ssf_fresnel.c b/src/ssf_fresnel.c
@@ -27,8 +27,6 @@ static INLINE int
check_fresnel_type(const struct ssf_fresnel_type* type)
{
return type
- && type->init
- && type->release
&& type->eval
&& IS_POW2(type->alignof_fresnel);
}
@@ -39,7 +37,7 @@ fresnel_release(ref_T* ref)
struct ssf_fresnel* fresnel = CONTAINER_OF(ref, struct ssf_fresnel, ref);
ASSERT(ref);
if(fresnel->data) {
- fresnel->type.release(fresnel->data);
+ if(fresnel->type.release) fresnel->type.release(fresnel->data);
MEM_RM(fresnel->allocator, fresnel->data);
}
MEM_RM(fresnel->allocator, fresnel);
@@ -73,15 +71,19 @@ ssf_fresnel_create
fresnel->allocator = mem_allocator;
fresnel->type = *type;
- fresnel->data = MEM_ALLOC_ALIGNED(fresnel->allocator,
- fresnel->type.sizeof_fresnel, fresnel->type.alignof_fresnel);
- if(!fresnel->data) {
- res = RES_MEM_ERR;
- goto error;
+ if(fresnel->type.sizeof_fresnel) {
+ fresnel->data = MEM_ALLOC_ALIGNED(fresnel->allocator,
+ fresnel->type.sizeof_fresnel, fresnel->type.alignof_fresnel);
+ if(!fresnel->data) {
+ res = RES_MEM_ERR;
+ goto error;
+ }
+ memset(fresnel->data, 0, fresnel->type.sizeof_fresnel);
+ if(fresnel->type.init) {
+ res = fresnel->type.init(fresnel->allocator, fresnel->data);
+ if(res != RES_OK) goto error;
+ }
}
- memset(fresnel->data, 0, fresnel->type.sizeof_fresnel);
- res = fresnel->type.init(fresnel->allocator, fresnel->data);
- if(res != RES_OK) goto error;
exit:
if(out_fresnel) *out_fresnel = fresnel;
diff --git a/src/ssf_fresnel_dielectric_conductor.c b/src/ssf_fresnel_dielectric_conductor.c
@@ -27,25 +27,6 @@ struct fresnel_dielectric_conductor {
/*******************************************************************************
* Private functions
******************************************************************************/
-static res_T
-fresnel_dielectric_conductor_init
- (struct mem_allocator* allocator, void* fresnel)
-{
- struct fresnel_dielectric_conductor* fc = fresnel;
- (void)allocator;
- ASSERT(fresnel);
- fc->eta_i = 0.0;
- fc->eta_t = 0.0;
- fc->eta_k_t = 0.0;
- return RES_OK;
-}
-
-static void
-fresnel_dielectric_conductor_release(void* fresnel)
-{
- (void)fresnel;
-}
-
/* Code from
* https://seblagarde.wordpress.com/2013/04/29/memo-on-fresnel-equations/ */
static double
@@ -85,8 +66,8 @@ fresnel_dielectric_conductor_eval(void* fresnel, const double cos_theta_i)
* Exported symbols
******************************************************************************/
const struct ssf_fresnel_type ssf_fresnel_dielectric_conductor = {
- fresnel_dielectric_conductor_init,
- fresnel_dielectric_conductor_release,
+ NULL,
+ NULL,
fresnel_dielectric_conductor_eval,
sizeof(struct fresnel_dielectric_conductor),
ALIGNOF(struct fresnel_dielectric_conductor)
@@ -100,7 +81,7 @@ ssf_fresnel_dielectric_conductor_setup
const double eta_k_t)
{
struct fresnel_dielectric_conductor* fc;
- if(!fresnel
+ if(!fresnel
|| !FRESNEL_TYPE_EQ(&fresnel->type, &ssf_fresnel_dielectric_conductor)) {
return RES_BAD_ARG;
}
diff --git a/src/ssf_fresnel_dielectric_dielectric.c b/src/ssf_fresnel_dielectric_dielectric.c
@@ -26,24 +26,6 @@ struct fresnel_dielectric_dielectric {
/*******************************************************************************
* Private functions
******************************************************************************/
-static res_T
-fresnel_dielectric_dielectric_init
- (struct mem_allocator* allocator, void* fresnel)
-{
- struct fresnel_dielectric_dielectric* fd = fresnel;
- (void)allocator;
- ASSERT(fresnel);
- fd->eta_i = 0.0;
- fd->eta_t = 0.0;
- return RES_OK;
-}
-
-static void
-fresnel_dielectric_dielectric_release(void* fresnel)
-{
- (void)fresnel;
-}
-
static double
fresnel_dielectric_dielectric_eval(void* fresnel, const double cos_theta_i)
{
@@ -81,8 +63,8 @@ fresnel_dielectric_dielectric_eval(void* fresnel, const double cos_theta_i)
* Exported symbols
******************************************************************************/
const struct ssf_fresnel_type ssf_fresnel_dielectric_dielectric = {
- fresnel_dielectric_dielectric_init,
- fresnel_dielectric_dielectric_release,
+ NULL,
+ NULL,
fresnel_dielectric_dielectric_eval,
sizeof(struct fresnel_dielectric_dielectric),
ALIGNOF(struct fresnel_dielectric_dielectric)
diff --git a/src/ssf_lambertian_reflection.c b/src/ssf_lambertian_reflection.c
@@ -28,19 +28,6 @@ struct lambertian_reflection {
/*******************************************************************************
* Private functions
******************************************************************************/
-static res_T
-lambertian_reflection_init(struct mem_allocator* allocator, void* bsdf)
-{
- ASSERT(bsdf);
- (void)allocator;
- ((struct lambertian_reflection*)bsdf)->reflectivity = 0.0;
- return RES_OK;
-}
-
-static void
-lambertian_reflection_release(void* bsdf)
-{ (void)bsdf; }
-
static double
lambertian_reflection_eval
(void* data, const double wo[3], const double N[3], const double wi[3])
@@ -90,8 +77,8 @@ lambertian_reflection_pdf
* Exorted symbols
******************************************************************************/
const struct ssf_bsdf_type ssf_lambertian_reflection = {
- lambertian_reflection_init,
- lambertian_reflection_release,
+ NULL,
+ NULL,
lambertian_reflection_sample,
lambertian_reflection_eval,
lambertian_reflection_pdf,
diff --git a/src/ssf_microfacet_distribution.c b/src/ssf_microfacet_distribution.c
@@ -30,8 +30,6 @@ check_microfacet_distribution_type
(const struct ssf_microfacet_distribution_type* type)
{
return type
- && type->init
- && type->release
&& type->sample
&& type->eval
&& type->pdf
@@ -45,7 +43,7 @@ microfacet_distribution_release(ref_T* ref)
CONTAINER_OF(ref, struct ssf_microfacet_distribution, ref);
ASSERT(ref);
if(distrib->data) {
- distrib->type.release(distrib->data);
+ if(distrib->type.release) distrib->type.release(distrib->data);
MEM_RM(distrib->allocator, distrib->data);
}
MEM_RM(distrib->allocator, distrib);
@@ -79,17 +77,21 @@ ssf_microfacet_distribution_create
distrib->allocator = mem_allocator;
distrib->type = *type;
- distrib->data = MEM_ALLOC_ALIGNED
- (distrib->allocator,
- distrib->type.sizeof_distribution,
- distrib->type.alignof_distribution);
- if(!distrib->data) {
- res = RES_MEM_ERR;
- goto error;
+ if(distrib->type.sizeof_distribution) {
+ distrib->data = MEM_ALLOC_ALIGNED
+ (distrib->allocator,
+ distrib->type.sizeof_distribution,
+ distrib->type.alignof_distribution);
+ if(!distrib->data) {
+ res = RES_MEM_ERR;
+ goto error;
+ }
+ memset(distrib->data, 0, distrib->type.sizeof_distribution);
+ if(distrib->type.init) {
+ res = distrib->type.init(mem_allocator, distrib->data);
+ if(res != RES_OK) goto error;
+ }
}
- memset(distrib->data, 0, distrib->type.sizeof_distribution);
- res = distrib->type.init(mem_allocator, distrib->data);
- if(res != RES_OK) goto error;
exit:
if(out_distrib) *out_distrib = distrib;
diff --git a/src/ssf_microfacet_reflection.c b/src/ssf_microfacet_reflection.c
@@ -27,17 +27,6 @@ struct microfacet_reflection {
/*******************************************************************************
* Microfacet functions
******************************************************************************/
-static res_T
-microfacet_reflection_init(struct mem_allocator* allocator, void* data)
-{
- struct microfacet_reflection* bsdf = data;
- ASSERT(bsdf);
- (void)allocator;
- bsdf->fresnel = NULL;
- bsdf->distrib = NULL;
- return RES_OK;
-}
-
static void
microfacet_reflection_release(void* data)
{
@@ -191,7 +180,7 @@ microfacet2_reflection_pdf
* Exported symbols
******************************************************************************/
const struct ssf_bsdf_type ssf_microfacet_reflection = {
- microfacet_reflection_init,
+ NULL,
microfacet_reflection_release,
microfacet_reflection_sample,
microfacet_reflection_eval,
@@ -201,7 +190,7 @@ const struct ssf_bsdf_type ssf_microfacet_reflection = {
};
const struct ssf_bsdf_type ssf_microfacet2_reflection = {
- microfacet_reflection_init,
+ NULL,
microfacet_reflection_release,
microfacet2_reflection_sample,
microfacet2_reflection_eval,
diff --git a/src/ssf_phase.c b/src/ssf_phase.c
@@ -29,8 +29,6 @@ static INLINE int
check_phase_type(const struct ssf_phase_type* type)
{
return type
- && type->init
- && type->release
&& type->sample
&& type->eval
&& type->pdf
@@ -43,7 +41,7 @@ phase_release(ref_T* ref)
struct ssf_phase* phase = CONTAINER_OF(ref, struct ssf_phase, ref);
ASSERT(ref);
if(phase->data) {
- phase->type.release(phase->data);
+ if(phase->type.release) phase->type.release(phase->data);
MEM_RM(phase->allocator, phase->data);
}
MEM_RM(phase->allocator, phase);
@@ -76,15 +74,19 @@ ssf_phase_create
phase->allocator = mem_allocator;
phase->type = *type;
- phase->data = MEM_ALLOC_ALIGNED
- (phase->allocator, phase->type.sizeof_phase, phase->type.alignof_phase);
- if(!phase->data) {
- res = RES_MEM_ERR;
- goto error;
+ if(phase->type.sizeof_phase) {
+ phase->data = MEM_ALLOC_ALIGNED
+ (phase->allocator, phase->type.sizeof_phase, phase->type.alignof_phase);
+ if(!phase->data) {
+ res = RES_MEM_ERR;
+ goto error;
+ }
+ memset(phase->data, 0, phase->type.sizeof_phase);
+ if(phase->type.init) {
+ res = phase->type.init(mem_allocator, phase->data);
+ if(res != RES_OK) goto error;
+ }
}
- memset(phase->data, 0, phase->type.sizeof_phase);
- res = phase->type.init(mem_allocator, phase->data);
- if(res != RES_OK) goto error;
exit:
if(out_phase) *out_phase = phase;
diff --git a/src/ssf_specular_reflection.c b/src/ssf_specular_reflection.c
@@ -26,14 +26,6 @@ struct specular_reflection {
/*******************************************************************************
* Private functions
******************************************************************************/
-static res_T
-specular_reflection_init(struct mem_allocator* allocator, void* bsdf)
-{
- ASSERT(bsdf);
- (void)allocator, (void)bsdf;
- return RES_OK;
-}
-
static void
specular_reflection_release(void* data)
{
@@ -88,7 +80,7 @@ specular_reflection_pdf
* Exported symbols
******************************************************************************/
const struct ssf_bsdf_type ssf_specular_reflection = {
- specular_reflection_init,
+ NULL,
specular_reflection_release,
specular_reflection_sample,
specular_reflection_eval,
diff --git a/src/test_ssf_bsdf.c b/src/test_ssf_bsdf.c
@@ -114,6 +114,7 @@ main(int argc, char** argv)
struct bsdf* data;
struct ssf_bsdf* bsdf;
struct ssf_bsdf_type type = SSF_BXDF_TYPE_NULL;
+ struct ssf_bsdf_type type2 = bsdf_dummy;
double wo[3];
double N[3];
double wi[4];
@@ -156,14 +157,14 @@ main(int argc, char** argv)
CHK(ssf_bsdf_ref_put(bsdf) == RES_OK);
CHK(bsdf_is_init == 0);
- type.init = NULL;
- CHK(ssf_bsdf_create(&allocator, &type, &bsdf) == RES_BAD_ARG);
- CHK(bsdf_is_init == 0);
- type.init = bsdf_init;
- type.release = NULL;
- CHK(ssf_bsdf_create(&allocator, &type, &bsdf) == RES_BAD_ARG);
- CHK(bsdf_is_init == 0);
- type.release = bsdf_release;
+ type2.init = NULL;
+ CHK(ssf_bsdf_create(&allocator, &type2, &bsdf) == RES_OK);
+ CHK(ssf_bsdf_ref_put(bsdf) == RES_OK);
+ type2.init = bsdf_dummy.init;
+ type2.release = NULL;
+ CHK(ssf_bsdf_create(&allocator, &type2, &bsdf) == RES_OK);
+ CHK(ssf_bsdf_ref_put(bsdf) == RES_OK);
+
type.sample = NULL;
CHK(ssf_bsdf_create(&allocator, &type, &bsdf) == RES_BAD_ARG);
CHK(bsdf_is_init == 0);
diff --git a/src/test_ssf_fresnel.c b/src/test_ssf_fresnel.c
@@ -60,6 +60,7 @@ main(int argc, char** argv)
struct fresnel* data;
struct ssf_fresnel* fresnel;
struct ssf_fresnel_type type = SSF_FRESNEL_TYPE_NULL;
+ struct ssf_fresnel_type type2 = fresnel_dummy;
(void)argc, (void)argv;
mem_init_proxy_allocator(&allocator, &mem_default_allocator);
@@ -96,14 +97,13 @@ main(int argc, char** argv)
CHK(ssf_fresnel_ref_put(fresnel) == RES_OK);
CHK(fresnel_is_init == 0);
- type.init = NULL;
- CHK(ssf_fresnel_create(&allocator, &type, &fresnel) == RES_BAD_ARG);
- CHK(fresnel_is_init == 0);
- type.init = fresnel_init;
- type.release = NULL;
- CHK(ssf_fresnel_create(&allocator, &type, &fresnel) == RES_BAD_ARG);
- CHK(fresnel_is_init == 0);
- type.release = fresnel_release;
+ type2.init = NULL;
+ CHK(ssf_fresnel_create(&allocator, &type2, &fresnel) == RES_OK);
+ CHK(ssf_fresnel_ref_put(fresnel) == RES_OK);
+ type2.init = fresnel_dummy.init;
+ CHK(ssf_fresnel_create(&allocator, &type2, &fresnel) == RES_OK);
+ CHK(ssf_fresnel_ref_put(fresnel) == RES_OK);
+
type.eval = NULL;
CHK(ssf_fresnel_create(&allocator, &type, &fresnel) == RES_BAD_ARG);
CHK(fresnel_is_init == 0);
diff --git a/src/test_ssf_microfacet_distribution.c b/src/test_ssf_microfacet_distribution.c
@@ -103,6 +103,7 @@ main(int argc, char** argv)
struct ufacet* data;
struct ssf_microfacet_distribution_type type =
SSF_MICROFACET_DISTRIBUTION_TYPE_NULL;
+ struct ssf_microfacet_distribution_type type2 = microfacet_dummy;
struct ssf_microfacet_distribution* distrib;
struct ssp_rng* rng;
double N[3], wh[3], pdf;
@@ -144,12 +145,14 @@ main(int argc, char** argv)
CHK(ssf_microfacet_distribution_ref_put(distrib) == RES_OK);
CHK(ufacet_is_init == 0);
- type.init = NULL;
- CHK(CREATE(&allocator, &type, &distrib) == RES_BAD_ARG);
- type.init = ufacet_init;
- type.release = NULL;
- CHK(CREATE(&allocator, &type, &distrib) == RES_BAD_ARG);
- type.release = ufacet_release;
+ type2.init = NULL;
+ CHK(CREATE(&allocator, &type2, &distrib) == RES_OK);
+ CHK(ssf_microfacet_distribution_ref_put(distrib) == RES_OK);
+ type2.init = microfacet_dummy.init;
+ type2.release = NULL;
+ CHK(CREATE(&allocator, &type2, &distrib) == RES_OK);
+ CHK(ssf_microfacet_distribution_ref_put(distrib) == RES_OK);
+
type.sample = NULL;
CHK(CREATE(&allocator, &type, &distrib) == RES_BAD_ARG);
type.sample = ufacet_sample;
diff --git a/src/test_ssf_phase.c b/src/test_ssf_phase.c
@@ -27,7 +27,6 @@ struct ALIGN(64) phase {
double value;
};
-
static res_T
phase_init(struct mem_allocator* allocator, void* phase)
{
@@ -101,6 +100,7 @@ main(int argc, char** argv)
struct ssp_rng* rng;
struct ssf_phase* phase = NULL;
struct ssf_phase_type type = SSF_PHASE_TYPE_NULL;
+ struct ssf_phase_type type2 = phase_dummy;
struct phase* data = NULL;
double wi[3];
double pdf;
@@ -136,14 +136,14 @@ main(int argc, char** argv)
CHK(ssf_phase_ref_put(phase) == RES_OK);
CHK(phase_is_init == 0);
- type.init = NULL;
- CHK(ssf_phase_create(&allocator, &type, &phase) == RES_BAD_ARG);
- CHK(phase_is_init == 0);
- type.init = phase_init;
- type.release = NULL;
- CHK(ssf_phase_create(&allocator, &type, &phase) == RES_BAD_ARG);
- CHK(phase_is_init == 0);
- type.release = phase_release;
+ type2.init = NULL;
+ CHK(ssf_phase_create(&allocator, &type2, &phase) == RES_OK);
+ CHK(ssf_phase_ref_put(phase) == RES_OK);
+ type2.init = phase_dummy.init;
+ type2.release = NULL;
+ CHK(ssf_phase_create(&allocator, &type2, &phase) == RES_OK);
+ CHK(ssf_phase_ref_put(phase) == RES_OK);
+
type.sample = NULL;
CHK(ssf_phase_create(&allocator, &type, &phase) == RES_BAD_ARG);
CHK(phase_is_init == 0);