aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/gpu/GrDeferredProxyUploader.h
diff options
context:
space:
mode:
authorGravatar Brian Osman <brianosman@google.com>2017-10-02 13:40:26 +0000
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2017-10-02 14:00:07 +0000
commit9b1f4bd1766c8fd28405168746492b93d201463e (patch)
tree36b4f9eeba4f2f843cbae65109cf0dfd55e5cfe7 /src/gpu/GrDeferredProxyUploader.h
parent5a2e50edc51006ce91366e177a9d21a16775d7fd (diff)
Revert "Revert "Revert "Revert "Revert "Make threaded proxy generation MDB-friendly, and defer instantiation"""""
This reverts commit fdd2cb52b781dd68f515a1eb9fe6d054a0ebc226. Reason for revert: ANGLE gold failures Original change's description: > Revert "Revert "Revert "Revert "Make threaded proxy generation MDB-friendly, and defer instantiation"""" > > This reverts commit 9f8d4d36b514ffe3cc3a4a48900e3dc1fecb2a96. > > Bug: skia: > Change-Id: I8d7c1df24d8b13b94404f3d9ba69a1ab55ee00c0 > Reviewed-on: https://skia-review.googlesource.com/52920 > Commit-Queue: Brian Osman <brianosman@google.com> > Reviewed-by: Robert Phillips <robertphillips@google.com> TBR=egdaniel@google.com,robertphillips@google.com,brianosman@google.com # Not skipping CQ checks because original CL landed > 1 day ago. Bug: skia: Change-Id: Ie461de167fbd37323cabd4adf064f99204ba4878 Reviewed-on: https://skia-review.googlesource.com/53801 Reviewed-by: Brian Osman <brianosman@google.com> Commit-Queue: Brian Osman <brianosman@google.com>
Diffstat (limited to 'src/gpu/GrDeferredProxyUploader.h')
-rw-r--r--src/gpu/GrDeferredProxyUploader.h120
1 files changed, 0 insertions, 120 deletions
diff --git a/src/gpu/GrDeferredProxyUploader.h b/src/gpu/GrDeferredProxyUploader.h
deleted file mode 100644
index b9c18857b8..0000000000
--- a/src/gpu/GrDeferredProxyUploader.h
+++ /dev/null
@@ -1,120 +0,0 @@
-/*
- * Copyright 2017 Google Inc.
- *
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#ifndef GrDeferredProxyUploader_DEFINED
-#define GrDeferredProxyUploader_DEFINED
-
-#include "SkAutoPixmapStorage.h"
-#include "SkMakeUnique.h"
-#include "SkRefCnt.h"
-#include "SkSemaphore.h"
-
-#include "GrOpFlushState.h"
-#include "GrTextureProxyPriv.h"
-
-/**
- * GrDeferredProxyUploader assists with threaded generation of textures. Currently used by both
- * software clip masks, and the software path renderer. The calling code typically needs to store
- * some additional data (T) for use on the worker thread. GrTDeferredProxyUploader allows storing
- * such data. The common flow is:
- *
- * 1) A GrTDeferredProxyUploader is created, with some payload (eg an SkPath to draw).
- * The uploader is owned by the proxy that it's going to populate.
- * 2) A task is created with a pointer to the uploader. A worker thread executes that task, using
- * the payload data to allocate and fill in the fPixels pixmap.
- * 3) The worker thread calls signalAndFreeData(), which notifies the main thread that the pixmap
- * is ready, and then deletes the payload data (which is no longer needed).
- * 4) In parallel to 2-3, on the main thread... Some op is created that refers to the proxy. When
- * that op is added to an op list, the op list retains a pointer to the "deferred" proxies.
- * 5) At flush time, the op list ensures that the deferred proxies are instantiated, then calls
- * scheduleUpload on those proxies, which calls scheduleUpload on the uploader (below).
- * 6) scheduleUpload defers the upload even further, by adding an ASAPUpload to the flush.
- * 7) When the ASAP upload happens, we wait to make sure that the pixels are marked ready
- * (from step #3 on the worker thread). Then we perform the actual upload to the texture.
- * Finally, we call resetDeferredUploader, which deletes the uploader object, causing fPixels
- * to be freed.
- */
-class GrDeferredProxyUploader : public SkNoncopyable {
-public:
- GrDeferredProxyUploader() : fScheduledUpload(false), fWaited(false) {}
-
- virtual ~GrDeferredProxyUploader() {
- // In normal usage (i.e., through GrTDeferredProxyUploader) this will be redundant
- this->wait();
- }
-
- void scheduleUpload(GrOpFlushState* flushState, GrTextureProxy* proxy) {
- if (fScheduledUpload) {
- // Multiple references to the owning proxy may have caused us to already execute
- return;
- }
-
- auto uploadMask = [this, proxy](GrDrawOp::WritePixelsFn& writePixelsFn) {
- this->wait();
- // If the worker thread was unable to allocate pixels, this check will fail, and we'll
- // end up drawing with an uninitialized mask texture, but at least we won't crash.
- if (this->fPixels.addr()) {
- writePixelsFn(proxy, 0, 0, this->fPixels.width(), this->fPixels.height(),
- proxy->config(), this->fPixels.addr(), this->fPixels.rowBytes());
- }
- // Upload has finished, so tell the proxy to release this GrDeferredProxyUploader
- proxy->texPriv().resetDeferredUploader();
- };
- flushState->addASAPUpload(std::move(uploadMask));
- fScheduledUpload = true;
- }
-
- void signalAndFreeData() {
- this->freeData();
- fPixelsReady.signal();
- }
-
- SkAutoPixmapStorage* getPixels() { return &fPixels; }
-
-protected:
- void wait() {
- if (!fWaited) {
- fPixelsReady.wait();
- fWaited = true;
- }
- }
-
-private:
- virtual void freeData() {}
-
- SkAutoPixmapStorage fPixels;
- SkSemaphore fPixelsReady;
- bool fScheduledUpload;
- bool fWaited;
-};
-
-template <typename T>
-class GrTDeferredProxyUploader : public GrDeferredProxyUploader {
-public:
- template <typename... Args>
- GrTDeferredProxyUploader(Args&&... args)
- : fData(skstd::make_unique<T>(std::forward<Args>(args)...)) {
- }
-
- ~GrTDeferredProxyUploader() override {
- // We need to wait here, so that we don't free fData before the worker thread is done
- // with it. (This happens if the proxy is deleted early due to a full clear or failure
- // of an op list to instantiate).
- this->wait();
- }
-
- T& data() { return *fData; }
-
-private:
- void freeData() override {
- fData.reset();
- }
-
- std::unique_ptr<T> fData;
-};
-
-#endif