| OLD | NEW | 
|   1 DM is like GM, but multithreaded.  It doesn't do everything GM does yet. |   1 DM is like GM, but multithreaded.  It doesn't do everything GM does yet. | 
|   2  |   2  | 
|   3 Current approximate list of missing features: |   3 Current approximate list of missing features: | 
|   4   --mismatchPath |   4   --mismatchPath | 
|   5   --missingExpectationsPath |   5   --missingExpectationsPath | 
|   6   --writePicturePath |   6   --writePicturePath | 
|   7  |   7  | 
|   8   --deferred / --pipe |   8   --deferred / --pipe | 
|   9   --rtree |   9   --rtree | 
|  10   --serialize |  | 
|  11   --tiledGrid |  10   --tiledGrid | 
|  12  |  11  | 
|  13  |  12  | 
|  14 DM's design is based around Tasks and a TaskRunner. |  13 DM's design is based around Tasks and a TaskRunner. | 
|  15  |  14  | 
|  16 A Task represents an independent unit of work that might fail.  We make a task |  15 A Task represents an independent unit of work that might fail.  We make a task | 
|  17 for each GM/configuration pair we want to run.  Tasks can kick off new tasks |  16 for each GM/configuration pair we want to run.  Tasks can kick off new tasks | 
|  18 themselves.  For example, a CpuTask can kick off a ReplayTask to make sure |  17 themselves.  For example, a CpuTask can kick off a ReplayTask to make sure | 
|  19 recording and playing back an SkPicture gives the same result as direct |  18 recording and playing back an SkPicture gives the same result as direct | 
|  20 rendering. |  19 rendering. | 
|  21  |  20  | 
|  22 The TaskRunner runs all tasks on one of two threadpools, whose sizes are |  21 The TaskRunner runs all tasks on one of two threadpools, whose sizes are | 
|  23 configurable by --cpuThreads and --gpuThreads.  Ideally we'd run these on a |  22 configurable by --cpuThreads and --gpuThreads.  Ideally we'd run these on a | 
|  24 single threadpool but it can swamp the GPU if we shove too much work into it at |  23 single threadpool but it can swamp the GPU if we shove too much work into it at | 
|  25 once.  --cpuThreads defaults to the number of cores on the machine. |  24 once.  --cpuThreads defaults to the number of cores on the machine. | 
|  26 --gpuThreads defaults to 1, but you may find 2 or 4 runs a little faster. |  25 --gpuThreads defaults to 1, but you may find 2 or 4 runs a little faster. | 
|  27  |  26  | 
|  28 So the main flow of DM is: |  27 So the main flow of DM is: | 
|  29  |  28  | 
|  30     for each GM: |  29     for each GM: | 
|  31         for each configuration: |  30         for each configuration: | 
|  32             kick off a new task |  31             kick off a new task | 
|  33     < tasks run, maybe fail, and maybe kick off new tasks > |  32     < tasks run, maybe fail, and maybe kick off new tasks > | 
|  34     wait for all tasks to finish |  33     wait for all tasks to finish | 
|  35     report failures |  34     report failures | 
|  36  |  35  | 
| OLD | NEW |