/* * Copyright 2015 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #ifndef GrOp_DEFINED #define GrOp_DEFINED #include "include/core/SkMatrix.h" #include "include/core/SkRect.h" #include "include/core/SkString.h" #include "include/core/SkTypes.h" #include "include/private/SkColorData.h" #include "include/private/base/SkDebug.h" #include "include/private/base/SkNoncopyable.h" #include "include/private/base/SkTo.h" #include "include/private/gpu/ganesh/GrTypesPriv.h" #include "src/core/SkTraceEvent.h" #include "src/gpu/ganesh/GrSurfaceProxy.h" #include <atomic> #include <cstddef> #include <cstdint> #include <memory> #include <new> #include <utility> class GrAppliedClip; class GrCaps; class GrDstProxyView; class GrOpFlushState; class GrPaint; class GrRecordingContext; class GrSurfaceProxyView; class SkArenaAlloc; enum class GrXferBarrierFlags; /** * GrOp is the base class for all Ganesh deferred GPU operations. To facilitate reordering and to * minimize draw calls, Ganesh does not generate geometry inline with draw calls. Instead, it * captures the arguments to the draw and then generates the geometry when flushing. This gives GrOp * subclasses complete freedom to decide how/when to combine in order to produce fewer draw calls * and minimize state changes. * * Ops of the same subclass may be merged or chained using combineIfPossible. When two ops merge, * one takes on the union of the data and the other is left empty. The merged op becomes responsible * for drawing the data from both the original ops. When ops are chained each op maintains its own * data but they are linked in a list and the head op becomes responsible for executing the work for * the chain. * * It is required that chainability is transitive. Moreover, if op A is able to merge with B then * it must be the case that any op that can chain with A will either merge or chain with any op * that can chain to B. * * The bounds of the op must contain all the vertices in device space *irrespective* of the clip. * The bounds are used in determining which clip elements must be applied and thus the bounds cannot * in turn depend upon the clip. */ #define GR_OP_SPEW … #if GR_OP_SPEW #define GrOP_SPEW … #define GrOP_INFO … #else #define GrOP_SPEW(code) … #define GrOP_INFO(...) … #endif // Print out op information at flush time #define GR_FLUSH_TIME_OP_SPEW … // A helper macro to generate a class static id #define DEFINE_OP_CLASS_ID … class GrOp : private SkNoncopyable { … }; #endif