| Index: include/gpu/GrRenderTarget.h
|
| diff --git a/include/gpu/GrRenderTarget.h b/include/gpu/GrRenderTarget.h
|
| index 40e006aa8aec8edb70b28cec5a3274f5b7f0e110..933e0923b5057b2d99feea641bd3be705507f2d1 100644
|
| --- a/include/gpu/GrRenderTarget.h
|
| +++ b/include/gpu/GrRenderTarget.h
|
| @@ -31,14 +31,55 @@ 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 stages of the graphics pipeline. This enum allows
|
| + * the caller to query about specific stages in isMultisampled() and
|
| + * numSamples().
|
| */
|
| - bool isMultisampled() const { return 0 != fDesc.fSampleCnt; }
|
| + enum PipelineStage {
|
| + kColorBuffer_PipelineStage,
|
| + kStencilBuffer_PipelineStage,
|
| + // We only support two sample configs at the moment, unified and
|
| + // stencil. So we can query multisample info for everywhere/anywhere
|
| + // by checking the correct buffer.
|
| + kEverywhere_PipelineStage = kColorBuffer_PipelineStage,
|
| + kAnywhere_PipelineStage = kStencilBuffer_PipelineStage
|
| + };
|
| +
|
| + /**
|
| + * @param pipelineStage specifies the pipeline stage for which
|
| + * multisampling is queried
|
| + * @return true if the surface is multisampled in the specified pipeline
|
| + * stage(s), false otherwise
|
| + */
|
| + bool isMultisampled(PipelineStage pipelineStage =
|
| + kEverywhere_PipelineStage) const {
|
| + if (kStencil_GrSampleConfig == fSampleConfig &&
|
| + kColorBuffer_PipelineStage == pipelineStage) {
|
| + return false;
|
| + }
|
| + return 0 != fDesc.fSampleCnt;
|
| + }
|
| +
|
| + /**
|
| + * @param pipelineStage specifies the pipeline stage for which
|
| + * multisampling is queried
|
| + * @return the number of samples-per-pixel, or zero if the render target
|
| + * is not multisampled in the specified pipeline stage(s)
|
| + */
|
| + int numSamples(PipelineStage pipelineStage =
|
| + kEverywhere_PipelineStage) const {
|
| + return this->isMultisampled(pipelineStage) ? fDesc.fSampleCnt : 0;
|
| + }
|
|
|
| /**
|
| - * @return the number of samples-per-pixel or zero if non-MSAA.
|
| + * @return sample config: kUnified_GrSampleConfig if both color and stencil
|
| + buffers are MSAA, or kStencil_GrSampleConfig if only stencil
|
| + buffer is MSAA.
|
| */
|
| - int numSamples() const { return fDesc.fSampleCnt; }
|
| + GrSampleConfig sampleConfig() const {
|
| + return fSampleConfig;
|
| + }
|
|
|
| /**
|
| * Call to indicate the multisample contents were modified such that the
|
| @@ -94,8 +135,10 @@ public:
|
| const GrRenderTargetPriv renderTargetPriv() const;
|
|
|
| protected:
|
| - GrRenderTarget(GrGpu* gpu, LifeCycle lifeCycle, const GrSurfaceDesc& desc)
|
| + GrRenderTarget(GrGpu* gpu, LifeCycle lifeCycle, const GrSurfaceDesc& desc,
|
| + GrSampleConfig sampleConfig)
|
| : INHERITED(gpu, lifeCycle, desc)
|
| + , fSampleConfig(sampleConfig)
|
| , fStencilBuffer(NULL) {
|
| fResolveRect.setLargestInverted();
|
| }
|
| @@ -110,6 +153,8 @@ private:
|
|
|
| friend class GrRenderTargetPriv;
|
|
|
| + GrSampleConfig fSampleConfig;
|
| +
|
| GrStencilBuffer* fStencilBuffer;
|
|
|
| SkIRect fResolveRect;
|
|
|