ufo-lamino-conv-task.c 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  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-gpu-task-iface.h>
  18. #include "ufo-lamino-conv-task.h"
  19. struct _UfoLaminoConvTaskPrivate {
  20. cl_kernel kernel;
  21. guint img_width;
  22. guint img_height;
  23. };
  24. static void ufo_task_interface_init (UfoTaskIface *iface);
  25. static void ufo_gpu_task_interface_init (UfoGpuTaskIface *iface);
  26. G_DEFINE_TYPE_WITH_CODE (UfoLaminoConvTask, ufo_lamino_conv_task, UFO_TYPE_TASK_NODE,
  27. G_IMPLEMENT_INTERFACE (UFO_TYPE_TASK,
  28. ufo_task_interface_init)
  29. G_IMPLEMENT_INTERFACE (UFO_TYPE_GPU_TASK,
  30. ufo_gpu_task_interface_init))
  31. #define UFO_LAMINO_CONV_TASK_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE((obj), UFO_TYPE_LAMINO_CONV_TASK, UfoLaminoConvTaskPrivate))
  32. UfoNode *
  33. ufo_lamino_conv_task_new (void)
  34. {
  35. return UFO_NODE (g_object_new (UFO_TYPE_LAMINO_CONV_TASK, NULL));
  36. }
  37. static gboolean
  38. ufo_lamino_conv_task_process (UfoGpuTask *task,
  39. UfoBuffer **inputs,
  40. UfoBuffer *output,
  41. UfoRequisition *requisition,
  42. UfoGpuNode *node)
  43. {
  44. UfoLaminoConvTaskPrivate *priv;
  45. cl_command_queue cmd_queue;
  46. cl_mem in1_mem;
  47. cl_mem in2_mem;
  48. cl_mem out_mem;
  49. priv = UFO_LAMINO_CONV_TASK (task)->priv;
  50. cmd_queue = ufo_gpu_node_get_cmd_queue (node);
  51. in1_mem = ufo_buffer_get_device_array (inputs[0], cmd_queue);
  52. in2_mem = ufo_buffer_get_device_array (inputs[1], cmd_queue);
  53. out_mem = ufo_buffer_get_device_array (output, cmd_queue);
  54. UFO_RESOURCES_CHECK_CLERR (clSetKernelArg (priv->kernel, 0, sizeof(cl_mem), (void *) &in1_mem));
  55. UFO_RESOURCES_CHECK_CLERR (clSetKernelArg (priv->kernel, 1, sizeof(cl_mem), (void *) &in2_mem));
  56. UFO_RESOURCES_CHECK_CLERR (clSetKernelArg (priv->kernel, 2, sizeof(cl_mem), (void *) &out_mem));
  57. UFO_RESOURCES_CHECK_CLERR (clEnqueueNDRangeKernel (cmd_queue, priv->kernel,
  58. 2, NULL, requisition->dims, NULL,
  59. 0, NULL, NULL));
  60. return TRUE;
  61. }
  62. static void
  63. ufo_lamino_conv_task_setup (UfoTask *task,
  64. UfoResources *resources,
  65. GError **error)
  66. {
  67. UfoLaminoConvTaskPrivate *priv;
  68. priv = UFO_LAMINO_CONV_TASK_GET_PRIVATE (task);
  69. priv->kernel = ufo_resources_get_kernel (resources, "lamino_ft_conv.cl", "lamino_c", error);
  70. if (priv->kernel)
  71. clRetainKernel (priv->kernel);
  72. }
  73. static void
  74. ufo_lamino_conv_task_get_requisition (UfoTask *task,
  75. UfoBuffer **inputs,
  76. UfoRequisition *requisition)
  77. {
  78. ufo_buffer_get_requisition (inputs[0], requisition);
  79. }
  80. static void
  81. ufo_lamino_conv_task_get_structure (UfoTask *task,
  82. guint *n_inputs,
  83. UfoInputParam **in_params,
  84. UfoTaskMode *mode)
  85. {
  86. UfoLaminoConvTaskPrivate *priv;
  87. priv = UFO_LAMINO_CONV_TASK_GET_PRIVATE (task);
  88. *mode = UFO_TASK_MODE_SINGLE;
  89. *n_inputs = 2;
  90. *in_params = g_new0 (UfoInputParam, 2);
  91. (*in_params)[0].n_dims = 2;
  92. (*in_params)[0].n_expected = -1;
  93. (*in_params)[1].n_dims = 2;
  94. (*in_params)[1].n_expected = 1;
  95. }
  96. static UfoNode *
  97. ufo_lamino_conv_task_copy_real (UfoNode *node,
  98. GError **error)
  99. {
  100. UfoLaminoConvTask *copy;
  101. copy = UFO_LAMINO_CONV_TASK (ufo_lamino_conv_task_new ());
  102. return UFO_NODE (copy);
  103. }
  104. static gboolean
  105. ufo_lamino_conv_task_equal_real (UfoNode *n1,
  106. UfoNode *n2)
  107. {
  108. g_return_val_if_fail (UFO_IS_LAMINO_CONV_TASK (n1) && UFO_IS_LAMINO_CONV_TASK (n2), FALSE);
  109. return TRUE;
  110. }
  111. static void
  112. ufo_lamino_conv_task_finalize (GObject *object)
  113. {
  114. UfoLaminoConvTaskPrivate *priv;
  115. priv = UFO_LAMINO_CONV_TASK_GET_PRIVATE (object);
  116. G_OBJECT_CLASS (ufo_lamino_conv_task_parent_class)->finalize (object);
  117. }
  118. static void
  119. ufo_task_interface_init (UfoTaskIface *iface)
  120. {
  121. iface->setup = ufo_lamino_conv_task_setup;
  122. iface->get_requisition = ufo_lamino_conv_task_get_requisition;
  123. iface->get_structure = ufo_lamino_conv_task_get_structure;
  124. }
  125. static void
  126. ufo_gpu_task_interface_init (UfoGpuTaskIface *iface)
  127. {
  128. iface->process = ufo_lamino_conv_task_process;
  129. }
  130. static void
  131. ufo_lamino_conv_task_set_property (GObject *object,
  132. guint property_id,
  133. const GValue *value,
  134. GParamSpec *pspec)
  135. {
  136. switch (property_id) {
  137. default:
  138. G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
  139. break;
  140. }
  141. }
  142. static void
  143. ufo_lamino_conv_task_get_property (GObject *object,
  144. guint property_id,
  145. GValue *value,
  146. GParamSpec *pspec)
  147. {
  148. switch (property_id) {
  149. default:
  150. G_OBJECT_WARN_INVALID_PROPERTY_ID(object, property_id, pspec);
  151. break;
  152. }
  153. }
  154. static void
  155. ufo_lamino_conv_task_class_init (UfoLaminoConvTaskClass *klass)
  156. {
  157. GObjectClass *oclass;
  158. UfoNodeClass *node_class;
  159. oclass = G_OBJECT_CLASS (klass);
  160. node_class = UFO_NODE_CLASS (klass);
  161. oclass->finalize = ufo_lamino_conv_task_finalize;
  162. oclass->set_property = ufo_lamino_conv_task_set_property;
  163. oclass->get_property = ufo_lamino_conv_task_get_property;
  164. node_class->copy = ufo_lamino_conv_task_copy_real;
  165. node_class->equal = ufo_lamino_conv_task_equal_real;
  166. g_type_class_add_private(klass, sizeof(UfoLaminoConvTaskPrivate));
  167. }
  168. static void
  169. ufo_lamino_conv_task_init (UfoLaminoConvTask *self)
  170. {
  171. UfoLaminoConvTaskPrivate *priv;
  172. self->priv = priv = UFO_LAMINO_CONV_TASK_GET_PRIVATE (self);
  173. }