blob: 8f1124946382af36a70d57fc7852d9fc9b2fb5a8 [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
egdaniel066df7c2016-06-08 14:02:27 -070011#include "GrGpuCommandBuffer.h"
joshualitt79f8fae2014-10-28 17:59:26 -070012#include "GrProgramDesc.h"
bsalomon6c9cd552016-01-22 07:17:34 -080013#include "GrSwizzle.h"
cdalton28f45b92016-03-07 13:58:26 -080014#include "GrAllocator.h"
Brian Osmane8e54582016-11-28 10:06:27 -050015#include "GrTextureProducer.h"
cblume55f2d2d2016-02-26 13:20:48 -080016#include "GrTypes.h"
kkinnunencabe20c2015-06-01 01:37:26 -070017#include "GrXferProcessor.h"
Robert Phillipse3302df2017-04-24 07:31:02 -040018#include "instanced/InstancedRendering.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
Robert Phillipse3302df2017-04-24 07:31:02 -040045namespace gr_instanced {
46 class InstancedOp;
47 class InstancedRendering;
48 class OpAllocator;
49}
csmartdaltona7f29642016-07-07 08:49:11 -070050
joshualitt3322fa42014-11-07 08:48:51 -080051class GrGpu : public SkRefCnt {
reed@google.comac10a2d2010-12-22 21:39:39 +000052public:
53 /**
bsalomon@google.com16e3dde2012-10-25 18:43:28 +000054 * Create an instance of GrGpu that matches the specified backend. If the requested backend is
halcanary96fcdcc2015-08-27 07:41:13 -070055 * not supported (at compile-time or run-time) this returns nullptr. The context will not be
bsalomon@google.com6e4e6502013-02-25 20:12:45 +000056 * fully constructed and should not be used by GrGpu until after this function returns.
reed@google.comac10a2d2010-12-22 21:39:39 +000057 */
bsalomon682c2692015-05-22 14:01:46 -070058 static GrGpu* Create(GrBackend, GrBackendContext, const GrContextOptions&, GrContext* context);
reed@google.comac10a2d2010-12-22 21:39:39 +000059
60 ////////////////////////////////////////////////////////////////////////////
61
bsalomon@google.com6e4e6502013-02-25 20:12:45 +000062 GrGpu(GrContext* context);
mtklein36352bf2015-03-25 18:17:31 -070063 ~GrGpu() override;
reed@google.comac10a2d2010-12-22 21:39:39 +000064
joshualitt3322fa42014-11-07 08:48:51 -080065 GrContext* getContext() { return fContext; }
66 const GrContext* getContext() const { return fContext; }
67
68 /**
69 * Gets the capabilities of the draw target.
70 */
bsalomon4b91f762015-05-19 09:29:46 -070071 const GrCaps* caps() const { return fCaps.get(); }
joshualitt3322fa42014-11-07 08:48:51 -080072
kkinnunencabe20c2015-06-01 01:37:26 -070073 GrPathRendering* pathRendering() { return fPathRendering.get(); }
kkinnunenccdaa042014-08-20 01:36:23 -070074
bsalomon6e2aad42016-04-01 11:54:31 -070075 enum class DisconnectType {
76 // No cleanup should be attempted, immediately cease making backend API calls
77 kAbandon,
78 // Free allocated resources (not known by GrResourceCache) before returning and
79 // ensure no backend backend 3D API calls will be made after disconnect() returns.
80 kCleanup,
81 };
82
83 // Called by GrContext when the underlying backend context is already or will be destroyed
84 // before GrContext.
85 virtual void disconnect(DisconnectType);
bsalomonc8dc1f72014-08-21 13:02:13 -070086
reed@google.comac10a2d2010-12-22 21:39:39 +000087 /**
88 * The GrGpu object normally assumes that no outsider is setting state
89 * within the underlying 3D API's context/device/whatever. This call informs
bsalomon@google.coma7f84e12011-03-10 14:13:19 +000090 * the GrGpu that the state was modified and it shouldn't make assumptions
91 * about the state.
reed@google.comac10a2d2010-12-22 21:39:39 +000092 */
mtkleinb9eb4ac2015-02-02 18:26:03 -080093 void markContextDirty(uint32_t state = kAll_GrBackendState) { fResetBits |= state; }
reed@google.comac10a2d2010-12-22 21:39:39 +000094
95 /**
bsalomon6d467ec2014-11-18 07:36:19 -080096 * Creates a texture object. If kRenderTarget_GrSurfaceFlag the texture can
97 * be used as a render target by calling GrTexture::asRenderTarget(). Not all
98 * pixel configs can be used as render targets. Support for configs as textures
bsalomon4b91f762015-05-19 09:29:46 -070099 * or render targets can be checked using GrCaps.
bsalomon@google.com1da07462011-03-10 14:51:57 +0000100 *
reed@google.comac10a2d2010-12-22 21:39:39 +0000101 * @param desc describes the texture to be created.
bsalomon5236cf42015-01-14 10:42:08 -0800102 * @param budgeted does this texture count against the resource cache budget?
cblume55f2d2d2016-02-26 13:20:48 -0800103 * @param texels array of mipmap levels containing texel data to load.
104 * Each level begins with full-size palette data for paletted textures.
Robert Phillips92de6312017-05-23 07:43:48 -0400105 * It contains width*height texels. If there is only one
cblume55f2d2d2016-02-26 13:20:48 -0800106 * element and it contains nullptr fPixels, texture data is
107 * uninitialized.
Robert Phillips590533f2017-07-11 14:22:35 -0400108 * @param mipLevelCount the number of levels in 'texels'
halcanary96fcdcc2015-08-27 07:41:13 -0700109 * @return The texture object if successful, otherwise nullptr.
reed@google.comac10a2d2010-12-22 21:39:39 +0000110 */
Robert Phillips16d8ec62017-07-27 16:16:25 -0400111 sk_sp<GrTexture> createTexture(const GrSurfaceDesc&, SkBudgeted,
Robert Phillips590533f2017-07-11 14:22:35 -0400112 const GrMipLevel texels[], int mipLevelCount);
cblume55f2d2d2016-02-26 13:20:48 -0800113
114 /**
bsalomone699d0c2016-03-09 06:25:15 -0800115 * Simplified createTexture() interface for when there is no initial texel data to upload.
cblume55f2d2d2016-02-26 13:20:48 -0800116 */
Robert Phillips16d8ec62017-07-27 16:16:25 -0400117 sk_sp<GrTexture> createTexture(const GrSurfaceDesc& desc, SkBudgeted);
bsalomone699d0c2016-03-09 06:25:15 -0800118
bsalomon@google.come269f212011-11-07 13:29:52 +0000119 /**
Brian Osman32342f02017-03-04 08:12:46 -0500120 * Implements GrResourceProvider::wrapBackendTexture
bsalomon@google.come269f212011-11-07 13:29:52 +0000121 */
Robert Phillips7294b852017-08-01 13:51:44 +0000122 sk_sp<GrTexture> wrapBackendTexture(const GrBackendTexture&, GrSurfaceOrigin, GrWrapOwnership);
Brian Salomond17f6582017-07-19 18:28:58 -0400123
124 /**
125 * Implements GrResourceProvider::wrapRenderableBackendTexture
126 */
Robert Phillips7294b852017-08-01 13:51:44 +0000127 sk_sp<GrTexture> wrapRenderableBackendTexture(const GrBackendTexture&, GrSurfaceOrigin,
Brian Salomond17f6582017-07-19 18:28:58 -0400128 int sampleCnt, GrWrapOwnership);
bsalomon@google.come269f212011-11-07 13:29:52 +0000129
130 /**
Brian Osman32342f02017-03-04 08:12:46 -0500131 * Implements GrResourceProvider::wrapBackendRenderTarget
bsalomon@google.come269f212011-11-07 13:29:52 +0000132 */
Robert Phillips7294b852017-08-01 13:51:44 +0000133 sk_sp<GrRenderTarget> wrapBackendRenderTarget(const GrBackendRenderTarget&, GrSurfaceOrigin);
bsalomon@google.come269f212011-11-07 13:29:52 +0000134
135 /**
Brian Osman32342f02017-03-04 08:12:46 -0500136 * Implements GrResourceProvider::wrapBackendTextureAsRenderTarget
ericrkf7b8b8a2016-02-24 14:49:51 -0800137 */
Greg Daniel7ef28f32017-04-20 16:41:55 +0000138 sk_sp<GrRenderTarget> wrapBackendTextureAsRenderTarget(const GrBackendTexture&,
Robert Phillips7294b852017-08-01 13:51:44 +0000139 GrSurfaceOrigin,
Greg Daniel7ef28f32017-04-20 16:41:55 +0000140 int sampleCnt);
ericrkf7b8b8a2016-02-24 14:49:51 -0800141
142 /**
csmartdalton485a1202016-07-13 10:16:32 -0700143 * Creates a buffer in GPU memory. For a client-side buffer use GrBuffer::CreateCPUBacked.
reed@google.comac10a2d2010-12-22 21:39:39 +0000144 *
cdaltone2e71c22016-04-07 18:13:29 -0700145 * @param size size of buffer to create.
146 * @param intendedType hint to the graphics subsystem about what the buffer will be used for.
147 * @param accessPattern hint to the graphics subsystem about how the data will be accessed.
cdalton1bf3e712016-04-19 10:00:02 -0700148 * @param data optional data with which to initialize the buffer.
cdaltone2e71c22016-04-07 18:13:29 -0700149 *
cdalton397536c2016-03-25 12:15:03 -0700150 * @return the buffer if successful, otherwise nullptr.
reed@google.comac10a2d2010-12-22 21:39:39 +0000151 */
cdalton1bf3e712016-04-19 10:00:02 -0700152 GrBuffer* createBuffer(size_t size, GrBufferType intendedType, GrAccessPattern accessPattern,
153 const void* data = nullptr);
halcanary9d524f22016-03-29 09:03:52 -0700154
reed@google.comac10a2d2010-12-22 21:39:39 +0000155 /**
csmartdaltona7f29642016-07-07 08:49:11 -0700156 * Creates an instanced rendering object if it is supported on this platform.
157 */
Robert Phillipse3302df2017-04-24 07:31:02 -0400158 std::unique_ptr<gr_instanced::OpAllocator> createInstancedRenderingAllocator();
csmartdaltone0d36292016-07-29 08:14:20 -0700159 gr_instanced::InstancedRendering* createInstancedRendering();
csmartdaltona7f29642016-07-07 08:49:11 -0700160
161 /**
bsalomon@google.com75f9f252012-01-31 13:35:56 +0000162 * Resolves MSAA.
163 */
Robert Phillips7294b852017-08-01 13:51:44 +0000164 void resolveRenderTarget(GrRenderTarget* target);
bsalomon@google.com75f9f252012-01-31 13:35:56 +0000165
bsalomonf0674512015-07-28 13:26:15 -0700166 /** Info struct returned by getReadPixelsInfo about performing intermediate draws before
bsalomon39826022015-07-23 08:07:21 -0700167 reading pixels for performance or correctness. */
168 struct ReadPixelTempDrawInfo {
169 /** If the GrGpu is requesting that the caller do a draw to an intermediate surface then
170 this is descriptor for the temp surface. The draw should always be a rect with
171 dst 0,0,w,h. */
172 GrSurfaceDesc fTempSurfaceDesc;
173 /** Indicates whether there is a performance advantage to using an exact match texture
174 (in terms of width and height) for the intermediate texture instead of approximate. */
bsalomonb117ff12016-07-19 07:24:40 -0700175 SkBackingFit fTempSurfaceFit;
bsalomon6c9cd552016-01-22 07:17:34 -0800176 /** Swizzle to apply during the draw. This is used to compensate for either feature or
177 performance limitations in the underlying 3D API. */
178 GrSwizzle fSwizzle;
179 /** The config that should be used to read from the temp surface after the draw. This may be
180 different than the original read config in order to compensate for swizzling. The
181 read data will effectively be in the original read config. */
182 GrPixelConfig fReadConfig;
bsalomon39826022015-07-23 08:07:21 -0700183 };
bsalomon6c9cd552016-01-22 07:17:34 -0800184
bsalomon39826022015-07-23 08:07:21 -0700185 /** Describes why an intermediate draw must/should be performed before readPixels. */
186 enum DrawPreference {
187 /** On input means that the caller would proceed without draw if the GrGpu doesn't request
188 one.
189 On output means that the GrGpu is not requesting a draw. */
190 kNoDraw_DrawPreference,
191 /** Means that the client would prefer a draw for performance of the readback but
192 can satisfy a straight readPixels call on the inputs without an intermediate draw.
193 getReadPixelsInfo will never set the draw preference to this value but may leave
194 it set. */
195 kCallerPrefersDraw_DrawPreference,
196 /** On output means that GrGpu would prefer a draw for performance of the readback but
197 can satisfy a straight readPixels call on the inputs without an intermediate draw. The
198 caller of getReadPixelsInfo should never specify this on intput. */
199 kGpuPrefersDraw_DrawPreference,
200 /** On input means that the caller requires a draw to do a transformation and there is no
201 CPU fallback.
202 On output means that GrGpu can only satisfy the readPixels request if the intermediate
203 draw is performed.
204 */
205 kRequireDraw_DrawPreference
206 };
207
bsalomonf0674512015-07-28 13:26:15 -0700208 /**
209 * Used to negotiate whether and how an intermediate draw should or must be performed before
210 * a readPixels call. If this returns false then GrGpu could not deduce an intermediate draw
211 * that would allow a successful readPixels call. The passed width, height, and rowBytes,
212 * must be non-zero and already reflect clipping to the src bounds.
213 */
Robert Phillips7294b852017-08-01 13:51:44 +0000214 bool getReadPixelsInfo(GrSurface* srcSurface, int readWidth, int readHeight, size_t rowBytes,
bsalomonf0674512015-07-28 13:26:15 -0700215 GrPixelConfig readConfig, DrawPreference*, ReadPixelTempDrawInfo*);
216
cblume61214052016-01-26 09:10:48 -0800217 /** Info struct returned by getWritePixelsInfo about performing an intermediate draw in order
bsalomonf0674512015-07-28 13:26:15 -0700218 to write pixels to a GrSurface for either performance or correctness reasons. */
219 struct WritePixelTempDrawInfo {
220 /** If the GrGpu is requesting that the caller upload to an intermediate surface and draw
221 that to the dst then this is the descriptor for the intermediate surface. The caller
222 should upload the pixels such that the upper left pixel of the upload rect is at 0,0 in
223 the intermediate surface.*/
224 GrSurfaceDesc fTempSurfaceDesc;
bsalomon6c9cd552016-01-22 07:17:34 -0800225 /** Swizzle to apply during the draw. This is used to compensate for either feature or
226 performance limitations in the underlying 3D API. */
227 GrSwizzle fSwizzle;
228 /** The config that should be specified when uploading the *original* data to the temp
229 surface before the draw. This may be different than the original src data config in
230 order to compensate for swizzling that will occur when drawing. */
231 GrPixelConfig fWriteConfig;
bsalomonf0674512015-07-28 13:26:15 -0700232 };
bsalomon39826022015-07-23 08:07:21 -0700233
bsalomon@google.com75f9f252012-01-31 13:35:56 +0000234 /**
bsalomonf0674512015-07-28 13:26:15 -0700235 * Used to negotiate whether and how an intermediate surface should be used to write pixels to
236 * a GrSurface. If this returns false then GrGpu could not deduce an intermediate draw
237 * that would allow a successful transfer of the src pixels to the dst. The passed width,
238 * height, and rowBytes, must be non-zero and already reflect clipping to the dst bounds.
bsalomon@google.com0a97be22011-11-08 19:20:57 +0000239 */
Robert Phillips7294b852017-08-01 13:51:44 +0000240 bool getWritePixelsInfo(GrSurface* dstSurface, int width, int height,
bsalomonf0674512015-07-28 13:26:15 -0700241 GrPixelConfig srcConfig, DrawPreference*, WritePixelTempDrawInfo*);
bsalomon@google.coma85449d2011-11-19 02:36:05 +0000242
243 /**
bsalomon@google.coma04e8e82012-08-27 12:53:13 +0000244 * Reads a rectangle of pixels from a render target.
bsalomon@google.comc4364992011-11-07 15:54:49 +0000245 *
bsalomon6cb3cbe2015-07-30 07:34:27 -0700246 * @param surface The surface to read from
bsalomon@google.com669fdc42011-04-05 17:08:27 +0000247 * @param left left edge of the rectangle to read (inclusive)
248 * @param top top edge of the rectangle to read (inclusive)
249 * @param width width of rectangle to read in pixels.
250 * @param height height of rectangle to read in pixels.
251 * @param config the pixel config of the destination buffer
252 * @param buffer memory to read the rectangle into.
bsalomon@google.comc6980972011-11-02 19:57:21 +0000253 * @param rowBytes the number of bytes between consecutive rows. Zero
254 * means rows are tightly packed.
bsalomon@google.comc4364992011-11-07 15:54:49 +0000255 * @param invertY buffer should be populated bottom-to-top as opposed
256 * to top-to-bottom (skia's usual order)
bsalomon@google.coma7f84e12011-03-10 14:13:19 +0000257 *
258 * @return true if the read succeeded, false if not. The read can fail
259 * because of a unsupported pixel config or because no render
260 * target is currently set.
261 */
Robert Phillips7294b852017-08-01 13:51:44 +0000262 bool readPixels(GrSurface* surface,
bsalomon@google.com669fdc42011-04-05 17:08:27 +0000263 int left, int top, int width, int height,
senorblanco@chromium.org3cb406b2013-02-05 19:50:46 +0000264 GrPixelConfig config, void* buffer, size_t rowBytes);
reed@google.comac10a2d2010-12-22 21:39:39 +0000265
bsalomon@google.com6f379512011-11-16 20:36:03 +0000266 /**
bsalomon6cb3cbe2015-07-30 07:34:27 -0700267 * Updates the pixels in a rectangle of a surface.
bsalomon@google.coma85449d2011-11-19 02:36:05 +0000268 *
bsalomon6cb3cbe2015-07-30 07:34:27 -0700269 * @param surface The surface to write to.
bsalomon@google.com6f379512011-11-16 20:36:03 +0000270 * @param left left edge of the rectangle to write (inclusive)
271 * @param top top edge of the rectangle to write (inclusive)
272 * @param width width of rectangle to write in pixels.
273 * @param height height of rectangle to write in pixels.
274 * @param config the pixel config of the source buffer
cblume55f2d2d2016-02-26 13:20:48 -0800275 * @param texels array of mipmap levels containing texture data
Robert Phillips590533f2017-07-11 14:22:35 -0400276 * @param mipLevelCount number of levels in 'texels'
cblume55f2d2d2016-02-26 13:20:48 -0800277 */
Robert Phillips7294b852017-08-01 13:51:44 +0000278 bool writePixels(GrSurface* surface,
cblume55f2d2d2016-02-26 13:20:48 -0800279 int left, int top, int width, int height,
280 GrPixelConfig config,
Robert Phillips590533f2017-07-11 14:22:35 -0400281 const GrMipLevel texels[], int mipLevelCount);
cblume55f2d2d2016-02-26 13:20:48 -0800282
283 /**
284 * This function is a shim which creates a SkTArray<GrMipLevel> of size 1.
285 * It then calls writePixels with that SkTArray.
286 *
287 * @param buffer memory to read pixels from.
288 * @param rowBytes number of bytes between consecutive rows. Zero
289 * means rows are tightly packed.
bsalomon@google.com6f379512011-11-16 20:36:03 +0000290 */
Robert Phillips7294b852017-08-01 13:51:44 +0000291 bool writePixels(GrSurface* surface,
bsalomon6cb3cbe2015-07-30 07:34:27 -0700292 int left, int top, int width, int height,
293 GrPixelConfig config, const void* buffer,
294 size_t rowBytes);
bsalomon@google.com6f379512011-11-16 20:36:03 +0000295
joshualitt3322fa42014-11-07 08:48:51 -0800296 /**
Jim Van Verth2e5eaf02017-06-21 15:55:46 -0400297 * Updates the pixels in a rectangle of a texture using a buffer
jvanverth17aa0472016-01-05 10:41:27 -0800298 *
Jim Van Verth2e5eaf02017-06-21 15:55:46 -0400299 * There are a couple of assumptions here. First, we only update the top miplevel.
300 * And second, that any y flip needed has already been done in the buffer.
301 *
302 * @param texture The texture to write to.
cdalton397536c2016-03-25 12:15:03 -0700303 * @param left left edge of the rectangle to write (inclusive)
304 * @param top top edge of the rectangle to write (inclusive)
305 * @param width width of rectangle to write in pixels.
306 * @param height height of rectangle to write in pixels.
307 * @param config the pixel config of the source buffer
Jim Van Verth2e5eaf02017-06-21 15:55:46 -0400308 * @param transferBuffer GrBuffer to read pixels from (type must be "kXferCpuToGpu")
cdalton397536c2016-03-25 12:15:03 -0700309 * @param offset offset from the start of the buffer
Jim Van Verth2e5eaf02017-06-21 15:55:46 -0400310 * @param rowBytes number of bytes between consecutive rows in the buffer. Zero
cdalton397536c2016-03-25 12:15:03 -0700311 * means rows are tightly packed.
jvanverth17aa0472016-01-05 10:41:27 -0800312 */
Jim Van Verth2e5eaf02017-06-21 15:55:46 -0400313 bool transferPixels(GrTexture* texture,
jvanverth17aa0472016-01-05 10:41:27 -0800314 int left, int top, int width, int height,
cdalton397536c2016-03-25 12:15:03 -0700315 GrPixelConfig config, GrBuffer* transferBuffer,
Jim Van Verth2e5eaf02017-06-21 15:55:46 -0400316 size_t offset, size_t rowBytes);
jvanverth17aa0472016-01-05 10:41:27 -0800317
bsalomon@google.com80d09b92011-11-05 21:21:13 +0000318 // After the client interacts directly with the 3D context state the GrGpu
319 // must resync its internal state and assumptions about 3D context state.
320 // Each time this occurs the GrGpu bumps a timestamp.
321 // state of the 3D context
322 // At 10 resets / frame and 60fps a 64bit timestamp will overflow in about
323 // a billion years.
324 typedef uint64_t ResetTimestamp;
325
326 // This timestamp is always older than the current timestamp
327 static const ResetTimestamp kExpiredTimestamp = 0;
328 // Returns a timestamp based on the number of times the context was reset.
329 // This timestamp can be used to lazily detect when cached 3D context state
330 // is dirty.
bsalomon6d467ec2014-11-18 07:36:19 -0800331 ResetTimestamp getResetTimestamp() const { return fResetTimestamp; }
bsalomon@google.com80d09b92011-11-05 21:21:13 +0000332
bsalomonf90a02b2014-11-26 12:28:00 -0800333 // 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 -0400334 // take place at the GrOpList level and this function implement faster copy paths. The rect
bsalomonf90a02b2014-11-26 12:28:00 -0800335 // and point are pre-clipped. The src rect and implied dst rect are guaranteed to be within the
336 // src/dst bounds and non-empty.
Robert Phillips7294b852017-08-01 13:51:44 +0000337 bool copySurface(GrSurface* dst,
338 GrSurface* src,
joshualitt1cbdcde2015-08-21 11:53:29 -0700339 const SkIRect& srcRect,
340 const SkIPoint& dstPoint);
joshualitt3322fa42014-11-07 08:48:51 -0800341
cdalton28f45b92016-03-07 13:58:26 -0800342 struct MultisampleSpecs {
csmartdalton0d28e572016-07-06 09:59:43 -0700343 MultisampleSpecs(uint8_t uniqueID, int effectiveSampleCnt, const SkPoint* locations)
344 : fUniqueID(uniqueID),
345 fEffectiveSampleCnt(effectiveSampleCnt),
346 fSampleLocations(locations) {}
347
cdalton28f45b92016-03-07 13:58:26 -0800348 // Nonzero ID that uniquely identifies these multisample specs.
csmartdalton0d28e572016-07-06 09:59:43 -0700349 uint8_t fUniqueID;
cdalton28f45b92016-03-07 13:58:26 -0800350 // The actual number of samples the GPU will run. NOTE: this value can be greater than the
351 // the render target's sample count.
csmartdalton0d28e572016-07-06 09:59:43 -0700352 int fEffectiveSampleCnt;
353 // If sample locations are supported, points to the subpixel locations at which the GPU will
354 // sample. Pixel center is at (.5, .5), and (0, 0) indicates the top left corner.
355 const SkPoint* fSampleLocations;
cdalton28f45b92016-03-07 13:58:26 -0800356 };
357
csmartdaltonc633abb2016-11-01 08:55:55 -0700358 // Finds a render target's multisample specs. The pipeline is only needed in case we need to
359 // flush the draw state prior to querying multisample info. The pipeline is not expected to
csmartdaltonc25c5d72016-11-01 07:03:59 -0700360 // affect the multisample information itself.
csmartdaltonc633abb2016-11-01 08:55:55 -0700361 const MultisampleSpecs& queryMultisampleSpecs(const GrPipeline&);
csmartdaltonc25c5d72016-11-01 07:03:59 -0700362
363 // Finds the multisample specs with a given unique id.
364 const MultisampleSpecs& getMultisampleSpecs(uint8_t uniqueID) {
365 SkASSERT(uniqueID > 0 && uniqueID < fMultisampleSpecs.count());
366 return fMultisampleSpecs[uniqueID];
367 }
cdalton28f45b92016-03-07 13:58:26 -0800368
Greg Daniel500d58b2017-08-24 15:59:33 -0400369 // Creates a GrGpuRTCommandBuffer which GrOpLists send draw commands to instead of directly
370 // to the Gpu object.
371 virtual GrGpuRTCommandBuffer* createCommandBuffer(
Robert Phillips95214472017-08-08 18:00:03 -0400372 GrRenderTarget*, GrSurfaceOrigin,
Greg Daniel500d58b2017-08-24 15:59:33 -0400373 const GrGpuRTCommandBuffer::LoadAndStoreInfo&,
374 const GrGpuRTCommandBuffer::StencilLoadAndStoreInfo&) = 0;
375
376 // Creates a GrGpuTextureCommandBuffer which GrOpLists send texture commands to instead of
377 // directly to the Gpu object.
378 virtual GrGpuTextureCommandBuffer* createCommandBuffer(GrTexture*, GrSurfaceOrigin) = 0;
bsalomon3e791242014-12-17 13:43:13 -0800379
Robert Phillips18e94842017-05-15 13:06:44 -0400380 // Called by GrDrawingManager when flushing.
Greg Daniel51316782017-08-02 15:10:09 +0000381 // Provides a hook for post-flush actions (e.g. Vulkan command buffer submits). This will also
382 // insert any numSemaphore semaphores on the gpu and set the backendSemaphores to match the
383 // inserted semaphores.
384 GrSemaphoresSubmitted finishFlush(int numSemaphores, GrBackendSemaphore backendSemaphores[]);
ethannicholas22793252016-01-30 09:59:10 -0800385
Greg Daniel6be35232017-03-01 17:01:09 -0500386 virtual GrFence SK_WARN_UNUSED_RESULT insertFence() = 0;
387 virtual bool waitFence(GrFence, uint64_t timeout = 1000) = 0;
jvanverth84741b32016-09-30 08:39:02 -0700388 virtual void deleteFence(GrFence) const = 0;
389
Greg Daniela5cb7812017-06-16 09:45:32 -0400390 virtual sk_sp<GrSemaphore> SK_WARN_UNUSED_RESULT makeSemaphore(bool isOwned = true) = 0;
391 virtual sk_sp<GrSemaphore> wrapBackendSemaphore(const GrBackendSemaphore& semaphore,
392 GrWrapOwnership ownership) = 0;
Brian Osmandc87c952017-04-28 13:57:38 -0400393 virtual void insertSemaphore(sk_sp<GrSemaphore> semaphore, bool flush = false) = 0;
Greg Daniel6be35232017-03-01 17:01:09 -0500394 virtual void waitSemaphore(sk_sp<GrSemaphore> semaphore) = 0;
395
Brian Osman13dddce2017-05-09 13:19:50 -0400396 /**
397 * Put this texture in a safe and known state for use across multiple GrContexts. Depending on
398 * the backend, this may return a GrSemaphore. If so, other contexts should wait on that
399 * semaphore before using this texture.
400 */
401 virtual sk_sp<GrSemaphore> prepareTextureForCrossContextUsage(GrTexture*) = 0;
402
mtkleinb9eb4ac2015-02-02 18:26:03 -0800403 ///////////////////////////////////////////////////////////////////////////
404 // Debugging and Stats
405
406 class Stats {
407 public:
408#if GR_GPU_STATS
409 Stats() { this->reset(); }
410
bsalomonb12ea412015-02-02 21:19:50 -0800411 void reset() {
412 fRenderTargetBinds = 0;
413 fShaderCompilations = 0;
414 fTextureCreates = 0;
415 fTextureUploads = 0;
jvanverth17aa0472016-01-05 10:41:27 -0800416 fTransfersToTexture = 0;
egdaniel8dc7c3a2015-04-16 11:22:42 -0700417 fStencilAttachmentCreates = 0;
joshualitt87a5c9f2015-09-08 13:42:05 -0700418 fNumDraws = 0;
bsalomon1d417a82016-03-23 11:50:26 -0700419 fNumFailedDraws = 0;
bsalomonb12ea412015-02-02 21:19:50 -0800420 }
mtkleinb9eb4ac2015-02-02 18:26:03 -0800421
422 int renderTargetBinds() const { return fRenderTargetBinds; }
423 void incRenderTargetBinds() { fRenderTargetBinds++; }
424 int shaderCompilations() const { return fShaderCompilations; }
425 void incShaderCompilations() { fShaderCompilations++; }
bsalomonb12ea412015-02-02 21:19:50 -0800426 int textureCreates() const { return fTextureCreates; }
427 void incTextureCreates() { fTextureCreates++; }
428 int textureUploads() const { return fTextureUploads; }
429 void incTextureUploads() { fTextureUploads++; }
jvanverth17aa0472016-01-05 10:41:27 -0800430 int transfersToTexture() const { return fTransfersToTexture; }
431 void incTransfersToTexture() { fTransfersToTexture++; }
egdaniel8dc7c3a2015-04-16 11:22:42 -0700432 void incStencilAttachmentCreates() { fStencilAttachmentCreates++; }
joshualitt87a5c9f2015-09-08 13:42:05 -0700433 void incNumDraws() { fNumDraws++; }
bsalomon1d417a82016-03-23 11:50:26 -0700434 void incNumFailedDraws() { ++fNumFailedDraws; }
mtkleinb9eb4ac2015-02-02 18:26:03 -0800435 void dump(SkString*);
joshualitte45c81c2015-12-02 09:05:37 -0800436 void dumpKeyValuePairs(SkTArray<SkString>* keys, SkTArray<double>* values);
bsalomon1d417a82016-03-23 11:50:26 -0700437 int numDraws() const { return fNumDraws; }
438 int numFailedDraws() const { return fNumFailedDraws; }
mtkleinb9eb4ac2015-02-02 18:26:03 -0800439 private:
440 int fRenderTargetBinds;
441 int fShaderCompilations;
bsalomonb12ea412015-02-02 21:19:50 -0800442 int fTextureCreates;
443 int fTextureUploads;
jvanverth17aa0472016-01-05 10:41:27 -0800444 int fTransfersToTexture;
egdaniel8dc7c3a2015-04-16 11:22:42 -0700445 int fStencilAttachmentCreates;
joshualitt87a5c9f2015-09-08 13:42:05 -0700446 int fNumDraws;
bsalomon1d417a82016-03-23 11:50:26 -0700447 int fNumFailedDraws;
mtkleinb9eb4ac2015-02-02 18:26:03 -0800448#else
joshualitte45c81c2015-12-02 09:05:37 -0800449 void dump(SkString*) {}
450 void dumpKeyValuePairs(SkTArray<SkString>*, SkTArray<double>*) {}
mtkleinb9eb4ac2015-02-02 18:26:03 -0800451 void incRenderTargetBinds() {}
452 void incShaderCompilations() {}
bsalomonb12ea412015-02-02 21:19:50 -0800453 void incTextureCreates() {}
454 void incTextureUploads() {}
jvanverth17aa0472016-01-05 10:41:27 -0800455 void incTransfersToTexture() {}
egdaniel8dc7c3a2015-04-16 11:22:42 -0700456 void incStencilAttachmentCreates() {}
joshualitt87a5c9f2015-09-08 13:42:05 -0700457 void incNumDraws() {}
bsalomon1d417a82016-03-23 11:50:26 -0700458 void incNumFailedDraws() {}
mtkleinb9eb4ac2015-02-02 18:26:03 -0800459#endif
460 };
461
462 Stats* stats() { return &fStats; }
Brian Osman71a18892017-08-10 10:23:25 -0400463 void dumpJSON(SkJSONWriter*) const;
mtkleinb9eb4ac2015-02-02 18:26:03 -0800464
bsalomon67d76202015-11-11 12:40:42 -0800465 /** Creates a texture directly in the backend API without wrapping it in a GrTexture. This is
466 only to be used for testing (particularly for testing the methods that import an externally
467 created texture into Skia. Must be matched with a call to deleteTestingOnlyTexture(). */
jvanverth88957922015-07-14 11:02:52 -0700468 virtual GrBackendObject createTestingOnlyBackendTexture(void* pixels, int w, int h,
egdaniel0a3a7f72016-06-24 09:22:31 -0700469 GrPixelConfig config,
470 bool isRenderTarget = false) = 0;
bsalomon67d76202015-11-11 12:40:42 -0800471 /** Check a handle represents an actual texture in the backend API that has not been freed. */
472 virtual bool isTestingOnlyBackendTexture(GrBackendObject) const = 0;
473 /** If ownership of the backend texture has been transferred pass true for abandonTexture. This
474 will do any necessary cleanup of the handle without freeing the texture in the backend
475 API. */
476 virtual void deleteTestingOnlyBackendTexture(GrBackendObject,
bsalomone63ffef2016-02-05 07:17:34 -0800477 bool abandonTexture = false) = 0;
jvanverth672bb7f2015-07-13 07:19:57 -0700478
egdanielec00d942015-09-14 12:56:10 -0700479 // width and height may be larger than rt (if underlying API allows it).
480 // Returns nullptr if compatible sb could not be created, otherwise the caller owns the ref on
481 // the GrStencilAttachment.
482 virtual GrStencilAttachment* createStencilAttachmentForRenderTarget(const GrRenderTarget*,
483 int width,
484 int height) = 0;
485 // clears target's entire stencil buffer to 0
Robert Phillips95214472017-08-08 18:00:03 -0400486 virtual void clearStencil(GrRenderTarget* target, int clearValue) = 0;
bsalomon6bc1b5f2015-02-23 09:06:38 -0800487
bsalomone179a912016-01-20 06:18:10 -0800488 // Determines whether a texture will need to be rescaled in order to be used with the
Brian Salomon514baff2016-11-17 15:17:07 -0500489 // GrSamplerParams. This variation is called when the caller will create a new texture using the
Brian Osman32342f02017-03-04 08:12:46 -0500490 // resource provider from a non-texture src (cpu-backed image, ...).
Robert Phillips81444fb2017-03-21 09:14:35 -0400491 bool isACopyNeededForTextureParams(int width, int height, const GrSamplerParams&,
492 GrTextureProducer::CopyParams*,
493 SkScalar scaleAdjust[2]) const;
bsalomone179a912016-01-20 06:18:10 -0800494
495 // Like the above but this variation should be called when the caller is not creating the
496 // original texture but rather was handed the original texture. It adds additional checks
497 // relevant to original textures that were created external to Skia via
Brian Osman32342f02017-03-04 08:12:46 -0500498 // GrResourceProvider::wrap methods.
Robert Phillips3798c862017-03-27 11:08:16 -0400499 bool isACopyNeededForTextureParams(GrTextureProxy* proxy, const GrSamplerParams& params,
Robert Phillips81444fb2017-03-21 09:14:35 -0400500 GrTextureProducer::CopyParams* copyParams,
501 SkScalar scaleAdjust[2]) const {
Robert Phillips3798c862017-03-27 11:08:16 -0400502 if (this->isACopyNeededForTextureParams(proxy->width(), proxy->height(), params,
Robert Phillips81444fb2017-03-21 09:14:35 -0400503 copyParams, scaleAdjust)) {
bsalomone179a912016-01-20 06:18:10 -0800504 return true;
505 }
Robert Phillips3798c862017-03-27 11:08:16 -0400506 return this->onIsACopyNeededForTextureParams(proxy, params, copyParams, scaleAdjust);
bsalomone179a912016-01-20 06:18:10 -0800507 }
bsalomon045802d2015-10-20 07:58:01 -0700508
jvanverth672bb7f2015-07-13 07:19:57 -0700509 // This is only to be used in GL-specific tests.
halcanary96fcdcc2015-08-27 07:41:13 -0700510 virtual const GrGLContext* glContextForTesting() const { return nullptr; }
bsalomon993a4212015-05-29 11:37:25 -0700511
joshualitt8fd844f2015-12-02 13:36:47 -0800512 // This is only to be used by testing code
513 virtual void resetShaderCacheForTesting() const {}
514
egdaniel9cb63402016-06-23 08:37:05 -0700515 void handleDirtyContext() {
516 if (fResetBits) {
517 this->resetContext();
518 }
519 }
520
joshualittd53a8272014-11-10 16:03:14 -0800521protected:
bsalomonf0674512015-07-28 13:26:15 -0700522 static void ElevateDrawPreference(GrGpu::DrawPreference* preference,
523 GrGpu::DrawPreference elevation) {
524 GR_STATIC_ASSERT(GrGpu::kCallerPrefersDraw_DrawPreference > GrGpu::kNoDraw_DrawPreference);
525 GR_STATIC_ASSERT(GrGpu::kGpuPrefersDraw_DrawPreference >
526 GrGpu::kCallerPrefersDraw_DrawPreference);
527 GR_STATIC_ASSERT(GrGpu::kRequireDraw_DrawPreference >
528 GrGpu::kGpuPrefersDraw_DrawPreference);
529 *preference = SkTMax(*preference, elevation);
530 }
531
jvanverth900bd4a2016-04-29 13:53:12 -0700532 // Handles cases where a surface will be updated without a call to flushRenderTarget
533 void didWriteToSurface(GrSurface* surface, const SkIRect* bounds, uint32_t mipLevels = 1) const;
534
Ben Wagner145dbcd2016-11-03 14:40:50 -0400535 Stats fStats;
536 std::unique_ptr<GrPathRendering> fPathRendering;
joshualitt3322fa42014-11-07 08:48:51 -0800537 // Subclass must initialize this in its constructor.
Hal Canary144caf52016-11-07 17:57:18 -0500538 sk_sp<const GrCaps> fCaps;
joshualitt3322fa42014-11-07 08:48:51 -0800539
csmartdalton0d28e572016-07-06 09:59:43 -0700540 typedef SkTArray<SkPoint, true> SamplePattern;
541
bsalomon@google.com02ddc8b2013-01-28 15:35:28 +0000542private:
bsalomon@google.comb635d392011-11-05 12:47:43 +0000543 // called when the 3D context state is unknown. Subclass should emit any
bsalomon@google.comc8f7f472012-06-18 13:44:51 +0000544 // assumed 3D context state and dirty any state cache.
bsalomon@google.com0a208a12013-06-28 18:57:35 +0000545 virtual void onResetContext(uint32_t resetBits) = 0;
bsalomon@google.coma7f84e12011-03-10 14:13:19 +0000546
bsalomoncb02b382015-08-12 11:14:50 -0700547 // Called before certain draws in order to guarantee coherent results from dst reads.
548 virtual void xferBarrier(GrRenderTarget*, GrXferBarrierType) = 0;
549
bsalomon@google.com16e3dde2012-10-25 18:43:28 +0000550 // overridden by backend-specific derived class to create objects.
egdanielb0e1be22015-04-22 13:27:39 -0700551 // Texture size and sample size will have already been validated in base class before
Robert Phillips92de6312017-05-23 07:43:48 -0400552 // onCreateTexture is called.
Robert Phillips16d8ec62017-07-27 16:16:25 -0400553 virtual sk_sp<GrTexture> onCreateTexture(const GrSurfaceDesc&, SkBudgeted,
Robert Phillips590533f2017-07-11 14:22:35 -0400554 const GrMipLevel texels[],
555 int mipLevelCount) = 0;
cblume55f2d2d2016-02-26 13:20:48 -0800556
Robert Phillips7294b852017-08-01 13:51:44 +0000557 virtual sk_sp<GrTexture> onWrapBackendTexture(const GrBackendTexture&,
558 GrSurfaceOrigin,
559 GrWrapOwnership) = 0;
Brian Salomond17f6582017-07-19 18:28:58 -0400560 virtual sk_sp<GrTexture> onWrapRenderableBackendTexture(const GrBackendTexture&,
Robert Phillips7294b852017-08-01 13:51:44 +0000561 GrSurfaceOrigin,
Brian Salomond17f6582017-07-19 18:28:58 -0400562 int sampleCnt,
563 GrWrapOwnership) = 0;
Robert Phillips7294b852017-08-01 13:51:44 +0000564 virtual sk_sp<GrRenderTarget> onWrapBackendRenderTarget(const GrBackendRenderTarget&,
565 GrSurfaceOrigin) = 0;
Greg Daniel7ef28f32017-04-20 16:41:55 +0000566 virtual sk_sp<GrRenderTarget> onWrapBackendTextureAsRenderTarget(const GrBackendTexture&,
Robert Phillips7294b852017-08-01 13:51:44 +0000567 GrSurfaceOrigin,
568 int sampleCnt)=0;
cdalton1bf3e712016-04-19 10:00:02 -0700569 virtual GrBuffer* onCreateBuffer(size_t size, GrBufferType intendedType, GrAccessPattern,
570 const void* data) = 0;
bsalomon@google.coma7f84e12011-03-10 14:13:19 +0000571
csmartdaltone0d36292016-07-29 08:14:20 -0700572 virtual gr_instanced::InstancedRendering* onCreateInstancedRendering() = 0;
Robert Phillipse3302df2017-04-24 07:31:02 -0400573 virtual std::unique_ptr<gr_instanced::OpAllocator> onCreateInstancedRenderingAllocator() {
574 return nullptr;
575 }
csmartdaltone0d36292016-07-29 08:14:20 -0700576
Robert Phillips3798c862017-03-27 11:08:16 -0400577 virtual bool onIsACopyNeededForTextureParams(GrTextureProxy* proxy, const GrSamplerParams&,
Robert Phillips81444fb2017-03-21 09:14:35 -0400578 GrTextureProducer::CopyParams*,
579 SkScalar scaleAdjust[2]) const {
580 return false;
581 }
bsalomone179a912016-01-20 06:18:10 -0800582
Robert Phillips7294b852017-08-01 13:51:44 +0000583 virtual bool onGetReadPixelsInfo(GrSurface* srcSurface, int readWidth, int readHeight,
bsalomonf0674512015-07-28 13:26:15 -0700584 size_t rowBytes, GrPixelConfig readConfig, DrawPreference*,
585 ReadPixelTempDrawInfo*) = 0;
Robert Phillips7294b852017-08-01 13:51:44 +0000586 virtual bool onGetWritePixelsInfo(GrSurface* dstSurface, int width, int height,
bsalomonf0674512015-07-28 13:26:15 -0700587 GrPixelConfig srcConfig, DrawPreference*,
588 WritePixelTempDrawInfo*) = 0;
589
bsalomon6cb3cbe2015-07-30 07:34:27 -0700590 // overridden by backend-specific derived class to perform the surface read
Robert Phillips7294b852017-08-01 13:51:44 +0000591 virtual bool onReadPixels(GrSurface*,
egdaniel6d901da2015-07-30 12:02:15 -0700592 int left, int top,
593 int width, int height,
bsalomon@google.comc4364992011-11-07 15:54:49 +0000594 GrPixelConfig,
595 void* buffer,
senorblanco@chromium.org3cb406b2013-02-05 19:50:46 +0000596 size_t rowBytes) = 0;
bsalomon@google.coma7f84e12011-03-10 14:13:19 +0000597
bsalomon6cb3cbe2015-07-30 07:34:27 -0700598 // overridden by backend-specific derived class to perform the surface write
Robert Phillips7294b852017-08-01 13:51:44 +0000599 virtual bool onWritePixels(GrSurface*,
bsalomon6cb3cbe2015-07-30 07:34:27 -0700600 int left, int top, int width, int height,
cblume55f2d2d2016-02-26 13:20:48 -0800601 GrPixelConfig config,
Robert Phillips590533f2017-07-11 14:22:35 -0400602 const GrMipLevel texels[], int mipLevelCount) = 0;
bsalomon@google.com6f379512011-11-16 20:36:03 +0000603
Jim Van Verth2e5eaf02017-06-21 15:55:46 -0400604 // overridden by backend-specific derived class to perform the texture transfer
605 virtual bool onTransferPixels(GrTexture*,
jvanverth17aa0472016-01-05 10:41:27 -0800606 int left, int top, int width, int height,
cdalton397536c2016-03-25 12:15:03 -0700607 GrPixelConfig config, GrBuffer* transferBuffer,
jvanverth17aa0472016-01-05 10:41:27 -0800608 size_t offset, size_t rowBytes) = 0;
609
bsalomon@google.com16e3dde2012-10-25 18:43:28 +0000610 // overridden by backend-specific derived class to perform the resolve
Robert Phillips7294b852017-08-01 13:51:44 +0000611 virtual void onResolveRenderTarget(GrRenderTarget* target) = 0;
bsalomon@google.com75f9f252012-01-31 13:35:56 +0000612
joshualitt1cbdcde2015-08-21 11:53:29 -0700613 // overridden by backend specific derived class to perform the copy surface
Robert Phillips7294b852017-08-01 13:51:44 +0000614 virtual bool onCopySurface(GrSurface* dst,
615 GrSurface* src,
616 const SkIRect& srcRect,
617 const SkIPoint& dstPoint) = 0;
joshualitt1cbdcde2015-08-21 11:53:29 -0700618
cdalton28f45b92016-03-07 13:58:26 -0800619 // overridden by backend specific derived class to perform the multisample queries
Robert Phillips7294b852017-08-01 13:51:44 +0000620 virtual void onQueryMultisampleSpecs(GrRenderTarget*, const GrStencilSettings&,
csmartdaltonc25c5d72016-11-01 07:03:59 -0700621 int* effectiveSampleCnt, SamplePattern*) = 0;
cdalton28f45b92016-03-07 13:58:26 -0800622
Greg Daniel51316782017-08-02 15:10:09 +0000623 virtual void onFinishFlush(bool insertedSemaphores) = 0;
624
Brian Osman71a18892017-08-10 10:23:25 -0400625 virtual void onDumpJSON(SkJSONWriter*) const {}
626
bsalomon@google.comb635d392011-11-05 12:47:43 +0000627 void resetContext() {
bsalomon@google.com0a208a12013-06-28 18:57:35 +0000628 this->onResetContext(fResetBits);
629 fResetBits = 0;
bsalomon@google.comb635d392011-11-05 12:47:43 +0000630 ++fResetTimestamp;
631 }
632
csmartdalton0d28e572016-07-06 09:59:43 -0700633 struct SamplePatternComparator {
634 bool operator()(const SamplePattern&, const SamplePattern&) const;
635 };
636
637 typedef std::map<SamplePattern, uint8_t, SamplePatternComparator> MultisampleSpecsIdMap;
638
639 ResetTimestamp fResetTimestamp;
640 uint32_t fResetBits;
641 MultisampleSpecsIdMap fMultisampleSpecsIdMap;
642 SkSTArray<1, MultisampleSpecs, true> fMultisampleSpecs;
joshualitt3322fa42014-11-07 08:48:51 -0800643 // The context owns us, not vice-versa, so this ptr is not ref'ed by Gpu.
csmartdalton0d28e572016-07-06 09:59:43 -0700644 GrContext* fContext;
bsalomon@google.com02ddc8b2013-01-28 15:35:28 +0000645
kkinnunencabe20c2015-06-01 01:37:26 -0700646 friend class GrPathRendering;
Robert Phillipse3302df2017-04-24 07:31:02 -0400647 friend class gr_instanced::InstancedOp; // for xferBarrier
joshualitt3322fa42014-11-07 08:48:51 -0800648 typedef SkRefCnt INHERITED;
reed@google.comac10a2d2010-12-22 21:39:39 +0000649};
650
651#endif