ufo-lamino-conv-task.c 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  1. /**
  2. * SECTION:ufo-filter-task
  3. * @Short_description: Process arbitrary Filter kernels
  4. * @Title: filter
  5. *
  6. * This module is used to load an arbitrary #UfoLaminoConvTask:kernel from
  7. * #UfoLaminoConvTask:filename and execute it on each input. The kernel must have
  8. * only two global float array parameters, the first represents the input, the
  9. * second one the output. #UfoLaminoConvTask:num-dims must be changed, if the kernel
  10. * accesses either one or three dimensional index spaces.
  11. */
  12. #ifdef __APPLE__
  13. #include <OpenCL/cl.h>
  14. #else
  15. #include <CL/cl.h>
  16. #endif
  17. #include "ufo-lamino-conv-task.h"
  18. struct _UfoLaminoConvTaskPrivate {
  19. cl_kernel kernel;
  20. guint img_width;
  21. guint img_height;
  22. };
  23. static void ufo_task_interface_init (UfoTaskIface *iface);
  24. G_DEFINE_TYPE_WITH_CODE (UfoLaminoConvTask, ufo_lamino_conv_task, UFO_TYPE_TASK_NODE,
  25. G_IMPLEMENT_INTERFACE (UFO_TYPE_TASK,
  26. ufo_task_interface_init))
  27. #define UFO_LAMINO_CONV_TASK_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE((obj), UFO_TYPE_LAMINO_CONV_TASK, UfoLaminoConvTaskPrivate))
  28. UfoNode *
  29. ufo_lamino_conv_task_new (void)
  30. {
  31. return UFO_NODE (g_object_new (UFO_TYPE_LAMINO_CONV_TASK, NULL));
  32. }
  33. static gboolean
  34. ufo_lamino_conv_task_process (UfoTask *task,
  35. UfoBuffer **inputs,
  36. UfoBuffer *output,
  37. UfoRequisition *requisition)
  38. {
  39. UfoLaminoConvTaskPrivate *priv;
  40. UfoGpuNode *node;
  41. cl_command_queue cmd_queue;
  42. cl_mem in1_mem;
  43. cl_mem in2_mem;
  44. cl_mem out_mem;
  45. priv = UFO_LAMINO_CONV_TASK (task)->priv;
  46. node = UFO_GPU_NODE (ufo_task_node_get_proc_node (UFO_TASK_NODE (task)));
  47. cmd_queue = ufo_gpu_node_get_cmd_queue (node);
  48. in1_mem = ufo_buffer_get_device_array (inputs[0], cmd_queue);
  49. in2_mem = ufo_buffer_get_device_array (inputs[1], cmd_queue);
  50. out_mem = ufo_buffer_get_device_array (output, cmd_queue);
  51. UFO_RESOURCES_CHECK_CLERR (clSetKernelArg (priv->kernel, 0, sizeof(cl_mem), (void *) &in1_mem));
  52. UFO_RESOURCES_CHECK_CLERR (clSetKernelArg (priv->kernel, 1, sizeof(cl_mem), (void *) &in2_mem));
  53. UFO_RESOURCES_CHECK_CLERR (clSetKernelArg (priv->kernel, 2, sizeof(cl_mem), (void *) &out_mem));
  54. UFO_RESOURCES_CHECK_CLERR (clEnqueueNDRangeKernel (cmd_queue, priv->kernel,
  55. 2, NULL, requisition->dims, NULL,
  56. 0, NULL, NULL));
  57. return TRUE;
  58. }
  59. static void
  60. ufo_lamino_conv_task_setup (UfoTask *task,
  61. UfoResources *resources,
  62. GError **error)
  63. {
  64. UfoLaminoConvTaskPrivate *priv;
  65. priv = UFO_LAMINO_CONV_TASK_GET_PRIVATE (task);
  66. priv->kernel = ufo_resources_get_kernel (resources, "lamino_ft_conv.cl", "lamino_c", error);
  67. if (priv->kernel) {
  68. UFO_RESOURCES_CHECK_CLERR (clRetainKernel (priv->kernel));
  69. }
  70. }
  71. static void
  72. ufo_lamino_conv_task_get_requisition (UfoTask *task,
  73. UfoBuffer **inputs,
  74. UfoRequisition *requisition)
  75. {
  76. ufo_buffer_get_requisition (inputs[0], requisition);
  77. }
  78. static guint
  79. ufo_lamino_conv_task_get_num_inputs (UfoTask *task)
  80. {
  81. return 2;
  82. }
  83. static guint
  84. ufo_lamino_conv_task_get_num_dimensions (UfoTask *task,
  85. guint input)
  86. {
  87. g_return_val_if_fail (input <= 1, 0);
  88. return 2;
  89. }
  90. static UfoTaskMode
  91. ufo_lamino_conv_task_get_mode (UfoTask *task)
  92. {
  93. return UFO_TASK_MODE_PROCESSOR | UFO_TASK_MODE_GPU;
  94. }
  95. static UfoNode *
  96. ufo_lamino_conv_task_copy_real (UfoNode *node,
  97. GError **error)
  98. {
  99. UfoLaminoConvTask *copy;
  100. copy = UFO_LAMINO_CONV_TASK (ufo_lamino_conv_task_new ());
  101. return UFO_NODE (copy);
  102. }
  103. static gboolean
  104. ufo_lamino_conv_task_equal_real (UfoNode *n1,
  105. UfoNode *n2)
  106. {
  107. g_return_val_if_fail (UFO_IS_LAMINO_CONV_TASK (n1) && UFO_IS_LAMINO_CONV_TASK (n2), FALSE);
  108. return TRUE;
  109. }
  110. static void
  111. ufo_lamino_conv_task_finalize (GObject *object)
  112. {
  113. UfoLaminoConvTaskPrivate *priv;
  114. priv = UFO_LAMINO_CONV_TASK_GET_PRIVATE (object);
  115. if (priv->kernel) {
  116. UFO_RESOURCES_CHECK_CLERR (clReleaseKernel (priv->kernel));
  117. priv->kernel = NULL;
  118. }
  119. G_OBJECT_CLASS (ufo_lamino_conv_task_parent_class)->finalize (object);
  120. }
  121. static void
  122. ufo_task_interface_init (UfoTaskIface *iface)
  123. {
  124. iface->setup = ufo_lamino_conv_task_setup;
  125. iface->get_requisition = ufo_lamino_conv_task_get_requisition;
  126. iface->get_num_inputs = ufo_lamino_conv_task_get_num_inputs;
  127. iface->get_num_dimensions = ufo_lamino_conv_task_get_num_dimensions;
  128. iface->get_mode = ufo_lamino_conv_task_get_mode;
  129. iface->process = ufo_lamino_conv_task_process;
  130. }
  131. static void
  132. ufo_lamino_conv_task_set_property (GObject *object,
  133. guint property_id,
  134. const GValue *value,
  135. GParamSpec *pspec)
  136. {
  137. switch (property_id) {
  138. default:
  139. G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
  140. break;
  141. }
  142. }
  143. static void
  144. ufo_lamino_conv_task_get_property (GObject *object,
  145. guint property_id,
  146. GValue *value,
  147. GParamSpec *pspec)
  148. {
  149. switch (property_id) {
  150. default:
  151. G_OBJECT_WARN_INVALID_PROPERTY_ID(object, property_id, pspec);
  152. break;
  153. }
  154. }
  155. static void
  156. ufo_lamino_conv_task_class_init (UfoLaminoConvTaskClass *klass)
  157. {
  158. GObjectClass *oclass;
  159. UfoNodeClass *node_class;
  160. oclass = G_OBJECT_CLASS (klass);
  161. node_class = UFO_NODE_CLASS (klass);
  162. oclass->finalize = ufo_lamino_conv_task_finalize;
  163. oclass->set_property = ufo_lamino_conv_task_set_property;
  164. oclass->get_property = ufo_lamino_conv_task_get_property;
  165. node_class->copy = ufo_lamino_conv_task_copy_real;
  166. node_class->equal = ufo_lamino_conv_task_equal_real;
  167. g_type_class_add_private(klass, sizeof(UfoLaminoConvTaskPrivate));
  168. }
  169. static void
  170. ufo_lamino_conv_task_init (UfoLaminoConvTask *self)
  171. {
  172. UfoLaminoConvTaskPrivate *priv;
  173. self->priv = priv = UFO_LAMINO_CONV_TASK_GET_PRIVATE (self);
  174. priv->kernel = NULL;
  175. }