-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathflatSaturation.cpp
More file actions
126 lines (104 loc) · 4.02 KB
/
Copy pathflatSaturation.cpp
File metadata and controls
126 lines (104 loc) · 4.02 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
#include "flatSaturation.h"
#include "flatSaturation_CUDA.cuh"
#include "flatSaturation_OpenCL.h"
#include "globals.h"
#include "utils.h"
bool FlatSaturationProcessor::firstTime = true;
void (FlatSaturationProcessor::* FlatSaturationProcessor::processFunc)() const = nullptr;
void (FlatSaturationProcessor::* FlatSaturationProcessor::processFuncRGBA)() const = nullptr;
cl_kernel FlatSaturationProcessor::m_openclKernel = nullptr;
cl_kernel FlatSaturationProcessor::m_openclKernelRGBA = nullptr;
FlatSaturationProcessor::FlatSaturationProcessor(int size, int nPixels, float thresh)
: m_thresh(thresh), m_nPixels(nPixels) {
imgSize = size;
if (FlatSaturationProcessor::firstTime) {
FlatSaturationProcessor::init();
if (BaseProcessor::firstTime) {
BaseProcessor::init();
}
}
// Allocate buffers for CUDA or OpenCL
if (isCudaAvailable()) {
cudaStreamCreate(&this->m_cudaStream);
allocateCUDA();
blockSize = 1024;
gridSize = (m_nPixels + blockSize - 1) / blockSize;
}
else {
globalWorkSize = m_nPixels;
allocateOpenCL();
}
}
FlatSaturationProcessor::~FlatSaturationProcessor() {
if (isCudaAvailable()) {
cudaFree(d_img);
cudaStreamDestroy(m_cudaStream);
}
else {
clReleaseMemObject(m_imgBuf);
}
}
void FlatSaturationProcessor::process() const {
(this->*processFunc)();
}
void FlatSaturationProcessor::processRGBA() const {
(this->*processFuncRGBA)();
}
void FlatSaturationProcessor::processCUDA() const {
flatSaturation_CUDA(gridSize, blockSize, m_cudaStream, d_img, m_nPixels, m_thresh);
}
void FlatSaturationProcessor::processRGBA_CUDA() const {
flatSaturationRGBA_CUDA(gridSize, blockSize, m_cudaStream, d_img, m_nPixels, m_thresh);
}
void FlatSaturationProcessor::processOpenCL() const {
clSetKernelArg(m_openclKernel, 0, sizeof(cl_mem), &m_imgBuf);
clSetKernelArg(m_openclKernel, 1, sizeof(int), &m_nPixels);
clSetKernelArg(m_openclKernel, 2, sizeof(float), &m_thresh);
cl_event kernelEvent;
clEnqueueNDRangeKernel(globalQueueOpenCL,
m_openclKernel,
1,
nullptr,
&globalWorkSize,
nullptr,
0, nullptr, &kernelEvent);
// ⏳ Wait for kernel to complete
clWaitForEvents(1, &kernelEvent);
// Release the kernel event
clReleaseEvent(kernelEvent);
}
void FlatSaturationProcessor::processRGBA_OpenCL() const {
clSetKernelArg(m_openclKernelRGBA, 0, sizeof(cl_mem), &m_imgBuf);
clSetKernelArg(m_openclKernelRGBA, 1, sizeof(int), &m_nPixels);
clSetKernelArg(m_openclKernelRGBA, 2, sizeof(float), &m_thresh);
cl_event kernelEvent;
clEnqueueNDRangeKernel(globalQueueOpenCL,
m_openclKernelRGBA,
1,
nullptr,
&globalWorkSize,
nullptr,
0, nullptr, &kernelEvent);
// ⏳ Wait for kernel to complete
clWaitForEvents(1, &kernelEvent);
// Release the kernel event
clReleaseEvent(kernelEvent);
}
void FlatSaturationProcessor::init() {
if (FlatSaturationProcessor::firstTime) {
if (isCudaAvailable()) {
FlatSaturationProcessor::processFunc = &FlatSaturationProcessor::processCUDA;
FlatSaturationProcessor::processFuncRGBA = &FlatSaturationProcessor::processRGBA_CUDA;
}
else {
FlatSaturationProcessor::processFunc = &FlatSaturationProcessor::processOpenCL;
FlatSaturationProcessor::processFuncRGBA = &FlatSaturationProcessor::processRGBA_OpenCL;
FlatSaturationProcessor::m_openclKernel = openclUtils::createKernelFromSource(globalContextOpenCL, globalDeviceOpenCL, flatSaturationOpenCLKernelSource, "flatSaturation_kernel");
FlatSaturationProcessor::m_openclKernelRGBA = openclUtils::createKernelFromSource(globalContextOpenCL, globalDeviceOpenCL, flatSaturationRGBAOpenCLKernelSource, "flatSaturationRGBA_kernel");
}
FlatSaturationProcessor::firstTime = false;
if (BaseProcessor::firstTime) {
BaseProcessor::init();
}
}
}