This repository has been archived by the owner on Jan 22, 2023. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcl_compiler.py
63 lines (48 loc) · 1.87 KB
/
cl_compiler.py
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
from accelerator import Accelerator
import numpy as np
import jinja2
class Compiler:
"""
The part of the Renderer that generates OpenCL code using Jinja2 templates.
Still quite badly separated.
"""
def __init__(self, renderer):
self.scene = renderer.scene
self.shader = renderer.shader
self.renderer = renderer
def make_program(self):
scene = self.scene
template_env = jinja2.Environment(\
loader=jinja2.PackageLoader('clray', 'cl_templates'),
line_statement_prefix='###')
kernels, functions = collect_tracer_kernels(scene.objects, template_env)
function_declarations = [body[:body.find('{')] + ';' for body in functions]
return template_env.get_template('main.cl').render({
'shader': self.shader,
'renderer': self.renderer,
'objects': scene.objects,
'n_objects': len(scene.objects),
'functions': {
'declarations': function_declarations,
'definitions': functions,
'kernels': kernels
}
})
def collect_tracer_kernels(objects, template_env):
name_map = {}
def push_func(name, body):
if name in name_map and name_map[name].strip() != body.strip():
print name_map[name]
print '------'
print body
raise RuntimeError("function name clash!!")
functions = set([])
kernels = set([])
for obj in objects:
for (name, body) in obj.tracer.make_functions(template_env).items():
push_func(name,body)
functions.add(body)
for (name, body) in obj.tracer.make_kernels(template_env).items():
push_func(name,body)
kernels.add(body)
return (list(kernels),list(functions))