| Index: include/gpu/GrRenderTarget.h
|
| diff --git a/include/gpu/GrRenderTarget.h b/include/gpu/GrRenderTarget.h
|
| index 5984bf71d8b514c10c44e2f40f7ba214bf56c738..f37dc6350b7e0e1716d0f69d4fdb72cc930abf16 100644
|
| --- a/include/gpu/GrRenderTarget.h
|
| +++ b/include/gpu/GrRenderTarget.h
|
| @@ -31,14 +31,60 @@ 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. This enum allows the caller to query about
|
| + * specific buffers in isMultisampled() and numSamples().
|
| */
|
| - bool isMultisampled() const { return 0 != fDesc.fSampleCnt; }
|
| + enum BufferBits {
|
| + kAny_BufferBits = 0,
|
| + kColor_BufferBit = 1,
|
| + kStencil_BufferBit = (1 << 1),
|
| + kAll_BufferBits = kColor_BufferBit + kStencil_BufferBit
|
| + };
|
| +
|
| + /**
|
| + * 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 = kColor_BufferBit + kStencil_BufferBit,
|
| + kStencil_SampleConfig = kStencil_BufferBit
|
| + };
|
| +
|
| + /**
|
| + * @param buffers specifies the buffers for which multisampling is queried
|
| + * @return true if the surface is multisampled in every specified buffer,
|
| + * false otherwise
|
| + */
|
| + bool isMultisampled(BufferBits buffers = kAll_BufferBits) const {
|
| + if (buffers != (fSampleConfig & buffers)) {
|
| + // One of the buffers is not in our msaa config.
|
| + return false;
|
| + }
|
| + return 0 != fDesc.fSampleCnt;
|
| + }
|
|
|
| /**
|
| - * @return the number of samples-per-pixel or zero if non-MSAA.
|
| + * @param buffers specifies the buffers for which multisampling is queried
|
| + * @return the number of samples-per-pixel, or zero if any of the specified
|
| + * buffers is not multisampled
|
| */
|
| - int numSamples() const { return fDesc.fSampleCnt; }
|
| + int numSamples(BufferBits buffers = kAll_BufferBits) const {
|
| + return this->isMultisampled(buffers) ? fDesc.fSampleCnt : 0;
|
| + }
|
| +
|
| + /**
|
| + * @return sample config: kUnified_SampleConfig if both color and stencil
|
| + buffers are MSAA, or kStencil_SampleConfig if only stencil
|
| + buffer is MSAA.
|
| + */
|
| + SampleConfig sampleConfig() const {
|
| + return fSampleConfig;
|
| + }
|
|
|
| /**
|
| * Call to indicate the multisample contents were modified such that the
|
| @@ -94,9 +140,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 +159,13 @@ private:
|
| friend class GrRenderTargetPriv;
|
|
|
| GrStencilAttachment* fStencilAttachment;
|
| + SampleConfig fSampleConfig;
|
|
|
| SkIRect fResolveRect;
|
|
|
| typedef GrSurface INHERITED;
|
| };
|
|
|
| +GR_MAKE_BITFIELD_OPS(GrRenderTarget::BufferBits)
|
| +
|
| #endif
|
|
|