solstice-solver

Solver library of the solstice app
git clone git://git.meso-star.com/solstice-solver.git
Log | Files | Refs | README | LICENSE

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