test_ssol_material.c (12924B)
1 /* Copyright (C) 2018-2026 |Meso|Star> (contact@meso-star.com) 2 * Copyright (C) 2016, 2018 CNRS 3 * 4 * This program is free software: you can redistribute it and/or modify 5 * it under the terms of the GNU General Public License as published by 6 * the Free Software Foundation, either version 3 of the License, or 7 * (at your option) any later version. 8 * 9 * This program is distributed in the hope that it will be useful, 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 * GNU General Public License for more details. 13 * 14 * You should have received a copy of the GNU General Public License 15 * along with this program. If not, see <http://www.gnu.org/licenses/>. */ 16 17 #include "ssol.h" 18 #include "test_ssol_utils.h" 19 #include "test_ssol_materials.h" 20 21 static void 22 test_mirror(struct ssol_device* dev) 23 { 24 struct ssol_mirror_shader mirror = SSOL_MIRROR_SHADER_NULL; 25 struct ssol_param_buffer* pbuf = NULL; 26 struct ssol_material* material; 27 enum ssol_material_type type; 28 29 CHK(ssol_material_create_mirror(NULL, NULL) == RES_BAD_ARG); 30 CHK(ssol_material_create_mirror(NULL, &material) == RES_BAD_ARG); 31 CHK(ssol_material_create_mirror(dev, NULL) == RES_BAD_ARG); 32 CHK(ssol_material_create_mirror(dev, &material) == RES_OK); 33 34 CHK(ssol_material_get_type(NULL, NULL) == RES_BAD_ARG); 35 CHK(ssol_material_get_type(material, NULL) == RES_BAD_ARG); 36 CHK(ssol_material_get_type(NULL, &type) == RES_BAD_ARG); 37 CHK(ssol_material_get_type(material, &type) == RES_OK); 38 CHK(type == SSOL_MATERIAL_MIRROR); 39 40 CHK(ssol_material_ref_get(NULL) == RES_BAD_ARG); 41 CHK(ssol_material_ref_get(material) == RES_OK); 42 43 CHK(ssol_material_ref_put(NULL) == RES_BAD_ARG); 44 CHK(ssol_material_ref_put(material) == RES_OK); 45 46 CHK(ssol_param_buffer_create(dev, 32, &pbuf) == RES_OK); 47 48 mirror.normal = get_shader_normal; 49 mirror.reflectivity = get_shader_reflectivity; 50 mirror.roughness = get_shader_roughness; 51 52 CHK(ssol_mirror_setup(NULL, NULL, SSOL_MICROFACET_DISTRIBUTIONS_COUNT__) 53 == RES_BAD_ARG); 54 CHK(ssol_mirror_setup(material, NULL, SSOL_MICROFACET_DISTRIBUTIONS_COUNT__) 55 == RES_BAD_ARG); 56 CHK(ssol_mirror_setup(NULL, &mirror, SSOL_MICROFACET_DISTRIBUTIONS_COUNT__) 57 == RES_BAD_ARG); 58 CHK(ssol_mirror_setup(material, &mirror, SSOL_MICROFACET_DISTRIBUTIONS_COUNT__) 59 == RES_BAD_ARG); 60 CHK(ssol_mirror_setup(NULL, NULL, SSOL_MICROFACET_BECKMANN) == RES_BAD_ARG); 61 CHK(ssol_mirror_setup(material, NULL, SSOL_MICROFACET_BECKMANN) == RES_BAD_ARG); 62 CHK(ssol_mirror_setup(NULL, &mirror, SSOL_MICROFACET_BECKMANN) == RES_BAD_ARG); 63 CHK(ssol_mirror_setup(material, &mirror, SSOL_MICROFACET_BECKMANN) == RES_OK); 64 65 CHK(ssol_material_set_param_buffer(NULL, NULL) == RES_BAD_ARG); 66 CHK(ssol_material_set_param_buffer(material, NULL) == RES_BAD_ARG); 67 CHK(ssol_material_set_param_buffer(NULL, pbuf) == RES_BAD_ARG); 68 CHK(ssol_material_set_param_buffer(material, pbuf) == RES_OK); 69 70 mirror.normal = NULL; 71 CHK(ssol_mirror_setup(material, &mirror, SSOL_MICROFACET_BECKMANN) 72 == RES_BAD_ARG); 73 mirror.normal = get_shader_normal; 74 75 mirror.reflectivity = NULL; 76 CHK(ssol_mirror_setup(material, &mirror, SSOL_MICROFACET_BECKMANN) 77 == RES_BAD_ARG); 78 mirror.reflectivity = get_shader_reflectivity; 79 80 mirror.roughness = NULL; 81 CHK(ssol_mirror_setup(material, &mirror, SSOL_MICROFACET_BECKMANN) 82 == RES_BAD_ARG); 83 mirror.roughness = get_shader_roughness; 84 85 CHK(ssol_material_ref_put(material) == RES_OK); 86 CHK(ssol_param_buffer_ref_put(pbuf) == RES_OK); 87 } 88 89 static void 90 test_matte(struct ssol_device* dev) 91 { 92 struct ssol_matte_shader matte = SSOL_MATTE_SHADER_NULL; 93 struct ssol_material* material; 94 enum ssol_material_type type; 95 96 CHK(ssol_material_create_matte(NULL, NULL) == RES_BAD_ARG); 97 CHK(ssol_material_create_matte(dev, NULL) == RES_BAD_ARG); 98 CHK(ssol_material_create_matte(NULL, &material) == RES_BAD_ARG); 99 CHK(ssol_material_create_matte(dev, &material) == RES_OK); 100 101 CHK(ssol_material_get_type(material, &type) == RES_OK); 102 CHK(type == SSOL_MATERIAL_MATTE); 103 104 matte.normal = get_shader_normal; 105 matte.reflectivity = get_shader_reflectivity; 106 CHK(ssol_matte_setup(NULL, NULL) == RES_BAD_ARG); 107 CHK(ssol_matte_setup(material, NULL) == RES_BAD_ARG); 108 CHK(ssol_matte_setup(NULL, &matte) == RES_BAD_ARG); 109 CHK(ssol_matte_setup(material, &matte) == RES_OK); 110 111 matte.normal = NULL; 112 CHK(ssol_matte_setup(material, &matte) == RES_BAD_ARG); 113 matte.normal = get_shader_normal; 114 matte.reflectivity = NULL; 115 CHK(ssol_matte_setup(material, &matte) == RES_BAD_ARG); 116 117 CHK(ssol_material_ref_put(material) == RES_OK); 118 } 119 120 static void 121 test_thin_dielectric(struct ssol_device* dev) 122 { 123 struct ssol_thin_dielectric_shader shader = 124 SSOL_THIN_DIELECTRIC_SHADER_NULL; 125 struct ssol_material* mtl; 126 struct ssol_medium mdm0 = SSOL_MEDIUM_VACUUM; 127 struct ssol_medium mdm1 = SSOL_MEDIUM_VACUUM; 128 enum ssol_material_type type; 129 130 CHK(ssol_material_create_thin_dielectric(NULL, NULL) == RES_BAD_ARG); 131 CHK(ssol_material_create_thin_dielectric(dev, NULL) == RES_BAD_ARG); 132 CHK(ssol_material_create_thin_dielectric(NULL, &mtl) == RES_BAD_ARG); 133 CHK(ssol_material_create_thin_dielectric(dev, &mtl) == RES_OK); 134 135 CHK(ssol_material_get_type(mtl, &type) == RES_OK); 136 CHK(type == SSOL_MATERIAL_THIN_DIELECTRIC); 137 138 shader.normal = get_shader_normal; 139 140 CHK(ssol_thin_dielectric_setup(NULL, NULL, NULL, NULL, -1) == RES_BAD_ARG); 141 CHK(ssol_thin_dielectric_setup(mtl, NULL, NULL, NULL, -1) == RES_BAD_ARG); 142 CHK(ssol_thin_dielectric_setup(NULL, &shader, NULL, NULL, -1) == RES_BAD_ARG); 143 CHK(ssol_thin_dielectric_setup(mtl, &shader, NULL, NULL, -1) == RES_BAD_ARG); 144 CHK(ssol_thin_dielectric_setup(NULL, NULL, &mdm0, NULL, -1) == RES_BAD_ARG); 145 CHK(ssol_thin_dielectric_setup(mtl, NULL, &mdm0, NULL, -1) == RES_BAD_ARG); 146 CHK(ssol_thin_dielectric_setup(NULL, &shader, &mdm0, NULL, -1) == RES_BAD_ARG); 147 CHK(ssol_thin_dielectric_setup(mtl, &shader, &mdm0, NULL, -1) == RES_BAD_ARG); 148 CHK(ssol_thin_dielectric_setup(NULL, NULL, NULL, NULL, 1) == RES_BAD_ARG); 149 CHK(ssol_thin_dielectric_setup(mtl, NULL, NULL, NULL, 1) == RES_BAD_ARG); 150 CHK(ssol_thin_dielectric_setup(NULL, &shader, NULL, NULL, 1) == RES_BAD_ARG); 151 CHK(ssol_thin_dielectric_setup(mtl, &shader, NULL, NULL, 1) == RES_BAD_ARG); 152 CHK(ssol_thin_dielectric_setup(NULL, NULL, &mdm0, NULL, 1) == RES_BAD_ARG); 153 CHK(ssol_thin_dielectric_setup(mtl, NULL, &mdm0, NULL, 1) == RES_BAD_ARG); 154 CHK(ssol_thin_dielectric_setup(NULL, &shader, &mdm0, NULL, 1) == RES_BAD_ARG); 155 CHK(ssol_thin_dielectric_setup(mtl, &shader, &mdm0, NULL, 1) == RES_BAD_ARG); 156 CHK(ssol_thin_dielectric_setup(NULL, NULL, NULL, &mdm1, -1) == RES_BAD_ARG); 157 CHK(ssol_thin_dielectric_setup(mtl, NULL, NULL, &mdm1, -1) == RES_BAD_ARG); 158 CHK(ssol_thin_dielectric_setup(NULL, &shader, NULL, &mdm1, -1) == RES_BAD_ARG); 159 CHK(ssol_thin_dielectric_setup(mtl, &shader, NULL, &mdm1, -1) == RES_BAD_ARG); 160 CHK(ssol_thin_dielectric_setup(NULL, NULL, &mdm0, &mdm1, -1) == RES_BAD_ARG); 161 CHK(ssol_thin_dielectric_setup(mtl, NULL, &mdm0, &mdm1, -1) == RES_BAD_ARG); 162 CHK(ssol_thin_dielectric_setup(NULL, &shader, &mdm0, &mdm1, -1) == RES_BAD_ARG); 163 CHK(ssol_thin_dielectric_setup(mtl, &shader, &mdm0, &mdm1, -1) == RES_BAD_ARG); 164 CHK(ssol_thin_dielectric_setup(NULL, NULL, NULL, &mdm1, 1) == RES_BAD_ARG); 165 CHK(ssol_thin_dielectric_setup(mtl, NULL, NULL, &mdm1, 1) == RES_BAD_ARG); 166 CHK(ssol_thin_dielectric_setup(NULL, &shader, NULL, &mdm1, 1) == RES_BAD_ARG); 167 CHK(ssol_thin_dielectric_setup(mtl, &shader, NULL, &mdm1, 1) == RES_BAD_ARG); 168 CHK(ssol_thin_dielectric_setup(NULL, NULL, &mdm0, &mdm1, 1) == RES_BAD_ARG); 169 CHK(ssol_thin_dielectric_setup(mtl, NULL, &mdm0, &mdm1, 1) == RES_BAD_ARG); 170 CHK(ssol_thin_dielectric_setup(NULL, &shader, &mdm0, &mdm1, 1) == RES_BAD_ARG); 171 CHK(ssol_thin_dielectric_setup(mtl, &shader, &mdm0, &mdm1, 1) == RES_OK); 172 173 shader.normal = NULL; 174 CHK(ssol_thin_dielectric_setup(mtl, &shader, &mdm0, &mdm1, 1) == RES_BAD_ARG); 175 shader.normal = get_shader_normal; 176 177 ssol_data_set_real(&mdm0.extinction, -1); 178 CHK(ssol_thin_dielectric_setup(mtl, &shader, &mdm0, &mdm1, 1) == RES_BAD_ARG); 179 ssol_data_copy(&mdm0.extinction, &SSOL_MEDIUM_VACUUM.extinction); 180 181 ssol_data_set_real(&mdm0.refractive_index, 0); 182 CHK(ssol_thin_dielectric_setup(mtl, &shader, &mdm0, &mdm1, 1) == RES_BAD_ARG); 183 ssol_data_copy(&mdm0.refractive_index, &SSOL_MEDIUM_VACUUM.refractive_index); 184 185 ssol_data_set_real(&mdm1.extinction, -1); 186 CHK(ssol_thin_dielectric_setup(mtl, &shader, &mdm0, &mdm1, 1) == RES_BAD_ARG); 187 ssol_data_copy(&mdm1.extinction, &SSOL_MEDIUM_VACUUM.extinction); 188 189 ssol_data_set_real(&mdm1.refractive_index, 0); 190 CHK(ssol_thin_dielectric_setup(mtl, &shader, &mdm0, &mdm1, 1) == RES_BAD_ARG); 191 ssol_data_copy(&mdm1.refractive_index, &SSOL_MEDIUM_VACUUM.refractive_index); 192 193 CHK(ssol_material_ref_put(mtl) == RES_OK); 194 } 195 196 static void 197 test_dielectric(struct ssol_device* dev) 198 { 199 struct ssol_dielectric_shader dielectric = SSOL_DIELECTRIC_SHADER_NULL; 200 struct ssol_material* material; 201 struct ssol_medium mdm0 = SSOL_MEDIUM_VACUUM; 202 struct ssol_medium mdm1 = SSOL_MEDIUM_VACUUM; 203 enum ssol_material_type type; 204 205 CHK(ssol_material_create_dielectric(NULL, NULL) == RES_BAD_ARG); 206 CHK(ssol_material_create_dielectric(dev, NULL) == RES_BAD_ARG); 207 CHK(ssol_material_create_dielectric(NULL, &material) == RES_BAD_ARG); 208 CHK(ssol_material_create_dielectric(dev, &material) == RES_OK); 209 210 CHK(ssol_material_get_type(material, &type) == RES_OK); 211 CHK(type == SSOL_MATERIAL_DIELECTRIC); 212 213 dielectric.normal = get_shader_normal; 214 215 CHK(ssol_dielectric_setup(NULL, NULL, NULL, NULL) == RES_BAD_ARG); 216 CHK(ssol_dielectric_setup(material, NULL, NULL, NULL) == RES_BAD_ARG); 217 CHK(ssol_dielectric_setup(NULL, &dielectric, NULL, NULL) == RES_BAD_ARG); 218 CHK(ssol_dielectric_setup(material, &dielectric, NULL, NULL) == RES_BAD_ARG); 219 CHK(ssol_dielectric_setup(NULL, NULL, &mdm0, NULL) == RES_BAD_ARG); 220 CHK(ssol_dielectric_setup(material, NULL, &mdm0, NULL) == RES_BAD_ARG); 221 CHK(ssol_dielectric_setup(NULL, &dielectric, &mdm0, NULL) == RES_BAD_ARG); 222 CHK(ssol_dielectric_setup(material, &dielectric, &mdm0, NULL) == RES_BAD_ARG); 223 CHK(ssol_dielectric_setup(NULL, NULL, NULL, &mdm1) == RES_BAD_ARG); 224 CHK(ssol_dielectric_setup(material, NULL, NULL, &mdm1) == RES_BAD_ARG); 225 CHK(ssol_dielectric_setup(NULL, &dielectric, NULL, &mdm1) == RES_BAD_ARG); 226 CHK(ssol_dielectric_setup(material, &dielectric, NULL, &mdm1) == RES_BAD_ARG); 227 CHK(ssol_dielectric_setup(NULL, NULL, &mdm0, &mdm1) == RES_BAD_ARG); 228 CHK(ssol_dielectric_setup(material, NULL, &mdm0, &mdm1) == RES_BAD_ARG); 229 CHK(ssol_dielectric_setup(NULL, &dielectric, &mdm0, &mdm1) == RES_BAD_ARG); 230 CHK(ssol_dielectric_setup(material, &dielectric, &mdm0, &mdm1) == RES_OK); 231 232 dielectric.normal = NULL; 233 CHK(ssol_dielectric_setup(NULL, &dielectric, &mdm0, &mdm1) == RES_BAD_ARG); 234 dielectric.normal = get_shader_normal; 235 236 ssol_data_set_real(&mdm0.refractive_index, 0); 237 CHK(ssol_dielectric_setup(NULL, &dielectric, &mdm0, &mdm1) == RES_BAD_ARG); 238 ssol_data_copy(&mdm0.refractive_index, &SSOL_MEDIUM_VACUUM.refractive_index); 239 240 ssol_data_set_real(&mdm1.refractive_index, 0); 241 CHK(ssol_dielectric_setup(NULL, &dielectric, &mdm0, &mdm1) == RES_BAD_ARG); 242 ssol_data_copy(&mdm1.refractive_index, &SSOL_MEDIUM_VACUUM.refractive_index); 243 244 ssol_data_set_real(&mdm0.extinction, -1); 245 CHK(ssol_dielectric_setup(NULL, &dielectric, &mdm0, &mdm1) == RES_BAD_ARG); 246 ssol_data_copy(&mdm0.extinction, &SSOL_MEDIUM_VACUUM.refractive_index); 247 248 ssol_data_set_real(&mdm1.extinction, -1); 249 CHK(ssol_dielectric_setup(NULL, &dielectric, &mdm0, &mdm1) == RES_BAD_ARG); 250 ssol_data_copy(&mdm1.refractive_index, &SSOL_MEDIUM_VACUUM.refractive_index); 251 252 CHK(ssol_material_ref_put(material) == RES_OK); 253 } 254 255 static void 256 test_virtual(struct ssol_device* dev) 257 { 258 struct ssol_material* material; 259 enum ssol_material_type type; 260 261 CHK(ssol_material_create_virtual(NULL, NULL) == RES_BAD_ARG); 262 CHK(ssol_material_create_virtual(NULL, &material) == RES_BAD_ARG); 263 CHK(ssol_material_create_virtual(dev, NULL) == RES_BAD_ARG); 264 CHK(ssol_material_create_virtual(dev, &material) == RES_OK); 265 266 CHK(ssol_material_get_type(material, &type) == RES_OK); 267 CHK(type == SSOL_MATERIAL_VIRTUAL); 268 269 CHK(ssol_material_ref_put(material) == RES_OK); 270 } 271 272 int 273 main(int argc, char** argv) 274 { 275 struct mem_allocator allocator; 276 struct ssol_device* dev; 277 (void) argc, (void) argv; 278 279 mem_init_proxy_allocator(&allocator, &mem_default_allocator); 280 281 CHK(ssol_device_create 282 (NULL, &allocator, SSOL_NTHREADS_DEFAULT, 0, &dev) == RES_OK); 283 284 test_mirror(dev); 285 test_matte(dev); 286 test_thin_dielectric(dev); 287 test_dielectric(dev); 288 test_virtual(dev); 289 290 CHK(ssol_device_ref_put(dev) == RES_OK); 291 292 check_memory_allocator(&allocator); 293 mem_shutdown_proxy_allocator(&allocator); 294 CHK(mem_allocated_size() == 0); 295 296 return 0; 297 } 298