Skia Compute core files

Bug: skia:
Change-Id: I4bba49cf20eff013e581800a3f114c85acd8498c
Reviewed-on: https://skia-review.googlesource.com/135782
Reviewed-by: Mike Klein <mtklein@google.com>
Reviewed-by: Mike Reed <reed@google.com>
Commit-Queue: Mike Klein <mtklein@google.com>
diff --git a/src/compute/skc/scheduler.h b/src/compute/skc/scheduler.h
new file mode 100644
index 0000000..334cb0f
--- /dev/null
+++ b/src/compute/skc/scheduler.h
@@ -0,0 +1,115 @@
+/*
+ * Copyright 2017 Google Inc.
+ *
+ * Use of this source code is governed by a BSD-style license that can
+ * be found in the LICENSE file.
+ *
+ */
+
+#pragma once
+
+//
+// FIXME -- make the scheduler even more lightweight than it is.  Move
+// to an idiom where the scheduled task brings its own state instead
+// of relying on an internal table.  This will make it possible to
+// reliably report the task's lifecycle and terminating state.
+//
+
+#include "types.h"
+
+//
+// 
+//
+
+#define SKC_SCHEDULER_SCHEDULE(s,c,d) skc_scheduler_schedule(s,c,d,#c)
+
+#ifndef NDEBUG 
+
+#include <stdio.h>
+
+#define SKC_SCHEDULER_WAIT_WHILE(s,p)           \
+  while (p) {                                   \
+    fprintf(stderr,"WAITING ON: " #p "\n");     \
+    skc_scheduler_wait(s);                      \
+  }
+#else
+#define SKC_SCHEDULER_WAIT_WHILE(s,p)           \
+  while (p) {                                   \
+    skc_scheduler_wait(s);                      \
+  }
+#endif
+
+//
+//
+//
+
+#ifndef NDEBUG
+#define SKC_CL_CB(s)  fprintf(stderr,"CB+ %s = %d\n",__func__,s)
+#else
+#include <stdio.h>
+#define SKC_CL_CB(s)
+#endif
+
+//
+//
+//
+
+#define SKC_SCHEDULER_COMMAND_INVALID  SKC_UINT_MAX
+
+typedef skc_uint skc_scheduler_command_t;
+
+typedef void (* skc_scheduler_command_pfn)(void * data);
+
+//
+//
+//
+
+struct skc_scheduler *
+skc_scheduler_create(struct skc_runtime * const runtime, skc_uint const size);
+
+void
+skc_scheduler_dispose(struct skc_runtime   * const runtime,
+                      struct skc_scheduler * const scheduler);
+                      
+
+//
+//
+//
+
+skc_scheduler_command_t
+skc_scheduler_schedule(struct skc_scheduler    * const scheduler,
+		       skc_scheduler_command_pfn const pfn,
+		       void                    *       data,
+                       char              const * const name);
+
+//
+//
+//
+
+skc_bool
+skc_scheduler_yield(struct skc_scheduler * const scheduler);
+
+void
+skc_scheduler_wait(struct skc_scheduler * const scheduler);
+
+void
+skc_scheduler_wait_one(struct skc_scheduler * const scheduler);
+
+//
+// FIXME -- get rid of these
+//
+
+#if 0
+
+skc_bool
+skc_scheduler_wait_for(struct skc_scheduler  * const scheduler,
+                       skc_scheduler_command_t const command);
+
+void
+skc_thread_sleep(skc_ulong const msecs);
+
+#endif
+
+//
+//
+//