blob: fb5dc00943e49a68ed60cbe6322d26c7b34312a2 [file] [log] [blame]
egdaniel066df7c2016-06-08 14:02:27 -07001/*
2* Copyright 2016 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.
6*/
7
8#ifndef GrGpuCommandBuffer_DEFINED
9#define GrGpuCommandBuffer_DEFINED
10
11#include "GrColor.h"
Brian Salomon89527432016-12-16 09:52:16 -050012#include "ops/GrDrawOp.h"
egdaniel066df7c2016-06-08 14:02:27 -070013
Brian Salomon742e31d2016-12-07 17:06:19 -050014class GrOpFlushState;
csmartdalton29df7602016-08-31 11:55:52 -070015class GrFixedClip;
egdaniel9cb63402016-06-23 08:37:05 -070016class GrGpu;
Chris Daltonbca46e22017-05-15 11:03:26 -060017class GrMesh;
egdaniel9cb63402016-06-23 08:37:05 -070018class GrPipeline;
19class GrPrimitiveProcessor;
egdaniel066df7c2016-06-08 14:02:27 -070020class GrRenderTarget;
egdaniel9cb63402016-06-23 08:37:05 -070021struct SkIRect;
Greg Daniel36a77ee2016-10-18 10:33:25 -040022struct SkRect;
egdaniel066df7c2016-06-08 14:02:27 -070023
egdaniel9cb63402016-06-23 08:37:05 -070024/**
25 * The GrGpuCommandBuffer is a series of commands (draws, clears, and discards), which all target
26 * the same render target. It is possible that these commands execute immediately (GL), or get
Brian Salomon09d994e2016-12-21 11:14:46 -050027 * buffered up for later execution (Vulkan). GrOps will execute their draw commands into a
egdaniel9cb63402016-06-23 08:37:05 -070028 * GrGpuCommandBuffer.
Brian Salomonc293a292016-11-30 13:38:32 -050029 *
30 * Ideally we'd know the GrRenderTarget, or at least its properties when the GrGpuCommandBuffer, is
31 * created. We also then wouldn't include it in the GrPipeline or as a parameter to the clear and
32 * discard methods. The logical place for that will be in GrRenderTargetOpList post-MDB. For now
33 * the render target is redundantly passed to each operation, though it will always be the same
34 * render target for a given command buffer even pre-MDB.
egdaniel9cb63402016-06-23 08:37:05 -070035 */
egdaniel066df7c2016-06-08 14:02:27 -070036class GrGpuCommandBuffer {
37public:
egdaniel9cb63402016-06-23 08:37:05 -070038 enum class LoadOp {
39 kLoad,
40 kClear,
41 kDiscard,
42 };
43
44 enum class StoreOp {
45 kStore,
46 kDiscard,
47 };
48
49 struct LoadAndStoreInfo {
50 LoadOp fLoadOp;
51 StoreOp fStoreOp;
52 GrColor fClearColor;
egdaniel066df7c2016-06-08 14:02:27 -070053 };
54
55 GrGpuCommandBuffer() {}
56 virtual ~GrGpuCommandBuffer() {}
57
58 // Signals the end of recording to the command buffer and that it can now be submitted.
59 virtual void end() = 0;
60
61 // Sends the command buffer off to the GPU object to execute the commands built up in the
62 // buffer. The gpu object is allowed to defer execution of the commands until it is flushed.
Greg Daniel36a77ee2016-10-18 10:33:25 -040063 void submit();
egdaniel9cb63402016-06-23 08:37:05 -070064
65 // We pass in an array of meshCount GrMesh to the draw. The backend should loop over each
66 // GrMesh object and emit a draw for it. Each draw will use the same GrPipeline and
67 // GrPrimitiveProcessor. This may fail if the draw would exceed any resource limits (e.g.
68 // number of vertex attributes is too large).
69 bool draw(const GrPipeline&,
70 const GrPrimitiveProcessor&,
Chris Daltonbca46e22017-05-15 11:03:26 -060071 const GrMesh[],
Greg Daniel36a77ee2016-10-18 10:33:25 -040072 int meshCount,
73 const SkRect& bounds);
egdaniel9cb63402016-06-23 08:37:05 -070074
Greg Daniel77b53f62016-10-18 11:48:51 -040075 // Performs an upload of vertex data in the middle of a set of a set of draws
Greg Danieldbd11ec2017-03-21 16:56:31 -040076 virtual void inlineUpload(GrOpFlushState* state, GrDrawOp::DeferredUploadFn& upload,
77 GrRenderTarget* rt) = 0;
Greg Daniel77b53f62016-10-18 11:48:51 -040078
egdaniel9cb63402016-06-23 08:37:05 -070079 /**
Greg Daniel77b53f62016-10-18 11:48:51 -040080 * Clear the passed in render target. Ignores the draw state and clip.
81 */
Brian Salomonc293a292016-11-30 13:38:32 -050082 void clear(GrRenderTarget*, const GrFixedClip&, GrColor);
egdaniel9cb63402016-06-23 08:37:05 -070083
Brian Salomonc293a292016-11-30 13:38:32 -050084 void clearStencilClip(GrRenderTarget*, const GrFixedClip&, bool insideStencilMask);
Greg Daniel36a77ee2016-10-18 10:33:25 -040085
egdaniel9cb63402016-06-23 08:37:05 -070086 /**
Greg Daniel77b53f62016-10-18 11:48:51 -040087 * Discards the contents render target. nullptr indicates that the current render target should
88 * be discarded.
89 */
egdaniel9cb63402016-06-23 08:37:05 -070090 // TODO: This should be removed in the future to favor using the load and store ops for discard
Brian Salomonc293a292016-11-30 13:38:32 -050091 virtual void discard(GrRenderTarget*) = 0;
egdaniel9cb63402016-06-23 08:37:05 -070092
93private:
94 virtual GrGpu* gpu() = 0;
Greg Daniel65a09272016-10-12 09:47:22 -040095 virtual GrRenderTarget* renderTarget() = 0;
96
Greg Daniel36a77ee2016-10-18 10:33:25 -040097 virtual void onSubmit() = 0;
egdaniel9cb63402016-06-23 08:37:05 -070098
99 // overridden by backend-specific derived class to perform the draw call.
100 virtual void onDraw(const GrPipeline&,
101 const GrPrimitiveProcessor&,
102 const GrMesh*,
Greg Daniel36a77ee2016-10-18 10:33:25 -0400103 int meshCount,
104 const SkRect& bounds) = 0;
egdaniel9cb63402016-06-23 08:37:05 -0700105
106 // overridden by backend-specific derived class to perform the clear.
Brian Salomonc293a292016-11-30 13:38:32 -0500107 virtual void onClear(GrRenderTarget*, const GrFixedClip&, GrColor) = 0;
egdaniel9cb63402016-06-23 08:37:05 -0700108
Brian Salomonc293a292016-11-30 13:38:32 -0500109 virtual void onClearStencilClip(GrRenderTarget*, const GrFixedClip&,
csmartdalton29df7602016-08-31 11:55:52 -0700110 bool insideStencilMask) = 0;
egdaniel9cb63402016-06-23 08:37:05 -0700111
egdaniel066df7c2016-06-08 14:02:27 -0700112};
113
114#endif