/*
 * Copyright 2019 Google LLC
 *
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */

#ifndef GrCopyRenderTask_DEFINED
#define GrCopyRenderTask_DEFINED

#include "src/gpu/ganesh/GrRenderTask.h"
#include "src/gpu/ganesh/GrSamplerState.h"

class GrCopyRenderTask final : public GrRenderTask {
public:
    /**
     * Copies pixels from srcRect in src to dstRect in dst. srcRect and dstRect must both be
     * contained in their respective surface dimensions; they do not have to have the same size
     * if the GPU supports scaling and filtering while copying. The src/dst share a common origin.
     */
    static sk_sp<GrRenderTask> Make(GrDrawingManager*,
                                    sk_sp<GrSurfaceProxy> dst,
                                    SkIRect dstRect,
                                    sk_sp<GrSurfaceProxy> src,
                                    SkIRect srcRect,
                                    GrSamplerState::Filter filter,
                                    GrSurfaceOrigin);

private:
    GrCopyRenderTask(GrDrawingManager*,
                     sk_sp<GrSurfaceProxy> dst,
                     SkIRect dstRect,
                     sk_sp<GrSurfaceProxy> src,
                     SkIRect srcRect,
                     GrSamplerState::Filter filter,
                     GrSurfaceOrigin);

    void onMakeSkippable() override { fSrc.reset(); }
    bool onIsUsed(GrSurfaceProxy* proxy) const override { return proxy == fSrc.get(); }
    void gatherProxyIntervals(GrResourceAllocator*) const override;
    ExpectedOutcome onMakeClosed(GrRecordingContext*, SkIRect* targetUpdateBounds) override;
    bool onExecute(GrOpFlushState*) override;

#if GR_TEST_UTILS
    const char* name() const final { return "Copy"; }
#endif
#ifdef SK_DEBUG
    void visitProxies_debugOnly(const GrVisitProxyFunc& func) const override {
        func(fSrc.get(), GrMipmapped::kNo);
    }
#endif

    sk_sp<GrSurfaceProxy> fSrc;
    SkIRect fSrcRect;
    SkIRect fDstRect;
    GrSamplerState::Filter fFilter;
    GrSurfaceOrigin fOrigin;
};

#endif

