blob: dc518cd72dd88c5b3afdd7ecb9e27c507f6be9c2 [file] [log] [blame]
reed@google.comac10a2d2010-12-22 21:39:39 +00001/*
epoger@google.comec3ed6a2011-07-28 14:26:00 +00002 * Copyright 2011 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
reed@google.comac10a2d2010-12-22 21:39:39 +00006 */
7
reed@google.comac10a2d2010-12-22 21:39:39 +00008#ifndef GrGpu_DEFINED
9#define GrGpu_DEFINED
10
Robert Phillipse42edcc2017-12-13 11:50:22 -050011#include "GrCaps.h"
egdaniel066df7c2016-06-08 14:02:27 -070012#include "GrGpuCommandBuffer.h"
joshualitt79f8fae2014-10-28 17:59:26 -070013#include "GrProgramDesc.h"
bsalomon6c9cd552016-01-22 07:17:34 -080014#include "GrSwizzle.h"
cdalton28f45b92016-03-07 13:58:26 -080015#include "GrAllocator.h"
Brian Osmane8e54582016-11-28 10:06:27 -050016#include "GrTextureProducer.h"
cblume55f2d2d2016-02-26 13:20:48 -080017#include "GrTypes.h"
kkinnunencabe20c2015-06-01 01:37:26 -070018#include "GrXferProcessor.h"
sugoi@google.com12b4e272012-12-06 20:13:11 +000019#include "SkPath.h"
cblume55f2d2d2016-02-26 13:20:48 -080020#include "SkTArray.h"
csmartdalton0d28e572016-07-06 09:59:43 -070021#include <map>
sugoi@google.com12b4e272012-12-06 20:13:11 +000022
Greg Danielbcf612b2017-05-01 13:50:58 +000023class GrBackendRenderTarget;
Greg Daniela5cb7812017-06-16 09:45:32 -040024class GrBackendSemaphore;
cdalton397536c2016-03-25 12:15:03 -070025class GrBuffer;
bsalomon@google.com669fdc42011-04-05 17:08:27 +000026class GrContext;
robertphillips28a838e2016-06-23 14:07:00 -070027struct GrContextOptions;
reedf9ad5582015-06-25 21:29:25 -070028class GrGLContext;
Chris Daltonbca46e22017-05-15 11:03:26 -060029class GrMesh;
bsalomon@google.com64aef2b2012-06-11 15:36:13 +000030class GrPath;
cdaltonb85a0aa2014-07-21 15:32:44 -070031class GrPathRange;
bsalomon@google.com30085192011-08-19 15:42:31 +000032class GrPathRenderer;
33class GrPathRendererChain;
kkinnunencabe20c2015-06-01 01:37:26 -070034class GrPathRendering;
egdaniel8dd688b2015-01-22 10:16:09 -080035class GrPipeline;
joshualitt873ad0e2015-01-20 09:08:51 -080036class GrPrimitiveProcessor;
kkinnunencabe20c2015-06-01 01:37:26 -070037class GrRenderTarget;
Greg Daniel6be35232017-03-01 17:01:09 -050038class GrSemaphore;
egdaniel8dc7c3a2015-04-16 11:22:42 -070039class GrStencilAttachment;
cdalton93a379b2016-05-11 13:58:08 -070040class GrStencilSettings;
kkinnunencabe20c2015-06-01 01:37:26 -070041class GrSurface;
42class GrTexture;
Brian Osman71a18892017-08-10 10:23:25 -040043class SkJSONWriter;
reed@google.comac10a2d2010-12-22 21:39:39 +000044
joshualitt3322fa42014-11-07 08:48:51 -080045class GrGpu : public SkRefCnt {
reed@google.comac10a2d2010-12-22 21:39:39 +000046public:
47 /**
bsalomon@google.com16e3dde2012-10-25 18:43:28 +000048 * Create an instance of GrGpu that matches the specified backend. If the requested backend is
halcanary96fcdcc2015-08-27 07:41:13 -070049 * not supported (at compile-time or run-time) this returns nullptr. The context will not be
bsalomon@google.com6e4e6502013-02-25 20:12:45 +000050 * fully constructed and should not be used by GrGpu until after this function returns.
reed@google.comac10a2d2010-12-22 21:39:39 +000051 */
Robert Phillipse42edcc2017-12-13 11:50:22 -050052 static sk_sp<GrGpu> Make(GrBackend, GrBackendContext, const GrContextOptions&, GrContext*);
reed@google.comac10a2d2010-12-22 21:39:39 +000053
54 ////////////////////////////////////////////////////////////////////////////
55
bsalomon@google.com6e4e6502013-02-25 20:12:45 +000056 GrGpu(GrContext* context);
mtklein36352bf2015-03-25 18:17:31 -070057 ~GrGpu() override;
reed@google.comac10a2d2010-12-22 21:39:39 +000058
joshualitt3322fa42014-11-07 08:48:51 -080059 GrContext* getContext() { return fContext; }
60 const GrContext* getContext() const { return fContext; }
61
62 /**
63 * Gets the capabilities of the draw target.
64 */
bsalomon4b91f762015-05-19 09:29:46 -070065 const GrCaps* caps() const { return fCaps.get(); }
Robert Phillipse42edcc2017-12-13 11:50:22 -050066 sk_sp<const GrCaps> refCaps() const { return fCaps; }
joshualitt3322fa42014-11-07 08:48:51 -080067
kkinnunencabe20c2015-06-01 01:37:26 -070068 GrPathRendering* pathRendering() { return fPathRendering.get(); }
kkinnunenccdaa042014-08-20 01:36:23 -070069
bsalomon6e2aad42016-04-01 11:54:31 -070070 enum class DisconnectType {
71 // No cleanup should be attempted, immediately cease making backend API calls
72 kAbandon,
73 // Free allocated resources (not known by GrResourceCache) before returning and
74 // ensure no backend backend 3D API calls will be made after disconnect() returns.
75 kCleanup,
76 };
77
78 // Called by GrContext when the underlying backend context is already or will be destroyed
79 // before GrContext.
80 virtual void disconnect(DisconnectType);
bsalomonc8dc1f72014-08-21 13:02:13 -070081
reed@google.comac10a2d2010-12-22 21:39:39 +000082 /**
83 * The GrGpu object normally assumes that no outsider is setting state
84 * within the underlying 3D API's context/device/whatever. This call informs
bsalomon@google.coma7f84e12011-03-10 14:13:19 +000085 * the GrGpu that the state was modified and it shouldn't make assumptions
86 * about the state.
reed@google.comac10a2d2010-12-22 21:39:39 +000087 */
mtkleinb9eb4ac2015-02-02 18:26:03 -080088 void markContextDirty(uint32_t state = kAll_GrBackendState) { fResetBits |= state; }
reed@google.comac10a2d2010-12-22 21:39:39 +000089
90 /**
bsalomon6d467ec2014-11-18 07:36:19 -080091 * Creates a texture object. If kRenderTarget_GrSurfaceFlag the texture can
92 * be used as a render target by calling GrTexture::asRenderTarget(). Not all
93 * pixel configs can be used as render targets. Support for configs as textures
bsalomon4b91f762015-05-19 09:29:46 -070094 * or render targets can be checked using GrCaps.
bsalomon@google.com1da07462011-03-10 14:51:57 +000095 *
Brian Salomon2a4f9832018-03-03 22:43:43 -050096 * @param desc describes the texture to be created.
97 * @param budgeted does this texture count against the resource cache budget?
98 * @param texelsOrigin origin of the texel data to be uploaded. Ignored if there is
99 * no initial texel data.
100 * @param texels array of mipmap levels containing texel data to load.
101 * Each level begins with full-size palette data for paletted textures.
102 * It contains width*height texels. If there is only one
103 * element and it contains nullptr fPixels, texture data is
104 * uninitialized.
Robert Phillips590533f2017-07-11 14:22:35 -0400105 * @param mipLevelCount the number of levels in 'texels'
halcanary96fcdcc2015-08-27 07:41:13 -0700106 * @return The texture object if successful, otherwise nullptr.
reed@google.comac10a2d2010-12-22 21:39:39 +0000107 */
Brian Salomon2a4f9832018-03-03 22:43:43 -0500108 sk_sp<GrTexture> createTexture(const GrSurfaceDesc&, SkBudgeted, GrSurfaceOrigin texelsOrigin,
Robert Phillips590533f2017-07-11 14:22:35 -0400109 const GrMipLevel texels[], int mipLevelCount);
cblume55f2d2d2016-02-26 13:20:48 -0800110
111 /**
bsalomone699d0c2016-03-09 06:25:15 -0800112 * Simplified createTexture() interface for when there is no initial texel data to upload.
cblume55f2d2d2016-02-26 13:20:48 -0800113 */
Robert Phillips16d8ec62017-07-27 16:16:25 -0400114 sk_sp<GrTexture> createTexture(const GrSurfaceDesc& desc, SkBudgeted);
bsalomone699d0c2016-03-09 06:25:15 -0800115
bsalomon@google.come269f212011-11-07 13:29:52 +0000116 /**
Brian Osman32342f02017-03-04 08:12:46 -0500117 * Implements GrResourceProvider::wrapBackendTexture
bsalomon@google.come269f212011-11-07 13:29:52 +0000118 */
Robert Phillipsb0e93a22017-08-29 08:26:54 -0400119 sk_sp<GrTexture> wrapBackendTexture(const GrBackendTexture&, GrWrapOwnership);
Brian Salomond17f6582017-07-19 18:28:58 -0400120
121 /**
122 * Implements GrResourceProvider::wrapRenderableBackendTexture
123 */
Robert Phillipsb0e93a22017-08-29 08:26:54 -0400124 sk_sp<GrTexture> wrapRenderableBackendTexture(const GrBackendTexture&,
Brian Salomond17f6582017-07-19 18:28:58 -0400125 int sampleCnt, GrWrapOwnership);
bsalomon@google.come269f212011-11-07 13:29:52 +0000126
127 /**
Brian Osman32342f02017-03-04 08:12:46 -0500128 * Implements GrResourceProvider::wrapBackendRenderTarget
bsalomon@google.come269f212011-11-07 13:29:52 +0000129 */
Robert Phillipsb0e93a22017-08-29 08:26:54 -0400130 sk_sp<GrRenderTarget> wrapBackendRenderTarget(const GrBackendRenderTarget&);
bsalomon@google.come269f212011-11-07 13:29:52 +0000131
132 /**
Brian Osman32342f02017-03-04 08:12:46 -0500133 * Implements GrResourceProvider::wrapBackendTextureAsRenderTarget
ericrkf7b8b8a2016-02-24 14:49:51 -0800134 */
Greg Daniel7ef28f32017-04-20 16:41:55 +0000135 sk_sp<GrRenderTarget> wrapBackendTextureAsRenderTarget(const GrBackendTexture&,
Greg Daniel7ef28f32017-04-20 16:41:55 +0000136 int sampleCnt);
ericrkf7b8b8a2016-02-24 14:49:51 -0800137
138 /**
csmartdalton485a1202016-07-13 10:16:32 -0700139 * Creates a buffer in GPU memory. For a client-side buffer use GrBuffer::CreateCPUBacked.
reed@google.comac10a2d2010-12-22 21:39:39 +0000140 *
cdaltone2e71c22016-04-07 18:13:29 -0700141 * @param size size of buffer to create.
142 * @param intendedType hint to the graphics subsystem about what the buffer will be used for.
143 * @param accessPattern hint to the graphics subsystem about how the data will be accessed.
cdalton1bf3e712016-04-19 10:00:02 -0700144 * @param data optional data with which to initialize the buffer.
cdaltone2e71c22016-04-07 18:13:29 -0700145 *
cdalton397536c2016-03-25 12:15:03 -0700146 * @return the buffer if successful, otherwise nullptr.
reed@google.comac10a2d2010-12-22 21:39:39 +0000147 */
cdalton1bf3e712016-04-19 10:00:02 -0700148 GrBuffer* createBuffer(size_t size, GrBufferType intendedType, GrAccessPattern accessPattern,
149 const void* data = nullptr);
halcanary9d524f22016-03-29 09:03:52 -0700150
reed@google.comac10a2d2010-12-22 21:39:39 +0000151 /**
bsalomon@google.com75f9f252012-01-31 13:35:56 +0000152 * Resolves MSAA.
153 */
Brian Salomon1fabd512018-02-09 09:54:25 -0500154 void resolveRenderTarget(GrRenderTarget*);
bsalomon@google.com75f9f252012-01-31 13:35:56 +0000155
bsalomonf0674512015-07-28 13:26:15 -0700156 /** Info struct returned by getReadPixelsInfo about performing intermediate draws before
bsalomon39826022015-07-23 08:07:21 -0700157 reading pixels for performance or correctness. */
158 struct ReadPixelTempDrawInfo {
Brian Salomonc320b152018-02-20 14:05:36 -0500159 /**
160 * If the GrGpu is requesting that the caller do a draw to an intermediate surface then
161 * this is descriptor for the temp surface. The draw should always be a rect with dst
162 * 0,0,w,h.
163 */
bsalomon39826022015-07-23 08:07:21 -0700164 GrSurfaceDesc fTempSurfaceDesc;
Brian Salomonc320b152018-02-20 14:05:36 -0500165 /**
166 * Indicates whether there is a performance advantage to using an exact match texture
167 * (in terms of width and height) for the intermediate texture instead of approximate.
168 */
bsalomonb117ff12016-07-19 07:24:40 -0700169 SkBackingFit fTempSurfaceFit;
Brian Salomonc320b152018-02-20 14:05:36 -0500170 /**
171 * Swizzle to apply during the draw. This is used to compensate for either feature or
172 * performance limitations in the underlying 3D API.
173 */
bsalomon6c9cd552016-01-22 07:17:34 -0800174 GrSwizzle fSwizzle;
Brian Salomonc320b152018-02-20 14:05:36 -0500175 /**
176 * The color type that should be used to read from the temp surface after the draw. This
177 * may be different than the original read color type in order to compensate for swizzling.
178 * The read data will effectively be in the original color type. The original gamma
179 * encoding is always used.
180 */
181 GrColorType fReadColorType;
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 {
Brian Salomonc320b152018-02-20 14:05:36 -0500186 /**
187 * On input means that the caller would proceed without draw if the GrGpu doesn't request
188 * one. On output means that the GrGpu is not requesting a draw.
189 */
bsalomon39826022015-07-23 08:07:21 -0700190 kNoDraw_DrawPreference,
Brian Salomonc320b152018-02-20 14:05:36 -0500191 /**
192 * Means that the client would prefer a draw for performance of the readback but
193 * can satisfy a straight readPixels call on the inputs without an intermediate draw.
194 * getReadPixelsInfo will never set the draw preference to this value but may leave
195 * it set.
196 */
bsalomon39826022015-07-23 08:07:21 -0700197 kCallerPrefersDraw_DrawPreference,
Brian Salomonc320b152018-02-20 14:05:36 -0500198 /**
199 * On output means that GrGpu would prefer a draw for performance of the readback but
200 * can satisfy a straight readPixels call on the inputs without an intermediate draw. The
201 * caller of getReadPixelsInfo should never specify this on intput.
202 */
bsalomon39826022015-07-23 08:07:21 -0700203 kGpuPrefersDraw_DrawPreference,
Brian Salomonc320b152018-02-20 14:05:36 -0500204 /**
205 * On input means that the caller requires a draw to do a transformation and there is no
206 * CPU fallback. On output means that GrGpu can only satisfy the readPixels request if the
207 * intermediate draw is performed.
208 */
bsalomon39826022015-07-23 08:07:21 -0700209 kRequireDraw_DrawPreference
210 };
211
bsalomonf0674512015-07-28 13:26:15 -0700212 /**
213 * Used to negotiate whether and how an intermediate draw should or must be performed before
214 * a readPixels call. If this returns false then GrGpu could not deduce an intermediate draw
215 * that would allow a successful readPixels call. The passed width, height, and rowBytes,
216 * must be non-zero and already reflect clipping to the src bounds.
217 */
Brian Salomonc320b152018-02-20 14:05:36 -0500218 bool getReadPixelsInfo(GrSurface*, GrSurfaceOrigin, int width, int height, size_t rowBytes,
219 GrColorType, GrSRGBConversion, DrawPreference*, ReadPixelTempDrawInfo*);
bsalomonf0674512015-07-28 13:26:15 -0700220
Brian Salomonc320b152018-02-20 14:05:36 -0500221 /**
222 * Info struct returned by getWritePixelsInfo about performing an intermediate draw in order
223 * to write pixels to a GrSurface for either performance or correctness reasons.
224 */
bsalomonf0674512015-07-28 13:26:15 -0700225 struct WritePixelTempDrawInfo {
Brian Salomonc320b152018-02-20 14:05:36 -0500226 /**
227 * If the GrGpu is requesting that the caller upload to an intermediate surface and draw
228 * that to the dst then this is the descriptor for the intermediate surface. The caller
229 * should upload the pixels such that the upper left pixel of the upload rect is at 0,0 in
230 * the intermediate surface
231 */
bsalomonf0674512015-07-28 13:26:15 -0700232 GrSurfaceDesc fTempSurfaceDesc;
Brian Salomonc320b152018-02-20 14:05:36 -0500233 /**
234 * Swizzle to apply during the draw. This is used to compensate for either feature or
235 * performance limitations in the underlying 3D API.
236 */
bsalomon6c9cd552016-01-22 07:17:34 -0800237 GrSwizzle fSwizzle;
Brian Salomonc320b152018-02-20 14:05:36 -0500238 /**
239 * The color type that should be specified when uploading the *original* data to the temp
240 * surface before the draw. This may be different than the original src color type in
241 * order to compensate for swizzling that will occur when drawing. The original gamma
242 * encoding is always used.
243 */
244 GrColorType fWriteColorType;
bsalomonf0674512015-07-28 13:26:15 -0700245 };
bsalomon39826022015-07-23 08:07:21 -0700246
bsalomon@google.com75f9f252012-01-31 13:35:56 +0000247 /**
bsalomonf0674512015-07-28 13:26:15 -0700248 * Used to negotiate whether and how an intermediate surface should be used to write pixels to
249 * a GrSurface. If this returns false then GrGpu could not deduce an intermediate draw
250 * that would allow a successful transfer of the src pixels to the dst. The passed width,
251 * height, and rowBytes, must be non-zero and already reflect clipping to the dst bounds.
bsalomon@google.com0a97be22011-11-08 19:20:57 +0000252 */
Brian Salomonc320b152018-02-20 14:05:36 -0500253 bool getWritePixelsInfo(GrSurface*, GrSurfaceOrigin, int width, int height, GrColorType,
254 GrSRGBConversion, DrawPreference*, WritePixelTempDrawInfo*);
bsalomon@google.coma85449d2011-11-19 02:36:05 +0000255
256 /**
Brian Salomon9b009bb2018-02-14 13:53:55 -0500257 * Reads a rectangle of pixels from a render target. No sRGB/linear conversions are performed.
bsalomon@google.comc4364992011-11-07 15:54:49 +0000258 *
bsalomon6cb3cbe2015-07-30 07:34:27 -0700259 * @param surface The surface to read from
bsalomon@google.com669fdc42011-04-05 17:08:27 +0000260 * @param left left edge of the rectangle to read (inclusive)
261 * @param top top edge of the rectangle to read (inclusive)
262 * @param width width of rectangle to read in pixels.
263 * @param height height of rectangle to read in pixels.
Brian Salomonc320b152018-02-20 14:05:36 -0500264 * @param dstColorType the color type of the destination buffer.
bsalomon@google.com669fdc42011-04-05 17:08:27 +0000265 * @param buffer memory to read the rectangle into.
bsalomon@google.comc6980972011-11-02 19:57:21 +0000266 * @param rowBytes the number of bytes between consecutive rows. Zero
267 * means rows are tightly packed.
bsalomon@google.comc4364992011-11-07 15:54:49 +0000268 * @param invertY buffer should be populated bottom-to-top as opposed
269 * to top-to-bottom (skia's usual order)
bsalomon@google.coma7f84e12011-03-10 14:13:19 +0000270 *
271 * @return true if the read succeeded, false if not. The read can fail
272 * because of a unsupported pixel config or because no render
273 * target is currently set.
274 */
Brian Salomon9b009bb2018-02-14 13:53:55 -0500275 bool readPixels(GrSurface* surface, GrSurfaceOrigin, int left, int top, int width, int height,
Brian Salomonc320b152018-02-20 14:05:36 -0500276 GrColorType dstColorType, void* buffer, size_t rowBytes);
reed@google.comac10a2d2010-12-22 21:39:39 +0000277
bsalomon@google.com6f379512011-11-16 20:36:03 +0000278 /**
Brian Salomon9b009bb2018-02-14 13:53:55 -0500279 * Updates the pixels in a rectangle of a surface. No sRGB/linear conversions are performed.
bsalomon@google.coma85449d2011-11-19 02:36:05 +0000280 *
bsalomon6cb3cbe2015-07-30 07:34:27 -0700281 * @param surface The surface to write to.
bsalomon@google.com6f379512011-11-16 20:36:03 +0000282 * @param left left edge of the rectangle to write (inclusive)
283 * @param top top edge of the rectangle to write (inclusive)
284 * @param width width of rectangle to write in pixels.
285 * @param height height of rectangle to write in pixels.
Brian Salomonc320b152018-02-20 14:05:36 -0500286 * @param srcColorType the color type of the source buffer.
cblume55f2d2d2016-02-26 13:20:48 -0800287 * @param texels array of mipmap levels containing texture data
Robert Phillips590533f2017-07-11 14:22:35 -0400288 * @param mipLevelCount number of levels in 'texels'
cblume55f2d2d2016-02-26 13:20:48 -0800289 */
Brian Salomonc320b152018-02-20 14:05:36 -0500290 bool writePixels(GrSurface* surface, GrSurfaceOrigin origin, int left, int top, int width,
291 int height, GrColorType srcColorType, const GrMipLevel texels[],
292 int mipLevelCount);
cblume55f2d2d2016-02-26 13:20:48 -0800293
294 /**
295 * This function is a shim which creates a SkTArray<GrMipLevel> of size 1.
296 * It then calls writePixels with that SkTArray.
bsalomon@google.com6f379512011-11-16 20:36:03 +0000297 */
Brian Salomonc320b152018-02-20 14:05:36 -0500298 bool writePixels(GrSurface*, GrSurfaceOrigin, int left, int top, int width, int height,
299 GrColorType, const void* buffer, size_t rowBytes);
bsalomon@google.com6f379512011-11-16 20:36:03 +0000300
joshualitt3322fa42014-11-07 08:48:51 -0800301 /**
Brian Salomon5f33a8c2018-02-26 14:32:39 -0500302 * This version of writePixels doesn't take an origin. TODO: Remove origin handling from
303 * GrGpu::writePixels entirely.
304 */
305 bool writePixels(GrSurface* surface, int left, int top, int width, int height,
306 GrColorType srcColorType, const void* buffer, size_t rowBytes) {
307 return this->writePixels(surface, kTopLeft_GrSurfaceOrigin, left, top, width, height,
308 srcColorType, buffer, rowBytes);
309 }
310
311 /**
Jim Van Verth2e5eaf02017-06-21 15:55:46 -0400312 * Updates the pixels in a rectangle of a texture using a buffer
jvanverth17aa0472016-01-05 10:41:27 -0800313 *
Jim Van Verth2e5eaf02017-06-21 15:55:46 -0400314 * There are a couple of assumptions here. First, we only update the top miplevel.
315 * And second, that any y flip needed has already been done in the buffer.
316 *
317 * @param texture The texture to write to.
cdalton397536c2016-03-25 12:15:03 -0700318 * @param left left edge of the rectangle to write (inclusive)
319 * @param top top edge of the rectangle to write (inclusive)
320 * @param width width of rectangle to write in pixels.
321 * @param height height of rectangle to write in pixels.
Brian Salomonc320b152018-02-20 14:05:36 -0500322 * @param bufferColorType the color type of the transfer buffer's pixel data
Jim Van Verth2e5eaf02017-06-21 15:55:46 -0400323 * @param transferBuffer GrBuffer to read pixels from (type must be "kXferCpuToGpu")
cdalton397536c2016-03-25 12:15:03 -0700324 * @param offset offset from the start of the buffer
Jim Van Verth2e5eaf02017-06-21 15:55:46 -0400325 * @param rowBytes number of bytes between consecutive rows in the buffer. Zero
cdalton397536c2016-03-25 12:15:03 -0700326 * means rows are tightly packed.
jvanverth17aa0472016-01-05 10:41:27 -0800327 */
Brian Salomon9b009bb2018-02-14 13:53:55 -0500328 bool transferPixels(GrTexture* texture, int left, int top, int width, int height,
Brian Salomonc320b152018-02-20 14:05:36 -0500329 GrColorType bufferColorType, GrBuffer* transferBuffer, size_t offset,
Brian Salomon9b009bb2018-02-14 13:53:55 -0500330 size_t rowBytes);
jvanverth17aa0472016-01-05 10:41:27 -0800331
bsalomon@google.com80d09b92011-11-05 21:21:13 +0000332 // After the client interacts directly with the 3D context state the GrGpu
333 // must resync its internal state and assumptions about 3D context state.
334 // Each time this occurs the GrGpu bumps a timestamp.
335 // state of the 3D context
336 // At 10 resets / frame and 60fps a 64bit timestamp will overflow in about
337 // a billion years.
338 typedef uint64_t ResetTimestamp;
339
340 // This timestamp is always older than the current timestamp
341 static const ResetTimestamp kExpiredTimestamp = 0;
342 // Returns a timestamp based on the number of times the context was reset.
343 // This timestamp can be used to lazily detect when cached 3D context state
344 // is dirty.
bsalomon6d467ec2014-11-18 07:36:19 -0800345 ResetTimestamp getResetTimestamp() const { return fResetTimestamp; }
bsalomon@google.com80d09b92011-11-05 21:21:13 +0000346
bsalomonf90a02b2014-11-26 12:28:00 -0800347 // 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 -0400348 // take place at the GrOpList level and this function implement faster copy paths. The rect
bsalomonf90a02b2014-11-26 12:28:00 -0800349 // and point are pre-clipped. The src rect and implied dst rect are guaranteed to be within the
350 // src/dst bounds and non-empty.
Robert Phillipsb0e93a22017-08-29 08:26:54 -0400351 bool copySurface(GrSurface* dst, GrSurfaceOrigin dstOrigin,
352 GrSurface* src, GrSurfaceOrigin srcOrigin,
joshualitt1cbdcde2015-08-21 11:53:29 -0700353 const SkIRect& srcRect,
354 const SkIPoint& dstPoint);
joshualitt3322fa42014-11-07 08:48:51 -0800355
Greg Daniel500d58b2017-08-24 15:59:33 -0400356 // Creates a GrGpuRTCommandBuffer which GrOpLists send draw commands to instead of directly
357 // to the Gpu object.
358 virtual GrGpuRTCommandBuffer* createCommandBuffer(
Robert Phillips95214472017-08-08 18:00:03 -0400359 GrRenderTarget*, GrSurfaceOrigin,
Greg Daniel500d58b2017-08-24 15:59:33 -0400360 const GrGpuRTCommandBuffer::LoadAndStoreInfo&,
361 const GrGpuRTCommandBuffer::StencilLoadAndStoreInfo&) = 0;
362
363 // Creates a GrGpuTextureCommandBuffer which GrOpLists send texture commands to instead of
364 // directly to the Gpu object.
365 virtual GrGpuTextureCommandBuffer* createCommandBuffer(GrTexture*, GrSurfaceOrigin) = 0;
bsalomon3e791242014-12-17 13:43:13 -0800366
Robert Phillips18e94842017-05-15 13:06:44 -0400367 // Called by GrDrawingManager when flushing.
Greg Daniel51316782017-08-02 15:10:09 +0000368 // Provides a hook for post-flush actions (e.g. Vulkan command buffer submits). This will also
369 // insert any numSemaphore semaphores on the gpu and set the backendSemaphores to match the
370 // inserted semaphores.
371 GrSemaphoresSubmitted finishFlush(int numSemaphores, GrBackendSemaphore backendSemaphores[]);
ethannicholas22793252016-01-30 09:59:10 -0800372
Greg Daniel6be35232017-03-01 17:01:09 -0500373 virtual GrFence SK_WARN_UNUSED_RESULT insertFence() = 0;
374 virtual bool waitFence(GrFence, uint64_t timeout = 1000) = 0;
jvanverth84741b32016-09-30 08:39:02 -0700375 virtual void deleteFence(GrFence) const = 0;
376
Greg Daniela5cb7812017-06-16 09:45:32 -0400377 virtual sk_sp<GrSemaphore> SK_WARN_UNUSED_RESULT makeSemaphore(bool isOwned = true) = 0;
Greg Daniel48661b82018-01-22 16:11:35 -0500378 virtual sk_sp<GrSemaphore> wrapBackendSemaphore(const GrBackendSemaphore& semaphore,
379 GrResourceProvider::SemaphoreWrapType wrapType,
380 GrWrapOwnership ownership) = 0;
381 virtual void insertSemaphore(sk_sp<GrSemaphore> semaphore, bool flush = false) = 0;
382 virtual void waitSemaphore(sk_sp<GrSemaphore> semaphore) = 0;
Greg Daniel6be35232017-03-01 17:01:09 -0500383
Brian Osman13dddce2017-05-09 13:19:50 -0400384 /**
385 * Put this texture in a safe and known state for use across multiple GrContexts. Depending on
386 * the backend, this may return a GrSemaphore. If so, other contexts should wait on that
387 * semaphore before using this texture.
388 */
389 virtual sk_sp<GrSemaphore> prepareTextureForCrossContextUsage(GrTexture*) = 0;
390
mtkleinb9eb4ac2015-02-02 18:26:03 -0800391 ///////////////////////////////////////////////////////////////////////////
392 // Debugging and Stats
393
394 class Stats {
395 public:
396#if GR_GPU_STATS
397 Stats() { this->reset(); }
398
bsalomonb12ea412015-02-02 21:19:50 -0800399 void reset() {
400 fRenderTargetBinds = 0;
401 fShaderCompilations = 0;
402 fTextureCreates = 0;
403 fTextureUploads = 0;
jvanverth17aa0472016-01-05 10:41:27 -0800404 fTransfersToTexture = 0;
egdaniel8dc7c3a2015-04-16 11:22:42 -0700405 fStencilAttachmentCreates = 0;
joshualitt87a5c9f2015-09-08 13:42:05 -0700406 fNumDraws = 0;
bsalomon1d417a82016-03-23 11:50:26 -0700407 fNumFailedDraws = 0;
bsalomonb12ea412015-02-02 21:19:50 -0800408 }
mtkleinb9eb4ac2015-02-02 18:26:03 -0800409
410 int renderTargetBinds() const { return fRenderTargetBinds; }
411 void incRenderTargetBinds() { fRenderTargetBinds++; }
412 int shaderCompilations() const { return fShaderCompilations; }
413 void incShaderCompilations() { fShaderCompilations++; }
bsalomonb12ea412015-02-02 21:19:50 -0800414 int textureCreates() const { return fTextureCreates; }
415 void incTextureCreates() { fTextureCreates++; }
416 int textureUploads() const { return fTextureUploads; }
417 void incTextureUploads() { fTextureUploads++; }
jvanverth17aa0472016-01-05 10:41:27 -0800418 int transfersToTexture() const { return fTransfersToTexture; }
419 void incTransfersToTexture() { fTransfersToTexture++; }
egdaniel8dc7c3a2015-04-16 11:22:42 -0700420 void incStencilAttachmentCreates() { fStencilAttachmentCreates++; }
joshualitt87a5c9f2015-09-08 13:42:05 -0700421 void incNumDraws() { fNumDraws++; }
bsalomon1d417a82016-03-23 11:50:26 -0700422 void incNumFailedDraws() { ++fNumFailedDraws; }
mtkleinb9eb4ac2015-02-02 18:26:03 -0800423 void dump(SkString*);
joshualitte45c81c2015-12-02 09:05:37 -0800424 void dumpKeyValuePairs(SkTArray<SkString>* keys, SkTArray<double>* values);
bsalomon1d417a82016-03-23 11:50:26 -0700425 int numDraws() const { return fNumDraws; }
426 int numFailedDraws() const { return fNumFailedDraws; }
mtkleinb9eb4ac2015-02-02 18:26:03 -0800427 private:
428 int fRenderTargetBinds;
429 int fShaderCompilations;
bsalomonb12ea412015-02-02 21:19:50 -0800430 int fTextureCreates;
431 int fTextureUploads;
jvanverth17aa0472016-01-05 10:41:27 -0800432 int fTransfersToTexture;
egdaniel8dc7c3a2015-04-16 11:22:42 -0700433 int fStencilAttachmentCreates;
joshualitt87a5c9f2015-09-08 13:42:05 -0700434 int fNumDraws;
bsalomon1d417a82016-03-23 11:50:26 -0700435 int fNumFailedDraws;
mtkleinb9eb4ac2015-02-02 18:26:03 -0800436#else
joshualitte45c81c2015-12-02 09:05:37 -0800437 void dump(SkString*) {}
438 void dumpKeyValuePairs(SkTArray<SkString>*, SkTArray<double>*) {}
mtkleinb9eb4ac2015-02-02 18:26:03 -0800439 void incRenderTargetBinds() {}
440 void incShaderCompilations() {}
bsalomonb12ea412015-02-02 21:19:50 -0800441 void incTextureCreates() {}
442 void incTextureUploads() {}
jvanverth17aa0472016-01-05 10:41:27 -0800443 void incTransfersToTexture() {}
egdaniel8dc7c3a2015-04-16 11:22:42 -0700444 void incStencilAttachmentCreates() {}
joshualitt87a5c9f2015-09-08 13:42:05 -0700445 void incNumDraws() {}
bsalomon1d417a82016-03-23 11:50:26 -0700446 void incNumFailedDraws() {}
mtkleinb9eb4ac2015-02-02 18:26:03 -0800447#endif
448 };
449
450 Stats* stats() { return &fStats; }
Brian Osman71a18892017-08-10 10:23:25 -0400451 void dumpJSON(SkJSONWriter*) const;
mtkleinb9eb4ac2015-02-02 18:26:03 -0800452
bsalomon67d76202015-11-11 12:40:42 -0800453 /** Creates a texture directly in the backend API without wrapping it in a GrTexture. This is
454 only to be used for testing (particularly for testing the methods that import an externally
455 created texture into Skia. Must be matched with a call to deleteTestingOnlyTexture(). */
Brian Salomonbdecacf2018-02-02 20:32:49 -0500456 GrBackendTexture createTestingOnlyBackendTexture(void* pixels, int w, int h, SkColorType,
457 bool isRenderTarget, GrMipMapped);
458
459 /** Older version based on GrPixelConfig. Currently the preferred one above devolves to this. */
Robert Phillipsd21b2a52017-12-12 13:01:25 -0500460 virtual GrBackendTexture createTestingOnlyBackendTexture(
461 void* pixels, int w, int h,
462 GrPixelConfig config,
463 bool isRenderTarget,
464 GrMipMapped mipMapped) = 0;
465 /** Check a handle represents an actual texture in the backend API that has not been freed. */
466 virtual bool isTestingOnlyBackendTexture(const GrBackendTexture&) 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(GrBackendTexture*,
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
Robert Phillips95214472017-08-08 18:00:03 -0400480 virtual void clearStencil(GrRenderTarget* target, int clearValue) = 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 Salomon2bbdcc42017-09-07 12:36:34 -0400483 // GrSamplerState. 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, ...).
Brian Salomon2bbdcc42017-09-07 12:36:34 -0400485 bool isACopyNeededForTextureParams(int width, int height, const GrSamplerState&,
Robert Phillips81444fb2017-03-21 09:14:35 -0400486 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.
Brian Salomon2bbdcc42017-09-07 12:36:34 -0400493 bool isACopyNeededForTextureParams(GrTextureProxy* proxy, const GrSamplerState& 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
Brian Salomon1fabd512018-02-09 09:54:25 -0500526 // Handles cases where a surface will be updated without a call to flushRenderTarget.
527 void didWriteToSurface(GrSurface* surface, GrSurfaceOrigin origin, const SkIRect* bounds,
528 uint32_t mipLevels = 1) const;
jvanverth900bd4a2016-04-29 13:53:12 -0700529
Ben Wagner145dbcd2016-11-03 14:40:50 -0400530 Stats fStats;
531 std::unique_ptr<GrPathRendering> fPathRendering;
joshualitt3322fa42014-11-07 08:48:51 -0800532 // Subclass must initialize this in its constructor.
Hal Canary144caf52016-11-07 17:57:18 -0500533 sk_sp<const GrCaps> fCaps;
joshualitt3322fa42014-11-07 08:48:51 -0800534
csmartdalton0d28e572016-07-06 09:59:43 -0700535 typedef SkTArray<SkPoint, true> SamplePattern;
536
bsalomon@google.com02ddc8b2013-01-28 15:35:28 +0000537private:
bsalomon@google.comb635d392011-11-05 12:47:43 +0000538 // called when the 3D context state is unknown. Subclass should emit any
bsalomon@google.comc8f7f472012-06-18 13:44:51 +0000539 // assumed 3D context state and dirty any state cache.
bsalomon@google.com0a208a12013-06-28 18:57:35 +0000540 virtual void onResetContext(uint32_t resetBits) = 0;
bsalomon@google.coma7f84e12011-03-10 14:13:19 +0000541
bsalomoncb02b382015-08-12 11:14:50 -0700542 // Called before certain draws in order to guarantee coherent results from dst reads.
543 virtual void xferBarrier(GrRenderTarget*, GrXferBarrierType) = 0;
544
bsalomon@google.com16e3dde2012-10-25 18:43:28 +0000545 // overridden by backend-specific derived class to create objects.
egdanielb0e1be22015-04-22 13:27:39 -0700546 // Texture size and sample size will have already been validated in base class before
Robert Phillips92de6312017-05-23 07:43:48 -0400547 // onCreateTexture is called.
Robert Phillips16d8ec62017-07-27 16:16:25 -0400548 virtual sk_sp<GrTexture> onCreateTexture(const GrSurfaceDesc&, SkBudgeted,
Brian Salomon2a4f9832018-03-03 22:43:43 -0500549 GrSurfaceOrigin texelsOrigin,
550 const GrMipLevel texels[], int mipLevelCount) = 0;
cblume55f2d2d2016-02-26 13:20:48 -0800551
Robert Phillipsb0e93a22017-08-29 08:26:54 -0400552 virtual sk_sp<GrTexture> onWrapBackendTexture(const GrBackendTexture&, GrWrapOwnership) = 0;
Brian Salomond17f6582017-07-19 18:28:58 -0400553 virtual sk_sp<GrTexture> onWrapRenderableBackendTexture(const GrBackendTexture&,
Brian Salomond17f6582017-07-19 18:28:58 -0400554 int sampleCnt,
555 GrWrapOwnership) = 0;
Robert Phillipsb0e93a22017-08-29 08:26:54 -0400556 virtual sk_sp<GrRenderTarget> onWrapBackendRenderTarget(const GrBackendRenderTarget&) = 0;
Greg Daniel7ef28f32017-04-20 16:41:55 +0000557 virtual sk_sp<GrRenderTarget> onWrapBackendTextureAsRenderTarget(const GrBackendTexture&,
Robert Phillipsb0e93a22017-08-29 08:26:54 -0400558 int sampleCnt) = 0;
cdalton1bf3e712016-04-19 10:00:02 -0700559 virtual GrBuffer* onCreateBuffer(size_t size, GrBufferType intendedType, GrAccessPattern,
560 const void* data) = 0;
bsalomon@google.coma7f84e12011-03-10 14:13:19 +0000561
Brian Salomon2bbdcc42017-09-07 12:36:34 -0400562 virtual bool onIsACopyNeededForTextureParams(GrTextureProxy* proxy, const GrSamplerState&,
Robert Phillips81444fb2017-03-21 09:14:35 -0400563 GrTextureProducer::CopyParams*,
564 SkScalar scaleAdjust[2]) const {
565 return false;
566 }
bsalomone179a912016-01-20 06:18:10 -0800567
Brian Salomon9b009bb2018-02-14 13:53:55 -0500568 virtual bool onGetReadPixelsInfo(GrSurface*, GrSurfaceOrigin, int width, int height,
Brian Salomonc320b152018-02-20 14:05:36 -0500569 size_t rowBytes, GrColorType, DrawPreference*,
bsalomonf0674512015-07-28 13:26:15 -0700570 ReadPixelTempDrawInfo*) = 0;
Brian Salomon9b009bb2018-02-14 13:53:55 -0500571 virtual bool onGetWritePixelsInfo(GrSurface*, GrSurfaceOrigin, int width, int height,
Brian Salomonc320b152018-02-20 14:05:36 -0500572 GrColorType, DrawPreference*, WritePixelTempDrawInfo*) = 0;
bsalomonf0674512015-07-28 13:26:15 -0700573
bsalomon6cb3cbe2015-07-30 07:34:27 -0700574 // overridden by backend-specific derived class to perform the surface read
Brian Salomonc320b152018-02-20 14:05:36 -0500575 virtual bool onReadPixels(GrSurface*, GrSurfaceOrigin, int left, int top, int width, int height,
576 GrColorType, void* buffer, size_t rowBytes) = 0;
bsalomon@google.coma7f84e12011-03-10 14:13:19 +0000577
bsalomon6cb3cbe2015-07-30 07:34:27 -0700578 // overridden by backend-specific derived class to perform the surface write
Brian Salomonc320b152018-02-20 14:05:36 -0500579 virtual bool onWritePixels(GrSurface*, GrSurfaceOrigin, int left, int top, int width,
580 int height, GrColorType, const GrMipLevel texels[],
581 int mipLevelCount) = 0;
bsalomon@google.com6f379512011-11-16 20:36:03 +0000582
Jim Van Verth2e5eaf02017-06-21 15:55:46 -0400583 // overridden by backend-specific derived class to perform the texture transfer
Brian Salomonc320b152018-02-20 14:05:36 -0500584 virtual bool onTransferPixels(GrTexture*, int left, int top, int width, int height,
585 GrColorType colorType, GrBuffer* transferBuffer, size_t offset,
586 size_t rowBytes) = 0;
jvanverth17aa0472016-01-05 10:41:27 -0800587
bsalomon@google.com16e3dde2012-10-25 18:43:28 +0000588 // overridden by backend-specific derived class to perform the resolve
Brian Salomon1fabd512018-02-09 09:54:25 -0500589 virtual void onResolveRenderTarget(GrRenderTarget* target) = 0;
bsalomon@google.com75f9f252012-01-31 13:35:56 +0000590
joshualitt1cbdcde2015-08-21 11:53:29 -0700591 // overridden by backend specific derived class to perform the copy surface
Robert Phillipsb0e93a22017-08-29 08:26:54 -0400592 virtual bool onCopySurface(GrSurface* dst, GrSurfaceOrigin dstOrigin,
593 GrSurface* src, GrSurfaceOrigin srcOrigin,
594 const SkIRect& srcRect, const SkIPoint& dstPoint) = 0;
joshualitt1cbdcde2015-08-21 11:53:29 -0700595
Greg Daniel51316782017-08-02 15:10:09 +0000596 virtual void onFinishFlush(bool insertedSemaphores) = 0;
597
Brian Osman71a18892017-08-10 10:23:25 -0400598 virtual void onDumpJSON(SkJSONWriter*) const {}
599
bsalomon@google.comb635d392011-11-05 12:47:43 +0000600 void resetContext() {
bsalomon@google.com0a208a12013-06-28 18:57:35 +0000601 this->onResetContext(fResetBits);
602 fResetBits = 0;
bsalomon@google.comb635d392011-11-05 12:47:43 +0000603 ++fResetTimestamp;
604 }
605
Chris Dalton535ba8d2018-02-20 09:51:59 -0700606 ResetTimestamp fResetTimestamp;
607 uint32_t fResetBits;
joshualitt3322fa42014-11-07 08:48:51 -0800608 // The context owns us, not vice-versa, so this ptr is not ref'ed by Gpu.
Chris Dalton535ba8d2018-02-20 09:51:59 -0700609 GrContext* fContext;
bsalomon@google.com02ddc8b2013-01-28 15:35:28 +0000610
kkinnunencabe20c2015-06-01 01:37:26 -0700611 friend class GrPathRendering;
joshualitt3322fa42014-11-07 08:48:51 -0800612 typedef SkRefCnt INHERITED;
reed@google.comac10a2d2010-12-22 21:39:39 +0000613};
614
615#endif