11fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com/*
21fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com * Copyright 2012 Google Inc.
31fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com *
41fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com * Use of this source code is governed by a BSD-style license that can be
51fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com * found in the LICENSE file.
61fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com */
71fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
81fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com#ifndef GrClipMaskCache_DEFINED
91fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com#define GrClipMaskCache_DEFINED
101fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
111fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com#include "GrContext.h"
121fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com#include "SkClipStack.h"
13a0b40280a49a8a43af7929ead3b3489951c58501commit-bot@chromium.org#include "SkTypes.h"
141fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
151fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.comclass GrTexture;
161fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
171fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com/**
181fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com * The stencil buffer stores the last clip path - providing a single entry
191fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com * "cache". This class provides similar functionality for AA clip paths
201fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com */
21e3beb6bd7de7fa211681abbb0be58e80b19885e0commit-bot@chromium.orgclass GrClipMaskCache : SkNoncopyable {
221fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.compublic:
231fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com    GrClipMaskCache();
241fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
251fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com    ~GrClipMaskCache() {
261fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
271fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com        while (!fStack.empty()) {
281fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com            GrClipStackFrame* temp = (GrClipStackFrame*) fStack.back();
291fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com            temp->~GrClipStackFrame();
301fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com            fStack.pop_back();
311fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com        }
321fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com    }
331fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
344c2443e36fdc6c095b17e90baa4a2f26a6f00b08bsalomon@google.com    bool canReuse(int32_t clipGenID, const SkIRect& bounds) {
351fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
364c2443e36fdc6c095b17e90baa4a2f26a6f00b08bsalomon@google.com        SkASSERT(clipGenID != SkClipStack::kWideOpenGenID);
374c2443e36fdc6c095b17e90baa4a2f26a6f00b08bsalomon@google.com        SkASSERT(clipGenID != SkClipStack::kEmptyGenID);
384c2443e36fdc6c095b17e90baa4a2f26a6f00b08bsalomon@google.com
391fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com        GrClipStackFrame* back = (GrClipStackFrame*) fStack.back();
401fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
414c2443e36fdc6c095b17e90baa4a2f26a6f00b08bsalomon@google.com        // We could reuse the mask if bounds is a subset of last bounds. We'd have to communicate
424c2443e36fdc6c095b17e90baa4a2f26a6f00b08bsalomon@google.com        // an offset to the caller.
43427cf28861867c0ea9aafca3a23878ec4068ad99bsalomon        if (back->fLastMask &&
44427cf28861867c0ea9aafca3a23878ec4068ad99bsalomon            !back->fLastMask->wasDestroyed() &&
454c2443e36fdc6c095b17e90baa4a2f26a6f00b08bsalomon@google.com            back->fLastBound == bounds &&
464c2443e36fdc6c095b17e90baa4a2f26a6f00b08bsalomon@google.com            back->fLastClipGenID == clipGenID) {
471fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com            return true;
481fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com        }
491fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
501fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com        return false;
511fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com    }
521fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
531fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com    void reset() {
541fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com        if (fStack.empty()) {
55f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org//            SkASSERT(false);
561fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com            return;
571fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com        }
581fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
591fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com        GrClipStackFrame* back = (GrClipStackFrame*) fStack.back();
601fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
611fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com        back->reset();
621fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com    }
631fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
641fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com    /**
651fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com     * After a "push" the clip state is entirely open. Currently, the
661fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com     * entire clip stack will be re-rendered into a new clip mask.
671fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com     * TODO: can we take advantage of the nested nature of the clips to
681fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com     * reduce the mask creation cost?
691fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com     */
701fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com    void push();
711fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
721fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com    void pop() {
73f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org        //SkASSERT(!fStack.empty());
741fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
751fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com        if (!fStack.empty()) {
761fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com            GrClipStackFrame* back = (GrClipStackFrame*) fStack.back();
771fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
781fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com            back->~GrClipStackFrame();
791fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com            fStack.pop_back();
801fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com        }
811fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com    }
821fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
834c2443e36fdc6c095b17e90baa4a2f26a6f00b08bsalomon@google.com    int32_t getLastClipGenID() const {
841fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
851fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com        if (fStack.empty()) {
864c2443e36fdc6c095b17e90baa4a2f26a6f00b08bsalomon@google.com            return SkClipStack::kInvalidGenID;
871fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com        }
881fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
894c2443e36fdc6c095b17e90baa4a2f26a6f00b08bsalomon@google.com        return ((GrClipStackFrame*) fStack.back())->fLastClipGenID;
901fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com    }
911fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
921fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com    GrTexture* getLastMask() {
931fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
941fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com        if (fStack.empty()) {
95f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org            SkASSERT(false);
961fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com            return NULL;
971fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com        }
981fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
991fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com        GrClipStackFrame* back = (GrClipStackFrame*) fStack.back();
1001fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
101427cf28861867c0ea9aafca3a23878ec4068ad99bsalomon        return back->fLastMask;
1021fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com    }
1031fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
1041fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com    const GrTexture* getLastMask() const {
1051fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
1061fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com        if (fStack.empty()) {
107f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org            SkASSERT(false);
1081fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com            return NULL;
1091fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com        }
1101fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
1111fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com        GrClipStackFrame* back = (GrClipStackFrame*) fStack.back();
1121fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
113427cf28861867c0ea9aafca3a23878ec4068ad99bsalomon        return back->fLastMask;
1141fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com    }
1151fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
1164c2443e36fdc6c095b17e90baa4a2f26a6f00b08bsalomon@google.com    void acquireMask(int32_t clipGenID,
117f2703d83da3ab2ae18b45231fd4f11e16cce3184bsalomon                     const GrSurfaceDesc& desc,
118fd03d4a829efe2d77a712fd991927c55f59a2ffecommit-bot@chromium.org                     const SkIRect& bound) {
1191fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
1201fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com        if (fStack.empty()) {
121f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org            SkASSERT(false);
1221fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com            return;
1231fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com        }
1241fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
1251fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com        GrClipStackFrame* back = (GrClipStackFrame*) fStack.back();
1261fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
1274c2443e36fdc6c095b17e90baa4a2f26a6f00b08bsalomon@google.com        back->acquireMask(fContext, clipGenID, desc, bound);
1281fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com    }
1291fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
1301fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com    int getLastMaskWidth() const {
1311fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
1321fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com        if (fStack.empty()) {
133f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org            SkASSERT(false);
1341fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com            return -1;
1351fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com        }
1361fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
1371fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com        GrClipStackFrame* back = (GrClipStackFrame*) fStack.back();
1381fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
139427cf28861867c0ea9aafca3a23878ec4068ad99bsalomon        if (NULL == back->fLastMask) {
1401fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com            return -1;
1411fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com        }
1421fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
143427cf28861867c0ea9aafca3a23878ec4068ad99bsalomon        return back->fLastMask->width();
1441fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com    }
1451fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
1461fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com    int getLastMaskHeight() const {
1471fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
1481fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com        if (fStack.empty()) {
149f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org            SkASSERT(false);
1501fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com            return -1;
1511fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com        }
1521fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
1531fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com        GrClipStackFrame* back = (GrClipStackFrame*) fStack.back();
1541fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
155427cf28861867c0ea9aafca3a23878ec4068ad99bsalomon        if (NULL == back->fLastMask) {
1561fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com            return -1;
1571fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com        }
1581fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
159427cf28861867c0ea9aafca3a23878ec4068ad99bsalomon        return back->fLastMask->height();
1601fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com    }
1611fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
162fd03d4a829efe2d77a712fd991927c55f59a2ffecommit-bot@chromium.org    void getLastBound(SkIRect* bound) const {
1631fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
1641fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com        if (fStack.empty()) {
165f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org            SkASSERT(false);
1661fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com            bound->setEmpty();
1671fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com            return;
1681fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com        }
1691fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
1701fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com        GrClipStackFrame* back = (GrClipStackFrame*) fStack.back();
1711fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
1721fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com        *bound = back->fLastBound;
1731fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com    }
1741fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
1751fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com    void setContext(GrContext* context) {
1761fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com        fContext = context;
1771fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com    }
1781fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
1791fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com    GrContext* getContext() {
1801fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com        return fContext;
1811fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com    }
1821fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
183c8dc1f74b6cdda9a43a638292a608c59c1d72d80bsalomon    //  TODO: Remove this when we hold cache keys instead of refs to textures.
184c8dc1f74b6cdda9a43a638292a608c59c1d72d80bsalomon    void purgeResources() {
1851fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com        SkDeque::F2BIter iter(fStack);
1861fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com        for (GrClipStackFrame* frame = (GrClipStackFrame*) iter.next();
1871fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com                frame != NULL;
1881fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com                frame = (GrClipStackFrame*) iter.next()) {
1891fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com            frame->reset();
1901fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com        }
1911fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com    }
1921fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
1931fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.comprivate:
1941fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com    struct GrClipStackFrame {
1951fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
1961fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com        GrClipStackFrame() {
1974c2443e36fdc6c095b17e90baa4a2f26a6f00b08bsalomon@google.com            this->reset();
1981fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com        }
1991fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
2001fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com        void acquireMask(GrContext* context,
2014c2443e36fdc6c095b17e90baa4a2f26a6f00b08bsalomon@google.com                         int32_t clipGenID,
202f2703d83da3ab2ae18b45231fd4f11e16cce3184bsalomon                         const GrSurfaceDesc& desc,
203fd03d4a829efe2d77a712fd991927c55f59a2ffecommit-bot@chromium.org                         const SkIRect& bound) {
2041fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
2054c2443e36fdc6c095b17e90baa4a2f26a6f00b08bsalomon@google.com            fLastClipGenID = clipGenID;
2061fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
207bcf0a52d4f4221b158e68a06ba0c4cc4db011060bsalomon            // HACK: set the last param to true to indicate that this request is at
208bcf0a52d4f4221b158e68a06ba0c4cc4db011060bsalomon            // flush time and therefore we require a scratch texture with no pending IO operations.
209d309e7aa0efa2d5dd7e7b1af97026fcd3a047e98bsalomon            fLastMask.reset(context->textureProvider()->refScratchTexture(
210d309e7aa0efa2d5dd7e7b1af97026fcd3a047e98bsalomon                desc, GrTextureProvider::kApprox_ScratchTexMatch, /*flushing=*/true));
2111fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
2121fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com            fLastBound = bound;
2131fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com        }
2141fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
2151fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com        void reset () {
2164c2443e36fdc6c095b17e90baa4a2f26a6f00b08bsalomon@google.com            fLastClipGenID = SkClipStack::kInvalidGenID;
2171fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
218f2703d83da3ab2ae18b45231fd4f11e16cce3184bsalomon            GrSurfaceDesc desc;
2191fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
220427cf28861867c0ea9aafca3a23878ec4068ad99bsalomon            fLastMask.reset(NULL);
2211fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com            fLastBound.setEmpty();
2221fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com        }
2231fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
2244c2443e36fdc6c095b17e90baa4a2f26a6f00b08bsalomon@google.com        int32_t                 fLastClipGenID;
2254c2443e36fdc6c095b17e90baa4a2f26a6f00b08bsalomon@google.com        // The mask's width & height values are used by GrClipMaskManager to correctly scale the
226c8dc1f74b6cdda9a43a638292a608c59c1d72d80bsalomon        // texture coords for the geometry drawn with this mask. TODO: This should be a cache key
227c8dc1f74b6cdda9a43a638292a608c59c1d72d80bsalomon        // and not a hard ref to a texture.
228427cf28861867c0ea9aafca3a23878ec4068ad99bsalomon        SkAutoTUnref<GrTexture> fLastMask;
2294c2443e36fdc6c095b17e90baa4a2f26a6f00b08bsalomon@google.com        // fLastBound stores the bounding box of the clip mask in clip-stack space. This rect is
2304c2443e36fdc6c095b17e90baa4a2f26a6f00b08bsalomon@google.com        // used by GrClipMaskManager to position a rect and compute texture coords for the mask.
231fd03d4a829efe2d77a712fd991927c55f59a2ffecommit-bot@chromium.org        SkIRect                 fLastBound;
2321fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com    };
2331fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
2341fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com    GrContext*   fContext;
2351fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com    SkDeque      fStack;
2361fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
237a0b40280a49a8a43af7929ead3b3489951c58501commit-bot@chromium.org    typedef SkNoncopyable INHERITED;
2381fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com};
2391fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com
2401fcc1b80994f7bfa60bbc74e924484da09b47e3brobertphillips@google.com#endif // GrClipMaskCache_DEFINED
241