From 9cf9887a09d0c8061587e62b4597938d3bedd1d2 Mon Sep 17 00:00:00 2001 From: Joshua Moerman Date: Mon, 28 Apr 2014 16:16:25 +0200 Subject: [PATCH] Tests the OpenCL part again --- src/main.cpp | 150 ++++++++++++++++++++++++++------------------------- 1 file changed, 78 insertions(+), 72 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index b89cdac..e6450a4 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -110,15 +110,92 @@ struct App { } }; +struct CLApp { + void initialize(){ + auto context = cl::Context::getDefault(); + cout << context << endl; -int main(){ + cl_int err = 0; + // build the program + auto KernelSource = slurp("Kernel.cl"); + cl::Program program(context, {KernelSource.c_str(), KernelSource.size()}, true, &err); + check(err); + cout << program << endl; + + // grab the kernel + KernelOp kernel(program, "square", &err); + check(err); + + // create a queue + cl::CommandQueue queue(context, context.getInfo().front()); + + // make a lot of data + constexpr size_t W = 1280 * 1; + constexpr size_t H = 800 * 1; + std::vector input_vector(W*H); + + for(int y = 0; y < H; ++y){ + for(int x = 0; x < W; ++x){ + input_vector[x + W*y] = 10 * ((x / double(W) - 0.5) + 1.3371337*(y / double(H) - 0.5)); + } + } + + // transfer data into buffers + cl::Buffer input(context, input_vector.begin(), input_vector.end(), false, true); + + int r = 20, g = 20, b = 20; + + // DO IT (in place) + for(int i = 0; i < r; ++i){ + check(kernel(queue, W, H, input, W, input)); + } + + // read back + queue.finish(); + + auto red = input_vector; + + // DO IT (in place) + for(int i = 0; i < g; ++i){ + check(kernel(queue, W, H, input, W, input)); + } + + // read back + queue.finish(); + + auto green = input_vector; + + // DO IT (in place) + for(int i = 0; i < b; ++i){ + check(kernel(queue, W, H, input, W, input)); + } + + // read back + queue.finish(); + + auto& blue = input_vector; + + // test + cout << "opencl is done" << endl; + png::ostream<> image(W, H, "test.png"); + for(int i = 0; i < red.size(); ++i){ + image << png::ostream<>::pixel(blue[i], red[i], green[i]); + } + cout << "png is saved" << endl; + } +}; + + +int main() { App a; + CLApp b; NSAppWrapper app; app.create_window({ [&](ContextParameters){ a.initialize(); + b.initialize(); }, [&](ContextParameters){ a.draw(); @@ -127,77 +204,6 @@ int main(){ }); app.run(); - - auto context = cl::Context::getDefault(); - cout << context << endl; - - cl_int err = 0; - // build the program - auto KernelSource = slurp("Kernel.cl"); - cl::Program program(context, {KernelSource.c_str(), KernelSource.size()}, true, &err); - check(err); - cout << program << endl; - - // grab the kernel - KernelOp kernel(program, "square", &err); - check(err); - - // create a queue - cl::CommandQueue queue(context, context.getInfo().front()); - - // make a lot of data - constexpr size_t W = 1280 * 4; - constexpr size_t H = 800 * 4; - std::vector input_vector(W*H); - - for(int y = 0; y < H; ++y){ - for(int x = 0; x < W; ++x){ - input_vector[x + W*y] = 10 * ((x / double(W) - 0.5) + 1.3371337*(y / double(H) - 0.5)); - } - } - - // transfer data into buffers - cl::Buffer input(context, input_vector.begin(), input_vector.end(), false, true); - - int r = 80, g = 40, b = 20; - - // DO IT (in place) - for(int i = 0; i < r; ++i){ - check(kernel(queue, W, H, input, W, input)); - } - - // read back - queue.finish(); - - auto red = input_vector; - - // DO IT (in place) - for(int i = 0; i < g; ++i){ - check(kernel(queue, W, H, input, W, input)); - } - - // read back - queue.finish(); - - auto green = input_vector; - - // DO IT (in place) - for(int i = 0; i < b; ++i){ - check(kernel(queue, W, H, input, W, input)); - } - - // read back - queue.finish(); - - auto& blue = input_vector; - - // test - cout << "opencl is done" << endl; - png::ostream<> image(W, H, "test.png"); - for(int i = 0; i < red.size(); ++i){ - image << png::ostream<>::pixel(blue[i], red[i], green[i]); - } - cout << "png is saved" << endl; }