GrDrawingManager.h revision 69cfe95b7be386cf7d349b61388e93ea7c3cd386
1/*
2 * Copyright 2015 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8#ifndef GrDrawingManager_DEFINED
9#define GrDrawingManager_DEFINED
10
11#include "GrDrawTarget.h"
12#include "GrBatchFlushState.h"
13#include "GrPathRendererChain.h"
14#include "GrPathRenderer.h"
15#include "SkTDArray.h"
16
17class GrContext;
18class GrDrawContext;
19class GrSoftwarePathRenderer;
20class GrTextContext;
21
22// Currently the DrawingManager creates a separate GrTextContext for each
23// combination of text drawing options (pixel geometry x DFT use)
24// and hands the appropriate one back given the DrawContext's request.
25//
26// It allocates a new GrDrawContext for each GrRenderTarget
27// but all of them still land in the same GrDrawTarget!
28//
29// In the future this class will allocate a new GrDrawContext for
30// each GrRenderTarget/GrDrawTarget and manage the DAG.
31class GrDrawingManager {
32public:
33    ~GrDrawingManager();
34
35    bool abandoned() const { return fAbandoned; }
36    void freeGpuResources();
37
38    GrDrawContext* drawContext(GrRenderTarget* rt, const SkSurfaceProps* surfaceProps);
39
40    GrTextContext* textContext(const SkSurfaceProps& props, GrRenderTarget* rt);
41
42    // The caller automatically gets a ref on the returned drawTarget. It must
43    // be balanced by an unref call.
44    GrDrawTarget* newDrawTarget(GrRenderTarget* rt);
45
46    GrContext* getContext() { return fContext; }
47
48    GrPathRenderer* getPathRenderer(const GrPathRenderer::CanDrawPathArgs& args,
49                                    bool allowSW,
50                                    GrPathRendererChain::DrawType drawType,
51                                    GrPathRenderer::StencilSupport* stencilSupport = NULL);
52
53    static bool ProgramUnitTest(GrContext* context, int maxStages);
54
55private:
56    GrDrawingManager(GrContext* context, const GrDrawTarget::Options& optionsForDrawTargets)
57        : fContext(context)
58        , fOptionsForDrawTargets(optionsForDrawTargets)
59        , fAbandoned(false)
60        , fNVPRTextContext(nullptr)
61        , fPathRendererChain(nullptr)
62        , fSoftwarePathRenderer(nullptr)
63        , fFlushState(context->getGpu(), context->resourceProvider()) {
64        sk_bzero(fTextContexts, sizeof(fTextContexts));
65    }
66
67    void abandon();
68    void cleanup();
69    void reset();
70    void flush();
71
72    friend class GrContext;  // for access to: ctor, abandon, reset & flush
73
74    static const int kNumPixelGeometries = 5; // The different pixel geometries
75    static const int kNumDFTOptions = 2;      // DFT or no DFT
76
77    GrContext*                  fContext;
78    GrDrawTarget::Options       fOptionsForDrawTargets;
79
80    bool                        fAbandoned;
81    SkTDArray<GrDrawTarget*>    fDrawTargets;
82
83    GrTextContext*              fNVPRTextContext;
84    GrTextContext*              fTextContexts[kNumPixelGeometries][kNumDFTOptions];
85
86    GrPathRendererChain*        fPathRendererChain;
87    GrSoftwarePathRenderer*     fSoftwarePathRenderer;
88
89    GrBatchFlushState           fFlushState;
90};
91
92#endif
93