aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar Adrienne Walker <enne@chromium.org>2018-05-07 12:48:34 -0700
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2018-05-10 14:54:15 +0000
commit328490c6a1625ce51d0e81688e0c85c79c400d86 (patch)
treeaf830b6655631d400c7c1fc581e0e625083dd555
parentccd4cfc23ebbbecbc6b292359352aad335ad7b73 (diff)
Add driver bug workarounds to GrCaps
This moves GrDriverBugWorkarounds to include so that it can be included by GrCaps. This also makes GrContextOptions a nearly empty class in the case of !SK_SUPPORT_GPU so that non-gpu builds don't need to build in GrDriverBugWorkarounds.cpp. Bug: chromium: 829614 Change-Id: Iedf73677fd09e9a487cfe618a696fd4b25c8703d Reviewed-on: https://skia-review.googlesource.com/126581 Reviewed-by: Brian Salomon <bsalomon@google.com> Commit-Queue: Adrienne Walker <enne@chromium.org>
-rw-r--r--BUILD.gn2
-rw-r--r--dm/DMSrcSink.cpp6
-rw-r--r--gn/gpu.gni2
-rw-r--r--include/gpu/GrCaps.h3
-rw-r--r--include/gpu/GrContextOptions.h9
-rw-r--r--include/gpu/GrDriverBugWorkarounds.h (renamed from src/gpu/GrDriverBugWorkarounds.h)9
-rw-r--r--include/gpu/GrDriverBugWorkaroundsAutogen.h (renamed from src/gpu/GrDriverBugWorkaroundsAutogen.h)0
-rw-r--r--src/gpu/GrCaps.cpp4
-rw-r--r--src/gpu/GrDriverBugWorkarounds.cpp9
9 files changed, 40 insertions, 4 deletions
diff --git a/BUILD.gn b/BUILD.gn
index 66dac2c237..83146bbc58 100644
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -839,7 +839,7 @@ if (skia_enable_gpu && skia_generate_workarounds) {
# see comments in skia_compile_processors about out dir path shenanigans.
output_file =
- rebase_path("src/gpu/GrDriverBugWorkaroundsAutogen.h", root_out_dir)
+ rebase_path("include/gpu/GrDriverBugWorkaroundsAutogen.h", root_out_dir)
outputs = [
"$root_out_dir/$output_file",
diff --git a/dm/DMSrcSink.cpp b/dm/DMSrcSink.cpp
index 5c8ab96806..efb0b3b4d4 100644
--- a/dm/DMSrcSink.cpp
+++ b/dm/DMSrcSink.cpp
@@ -1608,9 +1608,11 @@ Error GPUThreadTestingSink::draw(const Src& src, SkBitmap* dst, SkWStream* wStre
// Also, force us to only use the software path renderer, so we really stress-test the threaded
// version of that code.
GrContextOptions contextOptions = this->baseContextOptions();
+#if SK_SUPPORT_GPU
contextOptions.fGpuPathRenderers = GpuPathRenderers::kNone;
-
contextOptions.fExecutor = fExecutor.get();
+#endif
+
Error err = this->onDraw(src, dst, wStream, log, contextOptions);
if (!err.isEmpty() || !dst) {
return err;
@@ -1619,7 +1621,9 @@ Error GPUThreadTestingSink::draw(const Src& src, SkBitmap* dst, SkWStream* wStre
SkBitmap reference;
SkString refLog;
SkDynamicMemoryWStream refStream;
+#if SK_SUPPORT_GPU
contextOptions.fExecutor = nullptr;
+#endif
Error refErr = this->onDraw(src, &reference, &refStream, &refLog, contextOptions);
if (!refErr.isEmpty()) {
return refErr;
diff --git a/gn/gpu.gni b/gn/gpu.gni
index 8b79484fc5..912900827d 100644
--- a/gn/gpu.gni
+++ b/gn/gpu.gni
@@ -15,6 +15,7 @@ skia_gpu_sources = [
"$_include/gpu/GrConfig.h",
"$_include/gpu/GrContextOptions.h",
"$_include/gpu/GrContext.h",
+ "$_include/gpu/GrDriverBugWorkarounds.h",
"$_include/gpu/GrGpuResource.h",
"$_include/gpu/GrRenderTarget.h",
"$_include/gpu/GrResourceKey.h",
@@ -87,7 +88,6 @@ skia_gpu_sources = [
"$_src/gpu/GrDrawOpTest.cpp",
"$_src/gpu/GrDrawOpTest.h",
"$_src/gpu/GrDriverBugWorkarounds.cpp",
- "$_src/gpu/GrDriverBugWorkarounds.h",
"$_src/gpu/GrFixedClip.cpp",
"$_src/gpu/GrFixedClip.h",
"$_src/gpu/GrFragmentProcessor.cpp",
diff --git a/include/gpu/GrCaps.h b/include/gpu/GrCaps.h
index 0e81e236ef..7d77bdac92 100644
--- a/include/gpu/GrCaps.h
+++ b/include/gpu/GrCaps.h
@@ -10,6 +10,7 @@
#include "../private/GrTypesPriv.h"
#include "GrBlend.h"
+#include "GrDriverBugWorkarounds.h"
#include "GrShaderCaps.h"
#include "SkImageInfo.h"
#include "SkRefCnt.h"
@@ -340,6 +341,8 @@ private:
bool fSuppressPrints : 1;
bool fWireframeMode : 1;
+ GrDriverBugWorkarounds fDriverBugWorkarounds;
+
typedef SkRefCnt INHERITED;
};
diff --git a/include/gpu/GrContextOptions.h b/include/gpu/GrContextOptions.h
index 3a0fba1adb..eea7771075 100644
--- a/include/gpu/GrContextOptions.h
+++ b/include/gpu/GrContextOptions.h
@@ -12,11 +12,13 @@
#include "SkTypes.h"
#include "GrTypes.h"
#include "../private/GrTypesPriv.h"
+#include "GrDriverBugWorkarounds.h"
#include <vector>
class SkExecutor;
+#if SK_SUPPORT_GPU
struct GrContextOptions {
enum class Enable {
/** Forces an option to be disabled. */
@@ -239,6 +241,13 @@ struct GrContextOptions {
*/
Enable fDistanceFieldGlyphVerticesAlwaysHaveW = Enable::kDefault;
#endif
+
+ GrDriverBugWorkarounds fDriverBugWorkarounds;
+};
+#else
+struct GrContextOptions {
+ struct PersistentCache {};
};
+#endif
#endif
diff --git a/src/gpu/GrDriverBugWorkarounds.h b/include/gpu/GrDriverBugWorkarounds.h
index bca5dc99f1..31f6df5a33 100644
--- a/src/gpu/GrDriverBugWorkarounds.h
+++ b/include/gpu/GrDriverBugWorkarounds.h
@@ -19,6 +19,8 @@
#include "GrDriverBugWorkaroundsAutogen.h"
#endif
+#include "SkTypes.h"
+
#include <stdint.h>
#include <vector>
@@ -29,11 +31,16 @@ enum GrDriverBugWorkaroundType {
NUMBER_OF_GPU_DRIVER_BUG_WORKAROUND_TYPES
};
-class GrDriverBugWorkarounds {
+class SK_API GrDriverBugWorkarounds {
public:
GrDriverBugWorkarounds();
explicit GrDriverBugWorkarounds(const std::vector<int32_t>& workarounds);
+ GrDriverBugWorkarounds& operator=(const GrDriverBugWorkarounds&) = default;
+
+ // Turn on any workarounds listed in |workarounds| (but don't turn any off).
+ void applyOverrides(const GrDriverBugWorkarounds& workarounds);
+
~GrDriverBugWorkarounds();
#define GPU_OP(type, name) bool name = false;
diff --git a/src/gpu/GrDriverBugWorkaroundsAutogen.h b/include/gpu/GrDriverBugWorkaroundsAutogen.h
index 87aa46172e..87aa46172e 100644
--- a/src/gpu/GrDriverBugWorkaroundsAutogen.h
+++ b/include/gpu/GrDriverBugWorkaroundsAutogen.h
diff --git a/src/gpu/GrCaps.cpp b/src/gpu/GrCaps.cpp
index 0507a3fdfb..42d3d4c51a 100644
--- a/src/gpu/GrCaps.cpp
+++ b/src/gpu/GrCaps.cpp
@@ -94,6 +94,8 @@ GrCaps::GrCaps(const GrContextOptions& options) {
fAvoidStencilBuffers = false;
fPreferVRAMUseOverFlushes = true;
+
+ fDriverBugWorkarounds = options.fDriverBugWorkarounds;
}
void GrCaps::applyOptionsOverrides(const GrContextOptions& options) {
@@ -123,6 +125,8 @@ void GrCaps::applyOptionsOverrides(const GrContextOptions& options) {
fMaxWindowRectangles = GrWindowRectangles::kMaxWindows;
}
fAvoidStencilBuffers = options.fAvoidStencilBuffers;
+
+ fDriverBugWorkarounds.applyOverrides(options.fDriverBugWorkarounds);
}
static SkString map_flags_to_string(uint32_t flags) {
diff --git a/src/gpu/GrDriverBugWorkarounds.cpp b/src/gpu/GrDriverBugWorkarounds.cpp
index 5ed9d8d2ef..a1f27a3205 100644
--- a/src/gpu/GrDriverBugWorkarounds.cpp
+++ b/src/gpu/GrDriverBugWorkarounds.cpp
@@ -29,4 +29,13 @@ GrDriverBugWorkarounds::GrDriverBugWorkarounds(
}
}
+void GrDriverBugWorkarounds::applyOverrides(
+ const GrDriverBugWorkarounds& workarounds) {
+#define GPU_OP(type, name) \
+ name |= workarounds.name;
+
+ GPU_DRIVER_BUG_WORKAROUNDS(GPU_OP)
+#undef GPU_OP
+}
+
GrDriverBugWorkarounds::~GrDriverBugWorkarounds() = default;