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)