diff --git a/src/gpu/mtl/GrMtlOpsRenderPass.mm b/src/gpu/mtl/GrMtlOpsRenderPass.mm
index f232a99..a1b64aa 100644
--- a/src/gpu/mtl/GrMtlOpsRenderPass.mm
+++ b/src/gpu/mtl/GrMtlOpsRenderPass.mm
@@ -45,7 +45,7 @@
 }
 
 void GrMtlOpsRenderPass::submit() {
-    if (!fRenderTarget) {
+    if (!fFramebuffer) {
         return;
     }
     SkIRect iBounds;
@@ -87,7 +87,7 @@
         return false;
     }
 
-    fActivePipelineState->setData(fRenderTarget, programInfo);
+    fActivePipelineState->setData(fFramebuffer.get(), programInfo);
     fCurrentVertexStride = programInfo.geomProc().vertexStride();
 
     if (!fActiveRenderCmdEncoder) {
@@ -113,10 +113,11 @@
 
     if (!programInfo.pipeline().isScissorTestEnabled()) {
         // "Disable" scissor by setting it to the full pipeline bounds.
+        SkISize dimensions = fFramebuffer->colorAttachment()->dimensions();
         GrMtlPipelineState::SetDynamicScissorRectState(fActiveRenderCmdEncoder,
-                                                       fRenderTarget, fOrigin,
-                                                       SkIRect::MakeWH(fRenderTarget->width(),
-                                                                       fRenderTarget->height()));
+                                                       dimensions, fOrigin,
+                                                       SkIRect::MakeWH(dimensions.width(),
+                                                                       dimensions.height()));
     }
 
     fActivePrimitiveType = gr_to_mtl_primitive(programInfo.primitiveType());
@@ -127,7 +128,8 @@
 void GrMtlOpsRenderPass::onSetScissorRect(const SkIRect& scissor) {
     SkASSERT(fActivePipelineState);
     SkASSERT(fActiveRenderCmdEncoder);
-    GrMtlPipelineState::SetDynamicScissorRectState(fActiveRenderCmdEncoder, fRenderTarget,
+    GrMtlPipelineState::SetDynamicScissorRectState(fActiveRenderCmdEncoder,
+                                                   fFramebuffer->colorAttachment()->dimensions(),
                                                    fOrigin, scissor);
 }
 
@@ -166,7 +168,7 @@
     // Partial clears are not supported
     SkASSERT(!scissor.enabled());
 
-    GrAttachment* sb = fRenderTarget->getStencilAttachment();
+    GrAttachment* sb = fFramebuffer->stencilAttachment();
     // this should only be called internally when we know we have a
     // stencil buffer.
     SkASSERT(sb);
@@ -201,10 +203,12 @@
     encoder->pushDebugGroup(@"initRenderState");
 #endif
     encoder->setFrontFacingWinding(MTLWindingCounterClockwise);
+    SkISize colorAttachmentDimensions = fFramebuffer->colorAttachment()->dimensions();
     // Strictly speaking we shouldn't have to set this, as the default viewport is the size of
     // the drawable used to generate the renderCommandEncoder -- but just in case.
     MTLViewport viewport = { 0.0, 0.0,
-                             (double) fRenderTarget->width(), (double) fRenderTarget->height(),
+                             (double) colorAttachmentDimensions.width(),
+                             (double) colorAttachmentDimensions.height(),
                              0.0, 1.0 };
     encoder->setViewport(viewport);
 #ifdef SK_ENABLE_MTL_DEBUG_INFO
@@ -237,15 +241,15 @@
 
     fRenderPassDesc = [MTLRenderPassDescriptor new];
     auto colorAttachment = fRenderPassDesc.colorAttachments[0];
-    colorAttachment.texture =
-            static_cast<GrMtlRenderTarget*>(fRenderTarget)->colorMTLTexture();
+    auto* color = fFramebuffer->colorAttachment();
+    colorAttachment.texture = color->mtlTexture();
     const std::array<float, 4>& clearColor = colorInfo.fClearColor;
     colorAttachment.clearColor =
             MTLClearColorMake(clearColor[0], clearColor[1], clearColor[2], clearColor[3]);
     colorAttachment.loadAction = mtlLoadAction[static_cast<int>(colorInfo.fLoadOp)];
     colorAttachment.storeAction = mtlStoreAction[static_cast<int>(colorInfo.fStoreOp)];
 
-    auto* stencil = static_cast<GrMtlAttachment*>(fRenderTarget->getStencilAttachment());
+    auto* stencil = fFramebuffer->stencilAttachment();
     auto mtlStencil = fRenderPassDesc.stencilAttachment;
     if (stencil) {
         mtlStencil.texture = stencil->mtlTexture();
@@ -256,8 +260,8 @@
 
     // Manage initial clears
     if (colorInfo.fLoadOp == GrLoadOp::kClear || stencilInfo.fLoadOp == GrLoadOp::kClear)  {
-        fBounds = SkRect::MakeWH(fRenderTarget->width(),
-                                 fRenderTarget->height());
+        fBounds = SkRect::MakeWH(color->dimensions().width(),
+                                 color->dimensions().height());
         this->precreateCmdEncoder();
         if (colorInfo.fLoadOp == GrLoadOp::kClear) {
             colorAttachment.loadAction = MTLLoadActionLoad;
diff --git a/src/gpu/mtl/GrMtlPipelineState.h b/src/gpu/mtl/GrMtlPipelineState.h
index 6544c8b..5ca9ce4 100644
--- a/src/gpu/mtl/GrMtlPipelineState.h
+++ b/src/gpu/mtl/GrMtlPipelineState.h
@@ -16,6 +16,7 @@
 
 #import <Metal/Metal.h>
 
+class GrMtlFramebuffer;
 class GrMtlGpu;
 class GrMtlPipelineStateDataManager;
 class GrMtlRenderCommandEncoder;
@@ -46,7 +47,7 @@
 
     id<MTLRenderPipelineState> mtlPipelineState() { return fPipelineState; }
 
-    void setData(const GrRenderTarget*, const GrProgramInfo&);
+    void setData(GrMtlFramebuffer*, const GrProgramInfo&);
 
     void setTextures(const GrGeometryProcessor&,
                      const GrPipeline&,
@@ -58,7 +59,7 @@
                       const GrXferProcessor&);
 
     static void SetDynamicScissorRectState(GrMtlRenderCommandEncoder* renderCmdEncoder,
-                                           const GrRenderTarget* renderTarget,
+                                           SkISize colorAttachmentDimensions,
                                            GrSurfaceOrigin rtOrigin,
                                            SkIRect scissorRect);
 
@@ -82,7 +83,7 @@
         }
     };
 
-    void setRenderTargetState(const GrRenderTarget*, GrSurfaceOrigin);
+    void setRenderTargetState(SkISize colorAttachmentDimensions, GrSurfaceOrigin);
 
     void bindUniforms(GrMtlRenderCommandEncoder*);
 
diff --git a/src/gpu/mtl/GrMtlPipelineState.mm b/src/gpu/mtl/GrMtlPipelineState.mm
index b0f7bf1..5daf6ea 100644
--- a/src/gpu/mtl/GrMtlPipelineState.mm
+++ b/src/gpu/mtl/GrMtlPipelineState.mm
@@ -7,6 +7,7 @@
 
 #include "src/gpu/mtl/GrMtlPipelineState.h"
 
+#include "src/gpu/GrBackendUtils.h"
 #include "src/gpu/GrPipeline.h"
 #include "src/gpu/GrRenderTarget.h"
 #include "src/gpu/GrTexture.h"
@@ -15,6 +16,7 @@
 #include "src/gpu/glsl/GrGLSLGeometryProcessor.h"
 #include "src/gpu/glsl/GrGLSLXferProcessor.h"
 #include "src/gpu/mtl/GrMtlBuffer.h"
+#include "src/gpu/mtl/GrMtlFramebuffer.h"
 #include "src/gpu/mtl/GrMtlGpu.h"
 #include "src/gpu/mtl/GrMtlRenderCommandEncoder.h"
 #include "src/gpu/mtl/GrMtlTexture.h"
@@ -55,9 +57,11 @@
     (void) fPixelFormat; // Suppress unused-var warning.
 }
 
-void GrMtlPipelineState::setData(const GrRenderTarget* renderTarget,
+void GrMtlPipelineState::setData(GrMtlFramebuffer* framebuffer,
                                  const GrProgramInfo& programInfo) {
-    this->setRenderTargetState(renderTarget, programInfo.origin());
+    SkISize colorAttachmentDimensions = framebuffer->colorAttachment()->dimensions();
+
+    this->setRenderTargetState(colorAttachmentDimensions, programInfo.origin());
     fGeometryProcessor->setData(fDataManager, *fGpu->caps()->shaderCaps(), programInfo.geomProc());
 
     for (int i = 0; i < programInfo.pipeline().numFragmentProcessors(); ++i) {
@@ -74,8 +78,9 @@
 
 #ifdef SK_DEBUG
     if (programInfo.isStencilEnabled()) {
-        SkASSERT(renderTarget->getStencilAttachment());
-        SkASSERT(renderTarget->numStencilBits(renderTarget->numSamples() > 1) == 8);
+        SkDEBUGCODE(const GrAttachment* stencil = framebuffer->stencilAttachment());
+        SkASSERT(stencil);
+        SkASSERT(GrBackendFormatStencilBits(stencil->backendFormat()) == 8);
     }
 #endif
 
@@ -125,24 +130,24 @@
     }
 }
 
-void GrMtlPipelineState::setRenderTargetState(const GrRenderTarget* rt, GrSurfaceOrigin origin) {
-    // Set RT adjustment and RT flip
-    SkISize dimensions = rt->dimensions();
+void GrMtlPipelineState::setRenderTargetState(SkISize colorAttachmentDimensions,
+                                              GrSurfaceOrigin origin) {
     SkASSERT(fBuiltinUniformHandles.fRTAdjustmentUni.isValid());
     if (fRenderTargetState.fRenderTargetOrigin != origin ||
-        fRenderTargetState.fRenderTargetSize != dimensions) {
-        fRenderTargetState.fRenderTargetSize = dimensions;
+        fRenderTargetState.fRenderTargetSize != colorAttachmentDimensions) {
+        fRenderTargetState.fRenderTargetSize = colorAttachmentDimensions;
         fRenderTargetState.fRenderTargetOrigin = origin;
 
         // The client will mark a swap buffer as kTopLeft when making a SkSurface because
         // Metal's framebuffer space has (0, 0) at the top left. This agrees with Skia's device
         // coords. However, in NDC (-1, -1) is the bottom left. So we flip when origin is kTopLeft.
         bool flip = (origin == kTopLeft_GrSurfaceOrigin);
-        std::array<float, 4> v = SkSL::Compiler::GetRTAdjustVector(dimensions, flip);
+        std::array<float, 4> v = SkSL::Compiler::GetRTAdjustVector(colorAttachmentDimensions, flip);
         fDataManager.set4fv(fBuiltinUniformHandles.fRTAdjustmentUni, 1, v.data());
         if (fBuiltinUniformHandles.fRTFlipUni.isValid()) {
             // Note above that framebuffer space has origin top left. So we need !flip here.
-            std::array<float, 2> d = SkSL::Compiler::GetRTFlipVector(rt->height(), !flip);
+            std::array<float, 2> d =
+                    SkSL::Compiler::GetRTFlipVector(colorAttachmentDimensions.height(), !flip);
             fDataManager.set2fv(fBuiltinUniformHandles.fRTFlipUni, 1, d.data());
         }
     }
@@ -189,10 +194,11 @@
 }
 
 void GrMtlPipelineState::SetDynamicScissorRectState(GrMtlRenderCommandEncoder* renderCmdEncoder,
-                                                    const GrRenderTarget* renderTarget,
+                                                    SkISize colorAttachmentDimensions,
                                                     GrSurfaceOrigin rtOrigin,
                                                     SkIRect scissorRect) {
-    if (!scissorRect.intersect(SkIRect::MakeWH(renderTarget->width(), renderTarget->height()))) {
+    if (!scissorRect.intersect(SkIRect::MakeWH(colorAttachmentDimensions.width(),
+                                               colorAttachmentDimensions.height()))) {
         scissorRect.setEmpty();
     }
 
@@ -203,7 +209,7 @@
         scissor.y = scissorRect.fTop;
     } else {
         SkASSERT(kBottomLeft_GrSurfaceOrigin == rtOrigin);
-        scissor.y = renderTarget->height() - scissorRect.fBottom;
+        scissor.y = colorAttachmentDimensions.height() - scissorRect.fBottom;
     }
     scissor.height = scissorRect.height();
 
