diff --git a/src/gpu/GrGpu.h b/src/gpu/GrGpu.h
index 0c106e7..c5d2a44 100644
--- a/src/gpu/GrGpu.h
+++ b/src/gpu/GrGpu.h
@@ -720,10 +720,6 @@
     // Implementation of resetTextureBindings.
     virtual void onResetTextureBindings() {}
 
-    // Queries the effective number of samples in use by the hardware for the given render target,
-    // and queries the individual sample locations.
-    virtual void querySampleLocations(GrRenderTarget*, SkTArray<SkPoint>*) = 0;
-
     // overridden by backend-specific derived class to create objects.
     // Texture size, renderablility, format support, sample count will have already been validated
     // in base class before onCreateTexture is called.
diff --git a/src/gpu/d3d/GrD3DGpu.cpp b/src/gpu/d3d/GrD3DGpu.cpp
index 81d9ebb..d75efb2 100644
--- a/src/gpu/d3d/GrD3DGpu.cpp
+++ b/src/gpu/d3d/GrD3DGpu.cpp
@@ -240,61 +240,6 @@
     fCurrentDirectCommandList->addFinishedCallback(std::move(finishedCallback));
 }
 
-void GrD3DGpu::querySampleLocations(GrRenderTarget* renderTarget,
-                                    SkTArray<SkPoint>* sampleLocations) {
-    // By default, the Direct3D backend uses the standard sample locations defined by the docs.
-    // These are transformed from D3D's integer coordinate system with origin at the center,
-    // to our normalized coordinate system with origin at the upper left.
-    // This ends up corresponding with Vulkan's sample locations.
-    SkASSERT(this->caps()->sampleLocationsSupport());
-    static constexpr SkPoint kStandardSampleLocations_1[1] = {
-        {0.5f, 0.5f} };
-    static constexpr SkPoint kStandardSampleLocations_2[2] = {
-        {0.75f, 0.75f}, {0.25f, 0.25f} };
-    static constexpr SkPoint kStandardSampleLocations_4[4] = {
-        {0.375f, 0.125f}, {0.875f, 0.375f}, {0.125f, 0.625f}, {0.625f, 0.875f} };
-    static constexpr SkPoint kStandardSampleLocations_8[8] = {
-        {0.5625f, 0.3125f}, {0.4375f, 0.6875f}, {0.8125f, 0.5625f}, {0.3125f, 0.1875f},
-        {0.1875f, 0.8125f}, {0.0625f, 0.4375f}, {0.6875f, 0.9375f}, {0.9375f, 0.0625f} };
-    static constexpr SkPoint kStandardSampleLocations_16[16] = {
-        {0.5625f, 0.5625f}, {0.4375f, 0.3125f}, {0.3125f, 0.625f}, {0.75f, 0.4375f},
-        {0.1875f, 0.375f}, {0.625f, 0.8125f}, {0.8125f, 0.6875f}, {0.6875f, 0.1875f},
-        {0.375f, 0.875f}, {0.5f, 0.0625f}, {0.25f, 0.125f}, {0.125f, 0.75f},
-        {0.0f, 0.5f}, {0.9375f, 0.25f}, {0.875f, 0.9375f}, {0.0625f, 0.0f} };
-
-    int numSamples = renderTarget->numSamples();
-    // TODO: support mixed samples?
-    SkASSERT(numSamples > 1);
-    SkASSERT(!renderTarget->getStencilAttachment() ||
-             numSamples == renderTarget->getStencilAttachment()->numSamples());
-
-    GrD3DRenderTarget* d3dRT = static_cast<GrD3DRenderTarget*>(renderTarget);
-    unsigned int pattern = d3dRT->msaaTextureResource()->sampleQualityPattern();
-    if (pattern == DXGI_CENTER_MULTISAMPLE_QUALITY_PATTERN) {
-        sampleLocations->push_back_n(numSamples, kStandardSampleLocations_1[0]);
-        return;
-    }
-    SkASSERT(pattern == DXGI_STANDARD_MULTISAMPLE_QUALITY_PATTERN);
-
-    switch (numSamples) {
-    case 2:
-        sampleLocations->push_back_n(2, kStandardSampleLocations_2);
-        break;
-    case 4:
-        sampleLocations->push_back_n(4, kStandardSampleLocations_4);
-        break;
-    case 8:
-        sampleLocations->push_back_n(8, kStandardSampleLocations_8);
-        break;
-    case 16:
-        sampleLocations->push_back_n(16, kStandardSampleLocations_16);
-        break;
-    default:
-        SK_ABORT("Invalid sample count.");
-        break;
-    }
-}
-
 sk_sp<GrD3DTexture> GrD3DGpu::createD3DTexture(SkISize dimensions,
                                                DXGI_FORMAT dxgiFormat,
                                                GrRenderable renderable,
diff --git a/src/gpu/d3d/GrD3DGpu.h b/src/gpu/d3d/GrD3DGpu.h
index 9d66f15..ff470c3 100644
--- a/src/gpu/d3d/GrD3DGpu.h
+++ b/src/gpu/d3d/GrD3DGpu.h
@@ -53,8 +53,6 @@
 
     bool protectedContext() const { return false; }
 
-    void querySampleLocations(GrRenderTarget*, SkTArray<SkPoint>* sampleLocations) override;
-
     void xferBarrier(GrRenderTarget*, GrXferBarrierType) override {}
 
     void deleteBackendTexture(const GrBackendTexture&) override;
diff --git a/src/gpu/dawn/GrDawnGpu.h b/src/gpu/dawn/GrDawnGpu.h
index 53bfc1b..9d7abbc 100644
--- a/src/gpu/dawn/GrDawnGpu.h
+++ b/src/gpu/dawn/GrDawnGpu.h
@@ -109,8 +109,6 @@
 private:
     GrDawnGpu(GrDirectContext*, const GrContextOptions&, const wgpu::Device&);
 
-    virtual void querySampleLocations(GrRenderTarget*, SkTArray<SkPoint>*) override {}
-
     sk_sp<GrTexture> onCreateTexture(SkISize,
                                      const GrBackendFormat&,
                                      GrRenderable,
diff --git a/src/gpu/gl/GrGLGpu.cpp b/src/gpu/gl/GrGLGpu.cpp
index 15ed8f0..fe80ff7 100644
--- a/src/gpu/gl/GrGLGpu.cpp
+++ b/src/gpu/gl/GrGLGpu.cpp
@@ -3519,20 +3519,6 @@
     return true;
 }
 
-void GrGLGpu::querySampleLocations(
-        GrRenderTarget* renderTarget, SkTArray<SkPoint>* sampleLocations) {
-    this->flushRenderTargetNoColorWrites(static_cast<GrGLRenderTarget*>(renderTarget));
-
-    int effectiveSampleCnt;
-    GR_GL_GetIntegerv(this->glInterface(), GR_GL_SAMPLES, &effectiveSampleCnt);
-    SkASSERT(effectiveSampleCnt >= renderTarget->numSamples());
-
-    sampleLocations->reset(effectiveSampleCnt);
-    for (int i = 0; i < effectiveSampleCnt; ++i) {
-        GL_CALL(GetMultisamplefv(GR_GL_SAMPLE_POSITION, i, &(*sampleLocations)[i].fX));
-    }
-}
-
 void GrGLGpu::xferBarrier(GrRenderTarget* rt, GrXferBarrierType type) {
     SkASSERT(type);
     switch (type) {
diff --git a/src/gpu/gl/GrGLGpu.h b/src/gpu/gl/GrGLGpu.h
index ac868cf..e8c7e83 100644
--- a/src/gpu/gl/GrGLGpu.h
+++ b/src/gpu/gl/GrGLGpu.h
@@ -221,8 +221,6 @@
 
     void onResetTextureBindings() override;
 
-    void querySampleLocations(GrRenderTarget*, SkTArray<SkPoint>*) override;
-
     void xferBarrier(GrRenderTarget*, GrXferBarrierType) override;
 
     sk_sp<GrTexture> onCreateTexture(SkISize dimensions,
diff --git a/src/gpu/mock/GrMockGpu.cpp b/src/gpu/mock/GrMockGpu.cpp
index 1927b18..b9ccd68 100644
--- a/src/gpu/mock/GrMockGpu.cpp
+++ b/src/gpu/mock/GrMockGpu.cpp
@@ -90,63 +90,6 @@
     return nullptr;
 }
 
-void GrMockGpu::querySampleLocations(GrRenderTarget* rt, SkTArray<SkPoint>* sampleLocations) {
-    sampleLocations->reset();
-    int numRemainingSamples = rt->numSamples();
-    while (numRemainingSamples > 0) {
-        // Use standard D3D sample locations.
-        switch (numRemainingSamples) {
-            case 0:
-            case 1:
-                sampleLocations->push_back().set(.5, .5);
-                break;
-            case 2:
-                sampleLocations->push_back().set(.75, .75);
-                sampleLocations->push_back().set(.25, .25);
-                break;
-            case 3:
-            case 4:
-                sampleLocations->push_back().set(.375, .125);
-                sampleLocations->push_back().set(.875, .375);
-                sampleLocations->push_back().set(.125, .625);
-                sampleLocations->push_back().set(.625, .875);
-                break;
-            case 5:
-            case 6:
-            case 7:
-            case 8:
-                sampleLocations->push_back().set(.5625, .3125);
-                sampleLocations->push_back().set(.4375, .6875);
-                sampleLocations->push_back().set(.8125, .5625);
-                sampleLocations->push_back().set(.3125, .1875);
-                sampleLocations->push_back().set(.1875, .8125);
-                sampleLocations->push_back().set(.0625, .4375);
-                sampleLocations->push_back().set(.6875, .4375);
-                sampleLocations->push_back().set(.4375, .0625);
-                break;
-            default:
-                sampleLocations->push_back().set(.5625, .5625);
-                sampleLocations->push_back().set(.4375, .3125);
-                sampleLocations->push_back().set(.3125, .6250);
-                sampleLocations->push_back().set(.2500, .4375);
-                sampleLocations->push_back().set(.1875, .3750);
-                sampleLocations->push_back().set(.6250, .8125);
-                sampleLocations->push_back().set(.8125, .6875);
-                sampleLocations->push_back().set(.6875, .1875);
-                sampleLocations->push_back().set(.3750, .8750);
-                sampleLocations->push_back().set(.5000, .0625);
-                sampleLocations->push_back().set(.2500, .1250);
-                sampleLocations->push_back().set(.1250, .2500);
-                sampleLocations->push_back().set(.0000, .5000);
-                sampleLocations->push_back().set(.4375, .2500);
-                sampleLocations->push_back().set(.8750, .4375);
-                sampleLocations->push_back().set(.0625, .0000);
-                break;
-        }
-        numRemainingSamples = rt->numSamples() - sampleLocations->count();
-    }
-}
-
 sk_sp<GrTexture> GrMockGpu::onCreateTexture(SkISize dimensions,
                                             const GrBackendFormat& format,
                                             GrRenderable renderable,
diff --git a/src/gpu/mock/GrMockGpu.h b/src/gpu/mock/GrMockGpu.h
index a3e0c76..07887a3 100644
--- a/src/gpu/mock/GrMockGpu.h
+++ b/src/gpu/mock/GrMockGpu.h
@@ -54,8 +54,6 @@
 private:
     GrMockGpu(GrDirectContext*, const GrMockOptions&, const GrContextOptions&);
 
-    void querySampleLocations(GrRenderTarget*, SkTArray<SkPoint>* sampleLocations) override;
-
     void xferBarrier(GrRenderTarget*, GrXferBarrierType) override {}
 
     sk_sp<GrTexture> onCreateTexture(SkISize,
diff --git a/src/gpu/mtl/GrMtlGpu.h b/src/gpu/mtl/GrMtlGpu.h
index d63e93af..894f61b 100644
--- a/src/gpu/mtl/GrMtlGpu.h
+++ b/src/gpu/mtl/GrMtlGpu.h
@@ -120,11 +120,6 @@
 
     void destroyResources();
 
-    void querySampleLocations(GrRenderTarget*, SkTArray<SkPoint>*) override {
-        SkASSERT(!this->caps()->sampleLocationsSupport());
-        SK_ABORT("Sample locations not yet implemented for Metal.");
-    }
-
     void xferBarrier(GrRenderTarget*, GrXferBarrierType) override {}
 
     GrStagingBufferManager* stagingBufferManager() override { return &fStagingBufferManager; }
diff --git a/src/gpu/vk/GrVkGpu.cpp b/src/gpu/vk/GrVkGpu.cpp
index 0b20b2d..e49f08a 100644
--- a/src/gpu/vk/GrVkGpu.cpp
+++ b/src/gpu/vk/GrVkGpu.cpp
@@ -1768,59 +1768,6 @@
                                         previousState);
 }
 
-void GrVkGpu::querySampleLocations(GrRenderTarget* renderTarget,
-                                   SkTArray<SkPoint>* sampleLocations) {
-    // In Vulkan, sampleLocationsSupport() means that the platform uses the standard sample
-    // locations defined by the spec.
-    SkASSERT(this->caps()->sampleLocationsSupport());
-    static constexpr SkPoint kStandardSampleLocations_1[1] = {
-        {0.5f, 0.5f}};
-    static constexpr SkPoint kStandardSampleLocations_2[2] = {
-        {0.75f, 0.75f}, {0.25f, 0.25f}};
-    static constexpr SkPoint kStandardSampleLocations_4[4] = {
-        {0.375f, 0.125f}, {0.875f, 0.375f}, {0.125f, 0.625f}, {0.625f, 0.875f}};
-    static constexpr SkPoint kStandardSampleLocations_8[8] = {
-        {0.5625f, 0.3125f}, {0.4375f, 0.6875f}, {0.8125f, 0.5625f}, {0.3125f, 0.1875f},
-        {0.1875f, 0.8125f}, {0.0625f, 0.4375f}, {0.6875f, 0.9375f}, {0.9375f, 0.0625f}};
-    static constexpr SkPoint kStandardSampleLocations_16[16] = {
-        {0.5625f, 0.5625f}, {0.4375f, 0.3125f}, {0.3125f, 0.625f}, {0.75f, 0.4375f},
-        {0.1875f, 0.375f}, {0.625f, 0.8125f}, {0.8125f, 0.6875f}, {0.6875f, 0.1875f},
-        {0.375f, 0.875f}, {0.5f, 0.0625f}, {0.25f, 0.125f}, {0.125f, 0.75f},
-        {0.0f, 0.5f}, {0.9375f, 0.25f}, {0.875f, 0.9375f}, {0.0625f, 0.0f}};
-
-    int numSamples = renderTarget->numSamples();
-    if (1 == numSamples) {
-        SkASSERT(this->caps()->mixedSamplesSupport());
-        if (auto* stencil = renderTarget->getStencilAttachment()) {
-            numSamples = stencil->numSamples();
-        }
-    }
-    SkASSERT(numSamples > 1);
-    SkASSERT(!renderTarget->getStencilAttachment() ||
-             numSamples == renderTarget->getStencilAttachment()->numSamples());
-
-    switch (numSamples) {
-        case 1:
-            sampleLocations->push_back_n(1, kStandardSampleLocations_1);
-            break;
-        case 2:
-            sampleLocations->push_back_n(2, kStandardSampleLocations_2);
-            break;
-        case 4:
-            sampleLocations->push_back_n(4, kStandardSampleLocations_4);
-            break;
-        case 8:
-            sampleLocations->push_back_n(8, kStandardSampleLocations_8);
-            break;
-        case 16:
-            sampleLocations->push_back_n(16, kStandardSampleLocations_16);
-            break;
-        default:
-            SK_ABORT("Invalid vulkan sample count.");
-            break;
-    }
-}
-
 void GrVkGpu::xferBarrier(GrRenderTarget* rt, GrXferBarrierType barrierType) {
     GrVkRenderTarget* vkRT = static_cast<GrVkRenderTarget*>(rt);
     VkPipelineStageFlags dstStage;
diff --git a/src/gpu/vk/GrVkGpu.h b/src/gpu/vk/GrVkGpu.h
index 4bca855..9bc889a 100644
--- a/src/gpu/vk/GrVkGpu.h
+++ b/src/gpu/vk/GrVkGpu.h
@@ -77,8 +77,6 @@
 
     GrVkPrimaryCommandBuffer* currentCommandBuffer() const { return fMainCmdBuffer; }
 
-    void querySampleLocations(GrRenderTarget*, SkTArray<SkPoint>*) override;
-
     void xferBarrier(GrRenderTarget*, GrXferBarrierType) override;
 
     bool setBackendTextureState(const GrBackendTexture&,
