GrProcessor.h 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242
  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. #ifndef GrProcessor_DEFINED
  8. #define GrProcessor_DEFINED
  9. #include "include/core/SkMath.h"
  10. #include "include/core/SkString.h"
  11. #include "include/gpu/GrSamplerState.h"
  12. #include "src/gpu/GrColor.h"
  13. #include "src/gpu/GrGpuBuffer.h"
  14. #include "src/gpu/GrProcessorUnitTest.h"
  15. #include "src/gpu/GrShaderVar.h"
  16. #include "src/gpu/GrSurfaceProxyPriv.h"
  17. #include "src/gpu/GrTextureProxy.h"
  18. class GrContext;
  19. class GrResourceProvider;
  20. /**
  21. * Used by processors to build their keys. It incorporates each per-processor key into a larger
  22. * shader key.
  23. */
  24. class GrProcessorKeyBuilder {
  25. public:
  26. GrProcessorKeyBuilder(SkTArray<unsigned char, true>* data) : fData(data), fCount(0) {
  27. SkASSERT(0 == fData->count() % sizeof(uint32_t));
  28. }
  29. void add32(uint32_t v) {
  30. ++fCount;
  31. fData->push_back_n(4, reinterpret_cast<uint8_t*>(&v));
  32. }
  33. /** Inserts count uint32_ts into the key. The returned pointer is only valid until the next
  34. add*() call. */
  35. uint32_t* SK_WARN_UNUSED_RESULT add32n(int count) {
  36. SkASSERT(count > 0);
  37. fCount += count;
  38. return reinterpret_cast<uint32_t*>(fData->push_back_n(4 * count));
  39. }
  40. size_t size() const { return sizeof(uint32_t) * fCount; }
  41. private:
  42. SkTArray<uint8_t, true>* fData; // unowned ptr to the larger key.
  43. int fCount; // number of uint32_ts added to fData by the processor.
  44. };
  45. /** Provides custom shader code to the Ganesh shading pipeline. GrProcessor objects *must* be
  46. immutable: after being constructed, their fields may not change.
  47. Dynamically allocated GrProcessors are managed by a per-thread memory pool. The ref count of an
  48. processor must reach 0 before the thread terminates and the pool is destroyed.
  49. */
  50. class GrProcessor {
  51. public:
  52. enum ClassID {
  53. kBigKeyProcessor_ClassID,
  54. kBlockInputFragmentProcessor_ClassID,
  55. kButtCapStrokedCircleGeometryProcessor_ClassID,
  56. kCircleGeometryProcessor_ClassID,
  57. kCircularRRectEffect_ClassID,
  58. kClockwiseTestProcessor_ClassID,
  59. kColorTableEffect_ClassID,
  60. kComposeOneFragmentProcessor_ClassID,
  61. kComposeTwoFragmentProcessor_ClassID,
  62. kCoverageSetOpXP_ClassID,
  63. kCubicStrokeProcessor_ClassID,
  64. kCustomXP_ClassID,
  65. kDashingCircleEffect_ClassID,
  66. kDashingLineEffect_ClassID,
  67. kDefaultGeoProc_ClassID,
  68. kDIEllipseGeometryProcessor_ClassID,
  69. kDisableColorXP_ClassID,
  70. kTwoPointConicalEffect_ClassID,
  71. kEllipseGeometryProcessor_ClassID,
  72. kEllipticalRRectEffect_ClassID,
  73. kGP_ClassID,
  74. kVertexColorSpaceBenchGP_ClassID,
  75. kGrAARectEffect_ClassID,
  76. kGrAlphaThresholdFragmentProcessor_ClassID,
  77. kGrArithmeticFP_ClassID,
  78. kGrBicubicEffect_ClassID,
  79. kGrBitmapTextGeoProc_ClassID,
  80. kGrBlurredEdgeFragmentProcessor_ClassID,
  81. kGrCCClipProcessor_ClassID,
  82. kGrCCPathProcessor_ClassID,
  83. kGrCircleBlurFragmentProcessor_ClassID,
  84. kGrCircleEffect_ClassID,
  85. kGrClampedGradientEffect_ClassID,
  86. kGrColorMatrixFragmentProcessor_ClassID,
  87. kGrColorSpaceXformEffect_ClassID,
  88. kGrComposeLerpEffect_ClassID,
  89. kGrComposeLerpRedEffect_ClassID,
  90. kGrConfigConversionEffect_ClassID,
  91. kGrConicEffect_ClassID,
  92. kGrConstColorProcessor_ClassID,
  93. kGrConvexPolyEffect_ClassID,
  94. kGrDeviceSpaceTextureDecalFragmentProcessor_ClassID,
  95. kGrDiffuseLightingEffect_ClassID,
  96. kGrDisplacementMapEffect_ClassID,
  97. kGrDistanceFieldA8TextGeoProc_ClassID,
  98. kGrDistanceFieldLCDTextGeoProc_ClassID,
  99. kGrDistanceFieldPathGeoProc_ClassID,
  100. kGrDitherEffect_ClassID,
  101. kGrDualIntervalGradientColorizer_ClassID,
  102. kGrEllipseEffect_ClassID,
  103. kGrFillRRectOp_Processor_ClassID,
  104. kGrGaussianConvolutionFragmentProcessor_ClassID,
  105. kGrGSCoverageProcessor_ClassID,
  106. kGrImprovedPerlinNoiseEffect_ClassID,
  107. kGrIncrDecrWindingCountXP_ClassID,
  108. kGrLightingEffect_ClassID,
  109. kGrLinearGradient_ClassID,
  110. kGrLinearGradientLayout_ClassID,
  111. kGrLumaColorFilterEffect_ClassID,
  112. kGrMagnifierEffect_ClassID,
  113. kGrMatrixConvolutionEffect_ClassID,
  114. kGrMeshTestProcessor_ClassID,
  115. kGrMorphologyEffect_ClassID,
  116. kGrMixerEffect_ClassID,
  117. kGrOverdrawFragmentProcessor_ClassID,
  118. kGrOverrideInputFragmentProcessor_ClassID,
  119. kGrPathProcessor_ClassID,
  120. kGrPerlinNoise2Effect_ClassID,
  121. kGrPipelineDynamicStateTestProcessor_ClassID,
  122. kGrPremulInputFragmentProcessor_ClassID,
  123. kGrQuadEffect_ClassID,
  124. kGrRadialGradient_ClassID,
  125. kGrRadialGradientLayout_ClassID,
  126. kGrRectBlurEffect_ClassID,
  127. kGrRRectBlurEffect_ClassID,
  128. kGrRRectShadowGeoProc_ClassID,
  129. kGrResolveWindingCountXP_ClassID,
  130. kGrSimpleTextureEffect_ClassID,
  131. kGrSingleIntervalGradientColorizer_ClassID,
  132. kGrSkSLFP_ClassID,
  133. kGrSpecularLightingEffect_ClassID,
  134. kGrSRGBEffect_ClassID,
  135. kGrSampleMaskProcessor_ClassID,
  136. kGrSweepGradient_ClassID,
  137. kGrSweepGradientLayout_ClassID,
  138. kGrTextureDomainEffect_ClassID,
  139. kGrTextureGradientColorizer_ClassID,
  140. kGrTiledGradientEffect_ClassID,
  141. kGrTwoPointConicalGradientLayout_ClassID,
  142. kGrUnpremulInputFragmentProcessor_ClassID,
  143. kGrUnrolledBinaryGradientColorizer_ClassID,
  144. kGrVSCoverageProcessor_ClassID,
  145. kGrYUVtoRGBEffect_ClassID,
  146. kHighContrastFilterEffect_ClassID,
  147. kInstanceProcessor_ClassID,
  148. kLatticeGP_ClassID,
  149. kLumaColorFilterEffect_ClassID,
  150. kMSAAQuadProcessor_ClassID,
  151. kPDLCDXferProcessor_ClassID,
  152. kPorterDuffXferProcessor_ClassID,
  153. kPremulFragmentProcessor_ClassID,
  154. kQuadEdgeEffect_ClassID,
  155. kQuadPerEdgeAAGeometryProcessor_ClassID,
  156. kReplaceInputFragmentProcessor_ClassID,
  157. kRRectsGaussianEdgeFP_ClassID,
  158. kSampleLocationsTestProcessor_ClassID,
  159. kSeriesFragmentProcessor_ClassID,
  160. kShaderPDXferProcessor_ClassID,
  161. kStencilResolveProcessor_ClassID,
  162. kFwidthSquircleTestProcessor_ClassID,
  163. kSwizzleFragmentProcessor_ClassID,
  164. kTestFP_ClassID,
  165. kTextureGeometryProcessor_ClassID,
  166. kFlatNormalsFP_ClassID,
  167. kMappedNormalsFP_ClassID,
  168. kLightingFP_ClassID,
  169. kLinearStrokeProcessor_ClassID,
  170. };
  171. virtual ~GrProcessor() = default;
  172. /** Human-meaningful string to identify this prcoessor; may be embedded in generated shader
  173. code. */
  174. virtual const char* name() const = 0;
  175. /** Human-readable dump of all information */
  176. #ifdef SK_DEBUG
  177. virtual SkString dumpInfo() const {
  178. SkString str;
  179. str.appendf("Missing data");
  180. return str;
  181. }
  182. #else
  183. SkString dumpInfo() const { return SkString("<Processor information unavailable>"); }
  184. #endif
  185. /**
  186. * Custom shader features provided by the framework. These require special handling when
  187. * preparing shaders, so a processor must call setWillUseCustomFeature() from its constructor if
  188. * it intends to use one.
  189. */
  190. enum class CustomFeatures {
  191. kNone = 0,
  192. kSampleLocations = 1 << 0,
  193. };
  194. GR_DECL_BITFIELD_CLASS_OPS_FRIENDS(CustomFeatures);
  195. CustomFeatures requestedFeatures() const { return fRequestedFeatures; }
  196. void* operator new(size_t size);
  197. void operator delete(void* target);
  198. void* operator new(size_t size, void* placement) {
  199. return ::operator new(size, placement);
  200. }
  201. void operator delete(void* target, void* placement) {
  202. ::operator delete(target, placement);
  203. }
  204. /** Helper for down-casting to a GrProcessor subclass */
  205. template <typename T> const T& cast() const { return *static_cast<const T*>(this); }
  206. ClassID classID() const { return fClassID; }
  207. protected:
  208. GrProcessor(ClassID classID) : fClassID(classID) {}
  209. GrProcessor(const GrProcessor&) = delete;
  210. GrProcessor& operator=(const GrProcessor&) = delete;
  211. void setWillUseCustomFeature(CustomFeatures feature) { fRequestedFeatures |= feature; }
  212. void resetCustomFeatures() { fRequestedFeatures = CustomFeatures::kNone; }
  213. const ClassID fClassID;
  214. CustomFeatures fRequestedFeatures = CustomFeatures::kNone;
  215. };
  216. GR_MAKE_BITFIELD_CLASS_OPS(GrProcessor::CustomFeatures);
  217. #endif