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
|
import pyopencl as cl
mf = cl.mem_flags
import numpy
from mako.template import Template
from pathlib import Path
from OpenGL.GL import *
from OpenGL.arrays import vbo
class Streamlines:
def __init__(self, lattice, moments, origins):
self.lattice = lattice
self.context = self.lattice.context
self.queue = self.lattice.queue
self.float_type = self.lattice.memory.float_type
self.moments = moments
self.count = len(origins)
self.np_origins = numpy.ndarray(shape=(self.count, 2), dtype=self.float_type)
for i, pos in enumerate(origins):
self.np_origins[i,:] = pos
self.cl_origins = cl.Buffer(self.context, mf.READ_ONLY, size=self.count * 2*numpy.float32(0).nbytes)
cl.enqueue_copy(self.queue, self.cl_origins, self.np_origins).wait();
self.gl_texture_buffer = numpy.ndarray(shape=(self.lattice.memory.volume, 4), dtype=self.lattice.memory.float_type)
self.gl_texture_buffer[:,:] = 0.0
self.gl_streamlines = glGenTextures(1)
self.gl_texture_type = GL_TEXTURE_2D
glBindTexture(self.gl_texture_type, self.gl_streamlines)
glTexImage2D(self.gl_texture_type, 0, GL_RGBA32F, self.lattice.memory.size_x, self.lattice.memory.size_y, 0, GL_RGBA, GL_FLOAT, self.gl_texture_buffer)
glTexParameteri(self.gl_texture_type, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(self.gl_texture_type, GL_TEXTURE_MAG_FILTER, GL_LINEAR)
glTexParameteri(self.gl_texture_type, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE)
glTexParameteri(self.gl_texture_type, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE)
self.cl_gl_streamlines = cl.GLTexture(self.lattice.context, mf.READ_WRITE, self.gl_texture_type, 0, self.gl_streamlines, 2)
self.build_kernel()
def build_kernel(self):
program_src = Template(filename = str(Path(__file__).parent/'../template/streamline.mako')).render(
descriptor = self.lattice.descriptor,
geometry = self.lattice.geometry,
memory = self.lattice.memory,
float_type = self.float_type,
)
self.program = cl.Program(self.lattice.context, program_src).build(self.lattice.compiler_args)
def bind(self, location = GL_TEXTURE0):
glEnable(self.gl_texture_type)
glActiveTexture(location);
glBindTexture(self.gl_texture_type, self.gl_streamlines)
def update(self):
cl.enqueue_acquire_gl_objects(self.queue, [self.cl_gl_streamlines])
self.program.dillute(
self.queue, (self.lattice.memory.size_x,self.lattice.memory.size_y), None,
self.lattice.memory.cl_material,
self.cl_gl_streamlines)
self.program.draw_streamline(
self.queue, (self.count,1), None,
self.moments.cl_gl_moments,
self.lattice.memory.cl_material,
self.cl_origins,
self.cl_gl_streamlines)
|