-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathOKLCh.cpp
More file actions
127 lines (105 loc) · 3.94 KB
/
Copy pathOKLCh.cpp
File metadata and controls
127 lines (105 loc) · 3.94 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
127
#include "OKLCh.h"
#include "OKLCh_CUDA_launcher.cuh"
#include "OKLCh_OpenCL.h"
#include "globals.h"
#include "utils.h"
bool OKLChProcessor::firstTime = true;
void (OKLChProcessor::* OKLChProcessor::processFunc)() const = nullptr;
void (OKLChProcessor::* OKLChProcessor::processFuncRGBA)() const = nullptr;
cl_kernel OKLChProcessor::m_openclKernel = nullptr;
cl_kernel OKLChProcessor::m_openclKernelRGBA = nullptr;
OKLChProcessor::OKLChProcessor(int size, int nPixels, const float Ladd, const float Cadd, const float hadd)
: m_nPixels(nPixels), m_Ladd(Ladd), m_Cadd(Cadd), m_hadd(hadd) {
imgSize = size;
if (OKLChProcessor::firstTime) {
OKLChProcessor::init();
}
// Allocate buffers for CUDA or OpenCL
if (isCudaAvailable()) {
cudaStreamCreate(&this->m_cudaStream);
allocateCUDA();
blockSize = 256;
gridSize = (m_nPixels + blockSize - 1) / blockSize;
}
else {
globalWorkSize = m_nPixels;
allocateOpenCL();
}
}
OKLChProcessor::~OKLChProcessor() {
if (isCudaAvailable()) {
cudaFree(d_img);
cudaStreamDestroy(m_cudaStream);
}
else {
clReleaseMemObject(m_imgBuf);
}
}
void OKLChProcessor::process() const {
(this->*processFunc)();
}
void OKLChProcessor::processRGBA() const {
(this->*processFuncRGBA)();
}
void OKLChProcessor::processCUDA() const {
OKLCh_CUDA(gridSize, blockSize, m_cudaStream, d_img, m_nPixels, m_Ladd, m_Cadd, m_hadd);
}
void OKLChProcessor::processRGBA_CUDA() const {
OKLCh_CUDA(gridSize, blockSize, m_cudaStream, d_img, m_nPixels, m_Ladd, m_Cadd, m_hadd); // TODO: implement RGBA version
}
void OKLChProcessor::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_Ladd);
clSetKernelArg(m_openclKernel, 3, sizeof(float), &m_Cadd);
clSetKernelArg(m_openclKernel, 4, sizeof(float), &m_hadd);
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 OKLChProcessor::processRGBA_OpenCL() 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_Ladd);
clSetKernelArg(m_openclKernel, 3, sizeof(float), &m_Cadd);
clSetKernelArg(m_openclKernel, 4, sizeof(float), &m_hadd);
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 OKLChProcessor::init() {
if (OKLChProcessor::firstTime) {
if (isCudaAvailable()) {
OKLChProcessor::processFunc = &OKLChProcessor::processCUDA;
OKLChProcessor::processFuncRGBA = &OKLChProcessor::processRGBA_CUDA;
}
else {
OKLChProcessor::processFunc = &OKLChProcessor::processOpenCL;
OKLChProcessor::processFuncRGBA = &OKLChProcessor::processRGBA_OpenCL;
OKLChProcessor::m_openclKernel = openclUtils::createKernelFromSource(globalContextOpenCL, globalDeviceOpenCL, OKLChOpenCLKernelSource, "OKLCh_kernel");
//OKLChProcessor::m_openclKernelRGBA = openclUtils::createKernelFromSource(globalContextOpenCL, globalDeviceOpenCL, OKLChRGBAOpenCLKernelSource, "glitchFocusRGBA_kernel");
}
OKLChProcessor::firstTime = false;
if (BaseProcessor::firstTime) {
BaseProcessor::init();
}
}
}