Index: experimental/skpdiff/SkCLImageDiffer.h |
diff --git a/experimental/skpdiff/SkCLImageDiffer.h b/experimental/skpdiff/SkCLImageDiffer.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..565b3714ee4101216887da0e4c5a25e384809752 |
--- /dev/null |
+++ b/experimental/skpdiff/SkCLImageDiffer.h |
@@ -0,0 +1,117 @@ |
+/* |
+ * Copyright 2013 Google Inc. |
+ * |
+ * Use of this source code is governed by a BSD-style license that can be |
+ * found in the LICENSE file. |
+ */ |
+ |
+#ifndef SkCLImageDiffer_DEFINED |
+#define SkCLImageDiffer_DEFINED |
+ |
+#include <CL/cl.h> |
+#include "SkTDArray.h" |
+ |
+#include "SkImageDiffer.h" |
+ |
+class SkStream; |
+ |
+/** |
+ * An SkImageDiffer that requires initialization with an OpenCL device and context. |
+ */ |
+class SkCLImageDiffer : public SkImageDiffer { |
+public: |
+ SkCLImageDiffer(); |
+ |
+ /** |
+ * Initializes the OpenCL resources this differ needs to work |
+ * @param device An OpenCL device |
+ * @param context An OpenCL context of the given device |
+ * @return True on success, false otherwise |
+ */ |
+ virtual bool init(cl_device_id device, cl_context context); |
+ |
+protected: |
+ /** |
+ * Called by init after fDevice, fContext, and fCommandQueue are successfully initialized |
+ * @return True on success, false otherwise |
+ */ |
+ virtual bool onInit() = 0; |
+ |
+ /** |
+ * Loads an OpenCL kernel from the file with the given named entry point. This only works after |
+ * init is called. |
+ * @param file The file path of the kernel |
+ * @param name The name of the entry point of the desired kernel in the file |
+ * @param kernel A pointer to return the loaded kernel into |
+ * @return True on success, false otherwise |
+ */ |
+ bool loadKernelFile(const char file[], const char name[], cl_kernel* kernel); |
+ |
+ /** |
+ * Loads an OpenCL kernel from the stream with the given named entry point. This only works |
+ * after init is called. |
+ * @param stream The stream that contains the kernel |
+ * @param name The name of the entry point of the desired kernel in the stream |
+ * @param kernel A pointer to return the loaded kernel into |
+ * @return True on success, false otherwise |
+ */ |
+ bool loadKernelStream(SkStream* stream, const char name[], cl_kernel* kernel); |
+ |
+ /** |
+ * Loads an OpenCL kernel from the source string with the given named entry point. This only |
+ * works after init is called. |
+ * @param source The string that contains the kernel |
+ * @param name The name of the entry point of the desired kernel in the source string |
+ * @param kernel A pointer to return the loaded kernel into |
+ * @return True on success, false otherwise |
+ */ |
+ bool loadKernelSource(const char source[], const char name[], cl_kernel* kernel); |
+ |
+ /** |
+ * Loads a read only copy of the given bitmap into device memory and returns the block of |
+ * memory. This only works after init is called. |
+ * @param bitmap The bitmap to load into memory |
+ * @param image A pointer to return the allocated image to |
+ * @return True on success, false otherwise |
+ */ |
+ bool makeImage2D(SkBitmap* bitmap, cl_mem* image); |
+ |
+ cl_device_id fDevice; |
+ cl_context fContext; |
+ cl_command_queue fCommandQueue; |
+ |
+private: |
+ |
+ typedef SkImageDiffer INHERITED; |
+}; |
+ |
+/** |
+ * A OpenCL differ that measures the percentage of different corresponding pixels. If the two images |
+ * are not the same size or have no pixels, the result will always be zero. |
+ */ |
+class SkDifferentPixelsImageDiffer : public SkCLImageDiffer { |
+public: |
+ virtual const char* getName() SK_OVERRIDE; |
+ virtual int queueDiff(SkBitmap* baseline, SkBitmap* test) SK_OVERRIDE; |
+ virtual bool isFinished(int id) SK_OVERRIDE; |
+ virtual double getResult(int id) SK_OVERRIDE; |
+ |
+protected: |
+ virtual bool onInit() SK_OVERRIDE; |
+ |
+private: |
+ struct QueuedDiff { |
+ bool finished; |
+ double result; |
+ cl_mem baseline; |
+ cl_mem test; |
+ cl_mem resultsBuffer; |
+ }; |
+ |
+ SkTDArray<QueuedDiff> fQueuedDiffs; |
+ cl_kernel fKernel; |
+ |
+ typedef SkCLImageDiffer INHERITED; |
+}; |
+ |
+#endif |