GrSWMaskHelper and GrSoftwarePathRenderer only need the textureProvider (not GrContext)

This is split out of: https://codereview.chromium.org/1988923002/ (Declassify GrClipMaskManager and Remove GrRenderTarget and GrDrawTarget from GrPipelineBuilder)

BUG=skia:

Review-Url: https://codereview.chromium.org/1993403002
This commit is contained in:
robertphillips 2016-05-20 06:38:43 -07:00 committed by Commit bot
parent 24a9bd711a
commit 0152d731e0
7 changed files with 33 additions and 42 deletions

View File

@ -384,7 +384,7 @@ bool GrClipMaskManager::setupClipping(const GrPipelineBuilder& pipelineBuilder,
if (UseSWOnlyPath(this->getContext(), pipelineBuilder, rt, clipToMaskOffset, elements)) {
// The clip geometry is complex enough that it will be more efficient to create it
// entirely in software
result = CreateSoftwareClipMask(this->getContext(),
result = CreateSoftwareClipMask(this->getContext()->textureProvider(),
genID,
initialState,
elements,
@ -791,7 +791,7 @@ bool GrClipMaskManager::createStencilClipMask(GrRenderTarget* rt,
////////////////////////////////////////////////////////////////////////////////
sk_sp<GrTexture> GrClipMaskManager::CreateSoftwareClipMask(
GrContext* context,
GrTextureProvider* texProvider,
int32_t elementsGenID,
GrReducedClip::InitialState initialState,
const GrReducedClip::ElementList& elements,
@ -799,8 +799,7 @@ sk_sp<GrTexture> GrClipMaskManager::CreateSoftwareClipMask(
const SkIRect& clipSpaceIBounds) {
GrUniqueKey key;
GetClipMaskKey(elementsGenID, clipSpaceIBounds, &key);
GrResourceProvider* resourceProvider = context->resourceProvider();
if (GrTexture* texture = resourceProvider->findAndRefTextureByUniqueKey(key)) {
if (GrTexture* texture = texProvider->findAndRefTextureByUniqueKey(key)) {
return sk_sp<GrTexture>(texture);
}
@ -808,7 +807,7 @@ sk_sp<GrTexture> GrClipMaskManager::CreateSoftwareClipMask(
// the top left corner of the resulting rect to the top left of the texture.
SkIRect maskSpaceIBounds = SkIRect::MakeWH(clipSpaceIBounds.width(), clipSpaceIBounds.height());
GrSWMaskHelper helper(context);
GrSWMaskHelper helper(texProvider);
// Set the matrix so that rendered clip elements are transformed to mask space from clip
// space.
@ -857,7 +856,7 @@ sk_sp<GrTexture> GrClipMaskManager::CreateSoftwareClipMask(
desc.fHeight = clipSpaceIBounds.height();
desc.fConfig = kAlpha_8_GrPixelConfig;
sk_sp<GrTexture> result(context->resourceProvider()->createApproxTexture(desc, 0));
sk_sp<GrTexture> result(texProvider->createApproxTexture(desc));
if (!result) {
return nullptr;
}

View File

@ -9,12 +9,7 @@
#include "GrPipelineBuilder.h"
#include "GrReducedClip.h"
#include "GrTexture.h"
#include "SkClipStack.h"
#include "SkDeque.h"
#include "SkPath.h"
#include "SkRefCnt.h"
#include "SkTLList.h"
#include "SkTypes.h"
class GrAppliedClip;
@ -24,7 +19,7 @@ class GrPathRenderer;
class GrPathRendererChain;
class GrResourceProvider;
class GrTexture;
class SkPath;
class GrTextureProvider;
/**
* The clip mask creator handles the generation of the clip mask. If anti
@ -93,7 +88,7 @@ private:
const SkIRect& clipSpaceIBounds);
// Similar to createAlphaClipMask but it rasterizes in SW and uploads to the result texture.
static sk_sp<GrTexture> CreateSoftwareClipMask(GrContext*,
static sk_sp<GrTexture> CreateSoftwareClipMask(GrTextureProvider*,
int32_t elementsGenID,
GrReducedClip::InitialState initialState,
const GrReducedClip::ElementList& elements,

View File

@ -151,7 +151,7 @@ GrPathRenderer* GrDrawingManager::getPathRenderer(const GrPathRenderer::CanDrawP
GrPathRenderer* pr = fPathRendererChain->getPathRenderer(args, drawType, stencilSupport);
if (!pr && allowSW) {
if (!fSoftwarePathRenderer) {
fSoftwarePathRenderer = new GrSoftwarePathRenderer(fContext);
fSoftwarePathRenderer = new GrSoftwarePathRenderer(fContext->textureProvider());
}
pr = fSoftwarePathRenderer;
}

View File

@ -104,7 +104,7 @@ GrTexture* GrSWMaskHelper::createTexture() {
desc.fHeight = fPixels.height();
desc.fConfig = kAlpha_8_GrPixelConfig;
return fContext->textureProvider()->createApproxTexture(desc);
return fTexProvider->createApproxTexture(desc);
}
/**
@ -134,13 +134,13 @@ void GrSWMaskHelper::toSDF(unsigned char* sdf) {
* and uploads the result to a scratch texture. Returns the resulting
* texture on success; nullptr on failure.
*/
GrTexture* GrSWMaskHelper::DrawPathMaskToTexture(GrContext* context,
GrTexture* GrSWMaskHelper::DrawPathMaskToTexture(GrTextureProvider* texProvider,
const SkPath& path,
const GrStyle& style,
const SkIRect& resultBounds,
bool antiAlias,
const SkMatrix* matrix) {
GrSWMaskHelper helper(context);
GrSWMaskHelper helper(texProvider);
if (!helper.init(resultBounds, matrix)) {
return nullptr;

View File

@ -19,7 +19,7 @@
#include "SkTypes.h"
class GrClip;
class GrContext;
class GrTextureProvider;
class GrTexture;
class SkPath;
class SkStrokeRec;
@ -41,7 +41,7 @@ class GrDrawTarget;
*/
class GrSWMaskHelper : SkNoncopyable {
public:
GrSWMaskHelper(GrContext* context) : fContext(context) { }
GrSWMaskHelper(GrTextureProvider* texProvider) : fTexProvider(texProvider) { }
// set up the internal state in preparation for draws. Since many masks
// may be accumulated in the helper during creation, "resultBounds"
@ -69,7 +69,7 @@ public:
// Canonical usage utility that draws a single path and uploads it
// to the GPU. The result is returned.
static GrTexture* DrawPathMaskToTexture(GrContext* context,
static GrTexture* DrawPathMaskToTexture(GrTextureProvider*,
const SkPath& path,
const GrStyle& style,
const SkIRect& resultBounds,
@ -99,7 +99,7 @@ private:
// result (i.e., right size & format)
GrTexture* createTexture();
GrContext* fContext;
GrTextureProvider* fTexProvider;
SkMatrix fMatrix;
SkAutoPixmapStorage fPixels;
SkDraw fDraw;

View File

@ -6,13 +6,13 @@
*/
#include "GrSoftwarePathRenderer.h"
#include "GrContext.h"
#include "GrSWMaskHelper.h"
#include "GrTextureProvider.h"
#include "batches/GrRectBatchFactory.h"
////////////////////////////////////////////////////////////////////////////////
bool GrSoftwarePathRenderer::onCanDrawPath(const CanDrawPathArgs& args) const {
return SkToBool(fContext);
return SkToBool(fTexProvider);
}
namespace {
@ -21,22 +21,17 @@ namespace {
// gets device coord bounds of path (not considering the fill) and clip. The
// path bounds will be a subset of the clip bounds. returns false if
// path bounds would be empty.
bool get_path_and_clip_bounds(const GrPipelineBuilder* pipelineBuilder,
bool get_path_and_clip_bounds(int width, int height,
const GrClip& clip,
const SkPath& path,
const SkMatrix& matrix,
SkIRect* devPathBounds,
SkIRect* devClipBounds) {
// compute bounds as intersection of rt size, clip, and path
const GrRenderTarget* rt = pipelineBuilder->getRenderTarget();
if (nullptr == rt) {
return false;
}
clip.getConservativeBounds(rt->width(), rt->height(), devClipBounds);
clip.getConservativeBounds(width, height, devClipBounds);
if (devClipBounds->isEmpty()) {
*devPathBounds = SkIRect::MakeWH(rt->width(), rt->height());
*devPathBounds = SkIRect::MakeWH(width, height);
return false;
}
@ -112,12 +107,15 @@ void draw_around_inv_path(GrDrawTarget* target,
// return true on success; false on failure
bool GrSoftwarePathRenderer::onDrawPath(const DrawPathArgs& args) {
GR_AUDIT_TRAIL_AUTO_FRAME(args.fTarget->getAuditTrail(), "GrSoftwarePathRenderer::onDrawPath");
if (nullptr == fContext) {
if (!fTexProvider || !args.fPipelineBuilder->getRenderTarget()) {
return false;
}
const int width = args.fPipelineBuilder->getRenderTarget()->width();
const int height = args.fPipelineBuilder->getRenderTarget()->height();
SkIRect devPathBounds, devClipBounds;
if (!get_path_and_clip_bounds(args.fPipelineBuilder, *args.fClip, *args.fPath,
if (!get_path_and_clip_bounds(width, height, *args.fClip, *args.fPath,
*args.fViewMatrix, &devPathBounds, &devClipBounds)) {
if (args.fPath->isInverseFillType()) {
draw_around_inv_path(args.fTarget, args.fPipelineBuilder, *args.fClip, args.fColor,
@ -127,7 +125,7 @@ bool GrSoftwarePathRenderer::onDrawPath(const DrawPathArgs& args) {
}
SkAutoTUnref<GrTexture> texture(
GrSWMaskHelper::DrawPathMaskToTexture(fContext, *args.fPath, *args.fStyle,
GrSWMaskHelper::DrawPathMaskToTexture(fTexProvider, *args.fPath, *args.fStyle,
devPathBounds,
args.fAntiAlias, args.fViewMatrix));
if (nullptr == texture) {

View File

@ -10,7 +10,7 @@
#include "GrPathRenderer.h"
class GrContext;
class GrTextureProvider;
/**
* This class uses the software side to render a path to an SkBitmap and
@ -18,9 +18,8 @@ class GrContext;
*/
class GrSoftwarePathRenderer : public GrPathRenderer {
public:
GrSoftwarePathRenderer(GrContext* context)
: fContext(context) {
}
GrSoftwarePathRenderer(GrTextureProvider* texProvider) : fTexProvider(texProvider) { }
private:
StencilSupport onGetStencilSupport(const SkPath&) const override {
return GrPathRenderer::kNoSupport_StencilSupport;
@ -31,7 +30,7 @@ private:
bool onDrawPath(const DrawPathArgs&) override;
private:
GrContext* fContext;
GrTextureProvider* fTexProvider;
typedef GrPathRenderer INHERITED;
};