blob: 3a6a3e7005320a4cb21d1d0215dde438e55248cd [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"
Chris Dalton46983b72017-06-06 12:27:16 -060012#include "GrPipeline.h"
Brian Salomon89527432016-12-16 09:52:16 -050013#include "ops/GrDrawOp.h"
egdaniel066df7c2016-06-08 14:02:27 -070014
Brian Salomon742e31d2016-12-07 17:06:19 -050015class GrOpFlushState;
csmartdalton29df7602016-08-31 11:55:52 -070016class GrFixedClip;
egdaniel9cb63402016-06-23 08:37:05 -070017class GrGpu;
Chris Daltonbca46e22017-05-15 11:03:26 -060018class GrMesh;
egdaniel9cb63402016-06-23 08:37:05 -070019class GrPipeline;
20class GrPrimitiveProcessor;
egdaniel066df7c2016-06-08 14:02:27 -070021class GrRenderTarget;
egdaniel9cb63402016-06-23 08:37:05 -070022struct SkIRect;
Greg Daniel36a77ee2016-10-18 10:33:25 -040023struct SkRect;
egdaniel066df7c2016-06-08 14:02:27 -070024
egdaniel9cb63402016-06-23 08:37:05 -070025/**
26 * The GrGpuCommandBuffer is a series of commands (draws, clears, and discards), which all target
27 * the same render target. It is possible that these commands execute immediately (GL), or get
Brian Salomon09d994e2016-12-21 11:14:46 -050028 * buffered up for later execution (Vulkan). GrOps will execute their draw commands into a
egdaniel9cb63402016-06-23 08:37:05 -070029 * GrGpuCommandBuffer.
Brian Salomonc293a292016-11-30 13:38:32 -050030 *
31 * Ideally we'd know the GrRenderTarget, or at least its properties when the GrGpuCommandBuffer, is
32 * created. We also then wouldn't include it in the GrPipeline or as a parameter to the clear and
33 * discard methods. The logical place for that will be in GrRenderTargetOpList post-MDB. For now
34 * the render target is redundantly passed to each operation, though it will always be the same
35 * render target for a given command buffer even pre-MDB.
egdaniel9cb63402016-06-23 08:37:05 -070036 */
egdaniel066df7c2016-06-08 14:02:27 -070037class GrGpuCommandBuffer {
38public:
egdaniel9cb63402016-06-23 08:37:05 -070039 enum class LoadOp {
40 kLoad,
41 kClear,
42 kDiscard,
43 };
44
45 enum class StoreOp {
46 kStore,
47 kDiscard,
48 };
49
50 struct LoadAndStoreInfo {
51 LoadOp fLoadOp;
52 StoreOp fStoreOp;
53 GrColor fClearColor;
egdaniel066df7c2016-06-08 14:02:27 -070054 };
55
56 GrGpuCommandBuffer() {}
57 virtual ~GrGpuCommandBuffer() {}
58
59 // Signals the end of recording to the command buffer and that it can now be submitted.
60 virtual void end() = 0;
61
62 // Sends the command buffer off to the GPU object to execute the commands built up in the
63 // buffer. The gpu object is allowed to defer execution of the commands until it is flushed.
Greg Daniel36a77ee2016-10-18 10:33:25 -040064 void submit();
egdaniel9cb63402016-06-23 08:37:05 -070065
66 // We pass in an array of meshCount GrMesh to the draw. The backend should loop over each
67 // GrMesh object and emit a draw for it. Each draw will use the same GrPipeline and
68 // GrPrimitiveProcessor. This may fail if the draw would exceed any resource limits (e.g.
69 // number of vertex attributes is too large).
70 bool draw(const GrPipeline&,
71 const GrPrimitiveProcessor&,
Chris Daltonbca46e22017-05-15 11:03:26 -060072 const GrMesh[],
Chris Dalton46983b72017-06-06 12:27:16 -060073 const GrPipeline::DynamicState[],
Greg Daniel36a77ee2016-10-18 10:33:25 -040074 int meshCount,
75 const SkRect& bounds);
egdaniel9cb63402016-06-23 08:37:05 -070076
Greg Daniel77b53f62016-10-18 11:48:51 -040077 // Performs an upload of vertex data in the middle of a set of a set of draws
Greg Danieldbd11ec2017-03-21 16:56:31 -040078 virtual void inlineUpload(GrOpFlushState* state, GrDrawOp::DeferredUploadFn& upload,
79 GrRenderTarget* rt) = 0;
Greg Daniel77b53f62016-10-18 11:48:51 -040080
egdaniel9cb63402016-06-23 08:37:05 -070081 /**
Greg Daniel77b53f62016-10-18 11:48:51 -040082 * Clear the passed in render target. Ignores the draw state and clip.
83 */
Brian Salomonc293a292016-11-30 13:38:32 -050084 void clear(GrRenderTarget*, const GrFixedClip&, GrColor);
egdaniel9cb63402016-06-23 08:37:05 -070085
Brian Salomonc293a292016-11-30 13:38:32 -050086 void clearStencilClip(GrRenderTarget*, const GrFixedClip&, bool insideStencilMask);
Greg Daniel36a77ee2016-10-18 10:33:25 -040087
egdaniel9cb63402016-06-23 08:37:05 -070088 /**
Greg Daniel77b53f62016-10-18 11:48:51 -040089 * Discards the contents render target. nullptr indicates that the current render target should
90 * be discarded.
91 */
egdaniel9cb63402016-06-23 08:37:05 -070092 // 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 -050093 virtual void discard(GrRenderTarget*) = 0;
egdaniel9cb63402016-06-23 08:37:05 -070094
95private:
96 virtual GrGpu* gpu() = 0;
Greg Daniel65a09272016-10-12 09:47:22 -040097 virtual GrRenderTarget* renderTarget() = 0;
98
Greg Daniel36a77ee2016-10-18 10:33:25 -040099 virtual void onSubmit() = 0;
egdaniel9cb63402016-06-23 08:37:05 -0700100
101 // overridden by backend-specific derived class to perform the draw call.
102 virtual void onDraw(const GrPipeline&,
103 const GrPrimitiveProcessor&,
Chris Dalton46983b72017-06-06 12:27:16 -0600104 const GrMesh[],
105 const GrPipeline::DynamicState[],
Greg Daniel36a77ee2016-10-18 10:33:25 -0400106 int meshCount,
107 const SkRect& bounds) = 0;
egdaniel9cb63402016-06-23 08:37:05 -0700108
109 // overridden by backend-specific derived class to perform the clear.
Brian Salomonc293a292016-11-30 13:38:32 -0500110 virtual void onClear(GrRenderTarget*, const GrFixedClip&, GrColor) = 0;
egdaniel9cb63402016-06-23 08:37:05 -0700111
Brian Salomonc293a292016-11-30 13:38:32 -0500112 virtual void onClearStencilClip(GrRenderTarget*, const GrFixedClip&,
csmartdalton29df7602016-08-31 11:55:52 -0700113 bool insideStencilMask) = 0;
egdaniel9cb63402016-06-23 08:37:05 -0700114
egdaniel066df7c2016-06-08 14:02:27 -0700115};
116
117#endif