blob: f8528a1550ac60ed45599af95b4a3869fedad43b [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"
kkinnunencabe20c2015-06-01 01:37:26 -070012#include "GrPipelineBuilder.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"
bsalomon045802d2015-10-20 07:58:01 -070016#include "GrTextureParamsAdjuster.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"
sugoi@google.com12b4e272012-12-06 20:13:11 +000021
kkinnunencabe20c2015-06-01 01:37:26 -070022class GrBatchTracker;
cdalton397536c2016-03-25 12:15:03 -070023class GrBuffer;
bsalomon@google.com669fdc42011-04-05 17:08:27 +000024class GrContext;
reedf9ad5582015-06-25 21:29:25 -070025class GrGLContext;
egdaniel0e1853c2016-03-17 11:35:45 -070026class GrMesh;
bsalomone64eb572015-05-07 11:35:55 -070027class GrNonInstancedVertices;
bsalomon@google.com64aef2b2012-06-11 15:36:13 +000028class GrPath;
cdaltonb85a0aa2014-07-21 15:32:44 -070029class GrPathRange;
bsalomon@google.com30085192011-08-19 15:42:31 +000030class GrPathRenderer;
31class GrPathRendererChain;
kkinnunencabe20c2015-06-01 01:37:26 -070032class GrPathRendering;
egdaniel8dd688b2015-01-22 10:16:09 -080033class GrPipeline;
joshualitt873ad0e2015-01-20 09:08:51 -080034class GrPrimitiveProcessor;
kkinnunencabe20c2015-06-01 01:37:26 -070035class GrRenderTarget;
egdaniel8dc7c3a2015-04-16 11:22:42 -070036class GrStencilAttachment;
cdalton93a379b2016-05-11 13:58:08 -070037class GrStencilSettings;
kkinnunencabe20c2015-06-01 01:37:26 -070038class GrSurface;
39class GrTexture;
reed@google.comac10a2d2010-12-22 21:39:39 +000040
joshualitt3322fa42014-11-07 08:48:51 -080041class GrGpu : public SkRefCnt {
reed@google.comac10a2d2010-12-22 21:39:39 +000042public:
43 /**
bsalomon@google.com16e3dde2012-10-25 18:43:28 +000044 * Create an instance of GrGpu that matches the specified backend. If the requested backend is
halcanary96fcdcc2015-08-27 07:41:13 -070045 * not supported (at compile-time or run-time) this returns nullptr. The context will not be
bsalomon@google.com6e4e6502013-02-25 20:12:45 +000046 * fully constructed and should not be used by GrGpu until after this function returns.
reed@google.comac10a2d2010-12-22 21:39:39 +000047 */
bsalomon682c2692015-05-22 14:01:46 -070048 static GrGpu* Create(GrBackend, GrBackendContext, const GrContextOptions&, GrContext* context);
reed@google.comac10a2d2010-12-22 21:39:39 +000049
50 ////////////////////////////////////////////////////////////////////////////
51
bsalomon@google.com6e4e6502013-02-25 20:12:45 +000052 GrGpu(GrContext* context);
mtklein36352bf2015-03-25 18:17:31 -070053 ~GrGpu() override;
reed@google.comac10a2d2010-12-22 21:39:39 +000054
joshualitt3322fa42014-11-07 08:48:51 -080055 GrContext* getContext() { return fContext; }
56 const GrContext* getContext() const { return fContext; }
57
58 /**
59 * Gets the capabilities of the draw target.
60 */
bsalomon4b91f762015-05-19 09:29:46 -070061 const GrCaps* caps() const { return fCaps.get(); }
joshualitt3322fa42014-11-07 08:48:51 -080062
kkinnunencabe20c2015-06-01 01:37:26 -070063 GrPathRendering* pathRendering() { return fPathRendering.get(); }
kkinnunenccdaa042014-08-20 01:36:23 -070064
bsalomon6e2aad42016-04-01 11:54:31 -070065 enum class DisconnectType {
66 // No cleanup should be attempted, immediately cease making backend API calls
67 kAbandon,
68 // Free allocated resources (not known by GrResourceCache) before returning and
69 // ensure no backend backend 3D API calls will be made after disconnect() returns.
70 kCleanup,
71 };
72
73 // Called by GrContext when the underlying backend context is already or will be destroyed
74 // before GrContext.
75 virtual void disconnect(DisconnectType);
bsalomonc8dc1f72014-08-21 13:02:13 -070076
reed@google.comac10a2d2010-12-22 21:39:39 +000077 /**
78 * The GrGpu object normally assumes that no outsider is setting state
79 * within the underlying 3D API's context/device/whatever. This call informs
bsalomon@google.coma7f84e12011-03-10 14:13:19 +000080 * the GrGpu that the state was modified and it shouldn't make assumptions
81 * about the state.
reed@google.comac10a2d2010-12-22 21:39:39 +000082 */
mtkleinb9eb4ac2015-02-02 18:26:03 -080083 void markContextDirty(uint32_t state = kAll_GrBackendState) { fResetBits |= state; }
reed@google.comac10a2d2010-12-22 21:39:39 +000084
85 /**
bsalomon6d467ec2014-11-18 07:36:19 -080086 * Creates a texture object. If kRenderTarget_GrSurfaceFlag the texture can
87 * be used as a render target by calling GrTexture::asRenderTarget(). Not all
88 * pixel configs can be used as render targets. Support for configs as textures
bsalomon4b91f762015-05-19 09:29:46 -070089 * or render targets can be checked using GrCaps.
bsalomon@google.com1da07462011-03-10 14:51:57 +000090 *
reed@google.comac10a2d2010-12-22 21:39:39 +000091 * @param desc describes the texture to be created.
bsalomon5236cf42015-01-14 10:42:08 -080092 * @param budgeted does this texture count against the resource cache budget?
cblume55f2d2d2016-02-26 13:20:48 -080093 * @param texels array of mipmap levels containing texel data to load.
94 * Each level begins with full-size palette data for paletted textures.
95 * For compressed formats the level contains the compressed pixel data.
96 * Otherwise, it contains width*height texels. If there is only one
97 * element and it contains nullptr fPixels, texture data is
98 * uninitialized.
halcanary96fcdcc2015-08-27 07:41:13 -070099 * @return The texture object if successful, otherwise nullptr.
reed@google.comac10a2d2010-12-22 21:39:39 +0000100 */
bsalomon5ec26ae2016-02-25 08:33:02 -0800101 GrTexture* createTexture(const GrSurfaceDesc& desc, SkBudgeted budgeted,
cblume55f2d2d2016-02-26 13:20:48 -0800102 const SkTArray<GrMipLevel>& texels);
103
104 /**
bsalomone699d0c2016-03-09 06:25:15 -0800105 * Simplified createTexture() interface for when there is no initial texel data to upload.
cblume55f2d2d2016-02-26 13:20:48 -0800106 */
bsalomone699d0c2016-03-09 06:25:15 -0800107 GrTexture* createTexture(const GrSurfaceDesc& desc, SkBudgeted budgeted) {
108 return this->createTexture(desc, budgeted, SkTArray<GrMipLevel>());
109 }
110
111 /** Simplified createTexture() interface for when there is only a base level */
112 GrTexture* createTexture(const GrSurfaceDesc& desc, SkBudgeted budgeted, const void* level0Data,
113 size_t rowBytes) {
114 SkASSERT(level0Data);
115 GrMipLevel level = { level0Data, rowBytes };
116 SkSTArray<1, GrMipLevel> array;
117 array.push_back() = level;
118 return this->createTexture(desc, budgeted, array);
119 }
bsalomond3312592016-03-04 07:06:43 -0800120
bsalomon@google.come269f212011-11-07 13:29:52 +0000121 /**
ericrkf7b8b8a2016-02-24 14:49:51 -0800122 * Implements GrTextureProvider::wrapBackendTexture
bsalomon@google.come269f212011-11-07 13:29:52 +0000123 */
bsalomon6dc6f5f2015-06-18 09:12:16 -0700124 GrTexture* wrapBackendTexture(const GrBackendTextureDesc&, GrWrapOwnership);
bsalomon@google.come269f212011-11-07 13:29:52 +0000125
126 /**
brianosman436d9852016-02-25 13:40:42 -0800127 * Implements GrTextureProvider::wrapBackendRenderTarget
bsalomon@google.come269f212011-11-07 13:29:52 +0000128 */
bsalomon6dc6f5f2015-06-18 09:12:16 -0700129 GrRenderTarget* wrapBackendRenderTarget(const GrBackendRenderTargetDesc&, GrWrapOwnership);
bsalomon@google.come269f212011-11-07 13:29:52 +0000130
131 /**
ericrkf7b8b8a2016-02-24 14:49:51 -0800132 * Implements GrTextureProvider::wrapBackendTextureAsRenderTarget
133 */
kkinnunen49c4c222016-04-01 04:50:37 -0700134 GrRenderTarget* wrapBackendTextureAsRenderTarget(const GrBackendTextureDesc&);
ericrkf7b8b8a2016-02-24 14:49:51 -0800135
136 /**
cdalton397536c2016-03-25 12:15:03 -0700137 * Creates a buffer.
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 */
152 void resolveRenderTarget(GrRenderTarget* target);
153
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. */
163 bool fUseExactScratch;
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 */
202 bool getReadPixelsInfo(GrSurface* srcSurface, int readWidth, int readHeight, size_t rowBytes,
203 GrPixelConfig readConfig, DrawPreference*, ReadPixelTempDrawInfo*);
204
cblume61214052016-01-26 09:10:48 -0800205 /** Info struct returned by getWritePixelsInfo about performing an intermediate draw in order
bsalomonf0674512015-07-28 13:26:15 -0700206 to write pixels to a GrSurface for either performance or correctness reasons. */
207 struct WritePixelTempDrawInfo {
208 /** If the GrGpu is requesting that the caller upload to an intermediate surface and draw
209 that to the dst then this is the descriptor for the intermediate surface. The caller
210 should upload the pixels such that the upper left pixel of the upload rect is at 0,0 in
211 the intermediate surface.*/
212 GrSurfaceDesc fTempSurfaceDesc;
bsalomon6c9cd552016-01-22 07:17:34 -0800213 /** Swizzle to apply during the draw. This is used to compensate for either feature or
214 performance limitations in the underlying 3D API. */
215 GrSwizzle fSwizzle;
216 /** The config that should be specified when uploading the *original* data to the temp
217 surface before the draw. This may be different than the original src data config in
218 order to compensate for swizzling that will occur when drawing. */
219 GrPixelConfig fWriteConfig;
bsalomonf0674512015-07-28 13:26:15 -0700220 };
bsalomon39826022015-07-23 08:07:21 -0700221
bsalomon@google.com75f9f252012-01-31 13:35:56 +0000222 /**
bsalomonf0674512015-07-28 13:26:15 -0700223 * Used to negotiate whether and how an intermediate surface should be used to write pixels to
224 * a GrSurface. If this returns false then GrGpu could not deduce an intermediate draw
225 * that would allow a successful transfer of the src pixels to the dst. The passed width,
226 * height, and rowBytes, must be non-zero and already reflect clipping to the dst bounds.
bsalomon@google.com0a97be22011-11-08 19:20:57 +0000227 */
cblumeed828002016-02-16 13:00:01 -0800228 bool getWritePixelsInfo(GrSurface* dstSurface, int width, int height,
bsalomonf0674512015-07-28 13:26:15 -0700229 GrPixelConfig srcConfig, DrawPreference*, WritePixelTempDrawInfo*);
bsalomon@google.coma85449d2011-11-19 02:36:05 +0000230
231 /**
bsalomon@google.coma04e8e82012-08-27 12:53:13 +0000232 * Reads a rectangle of pixels from a render target.
bsalomon@google.comc4364992011-11-07 15:54:49 +0000233 *
bsalomon6cb3cbe2015-07-30 07:34:27 -0700234 * @param surface The surface to read from
bsalomon@google.com669fdc42011-04-05 17:08:27 +0000235 * @param left left edge of the rectangle to read (inclusive)
236 * @param top top edge of the rectangle to read (inclusive)
237 * @param width width of rectangle to read in pixels.
238 * @param height height of rectangle to read in pixels.
239 * @param config the pixel config of the destination buffer
240 * @param buffer memory to read the rectangle into.
bsalomon@google.comc6980972011-11-02 19:57:21 +0000241 * @param rowBytes the number of bytes between consecutive rows. Zero
242 * means rows are tightly packed.
bsalomon@google.comc4364992011-11-07 15:54:49 +0000243 * @param invertY buffer should be populated bottom-to-top as opposed
244 * to top-to-bottom (skia's usual order)
bsalomon@google.coma7f84e12011-03-10 14:13:19 +0000245 *
246 * @return true if the read succeeded, false if not. The read can fail
247 * because of a unsupported pixel config or because no render
248 * target is currently set.
249 */
bsalomon6cb3cbe2015-07-30 07:34:27 -0700250 bool readPixels(GrSurface* surface,
bsalomon@google.com669fdc42011-04-05 17:08:27 +0000251 int left, int top, int width, int height,
senorblanco@chromium.org3cb406b2013-02-05 19:50:46 +0000252 GrPixelConfig config, void* buffer, size_t rowBytes);
reed@google.comac10a2d2010-12-22 21:39:39 +0000253
bsalomon@google.com6f379512011-11-16 20:36:03 +0000254 /**
bsalomon6cb3cbe2015-07-30 07:34:27 -0700255 * Updates the pixels in a rectangle of a surface.
bsalomon@google.coma85449d2011-11-19 02:36:05 +0000256 *
bsalomon6cb3cbe2015-07-30 07:34:27 -0700257 * @param surface The surface to write to.
bsalomon@google.com6f379512011-11-16 20:36:03 +0000258 * @param left left edge of the rectangle to write (inclusive)
259 * @param top top edge of the rectangle to write (inclusive)
260 * @param width width of rectangle to write in pixels.
261 * @param height height of rectangle to write in pixels.
262 * @param config the pixel config of the source buffer
cblume55f2d2d2016-02-26 13:20:48 -0800263 * @param texels array of mipmap levels containing texture data
264 */
265 bool writePixels(GrSurface* surface,
266 int left, int top, int width, int height,
267 GrPixelConfig config,
268 const SkTArray<GrMipLevel>& texels);
269
270 /**
271 * This function is a shim which creates a SkTArray<GrMipLevel> of size 1.
272 * It then calls writePixels with that SkTArray.
273 *
274 * @param buffer memory to read pixels from.
275 * @param rowBytes number of bytes between consecutive rows. Zero
276 * means rows are tightly packed.
bsalomon@google.com6f379512011-11-16 20:36:03 +0000277 */
bsalomon6cb3cbe2015-07-30 07:34:27 -0700278 bool writePixels(GrSurface* surface,
279 int left, int top, int width, int height,
280 GrPixelConfig config, const void* buffer,
281 size_t rowBytes);
bsalomon@google.com6f379512011-11-16 20:36:03 +0000282
joshualitt3322fa42014-11-07 08:48:51 -0800283 /**
jvanverthc3d706f2016-04-20 10:33:27 -0700284 * Updates the pixels in a rectangle of a surface using a buffer
jvanverth17aa0472016-01-05 10:41:27 -0800285 *
jvanverthc3d706f2016-04-20 10:33:27 -0700286 * @param surface The surface to write to.
cdalton397536c2016-03-25 12:15:03 -0700287 * @param left left edge of the rectangle to write (inclusive)
288 * @param top top edge of the rectangle to write (inclusive)
289 * @param width width of rectangle to write in pixels.
290 * @param height height of rectangle to write in pixels.
291 * @param config the pixel config of the source buffer
292 * @param transferBuffer GrBuffer to read pixels from (type must be "kCpuToGpu")
293 * @param offset offset from the start of the buffer
294 * @param rowBytes number of bytes between consecutive rows. Zero
295 * means rows are tightly packed.
jvanverth17aa0472016-01-05 10:41:27 -0800296 */
jvanverthc3d706f2016-04-20 10:33:27 -0700297 bool transferPixels(GrSurface* surface,
jvanverth17aa0472016-01-05 10:41:27 -0800298 int left, int top, int width, int height,
cdalton397536c2016-03-25 12:15:03 -0700299 GrPixelConfig config, GrBuffer* transferBuffer,
jvanverth17aa0472016-01-05 10:41:27 -0800300 size_t offset, size_t rowBytes);
301
302 /**
joshualitt3322fa42014-11-07 08:48:51 -0800303 * This is can be called before allocating a texture to be a dst for copySurface. It will
bsalomonf90a02b2014-11-26 12:28:00 -0800304 * populate the origin, config, and flags fields of the desc such that copySurface can
305 * efficiently succeed. It should only succeed if it can allow copySurface to perform a copy
306 * that would be more effecient than drawing the src to a dst render target.
joshualitt3322fa42014-11-07 08:48:51 -0800307 */
joshualitt1c735482015-07-13 08:08:25 -0700308 virtual bool initCopySurfaceDstDesc(const GrSurface* src, GrSurfaceDesc* desc) const = 0;
joshualitt6db519c2014-10-29 08:48:18 -0700309
bsalomon@google.com80d09b92011-11-05 21:21:13 +0000310 // After the client interacts directly with the 3D context state the GrGpu
311 // must resync its internal state and assumptions about 3D context state.
312 // Each time this occurs the GrGpu bumps a timestamp.
313 // state of the 3D context
314 // At 10 resets / frame and 60fps a 64bit timestamp will overflow in about
315 // a billion years.
316 typedef uint64_t ResetTimestamp;
317
318 // This timestamp is always older than the current timestamp
319 static const ResetTimestamp kExpiredTimestamp = 0;
320 // Returns a timestamp based on the number of times the context was reset.
321 // This timestamp can be used to lazily detect when cached 3D context state
322 // is dirty.
bsalomon6d467ec2014-11-18 07:36:19 -0800323 ResetTimestamp getResetTimestamp() const { return fResetTimestamp; }
bsalomon@google.com80d09b92011-11-05 21:21:13 +0000324
bsalomonf90a02b2014-11-26 12:28:00 -0800325 // Called to perform a surface to surface copy. Fallbacks to issuing a draw from the src to dst
326 // take place at the GrDrawTarget level and this function implement faster copy paths. The rect
327 // and point are pre-clipped. The src rect and implied dst rect are guaranteed to be within the
328 // src/dst bounds and non-empty.
joshualitt1cbdcde2015-08-21 11:53:29 -0700329 bool copySurface(GrSurface* dst,
330 GrSurface* src,
331 const SkIRect& srcRect,
332 const SkIPoint& dstPoint);
joshualitt3322fa42014-11-07 08:48:51 -0800333
cdalton28f45b92016-03-07 13:58:26 -0800334 struct MultisampleSpecs {
335 // Nonzero ID that uniquely identifies these multisample specs.
336 uint8_t fUniqueID;
337 // The actual number of samples the GPU will run. NOTE: this value can be greater than the
338 // the render target's sample count.
339 int fEffectiveSampleCnt;
340 // If sample locations are supported, contains the subpixel locations at which the GPU will
341 // sample. Pixel center is at (.5, .5) and (0, 0) indicates the top left corner.
342 SkAutoTDeleteArray<const SkPoint> fSampleLocations;
343 };
344
345 // Finds a render target's multisample specs. The stencil settings are only needed to flush the
346 // draw state prior to querying multisample information; they should not have any effect on the
347 // multisample information itself.
348 const MultisampleSpecs& getMultisampleSpecs(GrRenderTarget*, const GrStencilSettings&);
349
egdaniel066df7c2016-06-08 14:02:27 -0700350 // Creates a GrGpuCommandBuffer in which the GrDrawTarget can send draw commands to instead of
351 // directly to the Gpu object.
egdaniel9cb63402016-06-23 08:37:05 -0700352 virtual GrGpuCommandBuffer* createCommandBuffer(
353 GrRenderTarget* target,
354 const GrGpuCommandBuffer::LoadAndStoreInfo& colorInfo,
355 const GrGpuCommandBuffer::LoadAndStoreInfo& stencilInfo) = 0;
bsalomon3e791242014-12-17 13:43:13 -0800356
halcanary9d524f22016-03-29 09:03:52 -0700357 // Called by drawtarget when flushing.
jvanverthd2d2eb92016-02-17 14:04:46 -0800358 // Provides a hook for post-flush actions (e.g. PLS reset and Vulkan command buffer submits).
359 virtual void finishDrawTarget() {}
ethannicholas22793252016-01-30 09:59:10 -0800360
mtkleinb9eb4ac2015-02-02 18:26:03 -0800361 ///////////////////////////////////////////////////////////////////////////
362 // Debugging and Stats
363
364 class Stats {
365 public:
366#if GR_GPU_STATS
367 Stats() { this->reset(); }
368
bsalomonb12ea412015-02-02 21:19:50 -0800369 void reset() {
370 fRenderTargetBinds = 0;
371 fShaderCompilations = 0;
372 fTextureCreates = 0;
373 fTextureUploads = 0;
jvanverth17aa0472016-01-05 10:41:27 -0800374 fTransfersToTexture = 0;
egdaniel8dc7c3a2015-04-16 11:22:42 -0700375 fStencilAttachmentCreates = 0;
joshualitt87a5c9f2015-09-08 13:42:05 -0700376 fNumDraws = 0;
bsalomon1d417a82016-03-23 11:50:26 -0700377 fNumFailedDraws = 0;
bsalomonb12ea412015-02-02 21:19:50 -0800378 }
mtkleinb9eb4ac2015-02-02 18:26:03 -0800379
380 int renderTargetBinds() const { return fRenderTargetBinds; }
381 void incRenderTargetBinds() { fRenderTargetBinds++; }
382 int shaderCompilations() const { return fShaderCompilations; }
383 void incShaderCompilations() { fShaderCompilations++; }
bsalomonb12ea412015-02-02 21:19:50 -0800384 int textureCreates() const { return fTextureCreates; }
385 void incTextureCreates() { fTextureCreates++; }
386 int textureUploads() const { return fTextureUploads; }
387 void incTextureUploads() { fTextureUploads++; }
jvanverth17aa0472016-01-05 10:41:27 -0800388 int transfersToTexture() const { return fTransfersToTexture; }
389 void incTransfersToTexture() { fTransfersToTexture++; }
egdaniel8dc7c3a2015-04-16 11:22:42 -0700390 void incStencilAttachmentCreates() { fStencilAttachmentCreates++; }
joshualitt87a5c9f2015-09-08 13:42:05 -0700391 void incNumDraws() { fNumDraws++; }
bsalomon1d417a82016-03-23 11:50:26 -0700392 void incNumFailedDraws() { ++fNumFailedDraws; }
mtkleinb9eb4ac2015-02-02 18:26:03 -0800393 void dump(SkString*);
joshualitte45c81c2015-12-02 09:05:37 -0800394 void dumpKeyValuePairs(SkTArray<SkString>* keys, SkTArray<double>* values);
bsalomon1d417a82016-03-23 11:50:26 -0700395 int numDraws() const { return fNumDraws; }
396 int numFailedDraws() const { return fNumFailedDraws; }
mtkleinb9eb4ac2015-02-02 18:26:03 -0800397 private:
398 int fRenderTargetBinds;
399 int fShaderCompilations;
bsalomonb12ea412015-02-02 21:19:50 -0800400 int fTextureCreates;
401 int fTextureUploads;
jvanverth17aa0472016-01-05 10:41:27 -0800402 int fTransfersToTexture;
egdaniel8dc7c3a2015-04-16 11:22:42 -0700403 int fStencilAttachmentCreates;
joshualitt87a5c9f2015-09-08 13:42:05 -0700404 int fNumDraws;
bsalomon1d417a82016-03-23 11:50:26 -0700405 int fNumFailedDraws;
mtkleinb9eb4ac2015-02-02 18:26:03 -0800406#else
joshualitte45c81c2015-12-02 09:05:37 -0800407 void dump(SkString*) {}
408 void dumpKeyValuePairs(SkTArray<SkString>*, SkTArray<double>*) {}
mtkleinb9eb4ac2015-02-02 18:26:03 -0800409 void incRenderTargetBinds() {}
410 void incShaderCompilations() {}
bsalomonb12ea412015-02-02 21:19:50 -0800411 void incTextureCreates() {}
412 void incTextureUploads() {}
jvanverth17aa0472016-01-05 10:41:27 -0800413 void incTransfersToTexture() {}
egdaniel8dc7c3a2015-04-16 11:22:42 -0700414 void incStencilAttachmentCreates() {}
joshualitt87a5c9f2015-09-08 13:42:05 -0700415 void incNumDraws() {}
bsalomon1d417a82016-03-23 11:50:26 -0700416 void incNumFailedDraws() {}
mtkleinb9eb4ac2015-02-02 18:26:03 -0800417#endif
418 };
419
420 Stats* stats() { return &fStats; }
421
bsalomon67d76202015-11-11 12:40:42 -0800422 /** Creates a texture directly in the backend API without wrapping it in a GrTexture. This is
423 only to be used for testing (particularly for testing the methods that import an externally
424 created texture into Skia. Must be matched with a call to deleteTestingOnlyTexture(). */
jvanverth88957922015-07-14 11:02:52 -0700425 virtual GrBackendObject createTestingOnlyBackendTexture(void* pixels, int w, int h,
bsalomone63ffef2016-02-05 07:17:34 -0800426 GrPixelConfig config) = 0;
bsalomon67d76202015-11-11 12:40:42 -0800427 /** Check a handle represents an actual texture in the backend API that has not been freed. */
428 virtual bool isTestingOnlyBackendTexture(GrBackendObject) const = 0;
429 /** If ownership of the backend texture has been transferred pass true for abandonTexture. This
430 will do any necessary cleanup of the handle without freeing the texture in the backend
431 API. */
432 virtual void deleteTestingOnlyBackendTexture(GrBackendObject,
bsalomone63ffef2016-02-05 07:17:34 -0800433 bool abandonTexture = false) = 0;
jvanverth672bb7f2015-07-13 07:19:57 -0700434
egdanielec00d942015-09-14 12:56:10 -0700435 // width and height may be larger than rt (if underlying API allows it).
436 // Returns nullptr if compatible sb could not be created, otherwise the caller owns the ref on
437 // the GrStencilAttachment.
438 virtual GrStencilAttachment* createStencilAttachmentForRenderTarget(const GrRenderTarget*,
439 int width,
440 int height) = 0;
441 // clears target's entire stencil buffer to 0
442 virtual void clearStencil(GrRenderTarget* target) = 0;
bsalomon6bc1b5f2015-02-23 09:06:38 -0800443
bsalomon6dea83f2015-12-03 12:58:06 -0800444 // draws an outline rectangle for debugging/visualization purposes.
445 virtual void drawDebugWireRect(GrRenderTarget*, const SkIRect&, GrColor) = 0;
bsalomon045802d2015-10-20 07:58:01 -0700446
bsalomone179a912016-01-20 06:18:10 -0800447 // Determines whether a texture will need to be rescaled in order to be used with the
448 // GrTextureParams. This variation is called when the caller will create a new texture using the
449 // texture provider from a non-texture src (cpu-backed image, ...).
bsalomon045802d2015-10-20 07:58:01 -0700450 bool makeCopyForTextureParams(int width, int height, const GrTextureParams&,
bsalomone179a912016-01-20 06:18:10 -0800451 GrTextureProducer::CopyParams*) const;
452
453 // Like the above but this variation should be called when the caller is not creating the
454 // original texture but rather was handed the original texture. It adds additional checks
455 // relevant to original textures that were created external to Skia via
456 // GrTextureProvider::wrap methods.
457 bool makeCopyForTextureParams(GrTexture* texture, const GrTextureParams& params,
458 GrTextureProducer::CopyParams* copyParams) const {
459 if (this->makeCopyForTextureParams(texture->width(), texture->height(), params,
460 copyParams)) {
461 return true;
462 }
463 return this->onMakeCopyForTextureParams(texture, params, copyParams);
464 }
bsalomon045802d2015-10-20 07:58:01 -0700465
jvanverth672bb7f2015-07-13 07:19:57 -0700466 // This is only to be used in GL-specific tests.
halcanary96fcdcc2015-08-27 07:41:13 -0700467 virtual const GrGLContext* glContextForTesting() const { return nullptr; }
bsalomon993a4212015-05-29 11:37:25 -0700468
joshualitt8fd844f2015-12-02 13:36:47 -0800469 // This is only to be used by testing code
470 virtual void resetShaderCacheForTesting() const {}
471
egdaniel9cb63402016-06-23 08:37:05 -0700472 void handleDirtyContext() {
473 if (fResetBits) {
474 this->resetContext();
475 }
476 }
477
joshualittd53a8272014-11-10 16:03:14 -0800478protected:
bsalomonf0674512015-07-28 13:26:15 -0700479 static void ElevateDrawPreference(GrGpu::DrawPreference* preference,
480 GrGpu::DrawPreference elevation) {
481 GR_STATIC_ASSERT(GrGpu::kCallerPrefersDraw_DrawPreference > GrGpu::kNoDraw_DrawPreference);
482 GR_STATIC_ASSERT(GrGpu::kGpuPrefersDraw_DrawPreference >
483 GrGpu::kCallerPrefersDraw_DrawPreference);
484 GR_STATIC_ASSERT(GrGpu::kRequireDraw_DrawPreference >
485 GrGpu::kGpuPrefersDraw_DrawPreference);
486 *preference = SkTMax(*preference, elevation);
487 }
488
jvanverth900bd4a2016-04-29 13:53:12 -0700489 // Handles cases where a surface will be updated without a call to flushRenderTarget
490 void didWriteToSurface(GrSurface* surface, const SkIRect* bounds, uint32_t mipLevels = 1) const;
491
mtkleinb9eb4ac2015-02-02 18:26:03 -0800492 Stats fStats;
493 SkAutoTDelete<GrPathRendering> fPathRendering;
joshualitt3322fa42014-11-07 08:48:51 -0800494 // Subclass must initialize this in its constructor.
bsalomon4b91f762015-05-19 09:29:46 -0700495 SkAutoTUnref<const GrCaps> fCaps;
joshualitt3322fa42014-11-07 08:48:51 -0800496
bsalomon@google.com02ddc8b2013-01-28 15:35:28 +0000497private:
bsalomon@google.comb635d392011-11-05 12:47:43 +0000498 // called when the 3D context state is unknown. Subclass should emit any
bsalomon@google.comc8f7f472012-06-18 13:44:51 +0000499 // assumed 3D context state and dirty any state cache.
bsalomon@google.com0a208a12013-06-28 18:57:35 +0000500 virtual void onResetContext(uint32_t resetBits) = 0;
bsalomon@google.coma7f84e12011-03-10 14:13:19 +0000501
bsalomoncb02b382015-08-12 11:14:50 -0700502 // Called before certain draws in order to guarantee coherent results from dst reads.
503 virtual void xferBarrier(GrRenderTarget*, GrXferBarrierType) = 0;
504
bsalomon@google.com16e3dde2012-10-25 18:43:28 +0000505 // overridden by backend-specific derived class to create objects.
egdanielb0e1be22015-04-22 13:27:39 -0700506 // Texture size and sample size will have already been validated in base class before
507 // onCreateTexture/CompressedTexture are called.
508 virtual GrTexture* onCreateTexture(const GrSurfaceDesc& desc,
kkinnunen2e6055b2016-04-22 01:48:29 -0700509 SkBudgeted budgeted,
cblume55f2d2d2016-02-26 13:20:48 -0800510 const SkTArray<GrMipLevel>& texels) = 0;
egdanielb0e1be22015-04-22 13:27:39 -0700511 virtual GrTexture* onCreateCompressedTexture(const GrSurfaceDesc& desc,
kkinnunen2e6055b2016-04-22 01:48:29 -0700512 SkBudgeted budgeted,
cblume55f2d2d2016-02-26 13:20:48 -0800513 const SkTArray<GrMipLevel>& texels) = 0;
514
bsalomon6dc6f5f2015-06-18 09:12:16 -0700515 virtual GrTexture* onWrapBackendTexture(const GrBackendTextureDesc&, GrWrapOwnership) = 0;
516 virtual GrRenderTarget* onWrapBackendRenderTarget(const GrBackendRenderTargetDesc&,
517 GrWrapOwnership) = 0;
kkinnunen49c4c222016-04-01 04:50:37 -0700518 virtual GrRenderTarget* onWrapBackendTextureAsRenderTarget(const GrBackendTextureDesc&) = 0;
cdalton1bf3e712016-04-19 10:00:02 -0700519 virtual GrBuffer* onCreateBuffer(size_t size, GrBufferType intendedType, GrAccessPattern,
520 const void* data) = 0;
bsalomon@google.coma7f84e12011-03-10 14:13:19 +0000521
bsalomone179a912016-01-20 06:18:10 -0800522 virtual bool onMakeCopyForTextureParams(GrTexture* texture, const GrTextureParams&,
523 GrTextureProducer::CopyParams*) const { return false; }
524
bsalomonf0674512015-07-28 13:26:15 -0700525 virtual bool onGetReadPixelsInfo(GrSurface* srcSurface, int readWidth, int readHeight,
526 size_t rowBytes, GrPixelConfig readConfig, DrawPreference*,
527 ReadPixelTempDrawInfo*) = 0;
cblumeed828002016-02-16 13:00:01 -0800528 virtual bool onGetWritePixelsInfo(GrSurface* dstSurface, int width, int height,
bsalomonf0674512015-07-28 13:26:15 -0700529 GrPixelConfig srcConfig, DrawPreference*,
530 WritePixelTempDrawInfo*) = 0;
531
bsalomon6cb3cbe2015-07-30 07:34:27 -0700532 // overridden by backend-specific derived class to perform the surface read
533 virtual bool onReadPixels(GrSurface*,
egdaniel6d901da2015-07-30 12:02:15 -0700534 int left, int top,
535 int width, int height,
bsalomon@google.comc4364992011-11-07 15:54:49 +0000536 GrPixelConfig,
537 void* buffer,
senorblanco@chromium.org3cb406b2013-02-05 19:50:46 +0000538 size_t rowBytes) = 0;
bsalomon@google.coma7f84e12011-03-10 14:13:19 +0000539
bsalomon6cb3cbe2015-07-30 07:34:27 -0700540 // overridden by backend-specific derived class to perform the surface write
541 virtual bool onWritePixels(GrSurface*,
542 int left, int top, int width, int height,
cblume55f2d2d2016-02-26 13:20:48 -0800543 GrPixelConfig config,
544 const SkTArray<GrMipLevel>& texels) = 0;
bsalomon@google.com6f379512011-11-16 20:36:03 +0000545
jvanverthc3d706f2016-04-20 10:33:27 -0700546 // overridden by backend-specific derived class to perform the surface write
547 virtual bool onTransferPixels(GrSurface*,
jvanverth17aa0472016-01-05 10:41:27 -0800548 int left, int top, int width, int height,
cdalton397536c2016-03-25 12:15:03 -0700549 GrPixelConfig config, GrBuffer* transferBuffer,
jvanverth17aa0472016-01-05 10:41:27 -0800550 size_t offset, size_t rowBytes) = 0;
551
bsalomon@google.com16e3dde2012-10-25 18:43:28 +0000552 // overridden by backend-specific derived class to perform the resolve
bsalomon@google.com75f9f252012-01-31 13:35:56 +0000553 virtual void onResolveRenderTarget(GrRenderTarget* target) = 0;
554
joshualitt1cbdcde2015-08-21 11:53:29 -0700555 // overridden by backend specific derived class to perform the copy surface
556 virtual bool onCopySurface(GrSurface* dst,
557 GrSurface* src,
558 const SkIRect& srcRect,
559 const SkIPoint& dstPoint) = 0;
560
cdalton28f45b92016-03-07 13:58:26 -0800561 // overridden by backend specific derived class to perform the multisample queries
562 virtual void onGetMultisampleSpecs(GrRenderTarget*,
563 const GrStencilSettings&,
564 int* effectiveSampleCnt,
565 SkAutoTDeleteArray<SkPoint>* sampleLocations) = 0;
566
bsalomon@google.comb635d392011-11-05 12:47:43 +0000567 void resetContext() {
bsalomon@google.com0a208a12013-06-28 18:57:35 +0000568 this->onResetContext(fResetBits);
569 fResetBits = 0;
bsalomon@google.comb635d392011-11-05 12:47:43 +0000570 ++fResetTimestamp;
571 }
572
bsalomon@google.com02ddc8b2013-01-28 15:35:28 +0000573 ResetTimestamp fResetTimestamp;
bsalomon@google.com0a208a12013-06-28 18:57:35 +0000574 uint32_t fResetBits;
cdalton28f45b92016-03-07 13:58:26 -0800575 SkTArray<const MultisampleSpecs*, true> fMultisampleSpecsMap;
576 GrTAllocator<MultisampleSpecs> fMultisampleSpecsAllocator;
joshualitt3322fa42014-11-07 08:48:51 -0800577 // The context owns us, not vice-versa, so this ptr is not ref'ed by Gpu.
578 GrContext* fContext;
bsalomon@google.com02ddc8b2013-01-28 15:35:28 +0000579
kkinnunencabe20c2015-06-01 01:37:26 -0700580 friend class GrPathRendering;
joshualitt3322fa42014-11-07 08:48:51 -0800581 typedef SkRefCnt INHERITED;
reed@google.comac10a2d2010-12-22 21:39:39 +0000582};
583
584#endif