<!DOCTYPE article PUBLIC "-//NLM//DTD JATS (Z39.96) Journal Archiving and Interchange DTD v1.0 20120330//EN" "JATS-archivearticle1.dtd">
<article xmlns:xlink="http://www.w3.org/1999/xlink">
  <front>
    <journal-meta />
    <article-meta>
      <title-group>
        <article-title>WebAssembly and Vulkan API in Image Processing Development</article-title>
      </title-group>
      <contrib-group>
        <contrib contrib-type="author">
          <string-name>Robert Tornai</string-name>
          <email>tornai.robert@inf.unideb.hu</email>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Péter Fürjes-Benke</string-name>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>László File</string-name>
          <email>file.laszlo.n@gmail.com</email>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Dávid Miklós Nyitrai</string-name>
          <email>dawnyitrai@gmail.com</email>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <aff id="aff0">
          <label>0</label>
          <institution>University of Debrecen, Faculty of Informatics</institution>
        </aff>
      </contrib-group>
      <pub-date>
        <year>2020</year>
      </pub-date>
      <fpage>29</fpage>
      <lpage>31</lpage>
      <abstract>
        <p>This paper will present an image processing program named BlackRoom. The software implements a lot of modern techniques like Vulkan, tile rendering, and WebAssembly. The calculation of diferent efects on large size images induces huge memory consumption. With the usage of tile rendering, this memory allocation can be decreased at the cost of a slight calculation performance. The integration of the Vulkan API is also a way to increase the eficiency of applications. Beyond OpenGL, Vulkan provides low-level access to the hardware. In order to point out the diference among the applied technologies, our program has a built-in benchmark system to determine the performance of the CPU and GPU through the implemented executing branches. A further aim is to make the program available for as many platforms as possible by paying special attention to WebAssembly. By generating WASM binary our application runs without installation in a browser.</p>
      </abstract>
      <kwd-group>
        <kwd>WebAssembly</kwd>
        <kwd>Vulkan</kwd>
        <kwd>tiling</kwd>
        <kwd>image processing</kwd>
        <kwd>benchmark</kwd>
      </kwd-group>
    </article-meta>
  </front>
  <body>
    <sec id="sec-1">
      <title>1. Introduction</title>
      <p>
        BlackRoom is an image processing application developed in Qt [
        <xref ref-type="bibr" rid="ref1 ref2">1, 2</xref>
        ]. The goal was
to use the most modern techniques, so we implemented the algorithms using Vulkan
Copyright © 2020 for this paper by its authors. Use permitted under Creative Commons License
Attribution 4.0 International (CC BY 4.0).
API also beyond OpenGL, latter is slightly slower in compute shading. Judging
by the fact that BlackRoom can be run from a browser thanks to WebAssembly,
the user does not have to install it. We have checked the existing accelerated
image processing libraries and found that one of the best is the progressive GPUCV
library, unfortunately it was abandoned in 2010 [
        <xref ref-type="bibr" rid="ref3">3</xref>
        ]. This way, it was never
developed in the direction to use it in web environment. Although, Allusse et al.
enhanced the system with CUDA support, it is a proprietary technique and it is
not web enabled either [
        <xref ref-type="bibr" rid="ref4">4</xref>
        ]. Furthermore, our program supports Linux, macOS,
and Windows platforms because we would like to make it available for as wide user
base as we can. The optimization of our image processing software yielded a
better and customizable memory management regarding the memory usage of image
modification algorithms. With the size of diferent kernels, the user can manage
the memory allocation for the software by accordingly sized overlapping in tiling.
      </p>
      <p>
        The structure of BlackRoom mainly follows the standard skeleton described in
GPU Gems [
        <xref ref-type="bibr" rid="ref5">5</xref>
        ]. As a source operator, we have a load operator for processed and raw
formats. Our system contains image filters. Some filters, as the Harris shutter, have
additional load operators for the color channels, thus extending the simple demo
structure mentioned in GPU Gems. In this way, not just linear processing paths
can be accomplished. We have implemented both image view and save operator as
sink operators. Similarly to the framework of Seiller et al. [
        <xref ref-type="bibr" rid="ref6">6</xref>
        ], the diferent GPU
processing paths as GLSL and Vulkan are implemented in separate classes.
      </p>
    </sec>
    <sec id="sec-2">
      <title>2. Categories of image processing algorithms</title>
      <p>
        In image processing [
        <xref ref-type="bibr" rid="ref7 ref8">7, 8</xref>
        ], there are two kinds of algorithms, one approach does
calculations based on the neighboring pixels and the other does not use the nearby
pixel information, only use the current pixel.
      </p>
      <sec id="sec-2-1">
        <title>2.1. Context-sensitive algorithms</title>
        <p>One of the simplest context-sensitive algorithms is the median filter. This is used
for noise reduction, mostly for damaged pictures. A few more context-sensitive
algorithms are included in our software as edge detection, Gauss filter, or
sharpening. We calculate the current pixel using the nearby pixels’ information of a given
size called window or kernel. In this kernel we can calculate e.g., the median of
the neighboring data. However, there is a problem on the edge of the image with
the pixels, where there is not enough nearby information to proceed. The simplest
solution for this is to start with the first full kernel on the image and skip the ones
on the edge and crop after we finish. We decided to implement a dynamic method
that counts the neighbors and performs the calculations accordingly.</p>
      </sec>
      <sec id="sec-2-2">
        <title>2.2. Context-free algorithms</title>
        <p>A lot of context-free algorithms were implemented in BlackRoom as channel mixer,
contrast, infrared conversion, negative efect, saturation, vignetting, and grayscale.</p>
        <p>
          For example, grayscale is calculated by taking only just the current pixel’s color
information in a commonly used Red-Green-Blue set. The values have a range of
[
          <xref ref-type="bibr" rid="ref1 ref10 ref11 ref12 ref13 ref14 ref15 ref16 ref17 ref18 ref19 ref2 ref20 ref21 ref22 ref23 ref24 ref3 ref4 ref5 ref6 ref7 ref8 ref9">0–255</xref>
          ]. The result will be independent of the neighbors. The weights for the RGB
values can be set independently by a combined GUI element of a text field, a slider,
and a value spinner. We calculate the weighted average of these values for the efect
using the appropriate parameters, and this way we get a tone of gray color. It shall
be used for the RGB components. If this final gray value is multiplied by vector
(1.2, 1.0, 0.8) then we get a sepia brown picture.
        </p>
      </sec>
    </sec>
    <sec id="sec-3">
      <title>3. Tile rendering</title>
      <p>In the video game industry, generally in 2D games it is common to separate the
game world into adjacent small portions, known as tiles. This approach helps
with the memory management of the software. Apart from memory optimization,
with the usage of this technique, we can describe a pathfinding method for game
elements or even collision detection can be solved this way.</p>
      <p>
        In image processing, we use tile rendering [
        <xref ref-type="bibr" rid="ref10 ref9">9, 10</xref>
        ] to optimize the usage of
available system memory. With this approach, we can work with big file sizes with
great image details. Using this method we can divide the processed image into
these parts called tiles (see Figure 1). Since WebAssembly is only supported in 32
bit mode right now in Qt 5.14.0, it means that the usable memory for programs
is maximum 4 GB. Having the original image and two auxiliary bufers beside the
ifnal picture, finally, they can be very huge using 16 bit color channels. By having
just a tile for the auxiliary bufers, the memory consumption can be reduced a lot.
      </p>
      <p>One of the advantages of tile rendering is the fact that we can calculate efects on
images with bigger size than the available video or system memory. If the necessary
resources do not fit in at once, the computer can use these rectangular parts of the
image. The program will transport these parts of the image through the bus system
of the mainboard one after another replacing the currently processed image part
as the calculation goes on.</p>
      <p>There is a problem with algorithms using the neighboring pixels on the edges
of the tiles because here we also need the nearby tiles’ information for the current
tile’s edge pixels’ calculation. To solve this problem, we define an overlapping tile
edge on the neighboring tiles (see Figure 2).</p>
    </sec>
    <sec id="sec-4">
      <title>4. Vulkan API</title>
      <p>
        Vulkan [
        <xref ref-type="bibr" rid="ref11">11</xref>
        ] is a cross-platform 3D graphics API that was released in 2016. It is
based on the AMD Mantle API [12]. The main advantage of it is that it provides
high-eficiency computing thanks to low-level access. What is to say that the
developers have almost full control over the GPU’s hardware. On the other hand,
it makes this API [
        <xref ref-type="bibr" rid="ref12">13</xref>
        ] harder for beginners because we have to set up every detail
from scratch. The memory management and initial frame bufer creation are fully
the developer’s responsibility. This feature of Vulkan gives less work to the graphics
drivers.
      </p>
      <p>
        In other APIs shaders have human-readable syntax. On the contrary, shaders
in Vulkan have to be specified in bytecode, called SPIR-V. With this approach,
Vulkan solves a really important problem. In the past, in order to compile OpenGL
[
        <xref ref-type="bibr" rid="ref13 ref14">14, 15</xref>
        ] and Direct3D [
        <xref ref-type="bibr" rid="ref15 ref16">16, 17</xref>
        ] shaders, the GPU vendors had to write really complex
compilers contained in the drivers, which resulted in that the shaders could work
diferently on diferent computers. Another great feature of Vulkan is the full
support of multi-threading. This makes it possible to get better overall CPU usage.
By this way, we can boost older PCs’ 3D performance.
      </p>
      <p>
        The computation in our software does not exploit the potential of Vulkan 3D
capabilities. We use it only for 2D rendering to display pictures and for texturing.
The Vulkan SDK provides tools for converting GLSL shaders [
        <xref ref-type="bibr" rid="ref17">18</xref>
        ] to SPIR-V format.
Therefore, we can reuse our shaders written for OpenGL quite easily, but their
usage is slightly diferent. Now our program can load in a picture and display it as a
texture on the screen. The basic efects like exposure value or brightness can be set.
According to our measurements with the new API, we reached approximately 20%
performance increment based on the used nanosec timer. However, benchmarks of
existing projects show that the diference could be up to 100%. In the future we
will work on the optimization of our Vulkan implementation. On the other hand,
all of our OpenGL shaders will be made available in Vulkan (see Figure 3).
      </p>
    </sec>
    <sec id="sec-5">
      <title>5. Benchmark system</title>
      <p>The test was carried over a desktop machine equipped with Intel Core i5-8250U @
1.60 GHz CPU and GeForce MX150 4 GB GPU.</p>
      <p>A benchmark button was added to the graphical user interface. Our software
implements a complex test, which can now be used to determine the performance of
GPUs and CPUs per image processing modules [19]. Basically, during the
benchmark the program renders the image multiple times applying the given efects using
both CPU and GPU processing paths (see Figure 4). The times obtained were
comparable in magnitude. Surprisingly, we have found that simple efects (maximum
a few ten CPU cycle long) run faster on the CPU than on the GPU if they are
alone in the efect chain. As an example, the infrared or the negative efect runs
40% faster on CPU because its calculation is quite quick. With GPU computing,
transferring the image data through the buses takes more time than that we gain
because of the better computation performance. From having at least two efects
in the chain means that the GPU will be faster in all combinations because the
transfer time become less significant in the whole process.</p>
      <p>
        Opposite to the results of Asano et al. [
        <xref ref-type="bibr" rid="ref18">20</xref>
        ], we found that even for one complex
efect the GPU is faster. Maybe the reason for this, that the graphical cards evolved
more during the last decade than the central processing units.
      </p>
      <p>
        A local contrast efect is planned to be implemented without unwanted halo
efects and gradient reversals along edges. A local laplacian filter suits these needs
[
        <xref ref-type="bibr" rid="ref19">21</xref>
        ]. With its huge complexity, the GPU will undoubtedly have a high advantage
over CPU. We plan to make comprehensive test against the results of Gkeka et al.
[
        <xref ref-type="bibr" rid="ref20">22</xref>
        ].
      </p>
    </sec>
    <sec id="sec-6">
      <title>6. WebAssembly</title>
      <p>
        WebAssembly is a binary instruction format for stack-based virtual machines [
        <xref ref-type="bibr" rid="ref21">23</xref>
        ].
It is designed to be easily compiled from C/C++/Rust sources. Thanks to its
binary format, it can be executed at almost native speed. To make it safe,
WebAssembly enforces the browser security settings on the programs so it can protect
us from malicious applications. With these properties, WebAssembly is a real
alternative to the widespread JavaScript [
        <xref ref-type="bibr" rid="ref22 ref23">24, 25</xref>
        ]. It is faster and what is more, it
is easier to understand. Since Qt’s 5.13.0 [
        <xref ref-type="bibr" rid="ref24">26</xref>
        ] version it is fully supported, so our
program can be built for this platform [27].
      </p>
      <p>One of the hardest challenges was to make it possible to load pictures from local
resources into the program. As our program runs on the WASM stacked-machine,
originally, we could only reach the virtual machine’s filesystem. We managed to
solve this problem based on the solution of Morten Johan Sørvig 1. The program
basically uploads the selected picture into the virtual machine’s memory, then
displays it on the screen (see Figure 5). When the user finishes processing the
image, he can download it onto his computer.</p>
    </sec>
    <sec id="sec-7">
      <title>7. Results</title>
      <p>We are able to build BlackRoom for WebAssembly. In this way it is possible
now to use our program from a web browser. For Windows, Linux, and Android
users, we incorporated the Vulkan API which is the most promising application
programming interface with thread-friendliness and low-overhead. Users of macOS
and iOS can enjoy the benefits through the MoltenVK layer. With the customizable
memory usage, we can release our software on diferent devices, even having a
limited amount of available memory. The controllable kernel size also makes a
good test environment for the system’s performance. Finally, we built a benchmark
system into our application in order to illustrate the diferences between the GPU
and CPU rendering paths.</p>
    </sec>
    <sec id="sec-8">
      <title>8. Future Work</title>
      <p>We are planning to implement even more image efects besides more eficiency
and memory tests. The Vulkan processing path can be enhanced to have almost
100% gain because real world applications suggest that. BlackRoom’s multi-thread
1Morten Johan Sørvig solution is available here:
https://github.com/msorvig/qtwebassembly-examples/tree/master/emscripten_localfiles, visited on 2019-10-12.
eficiency is also subpar presently in our minimum viable product, and it shall be
increased to better reach the calculation capacity of the number of the threads of
the CPU. The complex benchmark system will be enhanced to handle Vulkan API,
as well.</p>
      <p>Acknowledgements. This work was supported by the construction
EFOP-3.6.3VEKOP-16-2017-00002. The project was supported by the European Union,
coifnanced by the European Social Fund.
[12] Mantle (API), URL https://en.wikipedia.org/wiki/Mantle_(API), last modified
on 2019-12-16, visited on 2020-01-22.
[19] Pizzini, J., GPU Rendering vs. CPU Rendering – A method to compare render times
with empirical benchmarks (October 2, 2014), URL https://web.archive.org/web/
20190809214146/https://blog.boxx.com/2014/10/02/gpu-rendering-vs-cpurendering-a-method-to-compare-render-times-with-empirical-benchmarks,
visited on 2020-01-22.
[27] Rourke, M., Learn WebAssembly: Build web applications with native performance
using Wasm and C/C++, Packt Publishing Ltd., Birmingham, England, 1st edn.
(September 24, 2018).</p>
    </sec>
  </body>
  <back>
    <ref-list>
      <ref id="ref1">
        <mixed-citation>
          [1]
          <string-name>
            <surname>Lazar</surname>
            ,
            <given-names>G.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Penea</surname>
            ,
            <given-names>R.</given-names>
          </string-name>
          ,
          <source>Mastering Qt</source>
          <volume>5</volume>
          :
          <article-title>Create stunning cross-platform applications</article-title>
          , Packt Publishing Ltd.,
          <string-name>
            <surname>Birmingham</surname>
          </string-name>
          ,
          <source>England (December</source>
          <volume>15</volume>
          ,
          <year>2016</year>
          ).
        </mixed-citation>
      </ref>
      <ref id="ref2">
        <mixed-citation>
          [2]
          <string-name>
            <surname>Eng</surname>
            ,
            <given-names>L. Z.</given-names>
          </string-name>
          , Qt5 C+
          <article-title>+ GUI Programming Cookbook: Practical recipes for building cross-platform GUI applications, widgets, and animations with Qt 5</article-title>
          ,
          <string-name>
            <surname>Packt</surname>
            <given-names>Publishing Ltd.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Birmingham</surname>
          </string-name>
          , England, 2nd edn.
          <source>(March</source>
          <volume>27</volume>
          ,
          <year>2019</year>
          ).
        </mixed-citation>
      </ref>
      <ref id="ref3">
        <mixed-citation>
          [3]
          <string-name>
            <surname>Farrugia</surname>
            ,
            <given-names>J.-P.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Horain</surname>
            ,
            <given-names>P.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Guehenneux</surname>
            ,
            <given-names>E.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Alusse</surname>
            ,
            <given-names>Y.</given-names>
          </string-name>
          ,
          <article-title>GPUCV: A framework for image processing acceleration with graphics processors</article-title>
          ,
          <source>in IEEE International Conference on Multimedia and Expo</source>
          , Toronto (July,
          <year>2006</year>
          ), pp.
          <fpage>585</fpage>
          -
          <lpage>588</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref4">
        <mixed-citation>
          [4]
          <string-name>
            <surname>Allusse</surname>
            ,
            <given-names>Y.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Horain</surname>
            ,
            <given-names>P.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Agarwal</surname>
            ,
            <given-names>A.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Saipriyadarshan</surname>
            ,
            <given-names>C.</given-names>
          </string-name>
          ,
          <article-title>GpuCV: A GPUAccelerated Framework for Image Processing and Computer Vision</article-title>
          , in Advances in Visual Computing.
          <source>ISVC 2008. Lecture Notes in Computer Science, Las Vegas (December</source>
          ,
          <year>2008</year>
          ), pp.
          <fpage>430</fpage>
          -
          <lpage>439</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref5">
        <mixed-citation>
          [5]
          <string-name>
            <surname>Jargstorff</surname>
            ,
            <given-names>F.</given-names>
          </string-name>
          ,
          <article-title>A Framework for Image Processing</article-title>
          , in R. Fernando, editor,
          <source>GPU Gems, chap. 27</source>
          ,
          <string-name>
            <surname>Addison-Wesley</surname>
            <given-names>Professional</given-names>
          </string-name>
          , Boston, 1th edn.
          <source>(April</source>
          ,
          <year>2004</year>
          ), pp.
          <fpage>445</fpage>
          -
          <lpage>467</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref6">
        <mixed-citation>
          [6]
          <string-name>
            <surname>Seiller</surname>
            ,
            <given-names>N.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Singhal</surname>
            ,
            <given-names>N.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Park</surname>
            ,
            <given-names>I. K.</given-names>
          </string-name>
          ,
          <article-title>Object oriented framework for real-time image processing on GPU</article-title>
          ,
          <source>in Proceedings of 2010 IEEE 17th International Conference on Image Processing, Hong Kong (September</source>
          ,
          <year>2010</year>
          ), pp.
          <fpage>4477</fpage>
          -
          <lpage>4480</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref7">
        <mixed-citation>
          [7]
          <string-name>
            <surname>Gonzalez</surname>
            ,
            <given-names>R. C.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Woods</surname>
            ,
            <given-names>R. E.</given-names>
          </string-name>
          ,
          <source>Digital Image Processing, Pearson Education Limited</source>
          , London, England, 4th edn.
          <source>(March</source>
          <volume>30</volume>
          ,
          <year>2017</year>
          ).
        </mixed-citation>
      </ref>
      <ref id="ref8">
        <mixed-citation>
          [8]
          <string-name>
            <surname>Nixon</surname>
            ,
            <given-names>M.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Aguado</surname>
            ,
            <given-names>A.</given-names>
          </string-name>
          ,
          <source>Feature Extraction and Image Processing for Computer Vision</source>
          , Academic Press, Cambridge, Massachusetts, 4th edn.
          <source>(November</source>
          <volume>18</volume>
          ,
          <year>2019</year>
          ).
        </mixed-citation>
      </ref>
      <ref id="ref9">
        <mixed-citation>
          [9] Houston,
          <string-name>
            <given-names>M.</given-names>
            ,
            <surname>Koh</surname>
          </string-name>
          ,
          <string-name>
            <surname>W.</surname>
          </string-name>
          , Compression in the Graphics Pipeline:pp.
          <fpage>3</fpage>
          -
          <lpage>7</lpage>
          , URL http://graphics.stanford.edu/~mhouston/school/cs448a-01-fall/HoKo_ compression_in_graphics_pipeline.pdf, visited on 2020-
          <volume>01</volume>
          -22.
        </mixed-citation>
      </ref>
      <ref id="ref10">
        <mixed-citation>
          [10]
          <string-name>
            <surname>Tile-Based</surname>
            <given-names>Rendering</given-names>
          </string-name>
          , URL https://developer.arm.com/solutions/graphicsand-gaming/
          <article-title>developer-guides/learn-the-basics/tile-based-rendering/ single-page</article-title>
          ,
          <source>visited on 2020-01-22.</source>
        </mixed-citation>
      </ref>
      <ref id="ref11">
        <mixed-citation>
          [11]
          <string-name>
            <surname>Kenwright</surname>
          </string-name>
          ,
          <article-title>Introduction to Computer Graphics and the Vulkan API</article-title>
          , CreateSpace Independent Publishing Platform, Scotts Valley, California, 3rd edn.
          <source>(October</source>
          <volume>21</volume>
          ,
          <year>2018</year>
          ).
        </mixed-citation>
      </ref>
      <ref id="ref12">
        <mixed-citation>
          [13]
          <string-name>
            <surname>Sellers</surname>
            ,
            <given-names>G.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Kessenich</surname>
            ,
            <given-names>J.</given-names>
          </string-name>
          ,
          <article-title>Vulkan Programming Guide: The Oficial Guide to Learning Vulkan</article-title>
          ,
          <string-name>
            <surname>Addison-Wesley</surname>
            <given-names>Professional</given-names>
          </string-name>
          , Boston, Massachusetts, 1st edn.
          <source>(November</source>
          <volume>10</volume>
          ,
          <year>2016</year>
          ).
        </mixed-citation>
      </ref>
      <ref id="ref13">
        <mixed-citation>
          [14]
          <string-name>
            <surname>Kessenich</surname>
            ,
            <given-names>J.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Sellers</surname>
            ,
            <given-names>G.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Shreiner</surname>
            ,
            <given-names>D.</given-names>
          </string-name>
          ,
          <article-title>OpenGL Programming Guide: The Oficial Guide to Learning OpenGL, Version 4.5 with SPIR-V ,</article-title>
          <string-name>
            <surname>Addison-Wesley</surname>
            <given-names>Professional</given-names>
          </string-name>
          , Crawfordsville, Indiana, 9th edn.
          <source>(July</source>
          <volume>18</volume>
          ,
          <year>2016</year>
          ).
        </mixed-citation>
      </ref>
      <ref id="ref14">
        <mixed-citation>
          [15]
          <string-name>
            <surname>Sellers</surname>
            ,
            <given-names>G.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Wright</surname>
            ,
            <given-names>R. S.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Haemel</surname>
            ,
            <given-names>N.</given-names>
          </string-name>
          ,
          <source>OpenGL Superbible: Comprehensive Tutorial and Reference</source>
          ,
          <string-name>
            <surname>Addison-Wesley</surname>
            <given-names>Professional</given-names>
          </string-name>
          , Crawfordsville, Indiana, 7th edn.
          <source>(July</source>
          <volume>31</volume>
          ,
          <year>2015</year>
          ).
        </mixed-citation>
      </ref>
      <ref id="ref15">
        <mixed-citation>
          [16]
          <string-name>
            <surname>Luna</surname>
            ,
            <given-names>F.</given-names>
          </string-name>
          ,
          <article-title>Introduction to 3D Game Programming with DirectX 11, Mercury Learning</article-title>
          and Information LLC.,
          <string-name>
            <surname>Herdon</surname>
          </string-name>
          ,
          <source>Virginia (February</source>
          <volume>28</volume>
          ,
          <year>2012</year>
          ).
        </mixed-citation>
      </ref>
      <ref id="ref16">
        <mixed-citation>
          [17]
          <string-name>
            <surname>Zink</surname>
            ,
            <given-names>J.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Pettineo</surname>
            ,
            <given-names>M.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Hoxley</surname>
            ,
            <given-names>J.</given-names>
          </string-name>
          ,
          <source>Practical Rendering and Computation with Direct3D 11</source>
          ,
          <string-name>
            <surname>A. K</surname>
          </string-name>
          . Peters/CRC Press, Boca Raton, Florida, 1st edn.
          <source>(July</source>
          <volume>27</volume>
          ,
          <year>2011</year>
          ).
        </mixed-citation>
      </ref>
      <ref id="ref17">
        <mixed-citation>
          [18]
          <string-name>
            <surname>Rost</surname>
            ,
            <given-names>R. J.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Licea-Kane</surname>
            ,
            <given-names>B.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Ginsburg</surname>
            ,
            <given-names>D.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Kessenich</surname>
            ,
            <given-names>J.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Lichtenbelt</surname>
            ,
            <given-names>B.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Malan</surname>
            ,
            <given-names>H.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Weiblen</surname>
            ,
            <given-names>M.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>OpenGL Shading</surname>
            <given-names>Language</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Addison-Wesley</surname>
            <given-names>Professional</given-names>
          </string-name>
          , Ann Arbor,
          <article-title>Michigan, 3rd edition edn</article-title>
          .
          <source>(July</source>
          <volume>30</volume>
          ,
          <year>2009</year>
          ).
        </mixed-citation>
      </ref>
      <ref id="ref18">
        <mixed-citation>
          [20]
          <string-name>
            <surname>Asano</surname>
            ,
            <given-names>S.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Maruyama</surname>
            ,
            <given-names>T.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Yamaguchi</surname>
            ,
            <given-names>Y.</given-names>
          </string-name>
          ,
          <article-title>Performance comparison of FPGA, GPU and CPU in image processing</article-title>
          ,
          <source>in International Conference on Field Programmable Logic and Applications</source>
          , Prague (Sept,
          <year>2009</year>
          ), pp.
          <fpage>126</fpage>
          -
          <lpage>131</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref19">
        <mixed-citation>
          [21] Paris,
          <string-name>
            <given-names>S.</given-names>
            ,
            <surname>Hasinoff</surname>
          </string-name>
          ,
          <string-name>
            <given-names>S. W.</given-names>
            ,
            <surname>Kautz</surname>
          </string-name>
          ,
          <string-name>
            <surname>J.</surname>
          </string-name>
          , Local Laplacian Filters:
          <article-title>Edge-Aware Image Processing with a Laplacian Pyramid, in Communications of the ACM</article-title>
          , vol.
          <volume>58</volume>
          (
          <issue>March</issue>
          ,
          <year>2015</year>
          ), pp.
          <fpage>81</fpage>
          -
          <lpage>91</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref20">
        <mixed-citation>
          [22]
          <string-name>
            <surname>Gkeka</surname>
            ,
            <given-names>M. R.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Bellas</surname>
            ,
            <given-names>N.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Antonopoulos</surname>
            ,
            <given-names>C. D.</given-names>
          </string-name>
          ,
          <article-title>Comparative Performance Analysis of Vulkan Implementations of Computational Applications</article-title>
          , in IWOCL'
          <volume>19</volume>
          : Proceedings of the International Workshop on OpenCL, Association for Computing Machinery, Boston (May,
          <year>2019</year>
          ).
        </mixed-citation>
      </ref>
      <ref id="ref21">
        <mixed-citation>
          [23]
          <string-name>
            <surname>Gallant</surname>
            ,
            <given-names>G.</given-names>
          </string-name>
          , WebAssembly in Action, Manning Publications Co.,
          <string-name>
            <surname>Shelter</surname>
            <given-names>Island</given-names>
          </string-name>
          , New York, 1st edn.
          <source>(December 7</source>
          ,
          <year>2019</year>
          ).
        </mixed-citation>
      </ref>
      <ref id="ref22">
        <mixed-citation>
          [24]
          <string-name>
            <surname>Flanagan</surname>
            ,
            <given-names>D.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>JavaScript: The Definitive Guide: Activate Your Web Pages</surname>
            ,
            <given-names>O</given-names>
          </string-name>
          <string-name>
            <surname>'Reilly Media</surname>
          </string-name>
          , Sebastopol, California, 6th edn.
          <source>(May</source>
          <volume>13</volume>
          ,
          <year>2011</year>
          ).
        </mixed-citation>
      </ref>
      <ref id="ref23">
        <mixed-citation>
          [25]
          <string-name>
            <surname>Haverbeke</surname>
            ,
            <given-names>M.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Eloquent</surname>
            <given-names>JavaScript</given-names>
          </string-name>
          :
          <article-title>A Modern Introduction to Programming, No Starch Press Inc</article-title>
          ., San Francisco, California, 3rd edn.
          <source>(December 4</source>
          ,
          <year>2018</year>
          ).
        </mixed-citation>
      </ref>
      <ref id="ref24">
        <mixed-citation>
          [26]
          <string-name>
            <surname>Qt</surname>
            <given-names>for WebAssembly</given-names>
          </string-name>
          (
          <year>December 16</year>
          ,
          <year>2019</year>
          ), URL https://wiki.qt.io/Qt_for_ WebAssembly.
        </mixed-citation>
      </ref>
    </ref-list>
  </back>
</article>