1 /* 2 * Copyright 2012 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 GrProcessor_DEFINED 9 #define GrProcessor_DEFINED 10 11 #include "include/core/SkString.h" 12 13 #include <cstddef> 14 #include <new> 15 16 /** Provides custom shader code to the Ganesh shading pipeline. GrProcessor objects *must* be 17 immutable: after being constructed, their fields may not change. 18 19 Dynamically allocated GrProcessors are managed by a per-thread memory pool. The ref count of an 20 processor must reach 0 before the thread terminates and the pool is destroyed. 21 */ 22 class GrProcessor { 23 public: 24 enum ClassID { 25 kNull_ClassID, // Reserved ID for missing (null) processors 26 27 kAttributeTestProcessor_ClassID, 28 kBigKeyProcessor_ClassID, 29 kBlendFragmentProcessor_ClassID, 30 kBlockInputFragmentProcessor_ClassID, 31 kButtCapStrokedCircleGeometryProcessor_ClassID, 32 kCircleGeometryProcessor_ClassID, 33 kCircularRRectEffect_ClassID, 34 kClockwiseTestProcessor_ClassID, 35 kColorTableEffect_ClassID, 36 kCoverageSetOpXP_ClassID, 37 kCustomXP_ClassID, 38 kDashingCircleEffect_ClassID, 39 kDashingLineEffect_ClassID, 40 kDefaultGeoProc_ClassID, 41 kDeviceSpace_ClassID, 42 kDIEllipseGeometryProcessor_ClassID, 43 kDisableColorXP_ClassID, 44 kDrawAtlasPathShader_ClassID, 45 kEllipseGeometryProcessor_ClassID, 46 kEllipticalRRectEffect_ClassID, 47 kFwidthSquircleTestProcessor_ClassID, 48 kGP_ClassID, 49 kGrBicubicEffect_ClassID, 50 kGrBitmapTextGeoProc_ClassID, 51 kGrColorSpaceXformEffect_ClassID, 52 kGrConicEffect_ClassID, 53 kGrConvexPolyEffect_ClassID, 54 kGrDiffuseLightingEffect_ClassID, 55 kGrDisplacementMapEffect_ClassID, 56 kGrDistanceFieldA8TextGeoProc_ClassID, 57 kGrDistanceFieldLCDTextGeoProc_ClassID, 58 kGrDistanceFieldPathGeoProc_ClassID, 59 kGrFillRRectOp_Processor_ClassID, 60 kGrGaussianConvolutionFragmentProcessor_ClassID, 61 kGrMatrixConvolutionEffect_ClassID, 62 kGrMatrixEffect_ClassID, 63 kGrMeshTestProcessor_ClassID, 64 kGrMorphologyEffect_ClassID, 65 kGrPerlinNoise2Effect_ClassID, 66 kGrPipelineDynamicStateTestProcessor_ClassID, 67 kGrQuadEffect_ClassID, 68 kGrRRectShadowGeoProc_ClassID, 69 kGrSkSLFP_ClassID, 70 kGrSpecularLightingEffect_ClassID, 71 kGrTextureEffect_ClassID, 72 kGrUnrolledBinaryGradientColorizer_ClassID, 73 kGrYUVtoRGBEffect_ClassID, 74 kHighPrecisionFragmentProcessor_ClassID, 75 kLatticeGP_ClassID, 76 kPDLCDXferProcessor_ClassID, 77 kPorterDuffXferProcessor_ClassID, 78 kPremulFragmentProcessor_ClassID, 79 kQuadEdgeEffect_ClassID, 80 kQuadPerEdgeAAGeometryProcessor_ClassID, 81 kSeriesFragmentProcessor_ClassID, 82 kShaderPDXferProcessor_ClassID, 83 kSurfaceColorProcessor_ClassID, 84 kSwizzleFragmentProcessor_ClassID, 85 kTessellate_BoundingBoxShader_ClassID, 86 kTessellate_GrModulateAtlasCoverageEffect_ClassID, 87 kTessellate_GrStrokeTessellationShader_ClassID, 88 kTessellate_HullShader_ClassID, 89 kTessellate_MiddleOutShader_ClassID, 90 kTessellate_SimpleTriangleShader_ClassID, 91 kTessellationTestTriShader_ClassID, 92 kTestFP_ClassID, 93 kTestRectOp_ClassID, 94 kVertexColorSpaceBenchGP_ClassID, 95 kVerticesGP_ClassID, 96 }; 97 98 virtual ~GrProcessor() = default; 99 100 /** Human-meaningful string to identify this processor; may be embedded in generated shader 101 code and must be a legal SkSL identifier prefix. */ 102 virtual const char* name() const = 0; 103 104 /** Human-readable dump of all information */ 105 #if defined(GPU_TEST_UTILS) onDumpInfo()106 virtual SkString onDumpInfo() const { return SkString(); } 107 dumpInfo()108 SkString dumpInfo() const { 109 SkString info(name()); 110 info.append(this->onDumpInfo()); 111 return info; 112 } 113 #endif 114 115 void* operator new(size_t size); 116 void* operator new(size_t object_size, size_t footer_size); 117 void operator delete(void* target); 118 new(size_t size,void * placement)119 void* operator new(size_t size, void* placement) { 120 return ::operator new(size, placement); 121 } delete(void * target,void * placement)122 void operator delete(void* target, void* placement) { 123 ::operator delete(target, placement); 124 } 125 126 /** Helper for down-casting to a GrProcessor subclass */ cast()127 template <typename T> const T& cast() const { return *static_cast<const T*>(this); } 128 classID()129 ClassID classID() const { return fClassID; } 130 131 protected: GrProcessor(ClassID classID)132 GrProcessor(ClassID classID) : fClassID(classID) {} 133 GrProcessor(const GrProcessor&) = delete; 134 GrProcessor& operator=(const GrProcessor&) = delete; 135 136 const ClassID fClassID; 137 }; 138 139 #endif 140