blob: 3f3610898a42d11f818a5512d5f4b8c3d6afb5a5 [file] [log] [blame]
reed@google.comac10a2d2010-12-22 21:39:39 +00001/*
epoger@google.comec3ed6a2011-07-28 14:26:00 +00002 * Copyright 2011 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.
reed@google.comac10a2d2010-12-22 21:39:39 +00006 */
7
reed@google.comac10a2d2010-12-22 21:39:39 +00008#ifndef GrGpu_DEFINED
9#define GrGpu_DEFINED
10
Robert Phillipse42edcc2017-12-13 11:50:22 -050011#include "GrCaps.h"
egdaniel066df7c2016-06-08 14:02:27 -070012#include "GrGpuCommandBuffer.h"
joshualitt79f8fae2014-10-28 17:59:26 -070013#include "GrProgramDesc.h"
bsalomon6c9cd552016-01-22 07:17:34 -080014#include "GrSwizzle.h"
cdalton28f45b92016-03-07 13:58:26 -080015#include "GrAllocator.h"
Brian Osmane8e54582016-11-28 10:06:27 -050016#include "GrTextureProducer.h"
cblume55f2d2d2016-02-26 13:20:48 -080017#include "GrTypes.h"
kkinnunencabe20c2015-06-01 01:37:26 -070018#include "GrXferProcessor.h"
sugoi@google.com12b4e272012-12-06 20:13:11 +000019#include "SkPath.h"
cblume55f2d2d2016-02-26 13:20:48 -080020#include "SkTArray.h"
csmartdalton0d28e572016-07-06 09:59:43 -070021#include <map>
sugoi@google.com12b4e272012-12-06 20:13:11 +000022
Greg Danielbcf612b2017-05-01 13:50:58 +000023class GrBackendRenderTarget;
Greg Daniela5cb7812017-06-16 09:45:32 -040024class GrBackendSemaphore;
cdalton397536c2016-03-25 12:15:03 -070025class GrBuffer;
bsalomon@google.com669fdc42011-04-05 17:08:27 +000026class GrContext;
robertphillips28a838e2016-06-23 14:07:00 -070027struct GrContextOptions;
reedf9ad5582015-06-25 21:29:25 -070028class GrGLContext;
Chris Daltonbca46e22017-05-15 11:03:26 -060029class GrMesh;
bsalomon@google.com64aef2b2012-06-11 15:36:13 +000030class GrPath;
cdaltonb85a0aa2014-07-21 15:32:44 -070031class GrPathRange;
bsalomon@google.com30085192011-08-19 15:42:31 +000032class GrPathRenderer;
33class GrPathRendererChain;
kkinnunencabe20c2015-06-01 01:37:26 -070034class GrPathRendering;
egdaniel8dd688b2015-01-22 10:16:09 -080035class GrPipeline;
joshualitt873ad0e2015-01-20 09:08:51 -080036class GrPrimitiveProcessor;
kkinnunencabe20c2015-06-01 01:37:26 -070037class GrRenderTarget;
Greg Daniel6be35232017-03-01 17:01:09 -050038class GrSemaphore;
egdaniel8dc7c3a2015-04-16 11:22:42 -070039class GrStencilAttachment;
cdalton93a379b2016-05-11 13:58:08 -070040class GrStencilSettings;
kkinnunencabe20c2015-06-01 01:37:26 -070041class GrSurface;
42class GrTexture;
Brian Osman71a18892017-08-10 10:23:25 -040043class SkJSONWriter;
reed@google.comac10a2d2010-12-22 21:39:39 +000044
joshualitt3322fa42014-11-07 08:48:51 -080045class GrGpu : public SkRefCnt {
reed@google.comac10a2d2010-12-22 21:39:39 +000046public:
47 /**
bsalomon@google.com16e3dde2012-10-25 18:43:28 +000048 * Create an instance of GrGpu that matches the specified backend. If the requested backend is
halcanary96fcdcc2015-08-27 07:41:13 -070049 * not supported (at compile-time or run-time) this returns nullptr. The context will not be
bsalomon@google.com6e4e6502013-02-25 20:12:45 +000050 * fully constructed and should not be used by GrGpu until after this function returns.
reed@google.comac10a2d2010-12-22 21:39:39 +000051 */
Robert Phillipse42edcc2017-12-13 11:50:22 -050052 static sk_sp<GrGpu> Make(GrBackend, GrBackendContext, const GrContextOptions&, GrContext*);
reed@google.comac10a2d2010-12-22 21:39:39 +000053
54 ////////////////////////////////////////////////////////////////////////////
55
bsalomon@google.com6e4e6502013-02-25 20:12:45 +000056 GrGpu(GrContext* context);
mtklein36352bf2015-03-25 18:17:31 -070057 ~GrGpu() override;
reed@google.comac10a2d2010-12-22 21:39:39 +000058
joshualitt3322fa42014-11-07 08:48:51 -080059 GrContext* getContext() { return fContext; }
60 const GrContext* getContext() const { return fContext; }
61
62 /**
63 * Gets the capabilities of the draw target.
64 */
bsalomon4b91f762015-05-19 09:29:46 -070065 const GrCaps* caps() const { return fCaps.get(); }
Robert Phillipse42edcc2017-12-13 11:50:22 -050066 sk_sp<const GrCaps> refCaps() const { return fCaps; }
joshualitt3322fa42014-11-07 08:48:51 -080067
kkinnunencabe20c2015-06-01 01:37:26 -070068 GrPathRendering* pathRendering() { return fPathRendering.get(); }
kkinnunenccdaa042014-08-20 01:36:23 -070069
bsalomon6e2aad42016-04-01 11:54:31 -070070 enum class DisconnectType {
71 // No cleanup should be attempted, immediately cease making backend API calls
72 kAbandon,
73 // Free allocated resources (not known by GrResourceCache) before returning and
74 // ensure no backend backend 3D API calls will be made after disconnect() returns.
75 kCleanup,
76 };
77
78 // Called by GrContext when the underlying backend context is already or will be destroyed
79 // before GrContext.
80 virtual void disconnect(DisconnectType);
bsalomonc8dc1f72014-08-21 13:02:13 -070081
reed@google.comac10a2d2010-12-22 21:39:39 +000082 /**
83 * The GrGpu object normally assumes that no outsider is setting state
84 * within the underlying 3D API's context/device/whatever. This call informs
bsalomon@google.coma7f84e12011-03-10 14:13:19 +000085 * the GrGpu that the state was modified and it shouldn't make assumptions
86 * about the state.
reed@google.comac10a2d2010-12-22 21:39:39 +000087 */
mtkleinb9eb4ac2015-02-02 18:26:03 -080088 void markContextDirty(uint32_t state = kAll_GrBackendState) { fResetBits |= state; }
reed@google.comac10a2d2010-12-22 21:39:39 +000089
90 /**
bsalomon6d467ec2014-11-18 07:36:19 -080091 * Creates a texture object. If kRenderTarget_GrSurfaceFlag the texture can
92 * be used as a render target by calling GrTexture::asRenderTarget(). Not all
93 * pixel configs can be used as render targets. Support for configs as textures
bsalomon4b91f762015-05-19 09:29:46 -070094 * or render targets can be checked using GrCaps.
bsalomon@google.com1da07462011-03-10 14:51:57 +000095 *
reed@google.comac10a2d2010-12-22 21:39:39 +000096 * @param desc describes the texture to be created.
bsalomon5236cf42015-01-14 10:42:08 -080097 * @param budgeted does this texture count against the resource cache budget?
cblume55f2d2d2016-02-26 13:20:48 -080098 * @param texels array of mipmap levels containing texel data to load.
99 * Each level begins with full-size palette data for paletted textures.
Robert Phillips92de6312017-05-23 07:43:48 -0400100 * It contains width*height texels. If there is only one
cblume55f2d2d2016-02-26 13:20:48 -0800101 * element and it contains nullptr fPixels, texture data is
102 * uninitialized.
Robert Phillips590533f2017-07-11 14:22:35 -0400103 * @param mipLevelCount the number of levels in 'texels'
halcanary96fcdcc2015-08-27 07:41:13 -0700104 * @return The texture object if successful, otherwise nullptr.
reed@google.comac10a2d2010-12-22 21:39:39 +0000105 */
Robert Phillips16d8ec62017-07-27 16:16:25 -0400106 sk_sp<GrTexture> createTexture(const GrSurfaceDesc&, SkBudgeted,
Robert Phillips590533f2017-07-11 14:22:35 -0400107 const GrMipLevel texels[], int mipLevelCount);
cblume55f2d2d2016-02-26 13:20:48 -0800108
109 /**
bsalomone699d0c2016-03-09 06:25:15 -0800110 * Simplified createTexture() interface for when there is no initial texel data to upload.
cblume55f2d2d2016-02-26 13:20:48 -0800111 */
Robert Phillips16d8ec62017-07-27 16:16:25 -0400112 sk_sp<GrTexture> createTexture(const GrSurfaceDesc& desc, SkBudgeted);
bsalomone699d0c2016-03-09 06:25:15 -0800113
bsalomon@google.come269f212011-11-07 13:29:52 +0000114 /**
Brian Osman32342f02017-03-04 08:12:46 -0500115 * Implements GrResourceProvider::wrapBackendTexture
bsalomon@google.come269f212011-11-07 13:29:52 +0000116 */
Robert Phillipsb0e93a22017-08-29 08:26:54 -0400117 sk_sp<GrTexture> wrapBackendTexture(const GrBackendTexture&, GrWrapOwnership);
Brian Salomond17f6582017-07-19 18:28:58 -0400118
119 /**
120 * Implements GrResourceProvider::wrapRenderableBackendTexture
121 */
Robert Phillipsb0e93a22017-08-29 08:26:54 -0400122 sk_sp<GrTexture> wrapRenderableBackendTexture(const GrBackendTexture&,
Brian Salomond17f6582017-07-19 18:28:58 -0400123 int sampleCnt, GrWrapOwnership);
bsalomon@google.come269f212011-11-07 13:29:52 +0000124
125 /**
Brian Osman32342f02017-03-04 08:12:46 -0500126 * Implements GrResourceProvider::wrapBackendRenderTarget
bsalomon@google.come269f212011-11-07 13:29:52 +0000127 */
Robert Phillipsb0e93a22017-08-29 08:26:54 -0400128 sk_sp<GrRenderTarget> wrapBackendRenderTarget(const GrBackendRenderTarget&);
bsalomon@google.come269f212011-11-07 13:29:52 +0000129
130 /**
Brian Osman32342f02017-03-04 08:12:46 -0500131 * Implements GrResourceProvider::wrapBackendTextureAsRenderTarget
ericrkf7b8b8a2016-02-24 14:49:51 -0800132 */
Greg Daniel7ef28f32017-04-20 16:41:55 +0000133 sk_sp<GrRenderTarget> wrapBackendTextureAsRenderTarget(const GrBackendTexture&,
Greg Daniel7ef28f32017-04-20 16:41:55 +0000134 int sampleCnt);
ericrkf7b8b8a2016-02-24 14:49:51 -0800135
136 /**
csmartdalton485a1202016-07-13 10:16:32 -0700137 * Creates a buffer in GPU memory. For a client-side buffer use GrBuffer::CreateCPUBacked.
reed@google.comac10a2d2010-12-22 21:39:39 +0000138 *
cdaltone2e71c22016-04-07 18:13:29 -0700139 * @param size size of buffer to create.
140 * @param intendedType hint to the graphics subsystem about what the buffer will be used for.
141 * @param accessPattern hint to the graphics subsystem about how the data will be accessed.
cdalton1bf3e712016-04-19 10:00:02 -0700142 * @param data optional data with which to initialize the buffer.
cdaltone2e71c22016-04-07 18:13:29 -0700143 *
cdalton397536c2016-03-25 12:15:03 -0700144 * @return the buffer if successful, otherwise nullptr.
reed@google.comac10a2d2010-12-22 21:39:39 +0000145 */
cdalton1bf3e712016-04-19 10:00:02 -0700146 GrBuffer* createBuffer(size_t size, GrBufferType intendedType, GrAccessPattern accessPattern,
147 const void* data = nullptr);
halcanary9d524f22016-03-29 09:03:52 -0700148
reed@google.comac10a2d2010-12-22 21:39:39 +0000149 /**
bsalomon@google.com75f9f252012-01-31 13:35:56 +0000150 * Resolves MSAA.
151 */
Robert Phillipsb0e93a22017-08-29 08:26:54 -0400152 void resolveRenderTarget(GrRenderTarget*, GrSurfaceOrigin);
bsalomon@google.com75f9f252012-01-31 13:35:56 +0000153
bsalomonf0674512015-07-28 13:26:15 -0700154 /** Info struct returned by getReadPixelsInfo about performing intermediate draws before
bsalomon39826022015-07-23 08:07:21 -0700155 reading pixels for performance or correctness. */
156 struct ReadPixelTempDrawInfo {
157 /** If the GrGpu is requesting that the caller do a draw to an intermediate surface then
158 this is descriptor for the temp surface. The draw should always be a rect with
159 dst 0,0,w,h. */
160 GrSurfaceDesc fTempSurfaceDesc;
161 /** Indicates whether there is a performance advantage to using an exact match texture
162 (in terms of width and height) for the intermediate texture instead of approximate. */
bsalomonb117ff12016-07-19 07:24:40 -0700163 SkBackingFit fTempSurfaceFit;
bsalomon6c9cd552016-01-22 07:17:34 -0800164 /** Swizzle to apply during the draw. This is used to compensate for either feature or
165 performance limitations in the underlying 3D API. */
166 GrSwizzle fSwizzle;
167 /** The config that should be used to read from the temp surface after the draw. This may be
168 different than the original read config in order to compensate for swizzling. The
169 read data will effectively be in the original read config. */
170 GrPixelConfig fReadConfig;
bsalomon39826022015-07-23 08:07:21 -0700171 };
bsalomon6c9cd552016-01-22 07:17:34 -0800172
bsalomon39826022015-07-23 08:07:21 -0700173 /** Describes why an intermediate draw must/should be performed before readPixels. */
174 enum DrawPreference {
175 /** On input means that the caller would proceed without draw if the GrGpu doesn't request
176 one.
177 On output means that the GrGpu is not requesting a draw. */
178 kNoDraw_DrawPreference,
179 /** Means that the client would prefer a draw for performance of the readback but
180 can satisfy a straight readPixels call on the inputs without an intermediate draw.
181 getReadPixelsInfo will never set the draw preference to this value but may leave
182 it set. */
183 kCallerPrefersDraw_DrawPreference,
184 /** On output means that GrGpu would prefer a draw for performance of the readback but
185 can satisfy a straight readPixels call on the inputs without an intermediate draw. The
186 caller of getReadPixelsInfo should never specify this on intput. */
187 kGpuPrefersDraw_DrawPreference,
188 /** On input means that the caller requires a draw to do a transformation and there is no
189 CPU fallback.
190 On output means that GrGpu can only satisfy the readPixels request if the intermediate
191 draw is performed.
192 */
193 kRequireDraw_DrawPreference
194 };
195
bsalomonf0674512015-07-28 13:26:15 -0700196 /**
197 * Used to negotiate whether and how an intermediate draw should or must be performed before
198 * a readPixels call. If this returns false then GrGpu could not deduce an intermediate draw
199 * that would allow a successful readPixels call. The passed width, height, and rowBytes,
200 * must be non-zero and already reflect clipping to the src bounds.
201 */
Robert Phillipsb0e93a22017-08-29 08:26:54 -0400202 bool getReadPixelsInfo(GrSurface* srcSurface, GrSurfaceOrigin srcOrigin,
203 int readWidth, int readHeight, size_t rowBytes,
bsalomonf0674512015-07-28 13:26:15 -0700204 GrPixelConfig readConfig, DrawPreference*, ReadPixelTempDrawInfo*);
205
cblume61214052016-01-26 09:10:48 -0800206 /** Info struct returned by getWritePixelsInfo about performing an intermediate draw in order
bsalomonf0674512015-07-28 13:26:15 -0700207 to write pixels to a GrSurface for either performance or correctness reasons. */
208 struct WritePixelTempDrawInfo {
209 /** If the GrGpu is requesting that the caller upload to an intermediate surface and draw
210 that to the dst then this is the descriptor for the intermediate surface. The caller
211 should upload the pixels such that the upper left pixel of the upload rect is at 0,0 in
212 the intermediate surface.*/
213 GrSurfaceDesc fTempSurfaceDesc;
bsalomon6c9cd552016-01-22 07:17:34 -0800214 /** Swizzle to apply during the draw. This is used to compensate for either feature or
215 performance limitations in the underlying 3D API. */
216 GrSwizzle fSwizzle;
217 /** The config that should be specified when uploading the *original* data to the temp
218 surface before the draw. This may be different than the original src data config in
219 order to compensate for swizzling that will occur when drawing. */
220 GrPixelConfig fWriteConfig;
bsalomonf0674512015-07-28 13:26:15 -0700221 };
bsalomon39826022015-07-23 08:07:21 -0700222
bsalomon@google.com75f9f252012-01-31 13:35:56 +0000223 /**
bsalomonf0674512015-07-28 13:26:15 -0700224 * Used to negotiate whether and how an intermediate surface should be used to write pixels to
225 * a GrSurface. If this returns false then GrGpu could not deduce an intermediate draw
226 * that would allow a successful transfer of the src pixels to the dst. The passed width,
227 * height, and rowBytes, must be non-zero and already reflect clipping to the dst bounds.
bsalomon@google.com0a97be22011-11-08 19:20:57 +0000228 */
Robert Phillipsb0e93a22017-08-29 08:26:54 -0400229 bool getWritePixelsInfo(GrSurface* dstSurface, GrSurfaceOrigin dstOrigin, int width, int height,
bsalomonf0674512015-07-28 13:26:15 -0700230 GrPixelConfig srcConfig, DrawPreference*, WritePixelTempDrawInfo*);
bsalomon@google.coma85449d2011-11-19 02:36:05 +0000231
232 /**
bsalomon@google.coma04e8e82012-08-27 12:53:13 +0000233 * Reads a rectangle of pixels from a render target.
bsalomon@google.comc4364992011-11-07 15:54:49 +0000234 *
bsalomon6cb3cbe2015-07-30 07:34:27 -0700235 * @param surface The surface to read from
bsalomon@google.com669fdc42011-04-05 17:08:27 +0000236 * @param left left edge of the rectangle to read (inclusive)
237 * @param top top edge of the rectangle to read (inclusive)
238 * @param width width of rectangle to read in pixels.
239 * @param height height of rectangle to read in pixels.
240 * @param config the pixel config of the destination buffer
241 * @param buffer memory to read the rectangle into.
bsalomon@google.comc6980972011-11-02 19:57:21 +0000242 * @param rowBytes the number of bytes between consecutive rows. Zero
243 * means rows are tightly packed.
bsalomon@google.comc4364992011-11-07 15:54:49 +0000244 * @param invertY buffer should be populated bottom-to-top as opposed
245 * to top-to-bottom (skia's usual order)
bsalomon@google.coma7f84e12011-03-10 14:13:19 +0000246 *
247 * @return true if the read succeeded, false if not. The read can fail
248 * because of a unsupported pixel config or because no render
249 * target is currently set.
250 */
Robert Phillipsb0e93a22017-08-29 08:26:54 -0400251 bool readPixels(GrSurface* surface, GrSurfaceOrigin,
bsalomon@google.com669fdc42011-04-05 17:08:27 +0000252 int left, int top, int width, int height,
senorblanco@chromium.org3cb406b2013-02-05 19:50:46 +0000253 GrPixelConfig config, void* buffer, size_t rowBytes);
reed@google.comac10a2d2010-12-22 21:39:39 +0000254
bsalomon@google.com6f379512011-11-16 20:36:03 +0000255 /**
bsalomon6cb3cbe2015-07-30 07:34:27 -0700256 * Updates the pixels in a rectangle of a surface.
bsalomon@google.coma85449d2011-11-19 02:36:05 +0000257 *
bsalomon6cb3cbe2015-07-30 07:34:27 -0700258 * @param surface The surface to write to.
bsalomon@google.com6f379512011-11-16 20:36:03 +0000259 * @param left left edge of the rectangle to write (inclusive)
260 * @param top top edge of the rectangle to write (inclusive)
261 * @param width width of rectangle to write in pixels.
262 * @param height height of rectangle to write in pixels.
263 * @param config the pixel config of the source buffer
cblume55f2d2d2016-02-26 13:20:48 -0800264 * @param texels array of mipmap levels containing texture data
Robert Phillips590533f2017-07-11 14:22:35 -0400265 * @param mipLevelCount number of levels in 'texels'
cblume55f2d2d2016-02-26 13:20:48 -0800266 */
Robert Phillipsb0e93a22017-08-29 08:26:54 -0400267 bool writePixels(GrSurface* surface, GrSurfaceOrigin origin,
cblume55f2d2d2016-02-26 13:20:48 -0800268 int left, int top, int width, int height,
269 GrPixelConfig config,
Robert Phillips590533f2017-07-11 14:22:35 -0400270 const GrMipLevel texels[], int mipLevelCount);
cblume55f2d2d2016-02-26 13:20:48 -0800271
272 /**
273 * This function is a shim which creates a SkTArray<GrMipLevel> of size 1.
274 * It then calls writePixels with that SkTArray.
275 *
276 * @param buffer memory to read pixels from.
277 * @param rowBytes number of bytes between consecutive rows. Zero
278 * means rows are tightly packed.
bsalomon@google.com6f379512011-11-16 20:36:03 +0000279 */
Robert Phillipsb0e93a22017-08-29 08:26:54 -0400280 bool writePixels(GrSurface* surface, GrSurfaceOrigin origin,
bsalomon6cb3cbe2015-07-30 07:34:27 -0700281 int left, int top, int width, int height,
282 GrPixelConfig config, const void* buffer,
283 size_t rowBytes);
bsalomon@google.com6f379512011-11-16 20:36:03 +0000284
joshualitt3322fa42014-11-07 08:48:51 -0800285 /**
Jim Van Verth2e5eaf02017-06-21 15:55:46 -0400286 * Updates the pixels in a rectangle of a texture using a buffer
jvanverth17aa0472016-01-05 10:41:27 -0800287 *
Jim Van Verth2e5eaf02017-06-21 15:55:46 -0400288 * There are a couple of assumptions here. First, we only update the top miplevel.
289 * And second, that any y flip needed has already been done in the buffer.
290 *
291 * @param texture The texture to write to.
cdalton397536c2016-03-25 12:15:03 -0700292 * @param left left edge of the rectangle to write (inclusive)
293 * @param top top edge of the rectangle to write (inclusive)
294 * @param width width of rectangle to write in pixels.
295 * @param height height of rectangle to write in pixels.
296 * @param config the pixel config of the source buffer
Jim Van Verth2e5eaf02017-06-21 15:55:46 -0400297 * @param transferBuffer GrBuffer to read pixels from (type must be "kXferCpuToGpu")
cdalton397536c2016-03-25 12:15:03 -0700298 * @param offset offset from the start of the buffer
Jim Van Verth2e5eaf02017-06-21 15:55:46 -0400299 * @param rowBytes number of bytes between consecutive rows in the buffer. Zero
cdalton397536c2016-03-25 12:15:03 -0700300 * means rows are tightly packed.
jvanverth17aa0472016-01-05 10:41:27 -0800301 */
Jim Van Verth2e5eaf02017-06-21 15:55:46 -0400302 bool transferPixels(GrTexture* texture,
jvanverth17aa0472016-01-05 10:41:27 -0800303 int left, int top, int width, int height,
cdalton397536c2016-03-25 12:15:03 -0700304 GrPixelConfig config, GrBuffer* transferBuffer,
Jim Van Verth2e5eaf02017-06-21 15:55:46 -0400305 size_t offset, size_t rowBytes);
jvanverth17aa0472016-01-05 10:41:27 -0800306
bsalomon@google.com80d09b92011-11-05 21:21:13 +0000307 // After the client interacts directly with the 3D context state the GrGpu
308 // must resync its internal state and assumptions about 3D context state.
309 // Each time this occurs the GrGpu bumps a timestamp.
310 // state of the 3D context
311 // At 10 resets / frame and 60fps a 64bit timestamp will overflow in about
312 // a billion years.
313 typedef uint64_t ResetTimestamp;
314
315 // This timestamp is always older than the current timestamp
316 static const ResetTimestamp kExpiredTimestamp = 0;
317 // Returns a timestamp based on the number of times the context was reset.
318 // This timestamp can be used to lazily detect when cached 3D context state
319 // is dirty.
bsalomon6d467ec2014-11-18 07:36:19 -0800320 ResetTimestamp getResetTimestamp() const { return fResetTimestamp; }
bsalomon@google.com80d09b92011-11-05 21:21:13 +0000321
bsalomonf90a02b2014-11-26 12:28:00 -0800322 // Called to perform a surface to surface copy. Fallbacks to issuing a draw from the src to dst
Robert Phillipsf2361d22016-10-25 14:20:06 -0400323 // take place at the GrOpList level and this function implement faster copy paths. The rect
bsalomonf90a02b2014-11-26 12:28:00 -0800324 // and point are pre-clipped. The src rect and implied dst rect are guaranteed to be within the
325 // src/dst bounds and non-empty.
Robert Phillipsb0e93a22017-08-29 08:26:54 -0400326 bool copySurface(GrSurface* dst, GrSurfaceOrigin dstOrigin,
327 GrSurface* src, GrSurfaceOrigin srcOrigin,
joshualitt1cbdcde2015-08-21 11:53:29 -0700328 const SkIRect& srcRect,
329 const SkIPoint& dstPoint);
joshualitt3322fa42014-11-07 08:48:51 -0800330
cdalton28f45b92016-03-07 13:58:26 -0800331 struct MultisampleSpecs {
csmartdalton0d28e572016-07-06 09:59:43 -0700332 MultisampleSpecs(uint8_t uniqueID, int effectiveSampleCnt, const SkPoint* locations)
333 : fUniqueID(uniqueID),
334 fEffectiveSampleCnt(effectiveSampleCnt),
335 fSampleLocations(locations) {}
336
cdalton28f45b92016-03-07 13:58:26 -0800337 // Nonzero ID that uniquely identifies these multisample specs.
csmartdalton0d28e572016-07-06 09:59:43 -0700338 uint8_t fUniqueID;
cdalton28f45b92016-03-07 13:58:26 -0800339 // The actual number of samples the GPU will run. NOTE: this value can be greater than the
340 // the render target's sample count.
csmartdalton0d28e572016-07-06 09:59:43 -0700341 int fEffectiveSampleCnt;
342 // If sample locations are supported, points to the subpixel locations at which the GPU will
343 // sample. Pixel center is at (.5, .5), and (0, 0) indicates the top left corner.
344 const SkPoint* fSampleLocations;
cdalton28f45b92016-03-07 13:58:26 -0800345 };
346
csmartdaltonc633abb2016-11-01 08:55:55 -0700347 // Finds a render target's multisample specs. The pipeline is only needed in case we need to
348 // flush the draw state prior to querying multisample info. The pipeline is not expected to
csmartdaltonc25c5d72016-11-01 07:03:59 -0700349 // affect the multisample information itself.
csmartdaltonc633abb2016-11-01 08:55:55 -0700350 const MultisampleSpecs& queryMultisampleSpecs(const GrPipeline&);
csmartdaltonc25c5d72016-11-01 07:03:59 -0700351
352 // Finds the multisample specs with a given unique id.
353 const MultisampleSpecs& getMultisampleSpecs(uint8_t uniqueID) {
354 SkASSERT(uniqueID > 0 && uniqueID < fMultisampleSpecs.count());
355 return fMultisampleSpecs[uniqueID];
356 }
cdalton28f45b92016-03-07 13:58:26 -0800357
Greg Daniel500d58b2017-08-24 15:59:33 -0400358 // Creates a GrGpuRTCommandBuffer which GrOpLists send draw commands to instead of directly
359 // to the Gpu object.
360 virtual GrGpuRTCommandBuffer* createCommandBuffer(
Robert Phillips95214472017-08-08 18:00:03 -0400361 GrRenderTarget*, GrSurfaceOrigin,
Greg Daniel500d58b2017-08-24 15:59:33 -0400362 const GrGpuRTCommandBuffer::LoadAndStoreInfo&,
363 const GrGpuRTCommandBuffer::StencilLoadAndStoreInfo&) = 0;
364
365 // Creates a GrGpuTextureCommandBuffer which GrOpLists send texture commands to instead of
366 // directly to the Gpu object.
367 virtual GrGpuTextureCommandBuffer* createCommandBuffer(GrTexture*, GrSurfaceOrigin) = 0;
bsalomon3e791242014-12-17 13:43:13 -0800368
Robert Phillips18e94842017-05-15 13:06:44 -0400369 // Called by GrDrawingManager when flushing.
Greg Daniel51316782017-08-02 15:10:09 +0000370 // Provides a hook for post-flush actions (e.g. Vulkan command buffer submits). This will also
371 // insert any numSemaphore semaphores on the gpu and set the backendSemaphores to match the
372 // inserted semaphores.
373 GrSemaphoresSubmitted finishFlush(int numSemaphores, GrBackendSemaphore backendSemaphores[]);
ethannicholas22793252016-01-30 09:59:10 -0800374
Greg Daniel6be35232017-03-01 17:01:09 -0500375 virtual GrFence SK_WARN_UNUSED_RESULT insertFence() = 0;
376 virtual bool waitFence(GrFence, uint64_t timeout = 1000) = 0;
jvanverth84741b32016-09-30 08:39:02 -0700377 virtual void deleteFence(GrFence) const = 0;
378
Greg Daniela5cb7812017-06-16 09:45:32 -0400379 virtual sk_sp<GrSemaphore> SK_WARN_UNUSED_RESULT makeSemaphore(bool isOwned = true) = 0;
380 virtual sk_sp<GrSemaphore> wrapBackendSemaphore(const GrBackendSemaphore& semaphore,
381 GrWrapOwnership ownership) = 0;
Brian Osmandc87c952017-04-28 13:57:38 -0400382 virtual void insertSemaphore(sk_sp<GrSemaphore> semaphore, bool flush = false) = 0;
Greg Daniel6be35232017-03-01 17:01:09 -0500383 virtual void waitSemaphore(sk_sp<GrSemaphore> semaphore) = 0;
384
Brian Osman13dddce2017-05-09 13:19:50 -0400385 /**
386 * Put this texture in a safe and known state for use across multiple GrContexts. Depending on
387 * the backend, this may return a GrSemaphore. If so, other contexts should wait on that
388 * semaphore before using this texture.
389 */
390 virtual sk_sp<GrSemaphore> prepareTextureForCrossContextUsage(GrTexture*) = 0;
391
mtkleinb9eb4ac2015-02-02 18:26:03 -0800392 ///////////////////////////////////////////////////////////////////////////
393 // Debugging and Stats
394
395 class Stats {
396 public:
397#if GR_GPU_STATS
398 Stats() { this->reset(); }
399
bsalomonb12ea412015-02-02 21:19:50 -0800400 void reset() {
401 fRenderTargetBinds = 0;
402 fShaderCompilations = 0;
403 fTextureCreates = 0;
404 fTextureUploads = 0;
jvanverth17aa0472016-01-05 10:41:27 -0800405 fTransfersToTexture = 0;
egdaniel8dc7c3a2015-04-16 11:22:42 -0700406 fStencilAttachmentCreates = 0;
joshualitt87a5c9f2015-09-08 13:42:05 -0700407 fNumDraws = 0;
bsalomon1d417a82016-03-23 11:50:26 -0700408 fNumFailedDraws = 0;
bsalomonb12ea412015-02-02 21:19:50 -0800409 }
mtkleinb9eb4ac2015-02-02 18:26:03 -0800410
411 int renderTargetBinds() const { return fRenderTargetBinds; }
412 void incRenderTargetBinds() { fRenderTargetBinds++; }
413 int shaderCompilations() const { return fShaderCompilations; }
414 void incShaderCompilations() { fShaderCompilations++; }
bsalomonb12ea412015-02-02 21:19:50 -0800415 int textureCreates() const { return fTextureCreates; }
416 void incTextureCreates() { fTextureCreates++; }
417 int textureUploads() const { return fTextureUploads; }
418 void incTextureUploads() { fTextureUploads++; }
jvanverth17aa0472016-01-05 10:41:27 -0800419 int transfersToTexture() const { return fTransfersToTexture; }
420 void incTransfersToTexture() { fTransfersToTexture++; }
egdaniel8dc7c3a2015-04-16 11:22:42 -0700421 void incStencilAttachmentCreates() { fStencilAttachmentCreates++; }
joshualitt87a5c9f2015-09-08 13:42:05 -0700422 void incNumDraws() { fNumDraws++; }
bsalomon1d417a82016-03-23 11:50:26 -0700423 void incNumFailedDraws() { ++fNumFailedDraws; }
mtkleinb9eb4ac2015-02-02 18:26:03 -0800424 void dump(SkString*);
joshualitte45c81c2015-12-02 09:05:37 -0800425 void dumpKeyValuePairs(SkTArray<SkString>* keys, SkTArray<double>* values);
bsalomon1d417a82016-03-23 11:50:26 -0700426 int numDraws() const { return fNumDraws; }
427 int numFailedDraws() const { return fNumFailedDraws; }
mtkleinb9eb4ac2015-02-02 18:26:03 -0800428 private:
429 int fRenderTargetBinds;
430 int fShaderCompilations;
bsalomonb12ea412015-02-02 21:19:50 -0800431 int fTextureCreates;
432 int fTextureUploads;
jvanverth17aa0472016-01-05 10:41:27 -0800433 int fTransfersToTexture;
egdaniel8dc7c3a2015-04-16 11:22:42 -0700434 int fStencilAttachmentCreates;
joshualitt87a5c9f2015-09-08 13:42:05 -0700435 int fNumDraws;
bsalomon1d417a82016-03-23 11:50:26 -0700436 int fNumFailedDraws;
mtkleinb9eb4ac2015-02-02 18:26:03 -0800437#else
joshualitte45c81c2015-12-02 09:05:37 -0800438 void dump(SkString*) {}
439 void dumpKeyValuePairs(SkTArray<SkString>*, SkTArray<double>*) {}
mtkleinb9eb4ac2015-02-02 18:26:03 -0800440 void incRenderTargetBinds() {}
441 void incShaderCompilations() {}
bsalomonb12ea412015-02-02 21:19:50 -0800442 void incTextureCreates() {}
443 void incTextureUploads() {}
jvanverth17aa0472016-01-05 10:41:27 -0800444 void incTransfersToTexture() {}
egdaniel8dc7c3a2015-04-16 11:22:42 -0700445 void incStencilAttachmentCreates() {}
joshualitt87a5c9f2015-09-08 13:42:05 -0700446 void incNumDraws() {}
bsalomon1d417a82016-03-23 11:50:26 -0700447 void incNumFailedDraws() {}
mtkleinb9eb4ac2015-02-02 18:26:03 -0800448#endif
449 };
450
451 Stats* stats() { return &fStats; }
Brian Osman71a18892017-08-10 10:23:25 -0400452 void dumpJSON(SkJSONWriter*) const;
mtkleinb9eb4ac2015-02-02 18:26:03 -0800453
bsalomon67d76202015-11-11 12:40:42 -0800454 /** Creates a texture directly in the backend API without wrapping it in a GrTexture. This is
455 only to be used for testing (particularly for testing the methods that import an externally
456 created texture into Skia. Must be matched with a call to deleteTestingOnlyTexture(). */
Robert Phillipsd21b2a52017-12-12 13:01:25 -0500457 virtual GrBackendTexture createTestingOnlyBackendTexture(
458 void* pixels, int w, int h,
459 GrPixelConfig config,
460 bool isRenderTarget,
461 GrMipMapped mipMapped) = 0;
462 /** Check a handle represents an actual texture in the backend API that has not been freed. */
463 virtual bool isTestingOnlyBackendTexture(const GrBackendTexture&) const = 0;
464 /** If ownership of the backend texture has been transferred pass true for abandonTexture. This
465 will do any necessary cleanup of the handle without freeing the texture in the backend
466 API. */
467 virtual void deleteTestingOnlyBackendTexture(GrBackendTexture*,
bsalomone63ffef2016-02-05 07:17:34 -0800468 bool abandonTexture = false) = 0;
jvanverth672bb7f2015-07-13 07:19:57 -0700469
egdanielec00d942015-09-14 12:56:10 -0700470 // width and height may be larger than rt (if underlying API allows it).
471 // Returns nullptr if compatible sb could not be created, otherwise the caller owns the ref on
472 // the GrStencilAttachment.
473 virtual GrStencilAttachment* createStencilAttachmentForRenderTarget(const GrRenderTarget*,
474 int width,
475 int height) = 0;
476 // clears target's entire stencil buffer to 0
Robert Phillips95214472017-08-08 18:00:03 -0400477 virtual void clearStencil(GrRenderTarget* target, int clearValue) = 0;
bsalomon6bc1b5f2015-02-23 09:06:38 -0800478
bsalomone179a912016-01-20 06:18:10 -0800479 // Determines whether a texture will need to be rescaled in order to be used with the
Brian Salomon2bbdcc42017-09-07 12:36:34 -0400480 // GrSamplerState. This variation is called when the caller will create a new texture using the
Brian Osman32342f02017-03-04 08:12:46 -0500481 // resource provider from a non-texture src (cpu-backed image, ...).
Brian Salomon2bbdcc42017-09-07 12:36:34 -0400482 bool isACopyNeededForTextureParams(int width, int height, const GrSamplerState&,
Robert Phillips81444fb2017-03-21 09:14:35 -0400483 GrTextureProducer::CopyParams*,
484 SkScalar scaleAdjust[2]) const;
bsalomone179a912016-01-20 06:18:10 -0800485
486 // Like the above but this variation should be called when the caller is not creating the
487 // original texture but rather was handed the original texture. It adds additional checks
488 // relevant to original textures that were created external to Skia via
Brian Osman32342f02017-03-04 08:12:46 -0500489 // GrResourceProvider::wrap methods.
Brian Salomon2bbdcc42017-09-07 12:36:34 -0400490 bool isACopyNeededForTextureParams(GrTextureProxy* proxy, const GrSamplerState& params,
Robert Phillips81444fb2017-03-21 09:14:35 -0400491 GrTextureProducer::CopyParams* copyParams,
492 SkScalar scaleAdjust[2]) const {
Robert Phillips3798c862017-03-27 11:08:16 -0400493 if (this->isACopyNeededForTextureParams(proxy->width(), proxy->height(), params,
Robert Phillips81444fb2017-03-21 09:14:35 -0400494 copyParams, scaleAdjust)) {
bsalomone179a912016-01-20 06:18:10 -0800495 return true;
496 }
Robert Phillips3798c862017-03-27 11:08:16 -0400497 return this->onIsACopyNeededForTextureParams(proxy, params, copyParams, scaleAdjust);
bsalomone179a912016-01-20 06:18:10 -0800498 }
bsalomon045802d2015-10-20 07:58:01 -0700499
jvanverth672bb7f2015-07-13 07:19:57 -0700500 // This is only to be used in GL-specific tests.
halcanary96fcdcc2015-08-27 07:41:13 -0700501 virtual const GrGLContext* glContextForTesting() const { return nullptr; }
bsalomon993a4212015-05-29 11:37:25 -0700502
joshualitt8fd844f2015-12-02 13:36:47 -0800503 // This is only to be used by testing code
504 virtual void resetShaderCacheForTesting() const {}
505
egdaniel9cb63402016-06-23 08:37:05 -0700506 void handleDirtyContext() {
507 if (fResetBits) {
508 this->resetContext();
509 }
510 }
511
joshualittd53a8272014-11-10 16:03:14 -0800512protected:
bsalomonf0674512015-07-28 13:26:15 -0700513 static void ElevateDrawPreference(GrGpu::DrawPreference* preference,
514 GrGpu::DrawPreference elevation) {
515 GR_STATIC_ASSERT(GrGpu::kCallerPrefersDraw_DrawPreference > GrGpu::kNoDraw_DrawPreference);
516 GR_STATIC_ASSERT(GrGpu::kGpuPrefersDraw_DrawPreference >
517 GrGpu::kCallerPrefersDraw_DrawPreference);
518 GR_STATIC_ASSERT(GrGpu::kRequireDraw_DrawPreference >
519 GrGpu::kGpuPrefersDraw_DrawPreference);
520 *preference = SkTMax(*preference, elevation);
521 }
522
jvanverth900bd4a2016-04-29 13:53:12 -0700523 // Handles cases where a surface will be updated without a call to flushRenderTarget
524 void didWriteToSurface(GrSurface* surface, const SkIRect* bounds, uint32_t mipLevels = 1) const;
525
Ben Wagner145dbcd2016-11-03 14:40:50 -0400526 Stats fStats;
527 std::unique_ptr<GrPathRendering> fPathRendering;
joshualitt3322fa42014-11-07 08:48:51 -0800528 // Subclass must initialize this in its constructor.
Hal Canary144caf52016-11-07 17:57:18 -0500529 sk_sp<const GrCaps> fCaps;
joshualitt3322fa42014-11-07 08:48:51 -0800530
csmartdalton0d28e572016-07-06 09:59:43 -0700531 typedef SkTArray<SkPoint, true> SamplePattern;
532
bsalomon@google.com02ddc8b2013-01-28 15:35:28 +0000533private:
bsalomon@google.comb635d392011-11-05 12:47:43 +0000534 // called when the 3D context state is unknown. Subclass should emit any
bsalomon@google.comc8f7f472012-06-18 13:44:51 +0000535 // assumed 3D context state and dirty any state cache.
bsalomon@google.com0a208a12013-06-28 18:57:35 +0000536 virtual void onResetContext(uint32_t resetBits) = 0;
bsalomon@google.coma7f84e12011-03-10 14:13:19 +0000537
bsalomoncb02b382015-08-12 11:14:50 -0700538 // Called before certain draws in order to guarantee coherent results from dst reads.
539 virtual void xferBarrier(GrRenderTarget*, GrXferBarrierType) = 0;
540
bsalomon@google.com16e3dde2012-10-25 18:43:28 +0000541 // overridden by backend-specific derived class to create objects.
egdanielb0e1be22015-04-22 13:27:39 -0700542 // Texture size and sample size will have already been validated in base class before
Robert Phillips92de6312017-05-23 07:43:48 -0400543 // onCreateTexture is called.
Robert Phillips16d8ec62017-07-27 16:16:25 -0400544 virtual sk_sp<GrTexture> onCreateTexture(const GrSurfaceDesc&, SkBudgeted,
Robert Phillips590533f2017-07-11 14:22:35 -0400545 const GrMipLevel texels[],
546 int mipLevelCount) = 0;
cblume55f2d2d2016-02-26 13:20:48 -0800547
Robert Phillipsb0e93a22017-08-29 08:26:54 -0400548 virtual sk_sp<GrTexture> onWrapBackendTexture(const GrBackendTexture&, GrWrapOwnership) = 0;
Brian Salomond17f6582017-07-19 18:28:58 -0400549 virtual sk_sp<GrTexture> onWrapRenderableBackendTexture(const GrBackendTexture&,
Brian Salomond17f6582017-07-19 18:28:58 -0400550 int sampleCnt,
551 GrWrapOwnership) = 0;
Robert Phillipsb0e93a22017-08-29 08:26:54 -0400552 virtual sk_sp<GrRenderTarget> onWrapBackendRenderTarget(const GrBackendRenderTarget&) = 0;
Greg Daniel7ef28f32017-04-20 16:41:55 +0000553 virtual sk_sp<GrRenderTarget> onWrapBackendTextureAsRenderTarget(const GrBackendTexture&,
Robert Phillipsb0e93a22017-08-29 08:26:54 -0400554 int sampleCnt) = 0;
cdalton1bf3e712016-04-19 10:00:02 -0700555 virtual GrBuffer* onCreateBuffer(size_t size, GrBufferType intendedType, GrAccessPattern,
556 const void* data) = 0;
bsalomon@google.coma7f84e12011-03-10 14:13:19 +0000557
Brian Salomon2bbdcc42017-09-07 12:36:34 -0400558 virtual bool onIsACopyNeededForTextureParams(GrTextureProxy* proxy, const GrSamplerState&,
Robert Phillips81444fb2017-03-21 09:14:35 -0400559 GrTextureProducer::CopyParams*,
560 SkScalar scaleAdjust[2]) const {
561 return false;
562 }
bsalomone179a912016-01-20 06:18:10 -0800563
Robert Phillipsb0e93a22017-08-29 08:26:54 -0400564 virtual bool onGetReadPixelsInfo(GrSurface* srcSurface, GrSurfaceOrigin srcOrigin,
565 int readWidth, int readHeight,
bsalomonf0674512015-07-28 13:26:15 -0700566 size_t rowBytes, GrPixelConfig readConfig, DrawPreference*,
567 ReadPixelTempDrawInfo*) = 0;
Robert Phillipsb0e93a22017-08-29 08:26:54 -0400568 virtual bool onGetWritePixelsInfo(GrSurface* dstSurface, GrSurfaceOrigin dstOrigin,
569 int width, int height,
bsalomonf0674512015-07-28 13:26:15 -0700570 GrPixelConfig srcConfig, DrawPreference*,
571 WritePixelTempDrawInfo*) = 0;
572
bsalomon6cb3cbe2015-07-30 07:34:27 -0700573 // overridden by backend-specific derived class to perform the surface read
Robert Phillipsb0e93a22017-08-29 08:26:54 -0400574 virtual bool onReadPixels(GrSurface*, GrSurfaceOrigin,
egdaniel6d901da2015-07-30 12:02:15 -0700575 int left, int top,
576 int width, int height,
bsalomon@google.comc4364992011-11-07 15:54:49 +0000577 GrPixelConfig,
578 void* buffer,
senorblanco@chromium.org3cb406b2013-02-05 19:50:46 +0000579 size_t rowBytes) = 0;
bsalomon@google.coma7f84e12011-03-10 14:13:19 +0000580
bsalomon6cb3cbe2015-07-30 07:34:27 -0700581 // overridden by backend-specific derived class to perform the surface write
Robert Phillipsb0e93a22017-08-29 08:26:54 -0400582 virtual bool onWritePixels(GrSurface*, GrSurfaceOrigin,
bsalomon6cb3cbe2015-07-30 07:34:27 -0700583 int left, int top, int width, int height,
cblume55f2d2d2016-02-26 13:20:48 -0800584 GrPixelConfig config,
Robert Phillips590533f2017-07-11 14:22:35 -0400585 const GrMipLevel texels[], int mipLevelCount) = 0;
bsalomon@google.com6f379512011-11-16 20:36:03 +0000586
Jim Van Verth2e5eaf02017-06-21 15:55:46 -0400587 // overridden by backend-specific derived class to perform the texture transfer
588 virtual bool onTransferPixels(GrTexture*,
jvanverth17aa0472016-01-05 10:41:27 -0800589 int left, int top, int width, int height,
cdalton397536c2016-03-25 12:15:03 -0700590 GrPixelConfig config, GrBuffer* transferBuffer,
jvanverth17aa0472016-01-05 10:41:27 -0800591 size_t offset, size_t rowBytes) = 0;
592
bsalomon@google.com16e3dde2012-10-25 18:43:28 +0000593 // overridden by backend-specific derived class to perform the resolve
Robert Phillipsb0e93a22017-08-29 08:26:54 -0400594 virtual void onResolveRenderTarget(GrRenderTarget* target, GrSurfaceOrigin) = 0;
bsalomon@google.com75f9f252012-01-31 13:35:56 +0000595
joshualitt1cbdcde2015-08-21 11:53:29 -0700596 // overridden by backend specific derived class to perform the copy surface
Robert Phillipsb0e93a22017-08-29 08:26:54 -0400597 virtual bool onCopySurface(GrSurface* dst, GrSurfaceOrigin dstOrigin,
598 GrSurface* src, GrSurfaceOrigin srcOrigin,
599 const SkIRect& srcRect, const SkIPoint& dstPoint) = 0;
joshualitt1cbdcde2015-08-21 11:53:29 -0700600
cdalton28f45b92016-03-07 13:58:26 -0800601 // overridden by backend specific derived class to perform the multisample queries
Robert Phillipsb0e93a22017-08-29 08:26:54 -0400602 virtual void onQueryMultisampleSpecs(GrRenderTarget*, GrSurfaceOrigin rtOrigin,
603 const GrStencilSettings&,
csmartdaltonc25c5d72016-11-01 07:03:59 -0700604 int* effectiveSampleCnt, SamplePattern*) = 0;
cdalton28f45b92016-03-07 13:58:26 -0800605
Greg Daniel51316782017-08-02 15:10:09 +0000606 virtual void onFinishFlush(bool insertedSemaphores) = 0;
607
Brian Osman71a18892017-08-10 10:23:25 -0400608 virtual void onDumpJSON(SkJSONWriter*) const {}
609
bsalomon@google.comb635d392011-11-05 12:47:43 +0000610 void resetContext() {
bsalomon@google.com0a208a12013-06-28 18:57:35 +0000611 this->onResetContext(fResetBits);
612 fResetBits = 0;
bsalomon@google.comb635d392011-11-05 12:47:43 +0000613 ++fResetTimestamp;
614 }
615
csmartdalton0d28e572016-07-06 09:59:43 -0700616 struct SamplePatternComparator {
617 bool operator()(const SamplePattern&, const SamplePattern&) const;
618 };
619
620 typedef std::map<SamplePattern, uint8_t, SamplePatternComparator> MultisampleSpecsIdMap;
621
622 ResetTimestamp fResetTimestamp;
623 uint32_t fResetBits;
624 MultisampleSpecsIdMap fMultisampleSpecsIdMap;
625 SkSTArray<1, MultisampleSpecs, true> fMultisampleSpecs;
joshualitt3322fa42014-11-07 08:48:51 -0800626 // The context owns us, not vice-versa, so this ptr is not ref'ed by Gpu.
csmartdalton0d28e572016-07-06 09:59:43 -0700627 GrContext* fContext;
bsalomon@google.com02ddc8b2013-01-28 15:35:28 +0000628
kkinnunencabe20c2015-06-01 01:37:26 -0700629 friend class GrPathRendering;
joshualitt3322fa42014-11-07 08:48:51 -0800630 typedef SkRefCnt INHERITED;
reed@google.comac10a2d2010-12-22 21:39:39 +0000631};
632
633#endif