File indexing completed on 2024-05-26 04:29:10

0001 /*
0002  *  SPDX-FileCopyrightText: 2010 Lukáš Tvrdý <lukast.dev@gmail.com>
0003  *
0004  *  SPDX-License-Identifier: LGPL-2.1-or-later
0005  */
0006 
0007 #include "KoCompositeOpsBenchmark.h"
0008 
0009 #include "../compositeops/KoCompositeOpAlphaDarken.h"
0010 #include "../compositeops/KoCompositeOpOver.h"
0011 #include <KoOptimizedCompositeOpFactory.h>
0012 
0013 #include <KoColorSpaceTraits.h>
0014 #include <KoColorSpaceRegistry.h>
0015 
0016 #include <simpletest.h>
0017 
0018 const int TILE_WIDTH = 64;
0019 const int TILE_HEIGHT = 64;
0020 
0021 const int IMG_WIDTH = 2048;
0022 const int IMG_HEIGHT = 2048;
0023 
0024 const quint8 OPACITY_HALF = 128;
0025 
0026 const int TILES_IN_WIDTH = IMG_WIDTH / TILE_WIDTH;
0027 const int TILES_IN_HEIGHT = IMG_HEIGHT / TILE_HEIGHT;
0028 
0029 
0030 #define COMPOSITE_BENCHMARK \
0031         for (int y = 0; y < TILES_IN_HEIGHT; y++){                                              \
0032             for (int x = 0; x < TILES_IN_WIDTH; x++) {                                           \
0033                 const int rowStride = IMG_WIDTH * KoBgrU8Traits::pixelSize;  \
0034                 const int bufOffset = y * rowStride + x * TILE_WIDTH * KoBgrU8Traits::pixelSize;  \
0035                 compositeOp->composite(m_dstBuffer + bufOffset, rowStride,      \
0036                                       m_srcBuffer + bufOffset, rowStride,      \
0037                                       m_mskBuffer + bufOffset, rowStride,                                                            \
0038                                       TILE_WIDTH, TILE_HEIGHT,                                         \
0039                                       OPACITY_HALF);                                                   \
0040             }                                                                                   \
0041         }
0042 
0043 void KoCompositeOpsBenchmark::initTestCase()
0044 {
0045     const int bufLen = IMG_HEIGHT * IMG_WIDTH * KoBgrU8Traits::pixelSize;
0046 
0047     m_dstBuffer = new quint8[bufLen];
0048     m_srcBuffer = new quint8[bufLen];
0049     m_mskBuffer = new quint8[bufLen];
0050 }
0051 
0052 // this is called before every benchmark
0053 void KoCompositeOpsBenchmark::init()
0054 {
0055     qsrand(42);
0056 
0057     for (int i = 0; i < int(IMG_WIDTH * IMG_HEIGHT * KoBgrU8Traits::pixelSize); i++) {
0058         const int randVal = qrand();
0059 
0060         m_srcBuffer[i] = randVal & 0x0000FF;
0061         m_dstBuffer[i] = (randVal & 0x00FF000) >> 8;
0062         m_mskBuffer[i] = (randVal & 0xFF0000) >> 16;
0063     }
0064 }
0065 
0066 
0067 void KoCompositeOpsBenchmark::cleanupTestCase()
0068 {
0069     delete [] m_dstBuffer;
0070     delete [] m_srcBuffer;
0071     delete [] m_mskBuffer;
0072 }
0073 
0074 void KoCompositeOpsBenchmark::benchmarkCompositeOver()
0075 {
0076     KoCompositeOp *compositeOp = KoOptimizedCompositeOpFactory::createOverOp32(KoColorSpaceRegistry::instance()->rgb8());
0077     QBENCHMARK{
0078         COMPOSITE_BENCHMARK
0079     }
0080 }
0081 
0082 void KoCompositeOpsBenchmark::benchmarkCompositeAlphaDarkenHard()
0083 {
0084     KoCompositeOp *compositeOp = KoOptimizedCompositeOpFactory::createAlphaDarkenOpHard32(KoColorSpaceRegistry::instance()->rgb8());
0085     QBENCHMARK{
0086         COMPOSITE_BENCHMARK
0087     }
0088 }
0089 
0090 
0091 void KoCompositeOpsBenchmark::benchmarkCompositeAlphaDarkenCreamy()
0092 {
0093     KoCompositeOp *compositeOp = KoOptimizedCompositeOpFactory::createAlphaDarkenOpCreamy32(KoColorSpaceRegistry::instance()->rgb8());
0094     QBENCHMARK{
0095         COMPOSITE_BENCHMARK
0096     }
0097 }
0098 
0099 
0100 QTEST_GUILESS_MAIN(KoCompositeOpsBenchmark)