| Index: src/gpu/GrGpu.h
|
| diff --git a/src/gpu/GrGpu.h b/src/gpu/GrGpu.h
|
| index 032edc3fc97f75e1ebe1eedb26267e43ff318dff..be8a59a738098045c0417a4834bff15e1e648ec7 100644
|
| --- a/src/gpu/GrGpu.h
|
| +++ b/src/gpu/GrGpu.h
|
| @@ -17,6 +17,7 @@
|
| #include "GrXferProcessor.h"
|
| #include "SkPath.h"
|
| #include "SkTArray.h"
|
| +#include <map>
|
|
|
| class GrBatchTracker;
|
| class GrBuffer;
|
| @@ -341,14 +342,19 @@ public:
|
| const SkIPoint& dstPoint);
|
|
|
| struct MultisampleSpecs {
|
| + MultisampleSpecs(uint8_t uniqueID, int effectiveSampleCnt, const SkPoint* locations)
|
| + : fUniqueID(uniqueID),
|
| + fEffectiveSampleCnt(effectiveSampleCnt),
|
| + fSampleLocations(locations) {}
|
| +
|
| // Nonzero ID that uniquely identifies these multisample specs.
|
| - uint8_t fUniqueID;
|
| + 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;
|
| + int fEffectiveSampleCnt;
|
| + // If sample locations are supported, points to the subpixel locations at which the GPU will
|
| + // sample. Pixel center is at (.5, .5), and (0, 0) indicates the top left corner.
|
| + const SkPoint* fSampleLocations;
|
| };
|
|
|
| // Finds a render target's multisample specs. The stencil settings are only needed to flush the
|
| @@ -504,6 +510,8 @@ protected:
|
| // Subclass must initialize this in its constructor.
|
| SkAutoTUnref<const GrCaps> fCaps;
|
|
|
| + typedef SkTArray<SkPoint, true> SamplePattern;
|
| +
|
| private:
|
| // called when the 3D context state is unknown. Subclass should emit any
|
| // assumed 3D context state and dirty any state cache.
|
| @@ -569,10 +577,8 @@ private:
|
| 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;
|
| + virtual void onGetMultisampleSpecs(GrRenderTarget*, const GrStencilSettings&,
|
| + int* effectiveSampleCnt, SamplePattern*) = 0;
|
|
|
| void resetContext() {
|
| this->onResetContext(fResetBits);
|
| @@ -580,12 +586,18 @@ private:
|
| ++fResetTimestamp;
|
| }
|
|
|
| - ResetTimestamp fResetTimestamp;
|
| - uint32_t fResetBits;
|
| - SkTArray<const MultisampleSpecs*, true> fMultisampleSpecsMap;
|
| - GrTAllocator<MultisampleSpecs> fMultisampleSpecsAllocator;
|
| + struct SamplePatternComparator {
|
| + bool operator()(const SamplePattern&, const SamplePattern&) const;
|
| + };
|
| +
|
| + typedef std::map<SamplePattern, uint8_t, SamplePatternComparator> MultisampleSpecsIdMap;
|
| +
|
| + ResetTimestamp fResetTimestamp;
|
| + uint32_t fResetBits;
|
| + MultisampleSpecsIdMap fMultisampleSpecsIdMap;
|
| + SkSTArray<1, MultisampleSpecs, true> fMultisampleSpecs;
|
| // The context owns us, not vice-versa, so this ptr is not ref'ed by Gpu.
|
| - GrContext* fContext;
|
| + GrContext* fContext;
|
|
|
| friend class GrPathRendering;
|
| friend class gr_instanced::InstancedRendering;
|
|
|