| Index: include/gpu/GrRenderTarget.h
|
| diff --git a/include/gpu/GrRenderTarget.h b/include/gpu/GrRenderTarget.h
|
| index 5984bf71d8b514c10c44e2f40f7ba214bf56c738..91a67ae133e57e2d440c1c4ec890a0fdee67c86e 100644
|
| --- a/include/gpu/GrRenderTarget.h
|
| +++ b/include/gpu/GrRenderTarget.h
|
| @@ -31,14 +31,65 @@ public:
|
|
|
| // GrRenderTarget
|
| /**
|
| - * @return true if the surface is multisampled, false otherwise
|
| + * On some hardware it is possible for a render target to have multisampling
|
| + * only in certain buffers.
|
| + * Enforce only two legal sample configs.
|
| + * kUnified_SampleConfig signifies multisampling in both color and stencil
|
| + * buffers and is available across all hardware.
|
| + * kStencil_SampleConfig means multisampling is present in stencil buffer
|
| + * only; this config requires hardware support of
|
| + * NV_framebuffer_mixed_samples.
|
| + */
|
| + enum SampleConfig {
|
| + kUnified_SampleConfig = 0,
|
| + kStencil_SampleConfig = 1
|
| + };
|
| +
|
| + /**
|
| + * @return true if the surface is multisampled in all buffers,
|
| + * false otherwise
|
| + */
|
| + bool isUnifiedMultisampled() const {
|
| + if (fSampleConfig != kUnified_SampleConfig) {
|
| + return false;
|
| + }
|
| + return 0 != fDesc.fSampleCnt;
|
| + }
|
| +
|
| + /**
|
| + * @return true if the surface is multisampled in the stencil buffer,
|
| + * false otherwise
|
| + */
|
| + bool isStencilBufferMultisampled() const {
|
| + return 0 != fDesc.fSampleCnt;
|
| + }
|
| +
|
| + /**
|
| + * @return the number of color samples-per-pixel, or zero if non-MSAA or
|
| + * multisampled in the stencil buffer only.
|
| */
|
| - bool isMultisampled() const { return 0 != fDesc.fSampleCnt; }
|
| + int numColorSamples() const {
|
| + if (fSampleConfig == kUnified_SampleConfig) {
|
| + return fDesc.fSampleCnt;
|
| + }
|
| + return 0;
|
| + }
|
|
|
| /**
|
| - * @return the number of samples-per-pixel or zero if non-MSAA.
|
| + * @return the number of stencil samples-per-pixel, or zero if non-MSAA.
|
| */
|
| - int numSamples() const { return fDesc.fSampleCnt; }
|
| + int numStencilSamples() const {
|
| + return fDesc.fSampleCnt;
|
| + }
|
| +
|
| + /**
|
| + * @return true if the surface is mixed sampled, false otherwise.
|
| + */
|
| + bool hasMixedSamples() const {
|
| + SkASSERT(kStencil_SampleConfig != fSampleConfig ||
|
| + this->isStencilBufferMultisampled());
|
| + return kStencil_SampleConfig == fSampleConfig;
|
| + }
|
|
|
| /**
|
| * Call to indicate the multisample contents were modified such that the
|
| @@ -94,9 +145,11 @@ public:
|
| const GrRenderTargetPriv renderTargetPriv() const;
|
|
|
| protected:
|
| - GrRenderTarget(GrGpu* gpu, LifeCycle lifeCycle, const GrSurfaceDesc& desc)
|
| + GrRenderTarget(GrGpu* gpu, LifeCycle lifeCycle, const GrSurfaceDesc& desc,
|
| + SampleConfig sampleConfig)
|
| : INHERITED(gpu, lifeCycle, desc)
|
| - , fStencilAttachment(NULL) {
|
| + , fStencilAttachment(NULL)
|
| + , fSampleConfig(sampleConfig) {
|
| fResolveRect.setLargestInverted();
|
| }
|
|
|
| @@ -111,10 +164,12 @@ private:
|
| friend class GrRenderTargetPriv;
|
|
|
| GrStencilAttachment* fStencilAttachment;
|
| + SampleConfig fSampleConfig;
|
|
|
| SkIRect fResolveRect;
|
|
|
| typedef GrSurface INHERITED;
|
| };
|
|
|
| +
|
| #endif
|
|
|