xref: /aosp_15_r20/frameworks/rs/toolkit/TestTaskProcessor.cpp (revision e1eccf28f96817838ad6867f7f39d2351ec11f56)
1*e1eccf28SAndroid Build Coastguard Worker #include <array>
2*e1eccf28SAndroid Build Coastguard Worker 
3*e1eccf28SAndroid Build Coastguard Worker #include "TaskProcessor.h"
4*e1eccf28SAndroid Build Coastguard Worker 
5*e1eccf28SAndroid Build Coastguard Worker /**
6*e1eccf28SAndroid Build Coastguard Worker  * Sets all entries of the buffer to a value that depends on its coordinate and a delta.
7*e1eccf28SAndroid Build Coastguard Worker  */
8*e1eccf28SAndroid Build Coastguard Worker class SimpleTask : public android::renderscript::Task {
9*e1eccf28SAndroid Build Coastguard Worker     uint8_t* mBuffer;
10*e1eccf28SAndroid Build Coastguard Worker     uint8_t mDelta;
11*e1eccf28SAndroid Build Coastguard Worker     virtual void processData(int threadIndex, size_t startX, size_t startY, size_t endX,
12*e1eccf28SAndroid Build Coastguard Worker                              size_t endY);
13*e1eccf28SAndroid Build Coastguard Worker 
14*e1eccf28SAndroid Build Coastguard Worker    public:
SimpleTask(uint8_t * buffer,size_t vectorSize,size_t sizeX,size_t sizeY,uint8_t delta)15*e1eccf28SAndroid Build Coastguard Worker     SimpleTask(uint8_t* buffer, size_t vectorSize, size_t sizeX, size_t sizeY, uint8_t delta)
16*e1eccf28SAndroid Build Coastguard Worker         : Task{sizeX, sizeY, vectorSize, false, nullptr}, mBuffer{buffer}, mDelta{delta} {}
17*e1eccf28SAndroid Build Coastguard Worker };
18*e1eccf28SAndroid Build Coastguard Worker 
19*e1eccf28SAndroid Build Coastguard Worker /**
20*e1eccf28SAndroid Build Coastguard Worker  * Create a new value that's a function of the x, y coordinates and a delta.
21*e1eccf28SAndroid Build Coastguard Worker  */
newValue(size_t x,size_t y,uint8_t delta)22*e1eccf28SAndroid Build Coastguard Worker static uint8_t newValue(size_t x, size_t y, uint8_t delta) {
23*e1eccf28SAndroid Build Coastguard Worker     return (((x & 0xff) << 4) | (y & 0xff)) + delta;
24*e1eccf28SAndroid Build Coastguard Worker }
25*e1eccf28SAndroid Build Coastguard Worker 
processData(int,size_t startX,size_t startY,size_t endX,size_t endY)26*e1eccf28SAndroid Build Coastguard Worker void SimpleTask::processData(int /*threadIndex*/, size_t startX, size_t startY, size_t endX,
27*e1eccf28SAndroid Build Coastguard Worker                              size_t endY) {
28*e1eccf28SAndroid Build Coastguard Worker     for (size_t y = startY; y < endY; y++) {
29*e1eccf28SAndroid Build Coastguard Worker         for (size_t x = startX; x < endX; x++) {
30*e1eccf28SAndroid Build Coastguard Worker             size_t index = (y * mSizeX + x) * mVectorSize;
31*e1eccf28SAndroid Build Coastguard Worker             for (size_t i = 0; i < mVectorSize; i++) {
32*e1eccf28SAndroid Build Coastguard Worker                 // Use add to make sure the opertion is only done once. This assumes
33*e1eccf28SAndroid Build Coastguard Worker                 // the buffer starts set at 0.
34*e1eccf28SAndroid Build Coastguard Worker                 mBuffer[index + i] += newValue(x, y, mDelta + i);
35*e1eccf28SAndroid Build Coastguard Worker             }
36*e1eccf28SAndroid Build Coastguard Worker         }
37*e1eccf28SAndroid Build Coastguard Worker     }
38*e1eccf28SAndroid Build Coastguard Worker }
39*e1eccf28SAndroid Build Coastguard Worker 
40*e1eccf28SAndroid Build Coastguard Worker /**
41*e1eccf28SAndroid Build Coastguard Worker  * Returns true if all the entries of the vector are the expected value.
42*e1eccf28SAndroid Build Coastguard Worker  * Prints an error if not.
43*e1eccf28SAndroid Build Coastguard Worker  */
verifyAllTheSame(const std::vector<uint8_t> & buffer,size_t vectorSize,size_t sizeX,size_t sizeY,uint8_t delta)44*e1eccf28SAndroid Build Coastguard Worker bool verifyAllTheSame(const std::vector<uint8_t>& buffer, size_t vectorSize, size_t sizeX,
45*e1eccf28SAndroid Build Coastguard Worker                       size_t sizeY, uint8_t delta) {
46*e1eccf28SAndroid Build Coastguard Worker     for (size_t y = 0; y < sizeY; y++) {
47*e1eccf28SAndroid Build Coastguard Worker         for (size_t x = 0; x < sizeX; x++) {
48*e1eccf28SAndroid Build Coastguard Worker             size_t index = (y * sizeX + x) * vectorSize;
49*e1eccf28SAndroid Build Coastguard Worker             for (size_t i = 0; i < vectorSize; i++) {
50*e1eccf28SAndroid Build Coastguard Worker                 uint8_t expectedValue = newValue(x, y, delta + i);
51*e1eccf28SAndroid Build Coastguard Worker                 if (buffer[index + i] != expectedValue) {
52*e1eccf28SAndroid Build Coastguard Worker                     printf("Test Error at %zu, %zu. Expected %u found %u instead\n", x, y,
53*e1eccf28SAndroid Build Coastguard Worker                            expectedValue, buffer[index + i]);
54*e1eccf28SAndroid Build Coastguard Worker                     return false;
55*e1eccf28SAndroid Build Coastguard Worker                 }
56*e1eccf28SAndroid Build Coastguard Worker             }
57*e1eccf28SAndroid Build Coastguard Worker         }
58*e1eccf28SAndroid Build Coastguard Worker     }
59*e1eccf28SAndroid Build Coastguard Worker     return true;
60*e1eccf28SAndroid Build Coastguard Worker }
61*e1eccf28SAndroid Build Coastguard Worker 
62*e1eccf28SAndroid Build Coastguard Worker /**
63*e1eccf28SAndroid Build Coastguard Worker  * Create a buffer of the specified size, set each entry of that buffer
64*e1eccf28SAndroid Build Coastguard Worker  * to the specified value using TaskProcessor, and verify the results.
65*e1eccf28SAndroid Build Coastguard Worker  */
testOne(android::renderscript::TaskProcessor * processor,uint8_t delta,size_t vectorSize,size_t sizeX,size_t sizeY)66*e1eccf28SAndroid Build Coastguard Worker void testOne(android::renderscript::TaskProcessor* processor, uint8_t delta, size_t vectorSize,
67*e1eccf28SAndroid Build Coastguard Worker              size_t sizeX, size_t sizeY) {
68*e1eccf28SAndroid Build Coastguard Worker     std::vector<uint8_t> buffer(sizeX * sizeY * vectorSize);
69*e1eccf28SAndroid Build Coastguard Worker 
70*e1eccf28SAndroid Build Coastguard Worker     SimpleTask task{buffer.data(), vectorSize, sizeX, sizeY, delta};
71*e1eccf28SAndroid Build Coastguard Worker     processor->doTask(&task);
72*e1eccf28SAndroid Build Coastguard Worker 
73*e1eccf28SAndroid Build Coastguard Worker     if (verifyAllTheSame(buffer, vectorSize, sizeX, sizeY, delta)) {
74*e1eccf28SAndroid Build Coastguard Worker         printf("Test %u: All good!\n", delta);
75*e1eccf28SAndroid Build Coastguard Worker     }
76*e1eccf28SAndroid Build Coastguard Worker }
77*e1eccf28SAndroid Build Coastguard Worker 
main()78*e1eccf28SAndroid Build Coastguard Worker int main() {
79*e1eccf28SAndroid Build Coastguard Worker     std::vector<std::thread> testThreads;
80*e1eccf28SAndroid Build Coastguard Worker 
81*e1eccf28SAndroid Build Coastguard Worker     // Test with multiple threads, to help find synchronization errors.
82*e1eccf28SAndroid Build Coastguard Worker     android::renderscript::TaskProcessor processorA(1);
83*e1eccf28SAndroid Build Coastguard Worker     android::renderscript::TaskProcessor processorB(4);
84*e1eccf28SAndroid Build Coastguard Worker     testThreads.emplace_back(testOne, &processorA, 1, 4, 30, 40);
85*e1eccf28SAndroid Build Coastguard Worker     testThreads.emplace_back(testOne, &processorB, 1, 4, 30, 40);
86*e1eccf28SAndroid Build Coastguard Worker     testThreads.emplace_back(testOne, &processorA, 2, 4, 800, 600);
87*e1eccf28SAndroid Build Coastguard Worker     testThreads.emplace_back(testOne, &processorB, 2, 4, 800, 600);
88*e1eccf28SAndroid Build Coastguard Worker     testThreads.emplace_back(testOne, &processorA, 3, 1, 123, 47);
89*e1eccf28SAndroid Build Coastguard Worker     testThreads.emplace_back(testOne, &processorB, 3, 1, 123, 47);
90*e1eccf28SAndroid Build Coastguard Worker     testThreads.emplace_back(testOne, &processorA, 5, 2, 5000, 8000);
91*e1eccf28SAndroid Build Coastguard Worker     testThreads.emplace_back(testOne, &processorB, 5, 2, 5000, 8000);
92*e1eccf28SAndroid Build Coastguard Worker     testThreads.emplace_back(testOne, &processorA, 6, 3, 26000, 1);
93*e1eccf28SAndroid Build Coastguard Worker     testThreads.emplace_back(testOne, &processorB, 6, 3, 26000, 1);
94*e1eccf28SAndroid Build Coastguard Worker     testThreads.emplace_back(testOne, &processorA, 7, 4, 1, 26000);
95*e1eccf28SAndroid Build Coastguard Worker     testThreads.emplace_back(testOne, &processorB, 7, 4, 1, 26000);
96*e1eccf28SAndroid Build Coastguard Worker     testThreads.emplace_back(testOne, &processorA, 8, 4, 1000, 1000);
97*e1eccf28SAndroid Build Coastguard Worker     testThreads.emplace_back(testOne, &processorB, 8, 4, 1000, 1000);
98*e1eccf28SAndroid Build Coastguard Worker     testThreads.emplace_back(testOne, &processorA, 9, 1, 1, 1);
99*e1eccf28SAndroid Build Coastguard Worker     testThreads.emplace_back(testOne, &processorB, 9, 1, 1, 1);
100*e1eccf28SAndroid Build Coastguard Worker 
101*e1eccf28SAndroid Build Coastguard Worker     for (auto& thread : testThreads) {
102*e1eccf28SAndroid Build Coastguard Worker         thread.join();
103*e1eccf28SAndroid Build Coastguard Worker     }
104*e1eccf28SAndroid Build Coastguard Worker     return 0;
105*e1eccf28SAndroid Build Coastguard Worker }
106