CommonFlagsGpu.cpp 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. /*
  2. * Copyright 2014 Google Inc.
  3. *
  4. * Use of this source code is governed by a BSD-style license that can be
  5. * found in the LICENSE file.
  6. */
  7. #include "include/core/SkExecutor.h"
  8. #include "include/gpu/GrContextOptions.h"
  9. #include "tools/flags/CommonFlags.h"
  10. DEFINE_int(gpuThreads,
  11. 2,
  12. "Create this many extra threads to assist with GPU work, "
  13. "including software path rendering. Defaults to two.");
  14. static DEFINE_bool(cachePathMasks, true,
  15. "Allows path mask textures to be cached in GPU configs.");
  16. static DEFINE_bool(noGS, false, "Disables support for geometry shaders.");
  17. static DEFINE_bool(cc, false, "Allow coverage counting shortcuts to render paths?");
  18. static DEFINE_string(pr, "",
  19. "Set of enabled gpu path renderers. Defined as a list of: "
  20. "[~]none [~]dashline [~]nvpr [~]ccpr [~]aahairline [~]aaconvex [~]aalinearizing "
  21. "[~]small [~]tess] [~]all");
  22. static DEFINE_bool(disableDriverCorrectnessWorkarounds, false,
  23. "Disables all GPU driver correctness workarounds");
  24. static DEFINE_bool(reduceOpListSplitting, false, "Improve opList sorting");
  25. static DEFINE_bool(dontReduceOpListSplitting, false, "Allow more opList splitting");
  26. static GpuPathRenderers get_named_pathrenderers_flags(const char* name) {
  27. if (!strcmp(name, "none")) {
  28. return GpuPathRenderers::kNone;
  29. } else if (!strcmp(name, "dashline")) {
  30. return GpuPathRenderers::kDashLine;
  31. } else if (!strcmp(name, "nvpr")) {
  32. return GpuPathRenderers::kStencilAndCover;
  33. } else if (!strcmp(name, "ccpr")) {
  34. return GpuPathRenderers::kCoverageCounting;
  35. } else if (!strcmp(name, "aahairline")) {
  36. return GpuPathRenderers::kAAHairline;
  37. } else if (!strcmp(name, "aaconvex")) {
  38. return GpuPathRenderers::kAAConvex;
  39. } else if (!strcmp(name, "aalinearizing")) {
  40. return GpuPathRenderers::kAALinearizing;
  41. } else if (!strcmp(name, "small")) {
  42. return GpuPathRenderers::kSmall;
  43. } else if (!strcmp(name, "tess")) {
  44. return GpuPathRenderers::kTessellating;
  45. } else if (!strcmp(name, "all")) {
  46. return GpuPathRenderers::kAll;
  47. }
  48. SK_ABORT(SkStringPrintf("error: unknown named path renderer \"%s\"\n", name).c_str());
  49. return GpuPathRenderers::kNone;
  50. }
  51. static GpuPathRenderers collect_gpu_path_renderers_from_flags() {
  52. if (FLAGS_pr.isEmpty()) {
  53. return GpuPathRenderers::kAll;
  54. }
  55. GpuPathRenderers gpuPathRenderers = ('~' == FLAGS_pr[0][0])
  56. ? GpuPathRenderers::kAll
  57. : GpuPathRenderers::kNone;
  58. for (int i = 0; i < FLAGS_pr.count(); ++i) {
  59. const char* name = FLAGS_pr[i];
  60. if (name[0] == '~') {
  61. gpuPathRenderers &= ~get_named_pathrenderers_flags(&name[1]);
  62. } else {
  63. gpuPathRenderers |= get_named_pathrenderers_flags(name);
  64. }
  65. }
  66. return gpuPathRenderers;
  67. }
  68. void SetCtxOptionsFromCommonFlags(GrContextOptions* ctxOptions) {
  69. static std::unique_ptr<SkExecutor> gGpuExecutor = (0 != FLAGS_gpuThreads)
  70. ? SkExecutor::MakeFIFOThreadPool(FLAGS_gpuThreads)
  71. : nullptr;
  72. ctxOptions->fExecutor = gGpuExecutor.get();
  73. ctxOptions->fDisableCoverageCountingPaths = !FLAGS_cc;
  74. ctxOptions->fAllowPathMaskCaching = FLAGS_cachePathMasks;
  75. ctxOptions->fSuppressGeometryShaders = FLAGS_noGS;
  76. ctxOptions->fGpuPathRenderers = collect_gpu_path_renderers_from_flags();
  77. ctxOptions->fDisableDriverCorrectnessWorkarounds = FLAGS_disableDriverCorrectnessWorkarounds;
  78. if (FLAGS_reduceOpListSplitting) {
  79. SkASSERT(!FLAGS_dontReduceOpListSplitting);
  80. ctxOptions->fReduceOpListSplitting = GrContextOptions::Enable::kYes;
  81. } else if (FLAGS_dontReduceOpListSplitting) {
  82. ctxOptions->fReduceOpListSplitting = GrContextOptions::Enable::kNo;
  83. }
  84. }