MCPcopy Create free account
hub / github.com/arrayfire/arrayfire / copy_vector_field

Function copy_vector_field

src/backend/opencl/vector_field.cpp:24–92  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

22
23template<typename T>
24void copy_vector_field(const Array<T> &points, const Array<T> &directions,
25 fg_vector_field vfield) {
26 ForgeModule &_ = common::forgePlugin();
27 if (isGLSharingSupported()) {
28 CheckGL("Begin OpenCL resource copy");
29 const cl::Buffer *d_points = points.get();
30 const cl::Buffer *d_directions = directions.get();
31 unsigned pBytes = 0;
32 unsigned dBytes = 0;
33 FG_CHECK(_.fg_get_vector_field_vertex_buffer_size(&pBytes, vfield));
34 FG_CHECK(_.fg_get_vector_field_direction_buffer_size(&dBytes, vfield));
35
36 auto res = interopManager().getVectorFieldResources(vfield);
37
38 std::vector<cl::Memory> shared_objects;
39 shared_objects.push_back(*(res[0].get()));
40 shared_objects.push_back(*(res[1].get()));
41
42 glFinish();
43
44 // Use of events:
45 // https://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clEnqueueReleaseGLObjects.html
46 cl::Event event;
47
48 getQueue().enqueueAcquireGLObjects(&shared_objects, NULL, &event);
49 event.wait();
50 getQueue().enqueueCopyBuffer(*d_points, *(res[0].get()), 0, 0, pBytes,
51 NULL, &event);
52 getQueue().enqueueCopyBuffer(*d_directions, *(res[1].get()), 0, 0,
53 dBytes, NULL, &event);
54 getQueue().enqueueReleaseGLObjects(&shared_objects, NULL, &event);
55 event.wait();
56
57 CL_DEBUG_FINISH(getQueue());
58 CheckGL("End OpenCL resource copy");
59 } else {
60 unsigned size1 = 0, size2 = 0;
61 unsigned buff1 = 0, buff2 = 0;
62 FG_CHECK(_.fg_get_vector_field_vertex_buffer_size(&size1, vfield));
63 FG_CHECK(_.fg_get_vector_field_direction_buffer_size(&size2, vfield));
64 FG_CHECK(_.fg_get_vector_field_vertex_buffer(&buff1, vfield));
65 FG_CHECK(_.fg_get_vector_field_direction_buffer(&buff2, vfield));
66
67 CheckGL("Begin OpenCL fallback-resource copy");
68
69 // Points
70 glBindBuffer(GL_ARRAY_BUFFER, buff1);
71 auto *pPtr =
72 static_cast<GLubyte *>(glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY));
73 if (pPtr) {
74 getQueue().enqueueReadBuffer(*points.get(), CL_TRUE, 0, size1,
75 pPtr);
76 glUnmapBuffer(GL_ARRAY_BUFFER);
77 }
78 glBindBuffer(GL_ARRAY_BUFFER, 0);
79
80 // Directions
81 glBindBuffer(GL_ARRAY_BUFFER, buff2);

Callers

nothing calls this directly

Calls 5

isGLSharingSupportedFunction · 0.70
getQueueFunction · 0.50
getMethod · 0.45
waitMethod · 0.45

Tested by

no test coverage detected