blob: 4ccfc578fcbec0caec498a003421eb6085ec3796 [file] [log] [blame]
/*
* Copyright 2018 Google Inc.
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#ifndef GrCCClipPath_DEFINED
#define GrCCClipPath_DEFINED
#include "include/core/SkPath.h"
#include "src/gpu/GrSurfaceProxyPriv.h"
#include "src/gpu/GrTextureProxy.h"
#include "src/gpu/ccpr/GrCCAtlas.h"
struct GrCCPerFlushResourceSpecs;
class GrCCPerFlushResources;
class GrOnFlushResourceProvider;
class GrProxyProvider;
/**
* These are keyed by SkPath generation ID, and store which device-space paths are accessed and
* where by clip FPs in a given opsTask. A single GrCCClipPath can be referenced by multiple FPs. At
* flush time their coverage count masks are packed into atlas(es) alongside normal DrawPathOps.
*/
class GrCCClipPath : public SkRefCnt {
public:
GrCCClipPath(const SkPath& deviceSpacePath, const SkIRect&, const GrCaps&);
GrCCClipPath(const GrCCClipPath&) = delete;
void addAccess(const SkIRect& accessRect) { fAccessRect.join(accessRect); }
GrTextureProxy* atlasLazyProxy() const { return fAtlasLazyProxy.get(); }
const SkPath& deviceSpacePath() const { return fDeviceSpacePath; }
const SkIRect& pathDevIBounds() const { return fPathDevIBounds; }
void accountForOwnPath(GrCCAtlas::Specs*) const;
// Allocates our clip path in an atlas and records the offset.
//
// If the return value is non-null, it means the given path did not fit in the then-current
// atlas, so it was retired and a new one was added to the stack. The return value is the
// newly-retired atlas. (*NOT* the atlas this path will reside in.) The caller must call
// assignAtlasTexture on all prior GrCCClipPaths that will use the retired atlas.
std::unique_ptr<GrCCAtlas> renderPathInAtlas(GrCCPerFlushResources*,
GrOnFlushResourceProvider*);
const SkIVector& atlasTranslate() const {
SkASSERT(fHasAtlas);
return fDevToAtlasOffset;
}
void assignAtlasTexture(sk_sp<GrTexture> atlasTexture) {
fAtlasLazyProxy->priv().assign(std::move(atlasTexture));
}
private:
SkPath fDeviceSpacePath;
SkIRect fPathDevIBounds;
SkIRect fAccessRect;
sk_sp<GrTextureProxy> fAtlasLazyProxy;
SkIVector fDevToAtlasOffset; // Translation from device space to location in atlas.
SkDEBUGCODE(bool fHasAtlas = false;)
};
#endif