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

#ifndef GrOpList_DEFINED
#define GrOpList_DEFINED

#include "include/core/SkRefCnt.h"
#include "include/private/SkColorData.h"
#include "include/private/SkTDArray.h"
#include "src/gpu/GrRenderTask.h"
#include "src/gpu/GrTextureProxy.h"

class GrAuditTrail;
class GrOpMemoryPool;
class GrGpuBuffer;

class GrOpList : public GrRenderTask {
public:
    GrOpList(sk_sp<GrOpMemoryPool>, sk_sp<GrSurfaceProxy>, GrAuditTrail*);
    ~GrOpList() override;

    /**
     * Copies a pixel rectangle from a proxy into this opLists's target. This call may finalize
     * reserved vertex/index data (as though a draw call was made). The src pixels copied are
     * specified by srcRect. They are copied to a rect of the same size in this opList's target with
     * top left at dstPoint. If the src rect is clipped by the src bounds then  pixel values in the
     * dst rect corresponding to area clipped by the src rect are not overwritten. This method is
     * not guaranteed to succeed depending on the type of surface, configs, etc, and the
     * backend-specific limitations.
     */
    virtual bool copySurface(GrRecordingContext*,
                             GrSurfaceProxy* src,
                             const SkIRect& srcRect,
                             const SkIPoint& dstPoint) = 0;

    virtual void transferFrom(GrRecordingContext*,
                              const SkIRect& srcRect,
                              GrColorType surfaceColorType,
                              GrColorType dstColorType,
                              sk_sp<GrGpuBuffer> dst,
                              size_t dstOffset) = 0;

    void endFlush() override;

    /*
     * Dump out the GrOpList dependency DAG
     */
    SkDEBUGCODE(void dump(bool printDependencies) const override;)

protected:
    // This is a backpointer to the GrOpMemoryPool that holds the memory for this opLists' ops.
    // In the DDL case, these back pointers keep the DDL's GrOpMemoryPool alive as long as its
    // constituent opLists survive.
    sk_sp<GrOpMemoryPool> fOpMemoryPool;
    GrAuditTrail*         fAuditTrail;

    GrLoadOp              fColorLoadOp    = GrLoadOp::kLoad;
    SkPMColor4f           fLoadClearColor = SK_PMColor4fTRANSPARENT;
    GrLoadOp              fStencilLoadOp  = GrLoadOp::kLoad;
};

#endif
