diff options
author | 2016-03-07 13:58:26 -0800 | |
---|---|---|
committer | 2016-03-07 13:58:26 -0800 | |
commit | 28f45b949acc746849100fbe112ee5280f0594c9 (patch) | |
tree | b350d442680ef996ab6097433ab0cf960d3680b6 /src/gpu/GrGpu.h | |
parent | b3b13b7edeabad4c8e53b0d309b0a44668d1e68f (diff) |
Add "sample locations" feature to GrProcessor
Adds a "sample locations" feature to GrProcessor. When enabled, this
allows a processor to know inside the shader where all the samples are
located. Also adds various infastructure to query, cache, and identify
multisample data.
BUG=skia:
GOLD_TRYBOT_URL= https://gold.skia.org/search2?unt=true&query=source_type%3Dgm&master=false&issue=1717393002
Review URL: https://codereview.chromium.org/1717393002
Diffstat (limited to 'src/gpu/GrGpu.h')
-rw-r--r-- | src/gpu/GrGpu.h | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/src/gpu/GrGpu.h b/src/gpu/GrGpu.h index 5d35fcf859..ebe4116ebe 100644 --- a/src/gpu/GrGpu.h +++ b/src/gpu/GrGpu.h @@ -12,6 +12,7 @@ #include "GrProgramDesc.h" #include "GrStencil.h" #include "GrSwizzle.h" +#include "GrAllocator.h" #include "GrTextureParamsAdjuster.h" #include "GrTypes.h" #include "GrXferProcessor.h" @@ -365,6 +366,22 @@ public: const SkIRect& srcRect, const SkIPoint& dstPoint); + struct MultisampleSpecs { + // Nonzero ID that uniquely identifies these multisample specs. + uint8_t fUniqueID; + // The actual number of samples the GPU will run. NOTE: this value can be greater than the + // the render target's sample count. + int fEffectiveSampleCnt; + // If sample locations are supported, contains the subpixel locations at which the GPU will + // sample. Pixel center is at (.5, .5) and (0, 0) indicates the top left corner. + SkAutoTDeleteArray<const SkPoint> fSampleLocations; + }; + + // Finds a render target's multisample specs. The stencil settings are only needed to flush the + // draw state prior to querying multisample information; they should not have any effect on the + // multisample information itself. + const MultisampleSpecs& getMultisampleSpecs(GrRenderTarget*, const GrStencilSettings&); + struct DrawArgs { DrawArgs(const GrPrimitiveProcessor* primProc, const GrPipeline* pipeline, @@ -601,6 +618,12 @@ private: const SkIRect& srcRect, const SkIPoint& dstPoint) = 0; + // overridden by backend specific derived class to perform the multisample queries + virtual void onGetMultisampleSpecs(GrRenderTarget*, + const GrStencilSettings&, + int* effectiveSampleCnt, + SkAutoTDeleteArray<SkPoint>* sampleLocations) = 0; + void resetContext() { this->onResetContext(fResetBits); fResetBits = 0; @@ -609,6 +632,8 @@ private: ResetTimestamp fResetTimestamp; uint32_t fResetBits; + SkTArray<const MultisampleSpecs*, true> fMultisampleSpecsMap; + GrTAllocator<MultisampleSpecs> fMultisampleSpecsAllocator; // The context owns us, not vice-versa, so this ptr is not ref'ed by Gpu. GrContext* fContext; |