Welcome to mirror list, hosted at ThFree Co, Russian Federation.

COM_OpenCLKernels.cl.h « operations « compositor « blender « source - git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: e064b7511cb152b76cea0a2d269a9fc06be1a4ba (plain)
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
/* clkernelstoh output of file <COM_OpenCLKernels_cl> */

const char * clkernelstoh_COM_OpenCLKernels_cl = "/// This file contains all opencl kernels for node-operation implementations\n" \
"\n" \
"// Global SAMPLERS\n" \
"const sampler_t SAMPLER_NEAREST      = CLK_NORMALIZED_COORDS_FALSE | CLK_ADDRESS_CLAMP_TO_EDGE | CLK_FILTER_NEAREST;\n" \
"\n" \
"__constant const int2 zero = {0,0};\n" \
"\n" \
"// KERNEL --- BOKEH BLUR ---\n" \
"__kernel void bokehBlurKernel(__read_only image2d_t boundingBox, __read_only image2d_t inputImage,\n" \
"                              __read_only image2d_t bokehImage, __write_only image2d_t output,\n" \
"                              int2 offsetInput, int2 offsetOutput, int radius, int step, int2 dimension, int2 offset)\n" \
"{\n" \
"	int2 coords = {get_global_id(0), get_global_id(1)};\n" \
"	coords += offset;\n" \
"	float tempBoundingBox;\n" \
"	float4 color = {0.0f,0.0f,0.0f,0.0f};\n" \
"	float4 multiplier = {0.0f,0.0f,0.0f,0.0f};\n" \
"	float4 bokeh;\n" \
"	const float radius2 = radius*2.0f;\n" \
"	const int2 realCoordinate = coords + offsetOutput;\n" \
"\n" \
"	tempBoundingBox = read_imagef(boundingBox, SAMPLER_NEAREST, coords).s0;\n" \
"\n" \
"	if (tempBoundingBox > 0.0f) {\n" \
"		const int2 bokehImageDim = get_image_dim(bokehImage);\n" \
"		const int2 bokehImageCenter = bokehImageDim/2;\n" \
"		const int2 minXY = max(realCoordinate - radius, zero);\n" \
"		const int2 maxXY = min(realCoordinate + radius, dimension);\n" \
"		int nx, ny;\n" \
"\n" \
"		float2 uv;\n" \
"		int2 inputXy;\n" \
"\n" \
"		for (ny = minXY.y, inputXy.y = ny - offsetInput.y ; ny < maxXY.y ; ny +=step, inputXy.y+=step) {\n" \
"			uv.y = ((realCoordinate.y-ny)/radius2)*bokehImageDim.y+bokehImageCenter.y;\n" \
"\n" \
"			for (nx = minXY.x, inputXy.x = nx - offsetInput.x; nx < maxXY.x ; nx +=step, inputXy.x+=step) {\n" \
"				uv.x = ((realCoordinate.x-nx)/radius2)*bokehImageDim.x+bokehImageCenter.x;\n" \
"				bokeh = read_imagef(bokehImage, SAMPLER_NEAREST, uv);\n" \
"				color += bokeh * read_imagef(inputImage, SAMPLER_NEAREST, inputXy);\n" \
"				multiplier += bokeh;\n" \
"			}\n" \
"		}\n" \
"		color /= multiplier;\n" \
"\n" \
"	} else {\n" \
"		int2 imageCoordinates = realCoordinate - offsetInput;\n" \
"		color = read_imagef(inputImage, SAMPLER_NEAREST, imageCoordinates);\n" \
"	}\n" \
"\n" \
"	write_imagef(output, coords, color);\n" \
"}\n" \
"\n" \
"// KERNEL --- DILATE ---\n" \
"__kernel void dilateKernel(__read_only image2d_t inputImage,  __write_only image2d_t output,\n" \
"                           int2 offsetInput, int2 offsetOutput, int scope, int distanceSquared, int2 dimension,\n" \
"                           int2 offset)\n" \
"{\n" \
"	int2 coords = {get_global_id(0), get_global_id(1)};\n" \
"	coords += offset;\n" \
"	const int2 realCoordinate = coords + offsetOutput;\n" \
"\n" \
"	const int2 minXY = max(realCoordinate - scope, zero);\n" \
"	const int2 maxXY = min(realCoordinate + scope, dimension);\n" \
"\n" \
"	float value = 0.0f;\n" \
"	int nx, ny;\n" \
"	int2 inputXy;\n" \
"\n" \
"	for (ny = minXY.y, inputXy.y = ny - offsetInput.y ; ny < maxXY.y ; ny ++, inputXy.y++) {\n" \
"		for (nx = minXY.x, inputXy.x = nx - offsetInput.x; nx < maxXY.x ; nx ++, inputXy.x++) {\n" \
"			const float deltaX = (realCoordinate.x - nx);\n" \
"			const float deltaY = (realCoordinate.y - ny);\n" \
"			const float measuredDistance = deltaX*deltaX+deltaY*deltaY;\n" \
"			if (measuredDistance <= distanceSquared) {\n" \
"				value = max(value, read_imagef(inputImage, SAMPLER_NEAREST, inputXy).s0);\n" \
"			}\n" \
"		}\n" \
"	}\n" \
"\n" \
"	float4 color = {value,0.0f,0.0f,0.0f};\n" \
"	write_imagef(output, coords, color);\n" \
"}\n" \
"\n" \
"// KERNEL --- DILATE ---\n" \
"__kernel void erodeKernel(__read_only image2d_t inputImage,  __write_only image2d_t output,\n" \
"                           int2 offsetInput, int2 offsetOutput, int scope, int distanceSquared, int2 dimension,\n" \
"                           int2 offset)\n" \
"{\n" \
"	int2 coords = {get_global_id(0), get_global_id(1)};\n" \
"	coords += offset;\n" \
"	const int2 realCoordinate = coords + offsetOutput;\n" \
"\n" \
"	const int2 minXY = max(realCoordinate - scope, zero);\n" \
"	const int2 maxXY = min(realCoordinate + scope, dimension);\n" \
"\n" \
"	float value = 1.0f;\n" \
"	int nx, ny;\n" \
"	int2 inputXy;\n" \
"\n" \
"	for (ny = minXY.y, inputXy.y = ny - offsetInput.y ; ny < maxXY.y ; ny ++, inputXy.y++) {\n" \
"		for (nx = minXY.x, inputXy.x = nx - offsetInput.x; nx < maxXY.x ; nx ++, inputXy.x++) {\n" \
"			const float deltaX = (realCoordinate.x - nx);\n" \
"			const float deltaY = (realCoordinate.y - ny);\n" \
"			const float measuredDistance = deltaX*deltaX+deltaY*deltaY;\n" \
"			if (measuredDistance <= distanceSquared) {\n" \
"				value = min(value, read_imagef(inputImage, SAMPLER_NEAREST, inputXy).s0);\n" \
"			}\n" \
"		}\n" \
"	}\n" \
"\n" \
"	float4 color = {value,0.0f,0.0f,0.0f};\n" \
"	write_imagef(output, coords, color);\n" \
"}\n" \
"\0";