https://github.com/abadonna/defold-opencl
OpenCL as native extension for Defold
https://github.com/abadonna/defold-opencl
Last synced: 4 months ago
JSON representation
OpenCL as native extension for Defold
- Host: GitHub
- URL: https://github.com/abadonna/defold-opencl
- Owner: abadonna
- License: unlicense
- Created: 2023-10-16T18:06:20.000Z (over 1 year ago)
- Default Branch: main
- Last Pushed: 2023-10-24T21:56:34.000Z (over 1 year ago)
- Last Synced: 2024-10-09T13:06:57.485Z (8 months ago)
- Language: C
- Size: 170 KB
- Stars: 9
- Watchers: 1
- Forks: 1
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
- awesome-defold - OpenCL
README
# Defold-OpenCL
Proof of concept: OpenCL as native extension for Defold.## Installation
Open your game.project file and add in the dependencies:```
https://github.com/abadonna/defold-opencl/archive/master.zip
```## Documentation
I tried to put most boilerplate code under the hood to simplify the use. But also it means less flexibility - can be solved by expanding the libray.First you need to select device either from all or only GPU devices. To retrive list of available devices call:
```
devices = opencl.get_devices(is_gpu_only)
```Second step is to build program from code:
```
program = device:load_program(src)
```It's convinient to keep OpenCL code in custom resources and load it with sys.load_resource(path)
Now you have to create kernel from compiled program code:
```
kernel = program:create_kernel(name)
```And set all the nessesary arguments, with either:
```
kernel:set_arg_buffer(index, buffer, stream_name, read, write) -- set array as argument at index from dmBuffer
kernel:set_arg_int(index, value) -- set integer
kernel:set_arg_float(index, value) -- set float
kernel:set_arg_vec3(index, value) -- set vmath.vector3
kernel:set_arg_null(index, size) -- set null for local memory buffer
```If buffer stream contains 3 components per item it will be passed to kernel as array of float3
Now we can run kernel with
```
time = kernel:run(dimensions, {global_items_in_dimension1, ...}, {local_items_in_dimension1, ...})
```Local items size can be omitted. Number of work groups will be created = global_items/local_items.
Finally we need to read data back to lua.```
result_table = kernel:read(index, count) -- read count items from kernel arguments at index and returns as table
kernel:read(index, count, buffer, stream_name) -- read count items from kernel arguments at index to dmBuffer (faster)
```For more advanced examples check https://github.com/abadonna/defold-light-probes/tree/opencl