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