blob: c6684ac4faf7fe8580e28dd21c45fe8dc340f3dd [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;
reed@google.comac10a2d2010-12-22 21:39:39 +000043
Robert Phillipse3302df2017-04-24 07:31:02 -040044namespace gr_instanced {
45 class InstancedOp;
46 class InstancedRendering;
47 class OpAllocator;
48}
csmartdaltona7f29642016-07-07 08:49:11 -070049
joshualitt3322fa42014-11-07 08:48:51 -080050class GrGpu : public SkRefCnt {
reed@google.comac10a2d2010-12-22 21:39:39 +000051public:
52 /**
bsalomon@google.com16e3dde2012-10-25 18:43:28 +000053 * Create an instance of GrGpu that matches the specified backend. If the requested backend is
halcanary96fcdcc2015-08-27 07:41:13 -070054 * not supported (at compile-time or run-time) this returns nullptr. The context will not be
bsalomon@google.com6e4e6502013-02-25 20:12:45 +000055 * fully constructed and should not be used by GrGpu until after this function returns.
reed@google.comac10a2d2010-12-22 21:39:39 +000056 */
bsalomon682c2692015-05-22 14:01:46 -070057 static GrGpu* Create(GrBackend, GrBackendContext, const GrContextOptions&, GrContext* context);
reed@google.comac10a2d2010-12-22 21:39:39 +000058
59 ////////////////////////////////////////////////////////////////////////////
60
bsalomon@google.com6e4e6502013-02-25 20:12:45 +000061 GrGpu(GrContext* context);
mtklein36352bf2015-03-25 18:17:31 -070062 ~GrGpu() override;
reed@google.comac10a2d2010-12-22 21:39:39 +000063
joshualitt3322fa42014-11-07 08:48:51 -080064 GrContext* getContext() { return fContext; }
65 const GrContext* getContext() const { return fContext; }
66
67 /**
68 * Gets the capabilities of the draw target.
69 */
bsalomon4b91f762015-05-19 09:29:46 -070070 const GrCaps* caps() const { return fCaps.get(); }
joshualitt3322fa42014-11-07 08:48:51 -080071
kkinnunencabe20c2015-06-01 01:37:26 -070072 GrPathRendering* pathRendering() { return fPathRendering.get(); }
kkinnunenccdaa042014-08-20 01:36:23 -070073
bsalomon6e2aad42016-04-01 11:54:31 -070074 enum class DisconnectType {
75 // No cleanup should be attempted, immediately cease making backend API calls
76 kAbandon,
77 // Free allocated resources (not known by GrResourceCache) before returning and
78 // ensure no backend backend 3D API calls will be made after disconnect() returns.
79 kCleanup,
80 };
81
82 // Called by GrContext when the underlying backend context is already or will be destroyed
83 // before GrContext.
84 virtual void disconnect(DisconnectType);
bsalomonc8dc1f72014-08-21 13:02:13 -070085
reed@google.comac10a2d2010-12-22 21:39:39 +000086 /**
87 * The GrGpu object normally assumes that no outsider is setting state
88 * within the underlying 3D API's context/device/whatever. This call informs
bsalomon@google.coma7f84e12011-03-10 14:13:19 +000089 * the GrGpu that the state was modified and it shouldn't make assumptions
90 * about the state.
reed@google.comac10a2d2010-12-22 21:39:39 +000091 */
mtkleinb9eb4ac2015-02-02 18:26:03 -080092 void markContextDirty(uint32_t state = kAll_GrBackendState) { fResetBits |= state; }
reed@google.comac10a2d2010-12-22 21:39:39 +000093
94 /**
bsalomon6d467ec2014-11-18 07:36:19 -080095 * Creates a texture object. If kRenderTarget_GrSurfaceFlag the texture can
96 * be used as a render target by calling GrTexture::asRenderTarget(). Not all
97 * pixel configs can be used as render targets. Support for configs as textures
bsalomon4b91f762015-05-19 09:29:46 -070098 * or render targets can be checked using GrCaps.
bsalomon@google.com1da07462011-03-10 14:51:57 +000099 *
reed@google.comac10a2d2010-12-22 21:39:39 +0000100 * @param desc describes the texture to be created.
bsalomon5236cf42015-01-14 10:42:08 -0800101 * @param budgeted does this texture count against the resource cache budget?
cblume55f2d2d2016-02-26 13:20:48 -0800102 * @param texels array of mipmap levels containing texel data to load.
103 * Each level begins with full-size palette data for paletted textures.
Robert Phillips92de6312017-05-23 07:43:48 -0400104 * It contains width*height texels. If there is only one
cblume55f2d2d2016-02-26 13:20:48 -0800105 * element and it contains nullptr fPixels, texture data is
106 * uninitialized.
Robert Phillips590533f2017-07-11 14:22:35 -0400107 * @param mipLevelCount the number of levels in 'texels'
halcanary96fcdcc2015-08-27 07:41:13 -0700108 * @return The texture object if successful, otherwise nullptr.
reed@google.comac10a2d2010-12-22 21:39:39 +0000109 */
Robert Phillips67d52cf2017-06-05 13:38:13 -0400110 sk_sp<GrTexture> createTexture(const GrSurfaceDesc& desc, SkBudgeted budgeted,
Robert Phillips590533f2017-07-11 14:22:35 -0400111 const GrMipLevel texels[], int mipLevelCount);
cblume55f2d2d2016-02-26 13:20:48 -0800112
113 /**
bsalomone699d0c2016-03-09 06:25:15 -0800114 * Simplified createTexture() interface for when there is no initial texel data to upload.
cblume55f2d2d2016-02-26 13:20:48 -0800115 */
Robert Phillips646e4292017-06-13 12:44:56 -0400116 sk_sp<GrTexture> createTexture(const GrSurfaceDesc& desc, SkBudgeted budgeted);
bsalomone699d0c2016-03-09 06:25:15 -0800117
bsalomon@google.come269f212011-11-07 13:29:52 +0000118 /**
Brian Osman32342f02017-03-04 08:12:46 -0500119 * Implements GrResourceProvider::wrapBackendTexture
bsalomon@google.come269f212011-11-07 13:29:52 +0000120 */
Brian Salomond17f6582017-07-19 18:28:58 -0400121 sk_sp<GrTexture> wrapBackendTexture(const GrBackendTexture&, GrSurfaceOrigin, GrWrapOwnership);
122
123 /**
124 * Implements GrResourceProvider::wrapRenderableBackendTexture
125 */
126 sk_sp<GrTexture> wrapRenderableBackendTexture(const GrBackendTexture&, GrSurfaceOrigin,
127 int sampleCnt, GrWrapOwnership);
bsalomon@google.come269f212011-11-07 13:29:52 +0000128
129 /**
Brian Osman32342f02017-03-04 08:12:46 -0500130 * Implements GrResourceProvider::wrapBackendRenderTarget
bsalomon@google.come269f212011-11-07 13:29:52 +0000131 */
Greg Danielbcf612b2017-05-01 13:50:58 +0000132 sk_sp<GrRenderTarget> wrapBackendRenderTarget(const GrBackendRenderTarget&, GrSurfaceOrigin);
bsalomon@google.come269f212011-11-07 13:29:52 +0000133
134 /**
Brian Osman32342f02017-03-04 08:12:46 -0500135 * Implements GrResourceProvider::wrapBackendTextureAsRenderTarget
ericrkf7b8b8a2016-02-24 14:49:51 -0800136 */
Greg Daniel7ef28f32017-04-20 16:41:55 +0000137 sk_sp<GrRenderTarget> wrapBackendTextureAsRenderTarget(const GrBackendTexture&,
138 GrSurfaceOrigin,
139 int sampleCnt);
ericrkf7b8b8a2016-02-24 14:49:51 -0800140
141 /**
csmartdalton485a1202016-07-13 10:16:32 -0700142 * Creates a buffer in GPU memory. For a client-side buffer use GrBuffer::CreateCPUBacked.
reed@google.comac10a2d2010-12-22 21:39:39 +0000143 *
cdaltone2e71c22016-04-07 18:13:29 -0700144 * @param size size of buffer to create.
145 * @param intendedType hint to the graphics subsystem about what the buffer will be used for.
146 * @param accessPattern hint to the graphics subsystem about how the data will be accessed.
cdalton1bf3e712016-04-19 10:00:02 -0700147 * @param data optional data with which to initialize the buffer.
cdaltone2e71c22016-04-07 18:13:29 -0700148 *
cdalton397536c2016-03-25 12:15:03 -0700149 * @return the buffer if successful, otherwise nullptr.
reed@google.comac10a2d2010-12-22 21:39:39 +0000150 */
cdalton1bf3e712016-04-19 10:00:02 -0700151 GrBuffer* createBuffer(size_t size, GrBufferType intendedType, GrAccessPattern accessPattern,
152 const void* data = nullptr);
halcanary9d524f22016-03-29 09:03:52 -0700153
reed@google.comac10a2d2010-12-22 21:39:39 +0000154 /**
csmartdaltona7f29642016-07-07 08:49:11 -0700155 * Creates an instanced rendering object if it is supported on this platform.
156 */
Robert Phillipse3302df2017-04-24 07:31:02 -0400157 std::unique_ptr<gr_instanced::OpAllocator> createInstancedRenderingAllocator();
csmartdaltone0d36292016-07-29 08:14:20 -0700158 gr_instanced::InstancedRendering* createInstancedRendering();
csmartdaltona7f29642016-07-07 08:49:11 -0700159
160 /**
bsalomon@google.com75f9f252012-01-31 13:35:56 +0000161 * Resolves MSAA.
162 */
163 void resolveRenderTarget(GrRenderTarget* target);
164
bsalomonf0674512015-07-28 13:26:15 -0700165 /** Info struct returned by getReadPixelsInfo about performing intermediate draws before
bsalomon39826022015-07-23 08:07:21 -0700166 reading pixels for performance or correctness. */
167 struct ReadPixelTempDrawInfo {
168 /** If the GrGpu is requesting that the caller do a draw to an intermediate surface then
169 this is descriptor for the temp surface. The draw should always be a rect with
170 dst 0,0,w,h. */
171 GrSurfaceDesc fTempSurfaceDesc;
172 /** Indicates whether there is a performance advantage to using an exact match texture
173 (in terms of width and height) for the intermediate texture instead of approximate. */
bsalomonb117ff12016-07-19 07:24:40 -0700174 SkBackingFit fTempSurfaceFit;
bsalomon6c9cd552016-01-22 07:17:34 -0800175 /** Swizzle to apply during the draw. This is used to compensate for either feature or
176 performance limitations in the underlying 3D API. */
177 GrSwizzle fSwizzle;
178 /** The config that should be used to read from the temp surface after the draw. This may be
179 different than the original read config in order to compensate for swizzling. The
180 read data will effectively be in the original read config. */
181 GrPixelConfig fReadConfig;
bsalomon39826022015-07-23 08:07:21 -0700182 };
bsalomon6c9cd552016-01-22 07:17:34 -0800183
bsalomon39826022015-07-23 08:07:21 -0700184 /** Describes why an intermediate draw must/should be performed before readPixels. */
185 enum DrawPreference {
186 /** On input means that the caller would proceed without draw if the GrGpu doesn't request
187 one.
188 On output means that the GrGpu is not requesting a draw. */
189 kNoDraw_DrawPreference,
190 /** Means that the client would prefer a draw for performance of the readback but
191 can satisfy a straight readPixels call on the inputs without an intermediate draw.
192 getReadPixelsInfo will never set the draw preference to this value but may leave
193 it set. */
194 kCallerPrefersDraw_DrawPreference,
195 /** On output means that GrGpu would prefer a draw for performance of the readback but
196 can satisfy a straight readPixels call on the inputs without an intermediate draw. The
197 caller of getReadPixelsInfo should never specify this on intput. */
198 kGpuPrefersDraw_DrawPreference,
199 /** On input means that the caller requires a draw to do a transformation and there is no
200 CPU fallback.
201 On output means that GrGpu can only satisfy the readPixels request if the intermediate
202 draw is performed.
203 */
204 kRequireDraw_DrawPreference
205 };
206
bsalomonf0674512015-07-28 13:26:15 -0700207 /**
208 * Used to negotiate whether and how an intermediate draw should or must be performed before
209 * a readPixels call. If this returns false then GrGpu could not deduce an intermediate draw
210 * that would allow a successful readPixels call. The passed width, height, and rowBytes,
211 * must be non-zero and already reflect clipping to the src bounds.
212 */
213 bool getReadPixelsInfo(GrSurface* srcSurface, int readWidth, int readHeight, size_t rowBytes,
214 GrPixelConfig readConfig, DrawPreference*, ReadPixelTempDrawInfo*);
215
cblume61214052016-01-26 09:10:48 -0800216 /** Info struct returned by getWritePixelsInfo about performing an intermediate draw in order
bsalomonf0674512015-07-28 13:26:15 -0700217 to write pixels to a GrSurface for either performance or correctness reasons. */
218 struct WritePixelTempDrawInfo {
219 /** If the GrGpu is requesting that the caller upload to an intermediate surface and draw
220 that to the dst then this is the descriptor for the intermediate surface. The caller
221 should upload the pixels such that the upper left pixel of the upload rect is at 0,0 in
222 the intermediate surface.*/
223 GrSurfaceDesc fTempSurfaceDesc;
bsalomon6c9cd552016-01-22 07:17:34 -0800224 /** Swizzle to apply during the draw. This is used to compensate for either feature or
225 performance limitations in the underlying 3D API. */
226 GrSwizzle fSwizzle;
227 /** The config that should be specified when uploading the *original* data to the temp
228 surface before the draw. This may be different than the original src data config in
229 order to compensate for swizzling that will occur when drawing. */
230 GrPixelConfig fWriteConfig;
bsalomonf0674512015-07-28 13:26:15 -0700231 };
bsalomon39826022015-07-23 08:07:21 -0700232
bsalomon@google.com75f9f252012-01-31 13:35:56 +0000233 /**
bsalomonf0674512015-07-28 13:26:15 -0700234 * Used to negotiate whether and how an intermediate surface should be used to write pixels to
235 * a GrSurface. If this returns false then GrGpu could not deduce an intermediate draw
236 * that would allow a successful transfer of the src pixels to the dst. The passed width,
237 * height, and rowBytes, must be non-zero and already reflect clipping to the dst bounds.
bsalomon@google.com0a97be22011-11-08 19:20:57 +0000238 */
cblumeed828002016-02-16 13:00:01 -0800239 bool getWritePixelsInfo(GrSurface* dstSurface, int width, int height,
bsalomonf0674512015-07-28 13:26:15 -0700240 GrPixelConfig srcConfig, DrawPreference*, WritePixelTempDrawInfo*);
bsalomon@google.coma85449d2011-11-19 02:36:05 +0000241
242 /**
bsalomon@google.coma04e8e82012-08-27 12:53:13 +0000243 * Reads a rectangle of pixels from a render target.
bsalomon@google.comc4364992011-11-07 15:54:49 +0000244 *
bsalomon6cb3cbe2015-07-30 07:34:27 -0700245 * @param surface The surface to read from
bsalomon@google.com669fdc42011-04-05 17:08:27 +0000246 * @param left left edge of the rectangle to read (inclusive)
247 * @param top top edge of the rectangle to read (inclusive)
248 * @param width width of rectangle to read in pixels.
249 * @param height height of rectangle to read in pixels.
250 * @param config the pixel config of the destination buffer
251 * @param buffer memory to read the rectangle into.
bsalomon@google.comc6980972011-11-02 19:57:21 +0000252 * @param rowBytes the number of bytes between consecutive rows. Zero
253 * means rows are tightly packed.
bsalomon@google.comc4364992011-11-07 15:54:49 +0000254 * @param invertY buffer should be populated bottom-to-top as opposed
255 * to top-to-bottom (skia's usual order)
bsalomon@google.coma7f84e12011-03-10 14:13:19 +0000256 *
257 * @return true if the read succeeded, false if not. The read can fail
258 * because of a unsupported pixel config or because no render
259 * target is currently set.
260 */
bsalomon6cb3cbe2015-07-30 07:34:27 -0700261 bool readPixels(GrSurface* surface,
bsalomon@google.com669fdc42011-04-05 17:08:27 +0000262 int left, int top, int width, int height,
senorblanco@chromium.org3cb406b2013-02-05 19:50:46 +0000263 GrPixelConfig config, void* buffer, size_t rowBytes);
reed@google.comac10a2d2010-12-22 21:39:39 +0000264
bsalomon@google.com6f379512011-11-16 20:36:03 +0000265 /**
bsalomon6cb3cbe2015-07-30 07:34:27 -0700266 * Updates the pixels in a rectangle of a surface.
bsalomon@google.coma85449d2011-11-19 02:36:05 +0000267 *
bsalomon6cb3cbe2015-07-30 07:34:27 -0700268 * @param surface The surface to write to.
bsalomon@google.com6f379512011-11-16 20:36:03 +0000269 * @param left left edge of the rectangle to write (inclusive)
270 * @param top top edge of the rectangle to write (inclusive)
271 * @param width width of rectangle to write in pixels.
272 * @param height height of rectangle to write in pixels.
273 * @param config the pixel config of the source buffer
cblume55f2d2d2016-02-26 13:20:48 -0800274 * @param texels array of mipmap levels containing texture data
Robert Phillips590533f2017-07-11 14:22:35 -0400275 * @param mipLevelCount number of levels in 'texels'
cblume55f2d2d2016-02-26 13:20:48 -0800276 */
277 bool writePixels(GrSurface* surface,
278 int left, int top, int width, int height,
279 GrPixelConfig config,
Robert Phillips590533f2017-07-11 14:22:35 -0400280 const GrMipLevel texels[], int mipLevelCount);
cblume55f2d2d2016-02-26 13:20:48 -0800281
282 /**
283 * This function is a shim which creates a SkTArray<GrMipLevel> of size 1.
284 * It then calls writePixels with that SkTArray.
285 *
286 * @param buffer memory to read pixels from.
287 * @param rowBytes number of bytes between consecutive rows. Zero
288 * means rows are tightly packed.
bsalomon@google.com6f379512011-11-16 20:36:03 +0000289 */
bsalomon6cb3cbe2015-07-30 07:34:27 -0700290 bool writePixels(GrSurface* surface,
291 int left, int top, int width, int height,
292 GrPixelConfig config, const void* buffer,
293 size_t rowBytes);
bsalomon@google.com6f379512011-11-16 20:36:03 +0000294
joshualitt3322fa42014-11-07 08:48:51 -0800295 /**
Jim Van Verth2e5eaf02017-06-21 15:55:46 -0400296 * Updates the pixels in a rectangle of a texture using a buffer
jvanverth17aa0472016-01-05 10:41:27 -0800297 *
Jim Van Verth2e5eaf02017-06-21 15:55:46 -0400298 * There are a couple of assumptions here. First, we only update the top miplevel.
299 * And second, that any y flip needed has already been done in the buffer.
300 *
301 * @param texture The texture to write to.
cdalton397536c2016-03-25 12:15:03 -0700302 * @param left left edge of the rectangle to write (inclusive)
303 * @param top top edge of the rectangle to write (inclusive)
304 * @param width width of rectangle to write in pixels.
305 * @param height height of rectangle to write in pixels.
306 * @param config the pixel config of the source buffer
Jim Van Verth2e5eaf02017-06-21 15:55:46 -0400307 * @param transferBuffer GrBuffer to read pixels from (type must be "kXferCpuToGpu")
cdalton397536c2016-03-25 12:15:03 -0700308 * @param offset offset from the start of the buffer
Jim Van Verth2e5eaf02017-06-21 15:55:46 -0400309 * @param rowBytes number of bytes between consecutive rows in the buffer. Zero
cdalton397536c2016-03-25 12:15:03 -0700310 * means rows are tightly packed.
jvanverth17aa0472016-01-05 10:41:27 -0800311 */
Jim Van Verth2e5eaf02017-06-21 15:55:46 -0400312 bool transferPixels(GrTexture* texture,
jvanverth17aa0472016-01-05 10:41:27 -0800313 int left, int top, int width, int height,
cdalton397536c2016-03-25 12:15:03 -0700314 GrPixelConfig config, GrBuffer* transferBuffer,
Jim Van Verth2e5eaf02017-06-21 15:55:46 -0400315 size_t offset, size_t rowBytes);
jvanverth17aa0472016-01-05 10:41:27 -0800316
bsalomon@google.com80d09b92011-11-05 21:21:13 +0000317 // After the client interacts directly with the 3D context state the GrGpu
318 // must resync its internal state and assumptions about 3D context state.
319 // Each time this occurs the GrGpu bumps a timestamp.
320 // state of the 3D context
321 // At 10 resets / frame and 60fps a 64bit timestamp will overflow in about
322 // a billion years.
323 typedef uint64_t ResetTimestamp;
324
325 // This timestamp is always older than the current timestamp
326 static const ResetTimestamp kExpiredTimestamp = 0;
327 // Returns a timestamp based on the number of times the context was reset.
328 // This timestamp can be used to lazily detect when cached 3D context state
329 // is dirty.
bsalomon6d467ec2014-11-18 07:36:19 -0800330 ResetTimestamp getResetTimestamp() const { return fResetTimestamp; }
bsalomon@google.com80d09b92011-11-05 21:21:13 +0000331
bsalomonf90a02b2014-11-26 12:28:00 -0800332 // 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 -0400333 // take place at the GrOpList level and this function implement faster copy paths. The rect
bsalomonf90a02b2014-11-26 12:28:00 -0800334 // and point are pre-clipped. The src rect and implied dst rect are guaranteed to be within the
335 // src/dst bounds and non-empty.
joshualitt1cbdcde2015-08-21 11:53:29 -0700336 bool copySurface(GrSurface* dst,
337 GrSurface* src,
338 const SkIRect& srcRect,
339 const SkIPoint& dstPoint);
joshualitt3322fa42014-11-07 08:48:51 -0800340
cdalton28f45b92016-03-07 13:58:26 -0800341 struct MultisampleSpecs {
csmartdalton0d28e572016-07-06 09:59:43 -0700342 MultisampleSpecs(uint8_t uniqueID, int effectiveSampleCnt, const SkPoint* locations)
343 : fUniqueID(uniqueID),
344 fEffectiveSampleCnt(effectiveSampleCnt),
345 fSampleLocations(locations) {}
346
cdalton28f45b92016-03-07 13:58:26 -0800347 // Nonzero ID that uniquely identifies these multisample specs.
csmartdalton0d28e572016-07-06 09:59:43 -0700348 uint8_t fUniqueID;
cdalton28f45b92016-03-07 13:58:26 -0800349 // The actual number of samples the GPU will run. NOTE: this value can be greater than the
350 // the render target's sample count.
csmartdalton0d28e572016-07-06 09:59:43 -0700351 int fEffectiveSampleCnt;
352 // If sample locations are supported, points to the subpixel locations at which the GPU will
353 // sample. Pixel center is at (.5, .5), and (0, 0) indicates the top left corner.
354 const SkPoint* fSampleLocations;
cdalton28f45b92016-03-07 13:58:26 -0800355 };
356
csmartdaltonc633abb2016-11-01 08:55:55 -0700357 // Finds a render target's multisample specs. The pipeline is only needed in case we need to
358 // flush the draw state prior to querying multisample info. The pipeline is not expected to
csmartdaltonc25c5d72016-11-01 07:03:59 -0700359 // affect the multisample information itself.
csmartdaltonc633abb2016-11-01 08:55:55 -0700360 const MultisampleSpecs& queryMultisampleSpecs(const GrPipeline&);
csmartdaltonc25c5d72016-11-01 07:03:59 -0700361
362 // Finds the multisample specs with a given unique id.
363 const MultisampleSpecs& getMultisampleSpecs(uint8_t uniqueID) {
364 SkASSERT(uniqueID > 0 && uniqueID < fMultisampleSpecs.count());
365 return fMultisampleSpecs[uniqueID];
366 }
cdalton28f45b92016-03-07 13:58:26 -0800367
Robert Phillipsf2361d22016-10-25 14:20:06 -0400368 // Creates a GrGpuCommandBuffer in which the GrOpList can send draw commands to instead of
Brian Salomonc293a292016-11-30 13:38:32 -0500369 // directly to the Gpu object. This currently does not take a GrRenderTarget. The command buffer
370 // is expected to infer the render target from the first draw, clear, or discard. This is an
371 // awkward workaround that goes away after MDB is complete and the render target is known from
372 // the GrRenderTargetOpList.
egdaniel9cb63402016-06-23 08:37:05 -0700373 virtual GrGpuCommandBuffer* createCommandBuffer(
egdaniel9cb63402016-06-23 08:37:05 -0700374 const GrGpuCommandBuffer::LoadAndStoreInfo& colorInfo,
375 const GrGpuCommandBuffer::LoadAndStoreInfo& stencilInfo) = 0;
bsalomon3e791242014-12-17 13:43:13 -0800376
Robert Phillips18e94842017-05-15 13:06:44 -0400377 // Called by GrDrawingManager when flushing.
Mike Reed8724b462017-07-22 17:33:48 +0000378 // Provides a hook for post-flush actions (e.g. Vulkan command buffer submits).
379 virtual void finishFlush() {}
ethannicholas22793252016-01-30 09:59:10 -0800380
Greg Daniel6be35232017-03-01 17:01:09 -0500381 virtual GrFence SK_WARN_UNUSED_RESULT insertFence() = 0;
382 virtual bool waitFence(GrFence, uint64_t timeout = 1000) = 0;
jvanverth84741b32016-09-30 08:39:02 -0700383 virtual void deleteFence(GrFence) const = 0;
384
Greg Daniela5cb7812017-06-16 09:45:32 -0400385 virtual sk_sp<GrSemaphore> SK_WARN_UNUSED_RESULT makeSemaphore(bool isOwned = true) = 0;
386 virtual sk_sp<GrSemaphore> wrapBackendSemaphore(const GrBackendSemaphore& semaphore,
387 GrWrapOwnership ownership) = 0;
Brian Osmandc87c952017-04-28 13:57:38 -0400388 virtual void insertSemaphore(sk_sp<GrSemaphore> semaphore, bool flush = false) = 0;
Greg Daniel6be35232017-03-01 17:01:09 -0500389 virtual void waitSemaphore(sk_sp<GrSemaphore> semaphore) = 0;
390
Brian Osman13dddce2017-05-09 13:19:50 -0400391 /**
392 * Put this texture in a safe and known state for use across multiple GrContexts. Depending on
393 * the backend, this may return a GrSemaphore. If so, other contexts should wait on that
394 * semaphore before using this texture.
395 */
396 virtual sk_sp<GrSemaphore> prepareTextureForCrossContextUsage(GrTexture*) = 0;
397
mtkleinb9eb4ac2015-02-02 18:26:03 -0800398 ///////////////////////////////////////////////////////////////////////////
399 // Debugging and Stats
400
401 class Stats {
402 public:
403#if GR_GPU_STATS
404 Stats() { this->reset(); }
405
bsalomonb12ea412015-02-02 21:19:50 -0800406 void reset() {
407 fRenderTargetBinds = 0;
408 fShaderCompilations = 0;
409 fTextureCreates = 0;
410 fTextureUploads = 0;
jvanverth17aa0472016-01-05 10:41:27 -0800411 fTransfersToTexture = 0;
egdaniel8dc7c3a2015-04-16 11:22:42 -0700412 fStencilAttachmentCreates = 0;
joshualitt87a5c9f2015-09-08 13:42:05 -0700413 fNumDraws = 0;
bsalomon1d417a82016-03-23 11:50:26 -0700414 fNumFailedDraws = 0;
bsalomonb12ea412015-02-02 21:19:50 -0800415 }
mtkleinb9eb4ac2015-02-02 18:26:03 -0800416
417 int renderTargetBinds() const { return fRenderTargetBinds; }
418 void incRenderTargetBinds() { fRenderTargetBinds++; }
419 int shaderCompilations() const { return fShaderCompilations; }
420 void incShaderCompilations() { fShaderCompilations++; }
bsalomonb12ea412015-02-02 21:19:50 -0800421 int textureCreates() const { return fTextureCreates; }
422 void incTextureCreates() { fTextureCreates++; }
423 int textureUploads() const { return fTextureUploads; }
424 void incTextureUploads() { fTextureUploads++; }
jvanverth17aa0472016-01-05 10:41:27 -0800425 int transfersToTexture() const { return fTransfersToTexture; }
426 void incTransfersToTexture() { fTransfersToTexture++; }
egdaniel8dc7c3a2015-04-16 11:22:42 -0700427 void incStencilAttachmentCreates() { fStencilAttachmentCreates++; }
joshualitt87a5c9f2015-09-08 13:42:05 -0700428 void incNumDraws() { fNumDraws++; }
bsalomon1d417a82016-03-23 11:50:26 -0700429 void incNumFailedDraws() { ++fNumFailedDraws; }
mtkleinb9eb4ac2015-02-02 18:26:03 -0800430 void dump(SkString*);
joshualitte45c81c2015-12-02 09:05:37 -0800431 void dumpKeyValuePairs(SkTArray<SkString>* keys, SkTArray<double>* values);
bsalomon1d417a82016-03-23 11:50:26 -0700432 int numDraws() const { return fNumDraws; }
433 int numFailedDraws() const { return fNumFailedDraws; }
mtkleinb9eb4ac2015-02-02 18:26:03 -0800434 private:
435 int fRenderTargetBinds;
436 int fShaderCompilations;
bsalomonb12ea412015-02-02 21:19:50 -0800437 int fTextureCreates;
438 int fTextureUploads;
jvanverth17aa0472016-01-05 10:41:27 -0800439 int fTransfersToTexture;
egdaniel8dc7c3a2015-04-16 11:22:42 -0700440 int fStencilAttachmentCreates;
joshualitt87a5c9f2015-09-08 13:42:05 -0700441 int fNumDraws;
bsalomon1d417a82016-03-23 11:50:26 -0700442 int fNumFailedDraws;
mtkleinb9eb4ac2015-02-02 18:26:03 -0800443#else
joshualitte45c81c2015-12-02 09:05:37 -0800444 void dump(SkString*) {}
445 void dumpKeyValuePairs(SkTArray<SkString>*, SkTArray<double>*) {}
mtkleinb9eb4ac2015-02-02 18:26:03 -0800446 void incRenderTargetBinds() {}
447 void incShaderCompilations() {}
bsalomonb12ea412015-02-02 21:19:50 -0800448 void incTextureCreates() {}
449 void incTextureUploads() {}
jvanverth17aa0472016-01-05 10:41:27 -0800450 void incTransfersToTexture() {}
egdaniel8dc7c3a2015-04-16 11:22:42 -0700451 void incStencilAttachmentCreates() {}
joshualitt87a5c9f2015-09-08 13:42:05 -0700452 void incNumDraws() {}
bsalomon1d417a82016-03-23 11:50:26 -0700453 void incNumFailedDraws() {}
mtkleinb9eb4ac2015-02-02 18:26:03 -0800454#endif
455 };
456
457 Stats* stats() { return &fStats; }
458
bsalomon67d76202015-11-11 12:40:42 -0800459 /** Creates a texture directly in the backend API without wrapping it in a GrTexture. This is
460 only to be used for testing (particularly for testing the methods that import an externally
461 created texture into Skia. Must be matched with a call to deleteTestingOnlyTexture(). */
jvanverth88957922015-07-14 11:02:52 -0700462 virtual GrBackendObject createTestingOnlyBackendTexture(void* pixels, int w, int h,
egdaniel0a3a7f72016-06-24 09:22:31 -0700463 GrPixelConfig config,
464 bool isRenderTarget = false) = 0;
bsalomon67d76202015-11-11 12:40:42 -0800465 /** Check a handle represents an actual texture in the backend API that has not been freed. */
466 virtual bool isTestingOnlyBackendTexture(GrBackendObject) const = 0;
467 /** If ownership of the backend texture has been transferred pass true for abandonTexture. This
468 will do any necessary cleanup of the handle without freeing the texture in the backend
469 API. */
470 virtual void deleteTestingOnlyBackendTexture(GrBackendObject,
bsalomone63ffef2016-02-05 07:17:34 -0800471 bool abandonTexture = false) = 0;
jvanverth672bb7f2015-07-13 07:19:57 -0700472
egdanielec00d942015-09-14 12:56:10 -0700473 // width and height may be larger than rt (if underlying API allows it).
474 // Returns nullptr if compatible sb could not be created, otherwise the caller owns the ref on
475 // the GrStencilAttachment.
476 virtual GrStencilAttachment* createStencilAttachmentForRenderTarget(const GrRenderTarget*,
477 int width,
478 int height) = 0;
479 // clears target's entire stencil buffer to 0
480 virtual void clearStencil(GrRenderTarget* target) = 0;
bsalomon6bc1b5f2015-02-23 09:06:38 -0800481
bsalomone179a912016-01-20 06:18:10 -0800482 // Determines whether a texture will need to be rescaled in order to be used with the
Brian Salomon514baff2016-11-17 15:17:07 -0500483 // GrSamplerParams. This variation is called when the caller will create a new texture using the
Brian Osman32342f02017-03-04 08:12:46 -0500484 // resource provider from a non-texture src (cpu-backed image, ...).
Robert Phillips81444fb2017-03-21 09:14:35 -0400485 bool isACopyNeededForTextureParams(int width, int height, const GrSamplerParams&,
486 GrTextureProducer::CopyParams*,
487 SkScalar scaleAdjust[2]) const;
bsalomone179a912016-01-20 06:18:10 -0800488
489 // Like the above but this variation should be called when the caller is not creating the
490 // original texture but rather was handed the original texture. It adds additional checks
491 // relevant to original textures that were created external to Skia via
Brian Osman32342f02017-03-04 08:12:46 -0500492 // GrResourceProvider::wrap methods.
Robert Phillips3798c862017-03-27 11:08:16 -0400493 bool isACopyNeededForTextureParams(GrTextureProxy* proxy, const GrSamplerParams& params,
Robert Phillips81444fb2017-03-21 09:14:35 -0400494 GrTextureProducer::CopyParams* copyParams,
495 SkScalar scaleAdjust[2]) const {
Robert Phillips3798c862017-03-27 11:08:16 -0400496 if (this->isACopyNeededForTextureParams(proxy->width(), proxy->height(), params,
Robert Phillips81444fb2017-03-21 09:14:35 -0400497 copyParams, scaleAdjust)) {
bsalomone179a912016-01-20 06:18:10 -0800498 return true;
499 }
Robert Phillips3798c862017-03-27 11:08:16 -0400500 return this->onIsACopyNeededForTextureParams(proxy, params, copyParams, scaleAdjust);
bsalomone179a912016-01-20 06:18:10 -0800501 }
bsalomon045802d2015-10-20 07:58:01 -0700502
jvanverth672bb7f2015-07-13 07:19:57 -0700503 // This is only to be used in GL-specific tests.
halcanary96fcdcc2015-08-27 07:41:13 -0700504 virtual const GrGLContext* glContextForTesting() const { return nullptr; }
bsalomon993a4212015-05-29 11:37:25 -0700505
joshualitt8fd844f2015-12-02 13:36:47 -0800506 // This is only to be used by testing code
507 virtual void resetShaderCacheForTesting() const {}
508
egdaniel9cb63402016-06-23 08:37:05 -0700509 void handleDirtyContext() {
510 if (fResetBits) {
511 this->resetContext();
512 }
513 }
514
joshualittd53a8272014-11-10 16:03:14 -0800515protected:
bsalomonf0674512015-07-28 13:26:15 -0700516 static void ElevateDrawPreference(GrGpu::DrawPreference* preference,
517 GrGpu::DrawPreference elevation) {
518 GR_STATIC_ASSERT(GrGpu::kCallerPrefersDraw_DrawPreference > GrGpu::kNoDraw_DrawPreference);
519 GR_STATIC_ASSERT(GrGpu::kGpuPrefersDraw_DrawPreference >
520 GrGpu::kCallerPrefersDraw_DrawPreference);
521 GR_STATIC_ASSERT(GrGpu::kRequireDraw_DrawPreference >
522 GrGpu::kGpuPrefersDraw_DrawPreference);
523 *preference = SkTMax(*preference, elevation);
524 }
525
jvanverth900bd4a2016-04-29 13:53:12 -0700526 // Handles cases where a surface will be updated without a call to flushRenderTarget
527 void didWriteToSurface(GrSurface* surface, const SkIRect* bounds, uint32_t mipLevels = 1) const;
528
Ben Wagner145dbcd2016-11-03 14:40:50 -0400529 Stats fStats;
530 std::unique_ptr<GrPathRendering> fPathRendering;
joshualitt3322fa42014-11-07 08:48:51 -0800531 // Subclass must initialize this in its constructor.
Hal Canary144caf52016-11-07 17:57:18 -0500532 sk_sp<const GrCaps> fCaps;
joshualitt3322fa42014-11-07 08:48:51 -0800533
csmartdalton0d28e572016-07-06 09:59:43 -0700534 typedef SkTArray<SkPoint, true> SamplePattern;
535
bsalomon@google.com02ddc8b2013-01-28 15:35:28 +0000536private:
bsalomon@google.comb635d392011-11-05 12:47:43 +0000537 // called when the 3D context state is unknown. Subclass should emit any
bsalomon@google.comc8f7f472012-06-18 13:44:51 +0000538 // assumed 3D context state and dirty any state cache.
bsalomon@google.com0a208a12013-06-28 18:57:35 +0000539 virtual void onResetContext(uint32_t resetBits) = 0;
bsalomon@google.coma7f84e12011-03-10 14:13:19 +0000540
bsalomoncb02b382015-08-12 11:14:50 -0700541 // Called before certain draws in order to guarantee coherent results from dst reads.
542 virtual void xferBarrier(GrRenderTarget*, GrXferBarrierType) = 0;
543
bsalomon@google.com16e3dde2012-10-25 18:43:28 +0000544 // overridden by backend-specific derived class to create objects.
egdanielb0e1be22015-04-22 13:27:39 -0700545 // Texture size and sample size will have already been validated in base class before
Robert Phillips92de6312017-05-23 07:43:48 -0400546 // onCreateTexture is called.
Robert Phillips67d52cf2017-06-05 13:38:13 -0400547 virtual sk_sp<GrTexture> onCreateTexture(const GrSurfaceDesc& desc,
548 SkBudgeted budgeted,
Robert Phillips590533f2017-07-11 14:22:35 -0400549 const GrMipLevel texels[],
550 int mipLevelCount) = 0;
cblume55f2d2d2016-02-26 13:20:48 -0800551
Greg Daniel7ef28f32017-04-20 16:41:55 +0000552 virtual sk_sp<GrTexture> onWrapBackendTexture(const GrBackendTexture&,
553 GrSurfaceOrigin,
Greg Daniel7ef28f32017-04-20 16:41:55 +0000554 GrWrapOwnership) = 0;
Brian Salomond17f6582017-07-19 18:28:58 -0400555 virtual sk_sp<GrTexture> onWrapRenderableBackendTexture(const GrBackendTexture&,
556 GrSurfaceOrigin,
557 int sampleCnt,
558 GrWrapOwnership) = 0;
Greg Danielbcf612b2017-05-01 13:50:58 +0000559 virtual sk_sp<GrRenderTarget> onWrapBackendRenderTarget(const GrBackendRenderTarget&,
560 GrSurfaceOrigin) = 0;
Greg Daniel7ef28f32017-04-20 16:41:55 +0000561 virtual sk_sp<GrRenderTarget> onWrapBackendTextureAsRenderTarget(const GrBackendTexture&,
562 GrSurfaceOrigin,
563 int sampleCnt)=0;
cdalton1bf3e712016-04-19 10:00:02 -0700564 virtual GrBuffer* onCreateBuffer(size_t size, GrBufferType intendedType, GrAccessPattern,
565 const void* data) = 0;
bsalomon@google.coma7f84e12011-03-10 14:13:19 +0000566
csmartdaltone0d36292016-07-29 08:14:20 -0700567 virtual gr_instanced::InstancedRendering* onCreateInstancedRendering() = 0;
Robert Phillipse3302df2017-04-24 07:31:02 -0400568 virtual std::unique_ptr<gr_instanced::OpAllocator> onCreateInstancedRenderingAllocator() {
569 return nullptr;
570 }
csmartdaltone0d36292016-07-29 08:14:20 -0700571
Robert Phillips3798c862017-03-27 11:08:16 -0400572 virtual bool onIsACopyNeededForTextureParams(GrTextureProxy* proxy, const GrSamplerParams&,
Robert Phillips81444fb2017-03-21 09:14:35 -0400573 GrTextureProducer::CopyParams*,
574 SkScalar scaleAdjust[2]) const {
575 return false;
576 }
bsalomone179a912016-01-20 06:18:10 -0800577
bsalomonf0674512015-07-28 13:26:15 -0700578 virtual bool onGetReadPixelsInfo(GrSurface* srcSurface, int readWidth, int readHeight,
579 size_t rowBytes, GrPixelConfig readConfig, DrawPreference*,
580 ReadPixelTempDrawInfo*) = 0;
cblumeed828002016-02-16 13:00:01 -0800581 virtual bool onGetWritePixelsInfo(GrSurface* dstSurface, int width, int height,
bsalomonf0674512015-07-28 13:26:15 -0700582 GrPixelConfig srcConfig, DrawPreference*,
583 WritePixelTempDrawInfo*) = 0;
584
bsalomon6cb3cbe2015-07-30 07:34:27 -0700585 // overridden by backend-specific derived class to perform the surface read
586 virtual bool onReadPixels(GrSurface*,
egdaniel6d901da2015-07-30 12:02:15 -0700587 int left, int top,
588 int width, int height,
bsalomon@google.comc4364992011-11-07 15:54:49 +0000589 GrPixelConfig,
590 void* buffer,
senorblanco@chromium.org3cb406b2013-02-05 19:50:46 +0000591 size_t rowBytes) = 0;
bsalomon@google.coma7f84e12011-03-10 14:13:19 +0000592
bsalomon6cb3cbe2015-07-30 07:34:27 -0700593 // overridden by backend-specific derived class to perform the surface write
594 virtual bool onWritePixels(GrSurface*,
595 int left, int top, int width, int height,
cblume55f2d2d2016-02-26 13:20:48 -0800596 GrPixelConfig config,
Robert Phillips590533f2017-07-11 14:22:35 -0400597 const GrMipLevel texels[], int mipLevelCount) = 0;
bsalomon@google.com6f379512011-11-16 20:36:03 +0000598
Jim Van Verth2e5eaf02017-06-21 15:55:46 -0400599 // overridden by backend-specific derived class to perform the texture transfer
600 virtual bool onTransferPixels(GrTexture*,
jvanverth17aa0472016-01-05 10:41:27 -0800601 int left, int top, int width, int height,
cdalton397536c2016-03-25 12:15:03 -0700602 GrPixelConfig config, GrBuffer* transferBuffer,
jvanverth17aa0472016-01-05 10:41:27 -0800603 size_t offset, size_t rowBytes) = 0;
604
bsalomon@google.com16e3dde2012-10-25 18:43:28 +0000605 // overridden by backend-specific derived class to perform the resolve
bsalomon@google.com75f9f252012-01-31 13:35:56 +0000606 virtual void onResolveRenderTarget(GrRenderTarget* target) = 0;
607
joshualitt1cbdcde2015-08-21 11:53:29 -0700608 // overridden by backend specific derived class to perform the copy surface
609 virtual bool onCopySurface(GrSurface* dst,
610 GrSurface* src,
611 const SkIRect& srcRect,
612 const SkIPoint& dstPoint) = 0;
613
cdalton28f45b92016-03-07 13:58:26 -0800614 // overridden by backend specific derived class to perform the multisample queries
csmartdaltonc25c5d72016-11-01 07:03:59 -0700615 virtual void onQueryMultisampleSpecs(GrRenderTarget*, const GrStencilSettings&,
616 int* effectiveSampleCnt, SamplePattern*) = 0;
cdalton28f45b92016-03-07 13:58:26 -0800617
bsalomon@google.comb635d392011-11-05 12:47:43 +0000618 void resetContext() {
bsalomon@google.com0a208a12013-06-28 18:57:35 +0000619 this->onResetContext(fResetBits);
620 fResetBits = 0;
bsalomon@google.comb635d392011-11-05 12:47:43 +0000621 ++fResetTimestamp;
622 }
623
csmartdalton0d28e572016-07-06 09:59:43 -0700624 struct SamplePatternComparator {
625 bool operator()(const SamplePattern&, const SamplePattern&) const;
626 };
627
628 typedef std::map<SamplePattern, uint8_t, SamplePatternComparator> MultisampleSpecsIdMap;
629
630 ResetTimestamp fResetTimestamp;
631 uint32_t fResetBits;
632 MultisampleSpecsIdMap fMultisampleSpecsIdMap;
633 SkSTArray<1, MultisampleSpecs, true> fMultisampleSpecs;
joshualitt3322fa42014-11-07 08:48:51 -0800634 // The context owns us, not vice-versa, so this ptr is not ref'ed by Gpu.
csmartdalton0d28e572016-07-06 09:59:43 -0700635 GrContext* fContext;
bsalomon@google.com02ddc8b2013-01-28 15:35:28 +0000636
kkinnunencabe20c2015-06-01 01:37:26 -0700637 friend class GrPathRendering;
Robert Phillipse3302df2017-04-24 07:31:02 -0400638 friend class gr_instanced::InstancedOp; // for xferBarrier
joshualitt3322fa42014-11-07 08:48:51 -0800639 typedef SkRefCnt INHERITED;
reed@google.comac10a2d2010-12-22 21:39:39 +0000640};
641
642#endif