blob: 2db33800ed1ab74422a7daad3b12311335a367dd [file] [log] [blame]
reed@google.comac10a2d2010-12-22 21:39:39 +00001/*
2 Copyright 2010 Google Inc.
3
4 Licensed under the Apache License, Version 2.0 (the "License");
5 you may not use this file except in compliance with the License.
6 You may obtain a copy of the License at
7
8 http://www.apache.org/licenses/LICENSE-2.0
9
10 Unless required by applicable law or agreed to in writing, software
11 distributed under the License is distributed on an "AS IS" BASIS,
12 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 See the License for the specific language governing permissions and
14 limitations under the License.
15 */
16
17
18#ifndef SkGpuDevice_DEFINED
19#define SkGpuDevice_DEFINED
20
21#include "SkGr.h"
22#include "SkDevice.h"
23#include "SkRegion.h"
24
25struct SkDrawProcs;
reed@google.comac10a2d2010-12-22 21:39:39 +000026struct GrSkDrawProcs;
27class GrTextContext;
28
29/**
30 * Subclass of SkDevice, which directs all drawing to the GrGpu owned by the
31 * canvas.
32 */
33class SkGpuDevice : public SkDevice {
34public:
bsalomon@google.com2e7b43d2011-01-18 20:57:22 +000035 /**
36 * The SkGpuDevice will render to the GrRenderTarget, or if the paremeter is
37 * null it will create its own render target and manage that target's
38 * lifetime.
39 */
40 SkGpuDevice(GrContext*,
41 const SkBitmap& bitmap,
42 GrRenderTarget* renderTargetOrNull);
43
44 /**
45 * Magic value that can be passed to constructor. Causes
46 * the device to infer rendertarget from underlying 3D API (e.g. GL or D3D).
47 * This isn't a valid pointer, don't attempt to dereference.
48 */
49 static GrRenderTarget* Current3DApiRenderTarget();
50
reed@google.comac10a2d2010-12-22 21:39:39 +000051 virtual ~SkGpuDevice();
reed@google.com7b201d22011-01-11 18:59:23 +000052
reed@google.comac10a2d2010-12-22 21:39:39 +000053 GrContext* context() const { return fContext; }
54
55 /**
56 * If this device was built for rendering as a layer (i.e. offscreen),
57 * then this will return the platform-specific handle to that GPU resource.
58 * For example, in OpenGL, this will return the FBO's texture ID.
59 * If this device was not built for rendering as a layer, then 0
60 * is returned.
61 */
62 intptr_t getLayerTextureHandle() const;
reed@google.com7b201d22011-01-11 18:59:23 +000063
reed@google.comac10a2d2010-12-22 21:39:39 +000064 // call to set the clip to the specified rect
65 void scissor(const SkIRect&);
66
67 /**
68 * Override from SkGpuDevice, so we can set our FBO to be the render target
69 * The canvas parameter must be a SkGpuCanvas
70 */
71 virtual void gainFocus(SkCanvas*, const SkMatrix&, const SkRegion&);
72
73 virtual SkGpuTexture* accessTexture() { return (SkGpuTexture*)fTexture; }
74
75 // overrides from SkDevice
76
77 virtual bool readPixels(const SkIRect& srcRect, SkBitmap* bitmap);
78 virtual void writePixels(const SkBitmap& bitmap, int x, int y);
reed@google.com7b201d22011-01-11 18:59:23 +000079
reed@google.com46799cd2011-02-22 20:56:26 +000080 virtual void setMatrixClip(const SkMatrix& matrix, const SkRegion& clip,
81 const SkClipStack&);
reed@google.comac10a2d2010-12-22 21:39:39 +000082
83 virtual void drawPaint(const SkDraw&, const SkPaint& paint);
84 virtual void drawPoints(const SkDraw&, SkCanvas::PointMode mode, size_t count,
85 const SkPoint[], const SkPaint& paint);
86 virtual void drawRect(const SkDraw&, const SkRect& r,
87 const SkPaint& paint);
88 virtual void drawPath(const SkDraw&, const SkPath& path,
89 const SkPaint& paint, const SkMatrix* prePathMatrix,
90 bool pathIsMutable);
91 virtual void drawBitmap(const SkDraw&, const SkBitmap& bitmap,
92 const SkIRect* srcRectOrNull,
93 const SkMatrix& matrix, const SkPaint& paint);
94 virtual void drawSprite(const SkDraw&, const SkBitmap& bitmap,
95 int x, int y, const SkPaint& paint);
96 virtual void drawText(const SkDraw&, const void* text, size_t len,
97 SkScalar x, SkScalar y, const SkPaint& paint);
98 virtual void drawPosText(const SkDraw&, const void* text, size_t len,
99 const SkScalar pos[], SkScalar constY,
100 int scalarsPerPos, const SkPaint& paint);
101 virtual void drawTextOnPath(const SkDraw&, const void* text, size_t len,
102 const SkPath& path, const SkMatrix* matrix,
103 const SkPaint& paint);
104 virtual void drawVertices(const SkDraw&, SkCanvas::VertexMode, int vertexCount,
105 const SkPoint verts[], const SkPoint texs[],
106 const SkColor colors[], SkXfermode* xmode,
107 const uint16_t indices[], int indexCount,
108 const SkPaint& paint);
109 virtual void drawDevice(const SkDraw&, SkDevice*, int x, int y,
110 const SkPaint&);
reed@google.com7b201d22011-01-11 18:59:23 +0000111
reed@google.comac10a2d2010-12-22 21:39:39 +0000112 virtual void flush() { fContext->flush(false); }
reed@google.com7b201d22011-01-11 18:59:23 +0000113
114 /**
reed@google.comac10a2d2010-12-22 21:39:39 +0000115 * Make's this device's rendertarget current in the underlying 3D API.
116 * Also implicitly flushes.
117 */
118 virtual void makeRenderTargetCurrent();
119
120protected:
121 class TexCache;
122 TexCache* lockCachedTexture(const SkBitmap& bitmap,
123 const GrSamplerState& sampler,
124 GrTexture** texture,
125 bool forDeviceRenderTarget = false);
126 void unlockCachedTexture(TexCache*);
127
128 class SkAutoCachedTexture {
129 public:
130 SkAutoCachedTexture();
131 SkAutoCachedTexture(SkGpuDevice* device,
132 const SkBitmap& bitmap,
133 const GrSamplerState& sampler,
134 GrTexture** texture);
135 ~SkAutoCachedTexture();
136
137 GrTexture* set(SkGpuDevice*, const SkBitmap&, const GrSamplerState&);
138
139 private:
140 SkGpuDevice* fDevice;
141 TexCache* fTex;
142 };
143 friend class SkAutoTexCache;
144
145private:
146 GrContext* fContext;
bsalomon@google.com5782d712011-01-21 21:03:59 +0000147
reed@google.comac10a2d2010-12-22 21:39:39 +0000148 GrSkDrawProcs* fDrawProcs;
149
150 // state for our offscreen render-target
151 TexCache* fCache;
152 GrTexture* fTexture;
153 GrRenderTarget* fRenderTarget;
154 bool fNeedClear;
155 bool fNeedPrepareRenderTarget;
reed@google.com7b201d22011-01-11 18:59:23 +0000156
bsalomon@google.com5782d712011-01-21 21:03:59 +0000157 // doesn't set the texture/sampler/matrix state
158 // caller needs to null out GrPaint's texture if
159 // non-textured drawing is desired.
160 bool skPaint2GrPaintNoShader(const SkPaint& skPaint,
161 bool justAlpha,
162 GrPaint* grPaint);
163
164 // uses the SkShader to setup paint, act used to
165 // hold lock on cached texture and free it when
166 // destroyed.
167 bool skPaint2GrPaintShader(const SkPaint& skPaint,
168 SkAutoCachedTexture* act,
169 const SkMatrix& ctm,
170 GrPaint* grPaint);
171
172 SkDrawProcs* initDrawForText(GrTextContext*);
bsalomon@google.comc6cf7232011-02-17 16:43:10 +0000173 bool bindDeviceAsTexture(GrPaint* paint);
reed@google.comac10a2d2010-12-22 21:39:39 +0000174
175 void prepareRenderTarget(const SkDraw&);
176 void internalDrawBitmap(const SkDraw&, const SkBitmap&,
bsalomon@google.com5782d712011-01-21 21:03:59 +0000177 const SkIRect&, const SkMatrix&, GrPaint* grPaint);
reed@google.comac10a2d2010-12-22 21:39:39 +0000178
179 typedef SkDevice INHERITED;
180};
181
182#endif
183