1 /* 2 * Copyright 2018 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 GrAAFillRRectOp_DEFINED 9 #define GrAAFillRRectOp_DEFINED 10 11 #include "GrDrawOp.h" 12 13 class GrAAFillRRectOp : public GrDrawOp { 14 public: 15 DEFINE_OP_CLASS_ID 16 17 static std::unique_ptr<GrAAFillRRectOp> Make(GrContext*, const SkMatrix&, const SkRRect&, 18 const GrCaps&, GrPaint&&); 19 20 const char* name() const override { return "GrAAFillRRectOp"; } 21 FixedFunctionFlags fixedFunctionFlags() const override { return FixedFunctionFlags::kNone; } 22 GrProcessorSet::Analysis finalize(const GrCaps&, const GrAppliedClip*) override; 23 CombineResult onCombineIfPossible(GrOp*, const GrCaps&) override; 24 void visitProxies(const VisitProxyFunc& fn, VisitorType) const override { 25 fProcessors.visitProxies(fn); 26 } 27 void onPrepare(GrOpFlushState*) override; 28 29 void onExecute(GrOpFlushState*, const SkRect& chainBounds) override; 30 31 private: 32 enum class Flags { 33 kNone = 0, 34 kUseHWDerivatives = 1 << 0, 35 kHasLocalCoords = 1 << 1 36 }; 37 38 GR_DECL_BITFIELD_CLASS_OPS_FRIENDS(Flags) 39 40 class Processor; 41 42 GrAAFillRRectOp(const GrShaderCaps&, const SkMatrix&, const SkRRect&, GrPaint&&); 43 44 // These methods are used to append data of various POD types to our internal array of instance 45 // data. The actual layout of the instance buffer can vary from Op to Op. 46 template <typename T> inline void* appendInstanceData(int count) { 47 static_assert(std::is_pod<T>::value, ""); 48 static_assert(4 == alignof(T), ""); 49 return fInstanceData.push_back_n(sizeof(T) * count); 50 } 51 52 template <typename T, typename... Args> 53 inline void writeInstanceData(const T& val, const Args&... remainder) { 54 memcpy(this->appendInstanceData<T>(1), &val, sizeof(T)); 55 this->writeInstanceData(remainder...); 56 } 57 58 void writeInstanceData() {} // Halt condition. 59 60 const SkPMColor4f fOriginalColor; 61 const SkRect fLocalRect; 62 Flags fFlags = Flags::kNone; 63 GrProcessorSet fProcessors; 64 65 SkSTArray<sizeof(float) * 16 * 4, char, /*MEM_MOVE=*/ true> fInstanceData; 66 int fInstanceCount = 1; 67 int fInstanceStride = 0; 68 69 sk_sp<const GrBuffer> fInstanceBuffer; 70 int fBaseInstance; 71 72 friend class GrOpMemoryPool; 73 }; 74 75 GR_MAKE_BITFIELD_CLASS_OPS(GrAAFillRRectOp::Flags) 76 77 #endif 78