test_ssol_image.c (9181B)
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 20 21 #include <rsys/double2.h> 22 #include <rsys/double3.h> 23 24 static void 25 check_sampling(struct ssol_device* dev) 26 { 27 struct ssol_image_layout layout; 28 struct ssol_image* img; 29 size_t pixsz; 30 char* mem; 31 double uv[2]; 32 double pix[3]; 33 double tmp[3]; 34 35 CHK(ssol_image_create(dev, &img) == RES_OK); 36 CHK(ssol_image_setup(img, 4, 2, SSOL_PIXEL_DOUBLE3) == RES_OK); 37 CHK(ssol_image_get_layout(img, &layout) == RES_OK); 38 39 pixsz = ssol_sizeof_pixel_format(layout.pixel_format); 40 41 CHK(ssol_image_map(img, &mem) == RES_OK); 42 d3((double*)(mem + layout.offset + 0*pixsz + 0*layout.row_pitch), 1, 0, 0); 43 d3((double*)(mem + layout.offset + 1*pixsz + 0*layout.row_pitch), 1, 0, 0); 44 d3((double*)(mem + layout.offset + 2*pixsz + 0*layout.row_pitch), 1, 1, 0); 45 d3((double*)(mem + layout.offset + 3*pixsz + 0*layout.row_pitch), 1, 1, 0); 46 d3((double*)(mem + layout.offset + 0*pixsz + 1*layout.row_pitch), 1, 0, 1); 47 d3((double*)(mem + layout.offset + 1*pixsz + 1*layout.row_pitch), 1, 0, 1); 48 d3((double*)(mem + layout.offset + 2*pixsz + 1*layout.row_pitch), 0, 1, 1); 49 d3((double*)(mem + layout.offset + 3*pixsz + 1*layout.row_pitch), 0, 1, 1); 50 CHK(ssol_image_unmap(img) == RES_OK); 51 52 #define CLAMPED SSOL_ADDRESS_CLAMP 53 #define REPEAT SSOL_ADDRESS_REPEAT 54 #define NEAREST SSOL_FILTER_NEAREST 55 #define LINEAR SSOL_FILTER_LINEAR 56 57 d2_splat(uv, 0); 58 CHK(ssol_image_sample(NULL, NEAREST, CLAMPED, CLAMPED, NULL, NULL) == RES_BAD_ARG); 59 CHK(ssol_image_sample(img, NEAREST, CLAMPED, CLAMPED, NULL, NULL) == RES_BAD_ARG); 60 CHK(ssol_image_sample(NULL, NEAREST, CLAMPED, CLAMPED, uv, NULL) == RES_BAD_ARG); 61 CHK(ssol_image_sample(img, NEAREST, CLAMPED, CLAMPED, uv, NULL) == RES_BAD_ARG); 62 CHK(ssol_image_sample(NULL, NEAREST, CLAMPED, CLAMPED, NULL, pix) == RES_BAD_ARG); 63 CHK(ssol_image_sample(img, NEAREST, CLAMPED, CLAMPED, NULL, pix) == RES_BAD_ARG); 64 CHK(ssol_image_sample(NULL, NEAREST, CLAMPED, CLAMPED, uv, pix) == RES_BAD_ARG); 65 CHK(ssol_image_sample(img, NEAREST, CLAMPED, CLAMPED, uv, pix) == RES_OK); 66 CHK(d3_eq(pix, d3(tmp,1,0,0)) == 1); 67 68 uv[0] = 1.0/4.0; 69 CHK(ssol_image_sample(img, NEAREST, CLAMPED, CLAMPED, uv, pix) == RES_OK); 70 CHK(d3_eq(pix, d3(tmp,1,0,0)) == 1); 71 uv[0] = 2.0/4.0; 72 CHK(ssol_image_sample(img, NEAREST, CLAMPED, CLAMPED, uv, pix) == RES_OK); 73 CHK(d3_eq(pix, d3(tmp,1,1,0)) == 1); 74 uv[0] = 3.0/4.0; 75 CHK(ssol_image_sample(img, NEAREST, CLAMPED, CLAMPED, uv, pix) == RES_OK); 76 CHK(d3_eq(pix, d3(tmp,1,1,0)) == 1); 77 78 uv[0] = -1.0/4.0; 79 CHK(ssol_image_sample(img, NEAREST, CLAMPED, CLAMPED, uv, pix) == RES_OK); 80 CHK(d3_eq(pix, d3(tmp,1,0,0)) == 1); 81 CHK(ssol_image_sample(img, NEAREST, REPEAT, CLAMPED, uv, pix) == RES_OK); 82 CHK(d3_eq(pix, d3(tmp,1,1,0)) == 1); 83 uv[0] = 4.0/4.0; 84 CHK(ssol_image_sample(img, NEAREST, CLAMPED, CLAMPED, uv, pix) == RES_OK); 85 CHK(d3_eq(pix, d3(tmp,1,1,0)) == 1); 86 CHK(ssol_image_sample(img, NEAREST, REPEAT, CLAMPED, uv, pix) == RES_OK); 87 CHK(d3_eq(pix, d3(tmp,1,0,0)) == 1); 88 89 uv[1] = 1.0/2.0; 90 CHK(ssol_image_sample(img, NEAREST, CLAMPED, CLAMPED, uv, pix) == RES_OK); 91 CHK(d3_eq(pix, d3(tmp,0,1,1)) == 1); 92 uv[1] = 2.0/2.0; 93 CHK(ssol_image_sample(img, NEAREST, REPEAT, CLAMPED, uv, pix) == RES_OK); 94 CHK(d3_eq(pix, d3(tmp,1,0,1)) == 1); 95 CHK(ssol_image_sample(img, NEAREST, REPEAT, REPEAT, uv, pix) == RES_OK); 96 CHK(d3_eq(pix, d3(tmp,1,0,0)) == 1); 97 CHK(ssol_image_sample(img, NEAREST, CLAMPED, REPEAT, uv, pix) == RES_OK); 98 CHK(d3_eq(pix, d3(tmp,1,1,0)) == 1); 99 100 uv[0] = 1.0/4.0 + 1.0/8.0; 101 uv[1] = 0.0/2.0 + 1.0/4.0; 102 CHK(ssol_image_sample(img, LINEAR, CLAMPED, CLAMPED, uv, pix) == RES_OK); 103 CHK(d3_eq(pix, d3(tmp,0.75,0.5,0.5)) == 1); 104 105 CHK(ssol_image_ref_put(img) == RES_OK); 106 } 107 108 int 109 main(int argc, char** argv) 110 { 111 double block[8/*#rows*/*3/*#channels*/*8/*#column*/]; 112 struct mem_allocator allocator; 113 struct ssol_device* dev; 114 struct ssol_image* img; 115 struct ssol_image_layout layout = SSOL_IMAGE_LAYOUT_NULL; 116 size_t org[2]; 117 size_t sz[2]; 118 char* mem; 119 size_t i, x, y; 120 (void) argc, (void) argv; 121 122 mem_init_proxy_allocator(&allocator, &mem_default_allocator); 123 124 CHK(ssol_device_create 125 (NULL, &allocator, SSOL_NTHREADS_DEFAULT, 0, &dev) == RES_OK); 126 127 CHK(ssol_image_create(dev, &img) == RES_OK); 128 129 CHK(ssol_image_ref_get(NULL) == RES_BAD_ARG); 130 CHK(ssol_image_ref_get(img) == RES_OK); 131 132 CHK(ssol_image_ref_put(NULL) == RES_BAD_ARG); 133 CHK(ssol_image_ref_put(img) == RES_OK); 134 135 CHK(ssol_image_setup(NULL, 128, 128, SSOL_PIXEL_DOUBLE3) == RES_BAD_ARG); 136 CHK(ssol_image_setup(img, 0, 128, SSOL_PIXEL_DOUBLE3) == RES_BAD_ARG); 137 CHK(ssol_image_setup(img, 32, 32, (enum ssol_pixel_format)99) == RES_BAD_ARG); 138 CHK(ssol_image_setup(img, 128, 128, SSOL_PIXEL_DOUBLE3) == RES_OK); 139 CHK(ssol_image_setup(img, 128, 128, SSOL_PIXEL_DOUBLE3) == RES_OK); 140 CHK(ssol_image_setup(img, 16, 16, SSOL_PIXEL_DOUBLE3) == RES_OK); 141 142 org[0] = 0, org[1] = 0; 143 sz[0] = 8, sz[1] = 8; 144 #define WRITE ssol_image_write 145 FOR_EACH(i, 0, sizeof(block)/sizeof(double)) block[i] = 1.0; 146 CHK(WRITE(NULL, NULL, NULL, SSOL_PIXEL_DOUBLE3, NULL) == RES_BAD_ARG); 147 CHK(WRITE(img, NULL, NULL, SSOL_PIXEL_DOUBLE3, NULL) == RES_BAD_ARG); 148 CHK(WRITE(NULL, org, NULL, SSOL_PIXEL_DOUBLE3, NULL) == RES_BAD_ARG); 149 CHK(WRITE(img, org, NULL, SSOL_PIXEL_DOUBLE3, NULL) == RES_BAD_ARG); 150 CHK(WRITE(NULL, NULL, sz, SSOL_PIXEL_DOUBLE3, NULL) == RES_BAD_ARG); 151 CHK(WRITE(img, NULL, sz, SSOL_PIXEL_DOUBLE3, NULL) == RES_BAD_ARG); 152 CHK(WRITE(NULL, org, sz, SSOL_PIXEL_DOUBLE3, NULL) == RES_BAD_ARG); 153 CHK(WRITE(img, org, sz, SSOL_PIXEL_DOUBLE3, NULL) == RES_BAD_ARG); 154 CHK(WRITE(NULL, NULL, NULL, SSOL_PIXEL_DOUBLE3, block) == RES_BAD_ARG); 155 CHK(WRITE(img, NULL, NULL, SSOL_PIXEL_DOUBLE3, block) == RES_BAD_ARG); 156 CHK(WRITE(NULL, org, NULL, SSOL_PIXEL_DOUBLE3, block) == RES_BAD_ARG); 157 CHK(WRITE(img, org, NULL, SSOL_PIXEL_DOUBLE3, block) == RES_BAD_ARG); 158 CHK(WRITE(NULL, NULL, sz, SSOL_PIXEL_DOUBLE3, block) == RES_BAD_ARG); 159 CHK(WRITE(img, NULL, sz, SSOL_PIXEL_DOUBLE3, block) == RES_BAD_ARG); 160 CHK(WRITE(NULL, org, sz, SSOL_PIXEL_DOUBLE3, block) == RES_BAD_ARG); 161 CHK(WRITE(img, org, sz, SSOL_PIXEL_DOUBLE3, block) == RES_OK); 162 163 org[0] = 14, org[1] = 0; 164 CHK(WRITE(img, org, sz, SSOL_PIXEL_DOUBLE3, block) == RES_BAD_ARG); 165 org[0] = 8, org[1] = 0; 166 FOR_EACH(i, 0, sizeof(block)/sizeof(double)) block[i] = 2.0; 167 CHK(WRITE(img, org, sz, SSOL_PIXEL_DOUBLE3, block) == RES_OK); 168 org[0] = 0, org[1] = 8; 169 FOR_EACH(i, 0, sizeof(block)/sizeof(double)) block[i] = 3.0; 170 CHK(WRITE(img, org, sz, SSOL_PIXEL_DOUBLE3, block) == RES_OK); 171 org[0] = 8, org[1] = 8; 172 FOR_EACH(i, 0, sizeof(block)/sizeof(double)) block[i] = 4.0; 173 CHK(WRITE(img, org, sz, SSOL_PIXEL_DOUBLE3, block) == RES_OK); 174 #undef WRITE 175 176 CHK(ssol_image_get_layout(NULL, NULL) == RES_BAD_ARG); 177 CHK(ssol_image_get_layout(img, NULL) == RES_BAD_ARG); 178 CHK(ssol_image_get_layout(NULL, &layout) == RES_BAD_ARG); 179 CHK(ssol_image_get_layout(img, &layout) == RES_OK); 180 181 CHK(layout.size > layout.offset); 182 CHK(layout.width == 16); 183 CHK(layout.height == 16); 184 CHK(layout.size - layout.offset >= 16*16); 185 CHK(layout.row_pitch >= 16); 186 CHK(layout.pixel_format == SSOL_PIXEL_DOUBLE3); 187 188 CHK(ssol_image_map(NULL, NULL) == RES_BAD_ARG); 189 CHK(ssol_image_map(img, NULL) == RES_BAD_ARG); 190 CHK(ssol_image_map(NULL, &mem) == RES_BAD_ARG); 191 CHK(ssol_image_map(img, &mem) == RES_OK); 192 193 FOR_EACH(y, 0, layout.height) { 194 const double* row = (const double*) 195 ((mem + layout.offset) + y * layout.row_pitch); 196 FOR_EACH(x, 0, layout.width) { 197 const double* pixel = row + x*3; 198 if(y < 8) { 199 if(x < 8) { 200 CHK(pixel[0] == 1); 201 CHK(pixel[1] == 1); 202 CHK(pixel[2] == 1); 203 } else { 204 CHK(pixel[0] == 2); 205 CHK(pixel[1] == 2); 206 CHK(pixel[2] == 2); 207 } 208 } else { 209 if(x < 8) { 210 CHK(pixel[0] == 3); 211 CHK(pixel[1] == 3); 212 CHK(pixel[2] == 3); 213 } else { 214 CHK(pixel[0] == 4); 215 CHK(pixel[1] == 4); 216 CHK(pixel[2] == 4); 217 } 218 } 219 } 220 } 221 CHK(ssol_image_unmap(NULL) == RES_BAD_ARG); 222 CHK(ssol_image_unmap(img) == RES_OK); 223 224 CHK(ssol_image_ref_put(img) == RES_OK); 225 226 check_sampling(dev); 227 CHK(ssol_device_ref_put(dev) == RES_OK); 228 229 check_memory_allocator(&allocator); 230 mem_shutdown_proxy_allocator(&allocator); 231 CHK(mem_allocated_size() == 0); 232 233 return 0; 234 } 235