Chromium Code Reviews| 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 { |
|
bsalomon
2015/03/31 16:37:33
I'm not sure about this name...
enum BufferType
Chris Dalton
2015/03/31 19:47:30
I'm going to try replying inline. Hopefully it wor
Chris Dalton
2015/03/31 22:24:57
Sorry to pollute your inboxes :) I've thought abou
vbuzinov
2015/04/02 13:10:37
This bitfield implementation is certainly easier t
|
| + 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; |