blob: f1efadb6594592b1b34bf8fdd0f69d7009778036 [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 Daltonff926502017-05-03 14:36:54 -040028struct 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.
103 * For compressed formats the level contains the compressed pixel data.
104 * Otherwise, it contains width*height texels. If there is only one
105 * element and it contains nullptr fPixels, texture data is
106 * uninitialized.
halcanary96fcdcc2015-08-27 07:41:13 -0700107 * @return The texture object if successful, otherwise nullptr.
reed@google.comac10a2d2010-12-22 21:39:39 +0000108 */
bsalomon5ec26ae2016-02-25 08:33:02 -0800109 GrTexture* createTexture(const GrSurfaceDesc& desc, SkBudgeted budgeted,
cblume55f2d2d2016-02-26 13:20:48 -0800110 const SkTArray<GrMipLevel>& texels);
111
112 /**
bsalomone699d0c2016-03-09 06:25:15 -0800113 * Simplified createTexture() interface for when there is no initial texel data to upload.
cblume55f2d2d2016-02-26 13:20:48 -0800114 */
bsalomone699d0c2016-03-09 06:25:15 -0800115 GrTexture* createTexture(const GrSurfaceDesc& desc, SkBudgeted budgeted) {
116 return this->createTexture(desc, budgeted, SkTArray<GrMipLevel>());
117 }
118
119 /** Simplified createTexture() interface for when there is only a base level */
120 GrTexture* createTexture(const GrSurfaceDesc& desc, SkBudgeted budgeted, const void* level0Data,
121 size_t rowBytes) {
122 SkASSERT(level0Data);
123 GrMipLevel level = { level0Data, rowBytes };
124 SkSTArray<1, GrMipLevel> array;
125 array.push_back() = level;
126 return this->createTexture(desc, budgeted, array);
127 }
bsalomond3312592016-03-04 07:06:43 -0800128
bsalomon@google.come269f212011-11-07 13:29:52 +0000129 /**
Brian Osman32342f02017-03-04 08:12:46 -0500130 * Implements GrResourceProvider::wrapBackendTexture
bsalomon@google.come269f212011-11-07 13:29:52 +0000131 */
Greg Daniel7ef28f32017-04-20 16:41:55 +0000132 sk_sp<GrTexture> wrapBackendTexture(const GrBackendTexture&, GrSurfaceOrigin,
133 GrBackendTextureFlags, int sampleCnt, GrWrapOwnership);
bsalomon@google.come269f212011-11-07 13:29:52 +0000134
135 /**
Brian Osman32342f02017-03-04 08:12:46 -0500136 * Implements GrResourceProvider::wrapBackendRenderTarget
bsalomon@google.come269f212011-11-07 13:29:52 +0000137 */
Greg Danielbcf612b2017-05-01 13:50:58 +0000138 sk_sp<GrRenderTarget> wrapBackendRenderTarget(const GrBackendRenderTarget&, GrSurfaceOrigin);
bsalomon@google.come269f212011-11-07 13:29:52 +0000139
140 /**
Brian Osman32342f02017-03-04 08:12:46 -0500141 * Implements GrResourceProvider::wrapBackendTextureAsRenderTarget
ericrkf7b8b8a2016-02-24 14:49:51 -0800142 */
Greg Daniel7ef28f32017-04-20 16:41:55 +0000143 sk_sp<GrRenderTarget> wrapBackendTextureAsRenderTarget(const GrBackendTexture&,
144 GrSurfaceOrigin,
145 int sampleCnt);
ericrkf7b8b8a2016-02-24 14:49:51 -0800146
147 /**
csmartdalton485a1202016-07-13 10:16:32 -0700148 * Creates a buffer in GPU memory. For a client-side buffer use GrBuffer::CreateCPUBacked.
reed@google.comac10a2d2010-12-22 21:39:39 +0000149 *
cdaltone2e71c22016-04-07 18:13:29 -0700150 * @param size size of buffer to create.
151 * @param intendedType hint to the graphics subsystem about what the buffer will be used for.
152 * @param accessPattern hint to the graphics subsystem about how the data will be accessed.
cdalton1bf3e712016-04-19 10:00:02 -0700153 * @param data optional data with which to initialize the buffer.
cdaltone2e71c22016-04-07 18:13:29 -0700154 *
cdalton397536c2016-03-25 12:15:03 -0700155 * @return the buffer if successful, otherwise nullptr.
reed@google.comac10a2d2010-12-22 21:39:39 +0000156 */
cdalton1bf3e712016-04-19 10:00:02 -0700157 GrBuffer* createBuffer(size_t size, GrBufferType intendedType, GrAccessPattern accessPattern,
158 const void* data = nullptr);
halcanary9d524f22016-03-29 09:03:52 -0700159
reed@google.comac10a2d2010-12-22 21:39:39 +0000160 /**
csmartdaltona7f29642016-07-07 08:49:11 -0700161 * Creates an instanced rendering object if it is supported on this platform.
162 */
Robert Phillipse3302df2017-04-24 07:31:02 -0400163 std::unique_ptr<gr_instanced::OpAllocator> createInstancedRenderingAllocator();
csmartdaltone0d36292016-07-29 08:14:20 -0700164 gr_instanced::InstancedRendering* createInstancedRendering();
csmartdaltona7f29642016-07-07 08:49:11 -0700165
166 /**
bsalomon@google.com75f9f252012-01-31 13:35:56 +0000167 * Resolves MSAA.
168 */
169 void resolveRenderTarget(GrRenderTarget* target);
170
bsalomonf0674512015-07-28 13:26:15 -0700171 /** Info struct returned by getReadPixelsInfo about performing intermediate draws before
bsalomon39826022015-07-23 08:07:21 -0700172 reading pixels for performance or correctness. */
173 struct ReadPixelTempDrawInfo {
174 /** If the GrGpu is requesting that the caller do a draw to an intermediate surface then
175 this is descriptor for the temp surface. The draw should always be a rect with
176 dst 0,0,w,h. */
177 GrSurfaceDesc fTempSurfaceDesc;
178 /** Indicates whether there is a performance advantage to using an exact match texture
179 (in terms of width and height) for the intermediate texture instead of approximate. */
bsalomonb117ff12016-07-19 07:24:40 -0700180 SkBackingFit fTempSurfaceFit;
bsalomon6c9cd552016-01-22 07:17:34 -0800181 /** Swizzle to apply during the draw. This is used to compensate for either feature or
182 performance limitations in the underlying 3D API. */
183 GrSwizzle fSwizzle;
184 /** The config that should be used to read from the temp surface after the draw. This may be
185 different than the original read config in order to compensate for swizzling. The
186 read data will effectively be in the original read config. */
187 GrPixelConfig fReadConfig;
bsalomon39826022015-07-23 08:07:21 -0700188 };
bsalomon6c9cd552016-01-22 07:17:34 -0800189
bsalomon39826022015-07-23 08:07:21 -0700190 /** Describes why an intermediate draw must/should be performed before readPixels. */
191 enum DrawPreference {
192 /** On input means that the caller would proceed without draw if the GrGpu doesn't request
193 one.
194 On output means that the GrGpu is not requesting a draw. */
195 kNoDraw_DrawPreference,
196 /** Means that the client would prefer a draw for performance of the readback but
197 can satisfy a straight readPixels call on the inputs without an intermediate draw.
198 getReadPixelsInfo will never set the draw preference to this value but may leave
199 it set. */
200 kCallerPrefersDraw_DrawPreference,
201 /** On output means that GrGpu would prefer a draw for performance of the readback but
202 can satisfy a straight readPixels call on the inputs without an intermediate draw. The
203 caller of getReadPixelsInfo should never specify this on intput. */
204 kGpuPrefersDraw_DrawPreference,
205 /** On input means that the caller requires a draw to do a transformation and there is no
206 CPU fallback.
207 On output means that GrGpu can only satisfy the readPixels request if the intermediate
208 draw is performed.
209 */
210 kRequireDraw_DrawPreference
211 };
212
bsalomonf0674512015-07-28 13:26:15 -0700213 /**
214 * Used to negotiate whether and how an intermediate draw should or must be performed before
215 * a readPixels call. If this returns false then GrGpu could not deduce an intermediate draw
216 * that would allow a successful readPixels call. The passed width, height, and rowBytes,
217 * must be non-zero and already reflect clipping to the src bounds.
218 */
219 bool getReadPixelsInfo(GrSurface* srcSurface, int readWidth, int readHeight, size_t rowBytes,
220 GrPixelConfig readConfig, DrawPreference*, ReadPixelTempDrawInfo*);
221
cblume61214052016-01-26 09:10:48 -0800222 /** Info struct returned by getWritePixelsInfo about performing an intermediate draw in order
bsalomonf0674512015-07-28 13:26:15 -0700223 to write pixels to a GrSurface for either performance or correctness reasons. */
224 struct WritePixelTempDrawInfo {
225 /** If the GrGpu is requesting that the caller upload to an intermediate surface and draw
226 that to the dst then this is the descriptor for the intermediate surface. The caller
227 should upload the pixels such that the upper left pixel of the upload rect is at 0,0 in
228 the intermediate surface.*/
229 GrSurfaceDesc fTempSurfaceDesc;
bsalomon6c9cd552016-01-22 07:17:34 -0800230 /** Swizzle to apply during the draw. This is used to compensate for either feature or
231 performance limitations in the underlying 3D API. */
232 GrSwizzle fSwizzle;
233 /** The config that should be specified when uploading the *original* data to the temp
234 surface before the draw. This may be different than the original src data config in
235 order to compensate for swizzling that will occur when drawing. */
236 GrPixelConfig fWriteConfig;
bsalomonf0674512015-07-28 13:26:15 -0700237 };
bsalomon39826022015-07-23 08:07:21 -0700238
bsalomon@google.com75f9f252012-01-31 13:35:56 +0000239 /**
bsalomonf0674512015-07-28 13:26:15 -0700240 * Used to negotiate whether and how an intermediate surface should be used to write pixels to
241 * a GrSurface. If this returns false then GrGpu could not deduce an intermediate draw
242 * that would allow a successful transfer of the src pixels to the dst. The passed width,
243 * height, and rowBytes, must be non-zero and already reflect clipping to the dst bounds.
bsalomon@google.com0a97be22011-11-08 19:20:57 +0000244 */
cblumeed828002016-02-16 13:00:01 -0800245 bool getWritePixelsInfo(GrSurface* dstSurface, int width, int height,
bsalomonf0674512015-07-28 13:26:15 -0700246 GrPixelConfig srcConfig, DrawPreference*, WritePixelTempDrawInfo*);
bsalomon@google.coma85449d2011-11-19 02:36:05 +0000247
248 /**
bsalomon@google.coma04e8e82012-08-27 12:53:13 +0000249 * Reads a rectangle of pixels from a render target.
bsalomon@google.comc4364992011-11-07 15:54:49 +0000250 *
bsalomon6cb3cbe2015-07-30 07:34:27 -0700251 * @param surface The surface to read from
bsalomon@google.com669fdc42011-04-05 17:08:27 +0000252 * @param left left edge of the rectangle to read (inclusive)
253 * @param top top edge of the rectangle to read (inclusive)
254 * @param width width of rectangle to read in pixels.
255 * @param height height of rectangle to read in pixels.
256 * @param config the pixel config of the destination buffer
257 * @param buffer memory to read the rectangle into.
bsalomon@google.comc6980972011-11-02 19:57:21 +0000258 * @param rowBytes the number of bytes between consecutive rows. Zero
259 * means rows are tightly packed.
bsalomon@google.comc4364992011-11-07 15:54:49 +0000260 * @param invertY buffer should be populated bottom-to-top as opposed
261 * to top-to-bottom (skia's usual order)
bsalomon@google.coma7f84e12011-03-10 14:13:19 +0000262 *
263 * @return true if the read succeeded, false if not. The read can fail
264 * because of a unsupported pixel config or because no render
265 * target is currently set.
266 */
bsalomon6cb3cbe2015-07-30 07:34:27 -0700267 bool readPixels(GrSurface* surface,
bsalomon@google.com669fdc42011-04-05 17:08:27 +0000268 int left, int top, int width, int height,
senorblanco@chromium.org3cb406b2013-02-05 19:50:46 +0000269 GrPixelConfig config, void* buffer, size_t rowBytes);
reed@google.comac10a2d2010-12-22 21:39:39 +0000270
bsalomon@google.com6f379512011-11-16 20:36:03 +0000271 /**
bsalomon6cb3cbe2015-07-30 07:34:27 -0700272 * Updates the pixels in a rectangle of a surface.
bsalomon@google.coma85449d2011-11-19 02:36:05 +0000273 *
bsalomon6cb3cbe2015-07-30 07:34:27 -0700274 * @param surface The surface to write to.
bsalomon@google.com6f379512011-11-16 20:36:03 +0000275 * @param left left edge of the rectangle to write (inclusive)
276 * @param top top edge of the rectangle to write (inclusive)
277 * @param width width of rectangle to write in pixels.
278 * @param height height of rectangle to write in pixels.
279 * @param config the pixel config of the source buffer
cblume55f2d2d2016-02-26 13:20:48 -0800280 * @param texels array of mipmap levels containing texture data
281 */
282 bool writePixels(GrSurface* surface,
283 int left, int top, int width, int height,
284 GrPixelConfig config,
285 const SkTArray<GrMipLevel>& texels);
286
287 /**
288 * This function is a shim which creates a SkTArray<GrMipLevel> of size 1.
289 * It then calls writePixels with that SkTArray.
290 *
291 * @param buffer memory to read pixels from.
292 * @param rowBytes number of bytes between consecutive rows. Zero
293 * means rows are tightly packed.
bsalomon@google.com6f379512011-11-16 20:36:03 +0000294 */
bsalomon6cb3cbe2015-07-30 07:34:27 -0700295 bool writePixels(GrSurface* surface,
296 int left, int top, int width, int height,
297 GrPixelConfig config, const void* buffer,
298 size_t rowBytes);
bsalomon@google.com6f379512011-11-16 20:36:03 +0000299
joshualitt3322fa42014-11-07 08:48:51 -0800300 /**
jvanverthc3d706f2016-04-20 10:33:27 -0700301 * Updates the pixels in a rectangle of a surface using a buffer
jvanverth17aa0472016-01-05 10:41:27 -0800302 *
jvanverthc3d706f2016-04-20 10:33:27 -0700303 * @param surface The surface to write to.
cdalton397536c2016-03-25 12:15:03 -0700304 * @param left left edge of the rectangle to write (inclusive)
305 * @param top top edge of the rectangle to write (inclusive)
306 * @param width width of rectangle to write in pixels.
307 * @param height height of rectangle to write in pixels.
308 * @param config the pixel config of the source buffer
309 * @param transferBuffer GrBuffer to read pixels from (type must be "kCpuToGpu")
310 * @param offset offset from the start of the buffer
311 * @param rowBytes number of bytes between consecutive rows. Zero
312 * means rows are tightly packed.
jvanverth17aa0472016-01-05 10:41:27 -0800313 */
jvanverthc3d706f2016-04-20 10:33:27 -0700314 bool transferPixels(GrSurface* surface,
jvanverth17aa0472016-01-05 10:41:27 -0800315 int left, int top, int width, int height,
cdalton397536c2016-03-25 12:15:03 -0700316 GrPixelConfig config, GrBuffer* transferBuffer,
jvanverth84741b32016-09-30 08:39:02 -0700317 size_t offset, size_t rowBytes, GrFence* fence);
jvanverth17aa0472016-01-05 10:41:27 -0800318
bsalomon@google.com80d09b92011-11-05 21:21:13 +0000319 // After the client interacts directly with the 3D context state the GrGpu
320 // must resync its internal state and assumptions about 3D context state.
321 // Each time this occurs the GrGpu bumps a timestamp.
322 // state of the 3D context
323 // At 10 resets / frame and 60fps a 64bit timestamp will overflow in about
324 // a billion years.
325 typedef uint64_t ResetTimestamp;
326
327 // This timestamp is always older than the current timestamp
328 static const ResetTimestamp kExpiredTimestamp = 0;
329 // Returns a timestamp based on the number of times the context was reset.
330 // This timestamp can be used to lazily detect when cached 3D context state
331 // is dirty.
bsalomon6d467ec2014-11-18 07:36:19 -0800332 ResetTimestamp getResetTimestamp() const { return fResetTimestamp; }
bsalomon@google.com80d09b92011-11-05 21:21:13 +0000333
bsalomonf90a02b2014-11-26 12:28:00 -0800334 // 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 -0400335 // take place at the GrOpList level and this function implement faster copy paths. The rect
bsalomonf90a02b2014-11-26 12:28:00 -0800336 // and point are pre-clipped. The src rect and implied dst rect are guaranteed to be within the
337 // src/dst bounds and non-empty.
joshualitt1cbdcde2015-08-21 11:53:29 -0700338 bool copySurface(GrSurface* dst,
339 GrSurface* src,
340 const SkIRect& srcRect,
341 const SkIPoint& dstPoint);
joshualitt3322fa42014-11-07 08:48:51 -0800342
cdalton28f45b92016-03-07 13:58:26 -0800343 struct MultisampleSpecs {
csmartdalton0d28e572016-07-06 09:59:43 -0700344 MultisampleSpecs(uint8_t uniqueID, int effectiveSampleCnt, const SkPoint* locations)
345 : fUniqueID(uniqueID),
346 fEffectiveSampleCnt(effectiveSampleCnt),
347 fSampleLocations(locations) {}
348
cdalton28f45b92016-03-07 13:58:26 -0800349 // Nonzero ID that uniquely identifies these multisample specs.
csmartdalton0d28e572016-07-06 09:59:43 -0700350 uint8_t fUniqueID;
cdalton28f45b92016-03-07 13:58:26 -0800351 // The actual number of samples the GPU will run. NOTE: this value can be greater than the
352 // the render target's sample count.
csmartdalton0d28e572016-07-06 09:59:43 -0700353 int fEffectiveSampleCnt;
354 // If sample locations are supported, points to the subpixel locations at which the GPU will
355 // sample. Pixel center is at (.5, .5), and (0, 0) indicates the top left corner.
356 const SkPoint* fSampleLocations;
cdalton28f45b92016-03-07 13:58:26 -0800357 };
358
csmartdaltonc633abb2016-11-01 08:55:55 -0700359 // Finds a render target's multisample specs. The pipeline is only needed in case we need to
360 // flush the draw state prior to querying multisample info. The pipeline is not expected to
csmartdaltonc25c5d72016-11-01 07:03:59 -0700361 // affect the multisample information itself.
csmartdaltonc633abb2016-11-01 08:55:55 -0700362 const MultisampleSpecs& queryMultisampleSpecs(const GrPipeline&);
csmartdaltonc25c5d72016-11-01 07:03:59 -0700363
364 // Finds the multisample specs with a given unique id.
365 const MultisampleSpecs& getMultisampleSpecs(uint8_t uniqueID) {
366 SkASSERT(uniqueID > 0 && uniqueID < fMultisampleSpecs.count());
367 return fMultisampleSpecs[uniqueID];
368 }
cdalton28f45b92016-03-07 13:58:26 -0800369
Robert Phillipsf2361d22016-10-25 14:20:06 -0400370 // Creates a GrGpuCommandBuffer in which the GrOpList can send draw commands to instead of
Brian Salomonc293a292016-11-30 13:38:32 -0500371 // directly to the Gpu object. This currently does not take a GrRenderTarget. The command buffer
372 // is expected to infer the render target from the first draw, clear, or discard. This is an
373 // awkward workaround that goes away after MDB is complete and the render target is known from
374 // the GrRenderTargetOpList.
egdaniel9cb63402016-06-23 08:37:05 -0700375 virtual GrGpuCommandBuffer* createCommandBuffer(
egdaniel9cb63402016-06-23 08:37:05 -0700376 const GrGpuCommandBuffer::LoadAndStoreInfo& colorInfo,
377 const GrGpuCommandBuffer::LoadAndStoreInfo& stencilInfo) = 0;
bsalomon3e791242014-12-17 13:43:13 -0800378
Robert Phillipsf2361d22016-10-25 14:20:06 -0400379 // Called by GrOpList when flushing.
Brian Salomon42c456f2017-03-06 11:29:48 -0500380 // Provides a hook for post-flush actions (e.g. Vulkan command buffer submits).
Robert Phillipsf2361d22016-10-25 14:20:06 -0400381 virtual void finishOpList() {}
ethannicholas22793252016-01-30 09:59:10 -0800382
Greg Daniel6be35232017-03-01 17:01:09 -0500383 virtual GrFence SK_WARN_UNUSED_RESULT insertFence() = 0;
384 virtual bool waitFence(GrFence, uint64_t timeout = 1000) = 0;
jvanverth84741b32016-09-30 08:39:02 -0700385 virtual void deleteFence(GrFence) const = 0;
386
Greg Daniel6be35232017-03-01 17:01:09 -0500387 virtual sk_sp<GrSemaphore> SK_WARN_UNUSED_RESULT makeSemaphore() = 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
bsalomon6dea83f2015-12-03 12:58:06 -0800482 // draws an outline rectangle for debugging/visualization purposes.
483 virtual void drawDebugWireRect(GrRenderTarget*, const SkIRect&, GrColor) = 0;
bsalomon045802d2015-10-20 07:58:01 -0700484
bsalomone179a912016-01-20 06:18:10 -0800485 // Determines whether a texture will need to be rescaled in order to be used with the
Brian Salomon514baff2016-11-17 15:17:07 -0500486 // GrSamplerParams. This variation is called when the caller will create a new texture using the
Brian Osman32342f02017-03-04 08:12:46 -0500487 // resource provider from a non-texture src (cpu-backed image, ...).
Robert Phillips81444fb2017-03-21 09:14:35 -0400488 bool isACopyNeededForTextureParams(int width, int height, const GrSamplerParams&,
489 GrTextureProducer::CopyParams*,
490 SkScalar scaleAdjust[2]) const;
bsalomone179a912016-01-20 06:18:10 -0800491
492 // Like the above but this variation should be called when the caller is not creating the
493 // original texture but rather was handed the original texture. It adds additional checks
494 // relevant to original textures that were created external to Skia via
Brian Osman32342f02017-03-04 08:12:46 -0500495 // GrResourceProvider::wrap methods.
Robert Phillips3798c862017-03-27 11:08:16 -0400496 bool isACopyNeededForTextureParams(GrTextureProxy* proxy, const GrSamplerParams& params,
Robert Phillips81444fb2017-03-21 09:14:35 -0400497 GrTextureProducer::CopyParams* copyParams,
498 SkScalar scaleAdjust[2]) const {
Robert Phillips3798c862017-03-27 11:08:16 -0400499 if (this->isACopyNeededForTextureParams(proxy->width(), proxy->height(), params,
Robert Phillips81444fb2017-03-21 09:14:35 -0400500 copyParams, scaleAdjust)) {
bsalomone179a912016-01-20 06:18:10 -0800501 return true;
502 }
Robert Phillips3798c862017-03-27 11:08:16 -0400503 return this->onIsACopyNeededForTextureParams(proxy, params, copyParams, scaleAdjust);
bsalomone179a912016-01-20 06:18:10 -0800504 }
bsalomon045802d2015-10-20 07:58:01 -0700505
jvanverth672bb7f2015-07-13 07:19:57 -0700506 // This is only to be used in GL-specific tests.
halcanary96fcdcc2015-08-27 07:41:13 -0700507 virtual const GrGLContext* glContextForTesting() const { return nullptr; }
bsalomon993a4212015-05-29 11:37:25 -0700508
joshualitt8fd844f2015-12-02 13:36:47 -0800509 // This is only to be used by testing code
510 virtual void resetShaderCacheForTesting() const {}
511
egdaniel9cb63402016-06-23 08:37:05 -0700512 void handleDirtyContext() {
513 if (fResetBits) {
514 this->resetContext();
515 }
516 }
517
joshualittd53a8272014-11-10 16:03:14 -0800518protected:
bsalomonf0674512015-07-28 13:26:15 -0700519 static void ElevateDrawPreference(GrGpu::DrawPreference* preference,
520 GrGpu::DrawPreference elevation) {
521 GR_STATIC_ASSERT(GrGpu::kCallerPrefersDraw_DrawPreference > GrGpu::kNoDraw_DrawPreference);
522 GR_STATIC_ASSERT(GrGpu::kGpuPrefersDraw_DrawPreference >
523 GrGpu::kCallerPrefersDraw_DrawPreference);
524 GR_STATIC_ASSERT(GrGpu::kRequireDraw_DrawPreference >
525 GrGpu::kGpuPrefersDraw_DrawPreference);
526 *preference = SkTMax(*preference, elevation);
527 }
528
jvanverth900bd4a2016-04-29 13:53:12 -0700529 // Handles cases where a surface will be updated without a call to flushRenderTarget
530 void didWriteToSurface(GrSurface* surface, const SkIRect* bounds, uint32_t mipLevels = 1) const;
531
Ben Wagner145dbcd2016-11-03 14:40:50 -0400532 Stats fStats;
533 std::unique_ptr<GrPathRendering> fPathRendering;
joshualitt3322fa42014-11-07 08:48:51 -0800534 // Subclass must initialize this in its constructor.
Hal Canary144caf52016-11-07 17:57:18 -0500535 sk_sp<const GrCaps> fCaps;
joshualitt3322fa42014-11-07 08:48:51 -0800536
csmartdalton0d28e572016-07-06 09:59:43 -0700537 typedef SkTArray<SkPoint, true> SamplePattern;
538
bsalomon@google.com02ddc8b2013-01-28 15:35:28 +0000539private:
bsalomon@google.comb635d392011-11-05 12:47:43 +0000540 // called when the 3D context state is unknown. Subclass should emit any
bsalomon@google.comc8f7f472012-06-18 13:44:51 +0000541 // assumed 3D context state and dirty any state cache.
bsalomon@google.com0a208a12013-06-28 18:57:35 +0000542 virtual void onResetContext(uint32_t resetBits) = 0;
bsalomon@google.coma7f84e12011-03-10 14:13:19 +0000543
bsalomoncb02b382015-08-12 11:14:50 -0700544 // Called before certain draws in order to guarantee coherent results from dst reads.
545 virtual void xferBarrier(GrRenderTarget*, GrXferBarrierType) = 0;
546
bsalomon@google.com16e3dde2012-10-25 18:43:28 +0000547 // overridden by backend-specific derived class to create objects.
egdanielb0e1be22015-04-22 13:27:39 -0700548 // Texture size and sample size will have already been validated in base class before
549 // onCreateTexture/CompressedTexture are called.
550 virtual GrTexture* onCreateTexture(const GrSurfaceDesc& desc,
kkinnunen2e6055b2016-04-22 01:48:29 -0700551 SkBudgeted budgeted,
cblume55f2d2d2016-02-26 13:20:48 -0800552 const SkTArray<GrMipLevel>& texels) = 0;
egdanielb0e1be22015-04-22 13:27:39 -0700553 virtual GrTexture* onCreateCompressedTexture(const GrSurfaceDesc& desc,
kkinnunen2e6055b2016-04-22 01:48:29 -0700554 SkBudgeted budgeted,
cblume55f2d2d2016-02-26 13:20:48 -0800555 const SkTArray<GrMipLevel>& texels) = 0;
556
Greg Daniel7ef28f32017-04-20 16:41:55 +0000557 virtual sk_sp<GrTexture> onWrapBackendTexture(const GrBackendTexture&,
558 GrSurfaceOrigin,
559 GrBackendTextureFlags,
560 int sampleCnt,
561 GrWrapOwnership) = 0;
Greg Danielbcf612b2017-05-01 13:50:58 +0000562 virtual sk_sp<GrRenderTarget> onWrapBackendRenderTarget(const GrBackendRenderTarget&,
563 GrSurfaceOrigin) = 0;
Greg Daniel7ef28f32017-04-20 16:41:55 +0000564 virtual sk_sp<GrRenderTarget> onWrapBackendTextureAsRenderTarget(const GrBackendTexture&,
565 GrSurfaceOrigin,
566 int sampleCnt)=0;
cdalton1bf3e712016-04-19 10:00:02 -0700567 virtual GrBuffer* onCreateBuffer(size_t size, GrBufferType intendedType, GrAccessPattern,
568 const void* data) = 0;
bsalomon@google.coma7f84e12011-03-10 14:13:19 +0000569
csmartdaltone0d36292016-07-29 08:14:20 -0700570 virtual gr_instanced::InstancedRendering* onCreateInstancedRendering() = 0;
Robert Phillipse3302df2017-04-24 07:31:02 -0400571 virtual std::unique_ptr<gr_instanced::OpAllocator> onCreateInstancedRenderingAllocator() {
572 return nullptr;
573 }
csmartdaltone0d36292016-07-29 08:14:20 -0700574
Robert Phillips3798c862017-03-27 11:08:16 -0400575 virtual bool onIsACopyNeededForTextureParams(GrTextureProxy* proxy, const GrSamplerParams&,
Robert Phillips81444fb2017-03-21 09:14:35 -0400576 GrTextureProducer::CopyParams*,
577 SkScalar scaleAdjust[2]) const {
578 return false;
579 }
bsalomone179a912016-01-20 06:18:10 -0800580
bsalomonf0674512015-07-28 13:26:15 -0700581 virtual bool onGetReadPixelsInfo(GrSurface* srcSurface, int readWidth, int readHeight,
582 size_t rowBytes, GrPixelConfig readConfig, DrawPreference*,
583 ReadPixelTempDrawInfo*) = 0;
cblumeed828002016-02-16 13:00:01 -0800584 virtual bool onGetWritePixelsInfo(GrSurface* dstSurface, int width, int height,
bsalomonf0674512015-07-28 13:26:15 -0700585 GrPixelConfig srcConfig, DrawPreference*,
586 WritePixelTempDrawInfo*) = 0;
587
bsalomon6cb3cbe2015-07-30 07:34:27 -0700588 // overridden by backend-specific derived class to perform the surface read
589 virtual bool onReadPixels(GrSurface*,
egdaniel6d901da2015-07-30 12:02:15 -0700590 int left, int top,
591 int width, int height,
bsalomon@google.comc4364992011-11-07 15:54:49 +0000592 GrPixelConfig,
593 void* buffer,
senorblanco@chromium.org3cb406b2013-02-05 19:50:46 +0000594 size_t rowBytes) = 0;
bsalomon@google.coma7f84e12011-03-10 14:13:19 +0000595
bsalomon6cb3cbe2015-07-30 07:34:27 -0700596 // overridden by backend-specific derived class to perform the surface write
597 virtual bool onWritePixels(GrSurface*,
598 int left, int top, int width, int height,
cblume55f2d2d2016-02-26 13:20:48 -0800599 GrPixelConfig config,
600 const SkTArray<GrMipLevel>& texels) = 0;
bsalomon@google.com6f379512011-11-16 20:36:03 +0000601
jvanverthc3d706f2016-04-20 10:33:27 -0700602 // overridden by backend-specific derived class to perform the surface write
603 virtual bool onTransferPixels(GrSurface*,
jvanverth17aa0472016-01-05 10:41:27 -0800604 int left, int top, int width, int height,
cdalton397536c2016-03-25 12:15:03 -0700605 GrPixelConfig config, GrBuffer* transferBuffer,
jvanverth17aa0472016-01-05 10:41:27 -0800606 size_t offset, size_t rowBytes) = 0;
607
bsalomon@google.com16e3dde2012-10-25 18:43:28 +0000608 // overridden by backend-specific derived class to perform the resolve
bsalomon@google.com75f9f252012-01-31 13:35:56 +0000609 virtual void onResolveRenderTarget(GrRenderTarget* target) = 0;
610
joshualitt1cbdcde2015-08-21 11:53:29 -0700611 // overridden by backend specific derived class to perform the copy surface
612 virtual bool onCopySurface(GrSurface* dst,
613 GrSurface* src,
614 const SkIRect& srcRect,
615 const SkIPoint& dstPoint) = 0;
616
cdalton28f45b92016-03-07 13:58:26 -0800617 // overridden by backend specific derived class to perform the multisample queries
csmartdaltonc25c5d72016-11-01 07:03:59 -0700618 virtual void onQueryMultisampleSpecs(GrRenderTarget*, const GrStencilSettings&,
619 int* effectiveSampleCnt, SamplePattern*) = 0;
cdalton28f45b92016-03-07 13:58:26 -0800620
bsalomon@google.comb635d392011-11-05 12:47:43 +0000621 void resetContext() {
bsalomon@google.com0a208a12013-06-28 18:57:35 +0000622 this->onResetContext(fResetBits);
623 fResetBits = 0;
bsalomon@google.comb635d392011-11-05 12:47:43 +0000624 ++fResetTimestamp;
625 }
626
csmartdalton0d28e572016-07-06 09:59:43 -0700627 struct SamplePatternComparator {
628 bool operator()(const SamplePattern&, const SamplePattern&) const;
629 };
630
631 typedef std::map<SamplePattern, uint8_t, SamplePatternComparator> MultisampleSpecsIdMap;
632
633 ResetTimestamp fResetTimestamp;
634 uint32_t fResetBits;
635 MultisampleSpecsIdMap fMultisampleSpecsIdMap;
636 SkSTArray<1, MultisampleSpecs, true> fMultisampleSpecs;
joshualitt3322fa42014-11-07 08:48:51 -0800637 // The context owns us, not vice-versa, so this ptr is not ref'ed by Gpu.
csmartdalton0d28e572016-07-06 09:59:43 -0700638 GrContext* fContext;
bsalomon@google.com02ddc8b2013-01-28 15:35:28 +0000639
kkinnunencabe20c2015-06-01 01:37:26 -0700640 friend class GrPathRendering;
Robert Phillipse3302df2017-04-24 07:31:02 -0400641 friend class gr_instanced::InstancedOp; // for xferBarrier
joshualitt3322fa42014-11-07 08:48:51 -0800642 typedef SkRefCnt INHERITED;
reed@google.comac10a2d2010-12-22 21:39:39 +0000643};
644
645#endif