blob: 897f2b87370a0dc4614a51f7ae87ca194ff955a9 [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;
cdalton397536c2016-03-25 12:15:03 -070024class GrBuffer;
bsalomon@google.com669fdc42011-04-05 17:08:27 +000025class GrContext;
robertphillips28a838e2016-06-23 14:07:00 -070026struct GrContextOptions;
reedf9ad5582015-06-25 21:29:25 -070027class GrGLContext;
Chris Daltonbca46e22017-05-15 11:03:26 -060028class GrMesh;
bsalomon@google.com64aef2b2012-06-11 15:36:13 +000029class GrPath;
cdaltonb85a0aa2014-07-21 15:32:44 -070030class GrPathRange;
bsalomon@google.com30085192011-08-19 15:42:31 +000031class GrPathRenderer;
32class GrPathRendererChain;
kkinnunencabe20c2015-06-01 01:37:26 -070033class GrPathRendering;
egdaniel8dd688b2015-01-22 10:16:09 -080034class GrPipeline;
joshualitt873ad0e2015-01-20 09:08:51 -080035class GrPrimitiveProcessor;
kkinnunencabe20c2015-06-01 01:37:26 -070036class GrRenderTarget;
Greg Daniel6be35232017-03-01 17:01:09 -050037class GrSemaphore;
egdaniel8dc7c3a2015-04-16 11:22:42 -070038class GrStencilAttachment;
cdalton93a379b2016-05-11 13:58:08 -070039class GrStencilSettings;
kkinnunencabe20c2015-06-01 01:37:26 -070040class GrSurface;
41class GrTexture;
reed@google.comac10a2d2010-12-22 21:39:39 +000042
Robert Phillipse3302df2017-04-24 07:31:02 -040043namespace gr_instanced {
44 class InstancedOp;
45 class InstancedRendering;
46 class OpAllocator;
47}
csmartdaltona7f29642016-07-07 08:49:11 -070048
joshualitt3322fa42014-11-07 08:48:51 -080049class GrGpu : public SkRefCnt {
reed@google.comac10a2d2010-12-22 21:39:39 +000050public:
51 /**
bsalomon@google.com16e3dde2012-10-25 18:43:28 +000052 * Create an instance of GrGpu that matches the specified backend. If the requested backend is
halcanary96fcdcc2015-08-27 07:41:13 -070053 * not supported (at compile-time or run-time) this returns nullptr. The context will not be
bsalomon@google.com6e4e6502013-02-25 20:12:45 +000054 * fully constructed and should not be used by GrGpu until after this function returns.
reed@google.comac10a2d2010-12-22 21:39:39 +000055 */
bsalomon682c2692015-05-22 14:01:46 -070056 static GrGpu* Create(GrBackend, GrBackendContext, const GrContextOptions&, GrContext* context);
reed@google.comac10a2d2010-12-22 21:39:39 +000057
58 ////////////////////////////////////////////////////////////////////////////
59
bsalomon@google.com6e4e6502013-02-25 20:12:45 +000060 GrGpu(GrContext* context);
mtklein36352bf2015-03-25 18:17:31 -070061 ~GrGpu() override;
reed@google.comac10a2d2010-12-22 21:39:39 +000062
joshualitt3322fa42014-11-07 08:48:51 -080063 GrContext* getContext() { return fContext; }
64 const GrContext* getContext() const { return fContext; }
65
66 /**
67 * Gets the capabilities of the draw target.
68 */
bsalomon4b91f762015-05-19 09:29:46 -070069 const GrCaps* caps() const { return fCaps.get(); }
joshualitt3322fa42014-11-07 08:48:51 -080070
kkinnunencabe20c2015-06-01 01:37:26 -070071 GrPathRendering* pathRendering() { return fPathRendering.get(); }
kkinnunenccdaa042014-08-20 01:36:23 -070072
bsalomon6e2aad42016-04-01 11:54:31 -070073 enum class DisconnectType {
74 // No cleanup should be attempted, immediately cease making backend API calls
75 kAbandon,
76 // Free allocated resources (not known by GrResourceCache) before returning and
77 // ensure no backend backend 3D API calls will be made after disconnect() returns.
78 kCleanup,
79 };
80
81 // Called by GrContext when the underlying backend context is already or will be destroyed
82 // before GrContext.
83 virtual void disconnect(DisconnectType);
bsalomonc8dc1f72014-08-21 13:02:13 -070084
reed@google.comac10a2d2010-12-22 21:39:39 +000085 /**
86 * The GrGpu object normally assumes that no outsider is setting state
87 * within the underlying 3D API's context/device/whatever. This call informs
bsalomon@google.coma7f84e12011-03-10 14:13:19 +000088 * the GrGpu that the state was modified and it shouldn't make assumptions
89 * about the state.
reed@google.comac10a2d2010-12-22 21:39:39 +000090 */
mtkleinb9eb4ac2015-02-02 18:26:03 -080091 void markContextDirty(uint32_t state = kAll_GrBackendState) { fResetBits |= state; }
reed@google.comac10a2d2010-12-22 21:39:39 +000092
93 /**
bsalomon6d467ec2014-11-18 07:36:19 -080094 * Creates a texture object. If kRenderTarget_GrSurfaceFlag the texture can
95 * be used as a render target by calling GrTexture::asRenderTarget(). Not all
96 * pixel configs can be used as render targets. Support for configs as textures
bsalomon4b91f762015-05-19 09:29:46 -070097 * or render targets can be checked using GrCaps.
bsalomon@google.com1da07462011-03-10 14:51:57 +000098 *
reed@google.comac10a2d2010-12-22 21:39:39 +000099 * @param desc describes the texture to be created.
bsalomon5236cf42015-01-14 10:42:08 -0800100 * @param budgeted does this texture count against the resource cache budget?
cblume55f2d2d2016-02-26 13:20:48 -0800101 * @param texels array of mipmap levels containing texel data to load.
102 * Each level begins with full-size palette data for paletted textures.
Robert Phillips92de6312017-05-23 07:43:48 -0400103 * It contains width*height texels. If there is only one
cblume55f2d2d2016-02-26 13:20:48 -0800104 * element and it contains nullptr fPixels, texture data is
105 * uninitialized.
halcanary96fcdcc2015-08-27 07:41:13 -0700106 * @return The texture object if successful, otherwise nullptr.
reed@google.comac10a2d2010-12-22 21:39:39 +0000107 */
bsalomon5ec26ae2016-02-25 08:33:02 -0800108 GrTexture* createTexture(const GrSurfaceDesc& desc, SkBudgeted budgeted,
cblume55f2d2d2016-02-26 13:20:48 -0800109 const SkTArray<GrMipLevel>& texels);
110
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 */
bsalomone699d0c2016-03-09 06:25:15 -0800114 GrTexture* createTexture(const GrSurfaceDesc& desc, SkBudgeted budgeted) {
115 return this->createTexture(desc, budgeted, SkTArray<GrMipLevel>());
116 }
117
118 /** Simplified createTexture() interface for when there is only a base level */
119 GrTexture* createTexture(const GrSurfaceDesc& desc, SkBudgeted budgeted, const void* level0Data,
120 size_t rowBytes) {
121 SkASSERT(level0Data);
122 GrMipLevel level = { level0Data, rowBytes };
123 SkSTArray<1, GrMipLevel> array;
124 array.push_back() = level;
125 return this->createTexture(desc, budgeted, array);
126 }
bsalomond3312592016-03-04 07:06:43 -0800127
bsalomon@google.come269f212011-11-07 13:29:52 +0000128 /**
Brian Osman32342f02017-03-04 08:12:46 -0500129 * Implements GrResourceProvider::wrapBackendTexture
bsalomon@google.come269f212011-11-07 13:29:52 +0000130 */
Greg Daniel7ef28f32017-04-20 16:41:55 +0000131 sk_sp<GrTexture> wrapBackendTexture(const GrBackendTexture&, GrSurfaceOrigin,
132 GrBackendTextureFlags, int sampleCnt, GrWrapOwnership);
bsalomon@google.come269f212011-11-07 13:29:52 +0000133
134 /**
Brian Osman32342f02017-03-04 08:12:46 -0500135 * Implements GrResourceProvider::wrapBackendRenderTarget
bsalomon@google.come269f212011-11-07 13:29:52 +0000136 */
Greg Danielbcf612b2017-05-01 13:50:58 +0000137 sk_sp<GrRenderTarget> wrapBackendRenderTarget(const GrBackendRenderTarget&, GrSurfaceOrigin);
bsalomon@google.come269f212011-11-07 13:29:52 +0000138
139 /**
Brian Osman32342f02017-03-04 08:12:46 -0500140 * Implements GrResourceProvider::wrapBackendTextureAsRenderTarget
ericrkf7b8b8a2016-02-24 14:49:51 -0800141 */
Greg Daniel7ef28f32017-04-20 16:41:55 +0000142 sk_sp<GrRenderTarget> wrapBackendTextureAsRenderTarget(const GrBackendTexture&,
143 GrSurfaceOrigin,
144 int sampleCnt);
ericrkf7b8b8a2016-02-24 14:49:51 -0800145
146 /**
csmartdalton485a1202016-07-13 10:16:32 -0700147 * Creates a buffer in GPU memory. For a client-side buffer use GrBuffer::CreateCPUBacked.
reed@google.comac10a2d2010-12-22 21:39:39 +0000148 *
cdaltone2e71c22016-04-07 18:13:29 -0700149 * @param size size of buffer to create.
150 * @param intendedType hint to the graphics subsystem about what the buffer will be used for.
151 * @param accessPattern hint to the graphics subsystem about how the data will be accessed.
cdalton1bf3e712016-04-19 10:00:02 -0700152 * @param data optional data with which to initialize the buffer.
cdaltone2e71c22016-04-07 18:13:29 -0700153 *
cdalton397536c2016-03-25 12:15:03 -0700154 * @return the buffer if successful, otherwise nullptr.
reed@google.comac10a2d2010-12-22 21:39:39 +0000155 */
cdalton1bf3e712016-04-19 10:00:02 -0700156 GrBuffer* createBuffer(size_t size, GrBufferType intendedType, GrAccessPattern accessPattern,
157 const void* data = nullptr);
halcanary9d524f22016-03-29 09:03:52 -0700158
reed@google.comac10a2d2010-12-22 21:39:39 +0000159 /**
csmartdaltona7f29642016-07-07 08:49:11 -0700160 * Creates an instanced rendering object if it is supported on this platform.
161 */
Robert Phillipse3302df2017-04-24 07:31:02 -0400162 std::unique_ptr<gr_instanced::OpAllocator> createInstancedRenderingAllocator();
csmartdaltone0d36292016-07-29 08:14:20 -0700163 gr_instanced::InstancedRendering* createInstancedRendering();
csmartdaltona7f29642016-07-07 08:49:11 -0700164
165 /**
bsalomon@google.com75f9f252012-01-31 13:35:56 +0000166 * Resolves MSAA.
167 */
168 void resolveRenderTarget(GrRenderTarget* target);
169
bsalomonf0674512015-07-28 13:26:15 -0700170 /** Info struct returned by getReadPixelsInfo about performing intermediate draws before
bsalomon39826022015-07-23 08:07:21 -0700171 reading pixels for performance or correctness. */
172 struct ReadPixelTempDrawInfo {
173 /** If the GrGpu is requesting that the caller do a draw to an intermediate surface then
174 this is descriptor for the temp surface. The draw should always be a rect with
175 dst 0,0,w,h. */
176 GrSurfaceDesc fTempSurfaceDesc;
177 /** Indicates whether there is a performance advantage to using an exact match texture
178 (in terms of width and height) for the intermediate texture instead of approximate. */
bsalomonb117ff12016-07-19 07:24:40 -0700179 SkBackingFit fTempSurfaceFit;
bsalomon6c9cd552016-01-22 07:17:34 -0800180 /** Swizzle to apply during the draw. This is used to compensate for either feature or
181 performance limitations in the underlying 3D API. */
182 GrSwizzle fSwizzle;
183 /** The config that should be used to read from the temp surface after the draw. This may be
184 different than the original read config in order to compensate for swizzling. The
185 read data will effectively be in the original read config. */
186 GrPixelConfig fReadConfig;
bsalomon39826022015-07-23 08:07:21 -0700187 };
bsalomon6c9cd552016-01-22 07:17:34 -0800188
bsalomon39826022015-07-23 08:07:21 -0700189 /** Describes why an intermediate draw must/should be performed before readPixels. */
190 enum DrawPreference {
191 /** On input means that the caller would proceed without draw if the GrGpu doesn't request
192 one.
193 On output means that the GrGpu is not requesting a draw. */
194 kNoDraw_DrawPreference,
195 /** Means that the client would prefer a draw for performance of the readback but
196 can satisfy a straight readPixels call on the inputs without an intermediate draw.
197 getReadPixelsInfo will never set the draw preference to this value but may leave
198 it set. */
199 kCallerPrefersDraw_DrawPreference,
200 /** On output means that GrGpu would prefer a draw for performance of the readback but
201 can satisfy a straight readPixels call on the inputs without an intermediate draw. The
202 caller of getReadPixelsInfo should never specify this on intput. */
203 kGpuPrefersDraw_DrawPreference,
204 /** On input means that the caller requires a draw to do a transformation and there is no
205 CPU fallback.
206 On output means that GrGpu can only satisfy the readPixels request if the intermediate
207 draw is performed.
208 */
209 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 */
218 bool getReadPixelsInfo(GrSurface* srcSurface, int readWidth, int readHeight, size_t rowBytes,
219 GrPixelConfig readConfig, DrawPreference*, ReadPixelTempDrawInfo*);
220
cblume61214052016-01-26 09:10:48 -0800221 /** Info struct returned by getWritePixelsInfo about performing an intermediate draw in order
bsalomonf0674512015-07-28 13:26:15 -0700222 to write pixels to a GrSurface for either performance or correctness reasons. */
223 struct WritePixelTempDrawInfo {
224 /** If the GrGpu is requesting that the caller upload to an intermediate surface and draw
225 that to the dst then this is the descriptor for the intermediate surface. The caller
226 should upload the pixels such that the upper left pixel of the upload rect is at 0,0 in
227 the intermediate surface.*/
228 GrSurfaceDesc fTempSurfaceDesc;
bsalomon6c9cd552016-01-22 07:17:34 -0800229 /** Swizzle to apply during the draw. This is used to compensate for either feature or
230 performance limitations in the underlying 3D API. */
231 GrSwizzle fSwizzle;
232 /** The config that should be specified when uploading the *original* data to the temp
233 surface before the draw. This may be different than the original src data config in
234 order to compensate for swizzling that will occur when drawing. */
235 GrPixelConfig fWriteConfig;
bsalomonf0674512015-07-28 13:26:15 -0700236 };
bsalomon39826022015-07-23 08:07:21 -0700237
bsalomon@google.com75f9f252012-01-31 13:35:56 +0000238 /**
bsalomonf0674512015-07-28 13:26:15 -0700239 * Used to negotiate whether and how an intermediate surface should be used to write pixels to
240 * a GrSurface. If this returns false then GrGpu could not deduce an intermediate draw
241 * that would allow a successful transfer of the src pixels to the dst. The passed width,
242 * height, and rowBytes, must be non-zero and already reflect clipping to the dst bounds.
bsalomon@google.com0a97be22011-11-08 19:20:57 +0000243 */
cblumeed828002016-02-16 13:00:01 -0800244 bool getWritePixelsInfo(GrSurface* dstSurface, int width, int height,
bsalomonf0674512015-07-28 13:26:15 -0700245 GrPixelConfig srcConfig, DrawPreference*, WritePixelTempDrawInfo*);
bsalomon@google.coma85449d2011-11-19 02:36:05 +0000246
247 /**
bsalomon@google.coma04e8e82012-08-27 12:53:13 +0000248 * Reads a rectangle of pixels from a render target.
bsalomon@google.comc4364992011-11-07 15:54:49 +0000249 *
bsalomon6cb3cbe2015-07-30 07:34:27 -0700250 * @param surface The surface to read from
bsalomon@google.com669fdc42011-04-05 17:08:27 +0000251 * @param left left edge of the rectangle to read (inclusive)
252 * @param top top edge of the rectangle to read (inclusive)
253 * @param width width of rectangle to read in pixels.
254 * @param height height of rectangle to read in pixels.
255 * @param config the pixel config of the destination buffer
256 * @param buffer memory to read the rectangle into.
bsalomon@google.comc6980972011-11-02 19:57:21 +0000257 * @param rowBytes the number of bytes between consecutive rows. Zero
258 * means rows are tightly packed.
bsalomon@google.comc4364992011-11-07 15:54:49 +0000259 * @param invertY buffer should be populated bottom-to-top as opposed
260 * to top-to-bottom (skia's usual order)
bsalomon@google.coma7f84e12011-03-10 14:13:19 +0000261 *
262 * @return true if the read succeeded, false if not. The read can fail
263 * because of a unsupported pixel config or because no render
264 * target is currently set.
265 */
bsalomon6cb3cbe2015-07-30 07:34:27 -0700266 bool readPixels(GrSurface* surface,
bsalomon@google.com669fdc42011-04-05 17:08:27 +0000267 int left, int top, int width, int height,
senorblanco@chromium.org3cb406b2013-02-05 19:50:46 +0000268 GrPixelConfig config, void* buffer, size_t rowBytes);
reed@google.comac10a2d2010-12-22 21:39:39 +0000269
bsalomon@google.com6f379512011-11-16 20:36:03 +0000270 /**
bsalomon6cb3cbe2015-07-30 07:34:27 -0700271 * Updates the pixels in a rectangle of a surface.
bsalomon@google.coma85449d2011-11-19 02:36:05 +0000272 *
bsalomon6cb3cbe2015-07-30 07:34:27 -0700273 * @param surface The surface to write to.
bsalomon@google.com6f379512011-11-16 20:36:03 +0000274 * @param left left edge of the rectangle to write (inclusive)
275 * @param top top edge of the rectangle to write (inclusive)
276 * @param width width of rectangle to write in pixels.
277 * @param height height of rectangle to write in pixels.
278 * @param config the pixel config of the source buffer
cblume55f2d2d2016-02-26 13:20:48 -0800279 * @param texels array of mipmap levels containing texture data
280 */
281 bool writePixels(GrSurface* surface,
282 int left, int top, int width, int height,
283 GrPixelConfig config,
284 const SkTArray<GrMipLevel>& texels);
285
286 /**
287 * This function is a shim which creates a SkTArray<GrMipLevel> of size 1.
288 * It then calls writePixels with that SkTArray.
289 *
290 * @param buffer memory to read pixels from.
291 * @param rowBytes number of bytes between consecutive rows. Zero
292 * means rows are tightly packed.
bsalomon@google.com6f379512011-11-16 20:36:03 +0000293 */
bsalomon6cb3cbe2015-07-30 07:34:27 -0700294 bool writePixels(GrSurface* surface,
295 int left, int top, int width, int height,
296 GrPixelConfig config, const void* buffer,
297 size_t rowBytes);
bsalomon@google.com6f379512011-11-16 20:36:03 +0000298
joshualitt3322fa42014-11-07 08:48:51 -0800299 /**
jvanverthc3d706f2016-04-20 10:33:27 -0700300 * Updates the pixels in a rectangle of a surface using a buffer
jvanverth17aa0472016-01-05 10:41:27 -0800301 *
jvanverthc3d706f2016-04-20 10:33:27 -0700302 * @param surface The surface to write to.
cdalton397536c2016-03-25 12:15:03 -0700303 * @param left left edge of the rectangle to write (inclusive)
304 * @param top top edge of the rectangle to write (inclusive)
305 * @param width width of rectangle to write in pixels.
306 * @param height height of rectangle to write in pixels.
307 * @param config the pixel config of the source buffer
308 * @param transferBuffer GrBuffer to read pixels from (type must be "kCpuToGpu")
309 * @param offset offset from the start of the buffer
310 * @param rowBytes number of bytes between consecutive rows. Zero
311 * means rows are tightly packed.
jvanverth17aa0472016-01-05 10:41:27 -0800312 */
jvanverthc3d706f2016-04-20 10:33:27 -0700313 bool transferPixels(GrSurface* surface,
jvanverth17aa0472016-01-05 10:41:27 -0800314 int left, int top, int width, int height,
cdalton397536c2016-03-25 12:15:03 -0700315 GrPixelConfig config, GrBuffer* transferBuffer,
jvanverth84741b32016-09-30 08:39:02 -0700316 size_t offset, size_t rowBytes, GrFence* fence);
jvanverth17aa0472016-01-05 10:41:27 -0800317
bsalomon@google.com80d09b92011-11-05 21:21:13 +0000318 // After the client interacts directly with the 3D context state the GrGpu
319 // must resync its internal state and assumptions about 3D context state.
320 // Each time this occurs the GrGpu bumps a timestamp.
321 // state of the 3D context
322 // At 10 resets / frame and 60fps a 64bit timestamp will overflow in about
323 // a billion years.
324 typedef uint64_t ResetTimestamp;
325
326 // This timestamp is always older than the current timestamp
327 static const ResetTimestamp kExpiredTimestamp = 0;
328 // Returns a timestamp based on the number of times the context was reset.
329 // This timestamp can be used to lazily detect when cached 3D context state
330 // is dirty.
bsalomon6d467ec2014-11-18 07:36:19 -0800331 ResetTimestamp getResetTimestamp() const { return fResetTimestamp; }
bsalomon@google.com80d09b92011-11-05 21:21:13 +0000332
bsalomonf90a02b2014-11-26 12:28:00 -0800333 // Called to perform a surface to surface copy. Fallbacks to issuing a draw from the src to dst
Robert Phillipsf2361d22016-10-25 14:20:06 -0400334 // take place at the GrOpList level and this function implement faster copy paths. The rect
bsalomonf90a02b2014-11-26 12:28:00 -0800335 // and point are pre-clipped. The src rect and implied dst rect are guaranteed to be within the
336 // src/dst bounds and non-empty.
joshualitt1cbdcde2015-08-21 11:53:29 -0700337 bool copySurface(GrSurface* dst,
338 GrSurface* src,
339 const SkIRect& srcRect,
340 const SkIPoint& dstPoint);
joshualitt3322fa42014-11-07 08:48:51 -0800341
cdalton28f45b92016-03-07 13:58:26 -0800342 struct MultisampleSpecs {
csmartdalton0d28e572016-07-06 09:59:43 -0700343 MultisampleSpecs(uint8_t uniqueID, int effectiveSampleCnt, const SkPoint* locations)
344 : fUniqueID(uniqueID),
345 fEffectiveSampleCnt(effectiveSampleCnt),
346 fSampleLocations(locations) {}
347
cdalton28f45b92016-03-07 13:58:26 -0800348 // Nonzero ID that uniquely identifies these multisample specs.
csmartdalton0d28e572016-07-06 09:59:43 -0700349 uint8_t fUniqueID;
cdalton28f45b92016-03-07 13:58:26 -0800350 // The actual number of samples the GPU will run. NOTE: this value can be greater than the
351 // the render target's sample count.
csmartdalton0d28e572016-07-06 09:59:43 -0700352 int fEffectiveSampleCnt;
353 // If sample locations are supported, points to the subpixel locations at which the GPU will
354 // sample. Pixel center is at (.5, .5), and (0, 0) indicates the top left corner.
355 const SkPoint* fSampleLocations;
cdalton28f45b92016-03-07 13:58:26 -0800356 };
357
csmartdaltonc633abb2016-11-01 08:55:55 -0700358 // Finds a render target's multisample specs. The pipeline is only needed in case we need to
359 // flush the draw state prior to querying multisample info. The pipeline is not expected to
csmartdaltonc25c5d72016-11-01 07:03:59 -0700360 // affect the multisample information itself.
csmartdaltonc633abb2016-11-01 08:55:55 -0700361 const MultisampleSpecs& queryMultisampleSpecs(const GrPipeline&);
csmartdaltonc25c5d72016-11-01 07:03:59 -0700362
363 // Finds the multisample specs with a given unique id.
364 const MultisampleSpecs& getMultisampleSpecs(uint8_t uniqueID) {
365 SkASSERT(uniqueID > 0 && uniqueID < fMultisampleSpecs.count());
366 return fMultisampleSpecs[uniqueID];
367 }
cdalton28f45b92016-03-07 13:58:26 -0800368
Robert Phillipsf2361d22016-10-25 14:20:06 -0400369 // Creates a GrGpuCommandBuffer in which the GrOpList can send draw commands to instead of
Brian Salomonc293a292016-11-30 13:38:32 -0500370 // directly to the Gpu object. This currently does not take a GrRenderTarget. The command buffer
371 // is expected to infer the render target from the first draw, clear, or discard. This is an
372 // awkward workaround that goes away after MDB is complete and the render target is known from
373 // the GrRenderTargetOpList.
egdaniel9cb63402016-06-23 08:37:05 -0700374 virtual GrGpuCommandBuffer* createCommandBuffer(
egdaniel9cb63402016-06-23 08:37:05 -0700375 const GrGpuCommandBuffer::LoadAndStoreInfo& colorInfo,
376 const GrGpuCommandBuffer::LoadAndStoreInfo& stencilInfo) = 0;
bsalomon3e791242014-12-17 13:43:13 -0800377
Robert Phillips18e94842017-05-15 13:06:44 -0400378 // Called by GrDrawingManager when flushing.
Brian Salomon42c456f2017-03-06 11:29:48 -0500379 // Provides a hook for post-flush actions (e.g. Vulkan command buffer submits).
Robert Phillips18e94842017-05-15 13:06:44 -0400380 virtual void finishFlush() {}
ethannicholas22793252016-01-30 09:59:10 -0800381
Greg Daniel6be35232017-03-01 17:01:09 -0500382 virtual GrFence SK_WARN_UNUSED_RESULT insertFence() = 0;
383 virtual bool waitFence(GrFence, uint64_t timeout = 1000) = 0;
jvanverth84741b32016-09-30 08:39:02 -0700384 virtual void deleteFence(GrFence) const = 0;
385
Greg Daniel6be35232017-03-01 17:01:09 -0500386 virtual sk_sp<GrSemaphore> SK_WARN_UNUSED_RESULT makeSemaphore() = 0;
Brian Osmandc87c952017-04-28 13:57:38 -0400387 virtual void insertSemaphore(sk_sp<GrSemaphore> semaphore, bool flush = false) = 0;
Greg Daniel6be35232017-03-01 17:01:09 -0500388 virtual void waitSemaphore(sk_sp<GrSemaphore> semaphore) = 0;
389
Brian Osman13dddce2017-05-09 13:19:50 -0400390 /**
391 * Put this texture in a safe and known state for use across multiple GrContexts. Depending on
392 * the backend, this may return a GrSemaphore. If so, other contexts should wait on that
393 * semaphore before using this texture.
394 */
395 virtual sk_sp<GrSemaphore> prepareTextureForCrossContextUsage(GrTexture*) = 0;
396
mtkleinb9eb4ac2015-02-02 18:26:03 -0800397 ///////////////////////////////////////////////////////////////////////////
398 // Debugging and Stats
399
400 class Stats {
401 public:
402#if GR_GPU_STATS
403 Stats() { this->reset(); }
404
bsalomonb12ea412015-02-02 21:19:50 -0800405 void reset() {
406 fRenderTargetBinds = 0;
407 fShaderCompilations = 0;
408 fTextureCreates = 0;
409 fTextureUploads = 0;
jvanverth17aa0472016-01-05 10:41:27 -0800410 fTransfersToTexture = 0;
egdaniel8dc7c3a2015-04-16 11:22:42 -0700411 fStencilAttachmentCreates = 0;
joshualitt87a5c9f2015-09-08 13:42:05 -0700412 fNumDraws = 0;
bsalomon1d417a82016-03-23 11:50:26 -0700413 fNumFailedDraws = 0;
bsalomonb12ea412015-02-02 21:19:50 -0800414 }
mtkleinb9eb4ac2015-02-02 18:26:03 -0800415
416 int renderTargetBinds() const { return fRenderTargetBinds; }
417 void incRenderTargetBinds() { fRenderTargetBinds++; }
418 int shaderCompilations() const { return fShaderCompilations; }
419 void incShaderCompilations() { fShaderCompilations++; }
bsalomonb12ea412015-02-02 21:19:50 -0800420 int textureCreates() const { return fTextureCreates; }
421 void incTextureCreates() { fTextureCreates++; }
422 int textureUploads() const { return fTextureUploads; }
423 void incTextureUploads() { fTextureUploads++; }
jvanverth17aa0472016-01-05 10:41:27 -0800424 int transfersToTexture() const { return fTransfersToTexture; }
425 void incTransfersToTexture() { fTransfersToTexture++; }
egdaniel8dc7c3a2015-04-16 11:22:42 -0700426 void incStencilAttachmentCreates() { fStencilAttachmentCreates++; }
joshualitt87a5c9f2015-09-08 13:42:05 -0700427 void incNumDraws() { fNumDraws++; }
bsalomon1d417a82016-03-23 11:50:26 -0700428 void incNumFailedDraws() { ++fNumFailedDraws; }
mtkleinb9eb4ac2015-02-02 18:26:03 -0800429 void dump(SkString*);
joshualitte45c81c2015-12-02 09:05:37 -0800430 void dumpKeyValuePairs(SkTArray<SkString>* keys, SkTArray<double>* values);
bsalomon1d417a82016-03-23 11:50:26 -0700431 int numDraws() const { return fNumDraws; }
432 int numFailedDraws() const { return fNumFailedDraws; }
mtkleinb9eb4ac2015-02-02 18:26:03 -0800433 private:
434 int fRenderTargetBinds;
435 int fShaderCompilations;
bsalomonb12ea412015-02-02 21:19:50 -0800436 int fTextureCreates;
437 int fTextureUploads;
jvanverth17aa0472016-01-05 10:41:27 -0800438 int fTransfersToTexture;
egdaniel8dc7c3a2015-04-16 11:22:42 -0700439 int fStencilAttachmentCreates;
joshualitt87a5c9f2015-09-08 13:42:05 -0700440 int fNumDraws;
bsalomon1d417a82016-03-23 11:50:26 -0700441 int fNumFailedDraws;
mtkleinb9eb4ac2015-02-02 18:26:03 -0800442#else
joshualitte45c81c2015-12-02 09:05:37 -0800443 void dump(SkString*) {}
444 void dumpKeyValuePairs(SkTArray<SkString>*, SkTArray<double>*) {}
mtkleinb9eb4ac2015-02-02 18:26:03 -0800445 void incRenderTargetBinds() {}
446 void incShaderCompilations() {}
bsalomonb12ea412015-02-02 21:19:50 -0800447 void incTextureCreates() {}
448 void incTextureUploads() {}
jvanverth17aa0472016-01-05 10:41:27 -0800449 void incTransfersToTexture() {}
egdaniel8dc7c3a2015-04-16 11:22:42 -0700450 void incStencilAttachmentCreates() {}
joshualitt87a5c9f2015-09-08 13:42:05 -0700451 void incNumDraws() {}
bsalomon1d417a82016-03-23 11:50:26 -0700452 void incNumFailedDraws() {}
mtkleinb9eb4ac2015-02-02 18:26:03 -0800453#endif
454 };
455
456 Stats* stats() { return &fStats; }
457
bsalomon67d76202015-11-11 12:40:42 -0800458 /** Creates a texture directly in the backend API without wrapping it in a GrTexture. This is
459 only to be used for testing (particularly for testing the methods that import an externally
460 created texture into Skia. Must be matched with a call to deleteTestingOnlyTexture(). */
jvanverth88957922015-07-14 11:02:52 -0700461 virtual GrBackendObject createTestingOnlyBackendTexture(void* pixels, int w, int h,
egdaniel0a3a7f72016-06-24 09:22:31 -0700462 GrPixelConfig config,
463 bool isRenderTarget = false) = 0;
bsalomon67d76202015-11-11 12:40:42 -0800464 /** Check a handle represents an actual texture in the backend API that has not been freed. */
465 virtual bool isTestingOnlyBackendTexture(GrBackendObject) const = 0;
466 /** If ownership of the backend texture has been transferred pass true for abandonTexture. This
467 will do any necessary cleanup of the handle without freeing the texture in the backend
468 API. */
469 virtual void deleteTestingOnlyBackendTexture(GrBackendObject,
bsalomone63ffef2016-02-05 07:17:34 -0800470 bool abandonTexture = false) = 0;
jvanverth672bb7f2015-07-13 07:19:57 -0700471
egdanielec00d942015-09-14 12:56:10 -0700472 // width and height may be larger than rt (if underlying API allows it).
473 // Returns nullptr if compatible sb could not be created, otherwise the caller owns the ref on
474 // the GrStencilAttachment.
475 virtual GrStencilAttachment* createStencilAttachmentForRenderTarget(const GrRenderTarget*,
476 int width,
477 int height) = 0;
478 // clears target's entire stencil buffer to 0
479 virtual void clearStencil(GrRenderTarget* target) = 0;
bsalomon6bc1b5f2015-02-23 09:06:38 -0800480
bsalomon6dea83f2015-12-03 12:58:06 -0800481 // draws an outline rectangle for debugging/visualization purposes.
482 virtual void drawDebugWireRect(GrRenderTarget*, const SkIRect&, GrColor) = 0;
bsalomon045802d2015-10-20 07:58:01 -0700483
bsalomone179a912016-01-20 06:18:10 -0800484 // Determines whether a texture will need to be rescaled in order to be used with the
Brian Salomon514baff2016-11-17 15:17:07 -0500485 // GrSamplerParams. This variation is called when the caller will create a new texture using the
Brian Osman32342f02017-03-04 08:12:46 -0500486 // resource provider from a non-texture src (cpu-backed image, ...).
Robert Phillips81444fb2017-03-21 09:14:35 -0400487 bool isACopyNeededForTextureParams(int width, int height, const GrSamplerParams&,
488 GrTextureProducer::CopyParams*,
489 SkScalar scaleAdjust[2]) const;
bsalomone179a912016-01-20 06:18:10 -0800490
491 // Like the above but this variation should be called when the caller is not creating the
492 // original texture but rather was handed the original texture. It adds additional checks
493 // relevant to original textures that were created external to Skia via
Brian Osman32342f02017-03-04 08:12:46 -0500494 // GrResourceProvider::wrap methods.
Robert Phillips3798c862017-03-27 11:08:16 -0400495 bool isACopyNeededForTextureParams(GrTextureProxy* proxy, const GrSamplerParams& params,
Robert Phillips81444fb2017-03-21 09:14:35 -0400496 GrTextureProducer::CopyParams* copyParams,
497 SkScalar scaleAdjust[2]) const {
Robert Phillips3798c862017-03-27 11:08:16 -0400498 if (this->isACopyNeededForTextureParams(proxy->width(), proxy->height(), params,
Robert Phillips81444fb2017-03-21 09:14:35 -0400499 copyParams, scaleAdjust)) {
bsalomone179a912016-01-20 06:18:10 -0800500 return true;
501 }
Robert Phillips3798c862017-03-27 11:08:16 -0400502 return this->onIsACopyNeededForTextureParams(proxy, params, copyParams, scaleAdjust);
bsalomone179a912016-01-20 06:18:10 -0800503 }
bsalomon045802d2015-10-20 07:58:01 -0700504
jvanverth672bb7f2015-07-13 07:19:57 -0700505 // This is only to be used in GL-specific tests.
halcanary96fcdcc2015-08-27 07:41:13 -0700506 virtual const GrGLContext* glContextForTesting() const { return nullptr; }
bsalomon993a4212015-05-29 11:37:25 -0700507
joshualitt8fd844f2015-12-02 13:36:47 -0800508 // This is only to be used by testing code
509 virtual void resetShaderCacheForTesting() const {}
510
egdaniel9cb63402016-06-23 08:37:05 -0700511 void handleDirtyContext() {
512 if (fResetBits) {
513 this->resetContext();
514 }
515 }
516
joshualittd53a8272014-11-10 16:03:14 -0800517protected:
bsalomonf0674512015-07-28 13:26:15 -0700518 static void ElevateDrawPreference(GrGpu::DrawPreference* preference,
519 GrGpu::DrawPreference elevation) {
520 GR_STATIC_ASSERT(GrGpu::kCallerPrefersDraw_DrawPreference > GrGpu::kNoDraw_DrawPreference);
521 GR_STATIC_ASSERT(GrGpu::kGpuPrefersDraw_DrawPreference >
522 GrGpu::kCallerPrefersDraw_DrawPreference);
523 GR_STATIC_ASSERT(GrGpu::kRequireDraw_DrawPreference >
524 GrGpu::kGpuPrefersDraw_DrawPreference);
525 *preference = SkTMax(*preference, elevation);
526 }
527
jvanverth900bd4a2016-04-29 13:53:12 -0700528 // Handles cases where a surface will be updated without a call to flushRenderTarget
529 void didWriteToSurface(GrSurface* surface, const SkIRect* bounds, uint32_t mipLevels = 1) const;
530
Ben Wagner145dbcd2016-11-03 14:40:50 -0400531 Stats fStats;
532 std::unique_ptr<GrPathRendering> fPathRendering;
joshualitt3322fa42014-11-07 08:48:51 -0800533 // Subclass must initialize this in its constructor.
Hal Canary144caf52016-11-07 17:57:18 -0500534 sk_sp<const GrCaps> fCaps;
joshualitt3322fa42014-11-07 08:48:51 -0800535
csmartdalton0d28e572016-07-06 09:59:43 -0700536 typedef SkTArray<SkPoint, true> SamplePattern;
537
bsalomon@google.com02ddc8b2013-01-28 15:35:28 +0000538private:
bsalomon@google.comb635d392011-11-05 12:47:43 +0000539 // called when the 3D context state is unknown. Subclass should emit any
bsalomon@google.comc8f7f472012-06-18 13:44:51 +0000540 // assumed 3D context state and dirty any state cache.
bsalomon@google.com0a208a12013-06-28 18:57:35 +0000541 virtual void onResetContext(uint32_t resetBits) = 0;
bsalomon@google.coma7f84e12011-03-10 14:13:19 +0000542
bsalomoncb02b382015-08-12 11:14:50 -0700543 // Called before certain draws in order to guarantee coherent results from dst reads.
544 virtual void xferBarrier(GrRenderTarget*, GrXferBarrierType) = 0;
545
bsalomon@google.com16e3dde2012-10-25 18:43:28 +0000546 // overridden by backend-specific derived class to create objects.
egdanielb0e1be22015-04-22 13:27:39 -0700547 // Texture size and sample size will have already been validated in base class before
Robert Phillips92de6312017-05-23 07:43:48 -0400548 // onCreateTexture is called.
egdanielb0e1be22015-04-22 13:27:39 -0700549 virtual GrTexture* onCreateTexture(const GrSurfaceDesc& desc,
kkinnunen2e6055b2016-04-22 01:48:29 -0700550 SkBudgeted budgeted,
cblume55f2d2d2016-02-26 13:20:48 -0800551 const SkTArray<GrMipLevel>& texels) = 0;
cblume55f2d2d2016-02-26 13:20:48 -0800552
Greg Daniel7ef28f32017-04-20 16:41:55 +0000553 virtual sk_sp<GrTexture> onWrapBackendTexture(const GrBackendTexture&,
554 GrSurfaceOrigin,
555 GrBackendTextureFlags,
556 int sampleCnt,
557 GrWrapOwnership) = 0;
Greg Danielbcf612b2017-05-01 13:50:58 +0000558 virtual sk_sp<GrRenderTarget> onWrapBackendRenderTarget(const GrBackendRenderTarget&,
559 GrSurfaceOrigin) = 0;
Greg Daniel7ef28f32017-04-20 16:41:55 +0000560 virtual sk_sp<GrRenderTarget> onWrapBackendTextureAsRenderTarget(const GrBackendTexture&,
561 GrSurfaceOrigin,
562 int sampleCnt)=0;
cdalton1bf3e712016-04-19 10:00:02 -0700563 virtual GrBuffer* onCreateBuffer(size_t size, GrBufferType intendedType, GrAccessPattern,
564 const void* data) = 0;
bsalomon@google.coma7f84e12011-03-10 14:13:19 +0000565
csmartdaltone0d36292016-07-29 08:14:20 -0700566 virtual gr_instanced::InstancedRendering* onCreateInstancedRendering() = 0;
Robert Phillipse3302df2017-04-24 07:31:02 -0400567 virtual std::unique_ptr<gr_instanced::OpAllocator> onCreateInstancedRenderingAllocator() {
568 return nullptr;
569 }
csmartdaltone0d36292016-07-29 08:14:20 -0700570
Robert Phillips3798c862017-03-27 11:08:16 -0400571 virtual bool onIsACopyNeededForTextureParams(GrTextureProxy* proxy, const GrSamplerParams&,
Robert Phillips81444fb2017-03-21 09:14:35 -0400572 GrTextureProducer::CopyParams*,
573 SkScalar scaleAdjust[2]) const {
574 return false;
575 }
bsalomone179a912016-01-20 06:18:10 -0800576
bsalomonf0674512015-07-28 13:26:15 -0700577 virtual bool onGetReadPixelsInfo(GrSurface* srcSurface, int readWidth, int readHeight,
578 size_t rowBytes, GrPixelConfig readConfig, DrawPreference*,
579 ReadPixelTempDrawInfo*) = 0;
cblumeed828002016-02-16 13:00:01 -0800580 virtual bool onGetWritePixelsInfo(GrSurface* dstSurface, int width, int height,
bsalomonf0674512015-07-28 13:26:15 -0700581 GrPixelConfig srcConfig, DrawPreference*,
582 WritePixelTempDrawInfo*) = 0;
583
bsalomon6cb3cbe2015-07-30 07:34:27 -0700584 // overridden by backend-specific derived class to perform the surface read
585 virtual bool onReadPixels(GrSurface*,
egdaniel6d901da2015-07-30 12:02:15 -0700586 int left, int top,
587 int width, int height,
bsalomon@google.comc4364992011-11-07 15:54:49 +0000588 GrPixelConfig,
589 void* buffer,
senorblanco@chromium.org3cb406b2013-02-05 19:50:46 +0000590 size_t rowBytes) = 0;
bsalomon@google.coma7f84e12011-03-10 14:13:19 +0000591
bsalomon6cb3cbe2015-07-30 07:34:27 -0700592 // overridden by backend-specific derived class to perform the surface write
593 virtual bool onWritePixels(GrSurface*,
594 int left, int top, int width, int height,
cblume55f2d2d2016-02-26 13:20:48 -0800595 GrPixelConfig config,
596 const SkTArray<GrMipLevel>& texels) = 0;
bsalomon@google.com6f379512011-11-16 20:36:03 +0000597
jvanverthc3d706f2016-04-20 10:33:27 -0700598 // overridden by backend-specific derived class to perform the surface write
599 virtual bool onTransferPixels(GrSurface*,
jvanverth17aa0472016-01-05 10:41:27 -0800600 int left, int top, int width, int height,
cdalton397536c2016-03-25 12:15:03 -0700601 GrPixelConfig config, GrBuffer* transferBuffer,
jvanverth17aa0472016-01-05 10:41:27 -0800602 size_t offset, size_t rowBytes) = 0;
603
bsalomon@google.com16e3dde2012-10-25 18:43:28 +0000604 // overridden by backend-specific derived class to perform the resolve
bsalomon@google.com75f9f252012-01-31 13:35:56 +0000605 virtual void onResolveRenderTarget(GrRenderTarget* target) = 0;
606
joshualitt1cbdcde2015-08-21 11:53:29 -0700607 // overridden by backend specific derived class to perform the copy surface
608 virtual bool onCopySurface(GrSurface* dst,
609 GrSurface* src,
610 const SkIRect& srcRect,
611 const SkIPoint& dstPoint) = 0;
612
cdalton28f45b92016-03-07 13:58:26 -0800613 // overridden by backend specific derived class to perform the multisample queries
csmartdaltonc25c5d72016-11-01 07:03:59 -0700614 virtual void onQueryMultisampleSpecs(GrRenderTarget*, const GrStencilSettings&,
615 int* effectiveSampleCnt, SamplePattern*) = 0;
cdalton28f45b92016-03-07 13:58:26 -0800616
bsalomon@google.comb635d392011-11-05 12:47:43 +0000617 void resetContext() {
bsalomon@google.com0a208a12013-06-28 18:57:35 +0000618 this->onResetContext(fResetBits);
619 fResetBits = 0;
bsalomon@google.comb635d392011-11-05 12:47:43 +0000620 ++fResetTimestamp;
621 }
622
csmartdalton0d28e572016-07-06 09:59:43 -0700623 struct SamplePatternComparator {
624 bool operator()(const SamplePattern&, const SamplePattern&) const;
625 };
626
627 typedef std::map<SamplePattern, uint8_t, SamplePatternComparator> MultisampleSpecsIdMap;
628
629 ResetTimestamp fResetTimestamp;
630 uint32_t fResetBits;
631 MultisampleSpecsIdMap fMultisampleSpecsIdMap;
632 SkSTArray<1, MultisampleSpecs, true> fMultisampleSpecs;
joshualitt3322fa42014-11-07 08:48:51 -0800633 // The context owns us, not vice-versa, so this ptr is not ref'ed by Gpu.
csmartdalton0d28e572016-07-06 09:59:43 -0700634 GrContext* fContext;
bsalomon@google.com02ddc8b2013-01-28 15:35:28 +0000635
kkinnunencabe20c2015-06-01 01:37:26 -0700636 friend class GrPathRendering;
Robert Phillipse3302df2017-04-24 07:31:02 -0400637 friend class gr_instanced::InstancedOp; // for xferBarrier
joshualitt3322fa42014-11-07 08:48:51 -0800638 typedef SkRefCnt INHERITED;
reed@google.comac10a2d2010-12-22 21:39:39 +0000639};
640
641#endif