GrGpuResourceRef.h revision 95740981c36266e4595ddde2264aa38e3c7e2d02
195740981c36266e4595ddde2264aa38e3c7e2d02bsalomon/*
295740981c36266e4595ddde2264aa38e3c7e2d02bsalomon * Copyright 2014 Google Inc.
395740981c36266e4595ddde2264aa38e3c7e2d02bsalomon *
495740981c36266e4595ddde2264aa38e3c7e2d02bsalomon * Use of this source code is governed by a BSD-style license that can be
595740981c36266e4595ddde2264aa38e3c7e2d02bsalomon * found in the LICENSE file.
695740981c36266e4595ddde2264aa38e3c7e2d02bsalomon */
795740981c36266e4595ddde2264aa38e3c7e2d02bsalomon
895740981c36266e4595ddde2264aa38e3c7e2d02bsalomon#ifndef GrProgramResource_DEFINED
995740981c36266e4595ddde2264aa38e3c7e2d02bsalomon#define GrProgramResource_DEFINED
1095740981c36266e4595ddde2264aa38e3c7e2d02bsalomon
1195740981c36266e4595ddde2264aa38e3c7e2d02bsalomon#include "SkRefCnt.h"
1295740981c36266e4595ddde2264aa38e3c7e2d02bsalomon
1395740981c36266e4595ddde2264aa38e3c7e2d02bsalomonclass GrGpuResource;
1495740981c36266e4595ddde2264aa38e3c7e2d02bsalomon
1595740981c36266e4595ddde2264aa38e3c7e2d02bsalomon/**
1695740981c36266e4595ddde2264aa38e3c7e2d02bsalomon * Class that wraps a resource referenced by a GrProgramElement or GrDrawState. It manages
1795740981c36266e4595ddde2264aa38e3c7e2d02bsalomon * converting refs to pending io operations. Like SkAutoTUnref, its constructor and setter adopt
1895740981c36266e4595ddde2264aa38e3c7e2d02bsalomon * a ref from their caller. This class is intended only for internal use in core Gr code.
1995740981c36266e4595ddde2264aa38e3c7e2d02bsalomon */
2095740981c36266e4595ddde2264aa38e3c7e2d02bsalomonclass GrProgramResource : SkNoncopyable {
2195740981c36266e4595ddde2264aa38e3c7e2d02bsalomonpublic:
2295740981c36266e4595ddde2264aa38e3c7e2d02bsalomon    enum IOType {
2395740981c36266e4595ddde2264aa38e3c7e2d02bsalomon        kRead_IOType,
2495740981c36266e4595ddde2264aa38e3c7e2d02bsalomon        kWrite_IOType,
2595740981c36266e4595ddde2264aa38e3c7e2d02bsalomon        kRW_IOType,
2695740981c36266e4595ddde2264aa38e3c7e2d02bsalomon
2795740981c36266e4595ddde2264aa38e3c7e2d02bsalomon        kNone_IOType, // For internal use only, don't specify to constructor or setResource().
2895740981c36266e4595ddde2264aa38e3c7e2d02bsalomon    };
2995740981c36266e4595ddde2264aa38e3c7e2d02bsalomon
3095740981c36266e4595ddde2264aa38e3c7e2d02bsalomon    SK_DECLARE_INST_COUNT_ROOT(GrProgramResource);
3195740981c36266e4595ddde2264aa38e3c7e2d02bsalomon    GrProgramResource();
3295740981c36266e4595ddde2264aa38e3c7e2d02bsalomon
3395740981c36266e4595ddde2264aa38e3c7e2d02bsalomon    /** Adopts a ref from the caller. ioType expresses what type of IO operations will be marked as
3495740981c36266e4595ddde2264aa38e3c7e2d02bsalomon        pending on the resource when markPendingIO is called. */
3595740981c36266e4595ddde2264aa38e3c7e2d02bsalomon    explicit GrProgramResource(GrGpuResource*, IOType ioType);
3695740981c36266e4595ddde2264aa38e3c7e2d02bsalomon
3795740981c36266e4595ddde2264aa38e3c7e2d02bsalomon    ~GrProgramResource();
3895740981c36266e4595ddde2264aa38e3c7e2d02bsalomon
3995740981c36266e4595ddde2264aa38e3c7e2d02bsalomon    GrGpuResource* getResource() const { return fResource; }
4095740981c36266e4595ddde2264aa38e3c7e2d02bsalomon
4195740981c36266e4595ddde2264aa38e3c7e2d02bsalomon    /** Adopts a ref from the caller. ioType expresses what type of IO operations will be marked as
4295740981c36266e4595ddde2264aa38e3c7e2d02bsalomon        pending on the resource when markPendingIO is called. */
4395740981c36266e4595ddde2264aa38e3c7e2d02bsalomon    void setResource(GrGpuResource*, IOType ioType);
4495740981c36266e4595ddde2264aa38e3c7e2d02bsalomon
4595740981c36266e4595ddde2264aa38e3c7e2d02bsalomon    /** Does this object own a pending read or write on the resource it is wrapping. */
4695740981c36266e4595ddde2264aa38e3c7e2d02bsalomon    bool ownsPendingIO() const { return fPendingIO; }
4795740981c36266e4595ddde2264aa38e3c7e2d02bsalomon
4895740981c36266e4595ddde2264aa38e3c7e2d02bsalomon    /** Shortcut for calling setResource() with NULL. It cannot be called after markingPendingIO
4995740981c36266e4595ddde2264aa38e3c7e2d02bsalomon        is called. */
5095740981c36266e4595ddde2264aa38e3c7e2d02bsalomon    void reset();
5195740981c36266e4595ddde2264aa38e3c7e2d02bsalomon
5295740981c36266e4595ddde2264aa38e3c7e2d02bsalomonprivate:
5395740981c36266e4595ddde2264aa38e3c7e2d02bsalomon    /** Called by owning GrProgramElement when the program element is first scheduled for
5495740981c36266e4595ddde2264aa38e3c7e2d02bsalomon        execution. */
5595740981c36266e4595ddde2264aa38e3c7e2d02bsalomon    void markPendingIO() const;
5695740981c36266e4595ddde2264aa38e3c7e2d02bsalomon
5795740981c36266e4595ddde2264aa38e3c7e2d02bsalomon    /** Called when the program element/draw state is no longer owned by GrDrawTarget-client code.
5895740981c36266e4595ddde2264aa38e3c7e2d02bsalomon        This lets the cache know that the drawing code will no longer schedule additional reads or
5995740981c36266e4595ddde2264aa38e3c7e2d02bsalomon        writes to the resource using the program element or draw state. */
6095740981c36266e4595ddde2264aa38e3c7e2d02bsalomon    void removeRef() const;
6195740981c36266e4595ddde2264aa38e3c7e2d02bsalomon
6295740981c36266e4595ddde2264aa38e3c7e2d02bsalomon    friend class GrDrawState;
6395740981c36266e4595ddde2264aa38e3c7e2d02bsalomon    friend class GrProgramElement;
6495740981c36266e4595ddde2264aa38e3c7e2d02bsalomon
6595740981c36266e4595ddde2264aa38e3c7e2d02bsalomon    GrGpuResource*      fResource;
6695740981c36266e4595ddde2264aa38e3c7e2d02bsalomon    mutable bool        fOwnRef;
6795740981c36266e4595ddde2264aa38e3c7e2d02bsalomon    mutable bool        fPendingIO;
6895740981c36266e4595ddde2264aa38e3c7e2d02bsalomon    IOType              fIOType;
6995740981c36266e4595ddde2264aa38e3c7e2d02bsalomon
7095740981c36266e4595ddde2264aa38e3c7e2d02bsalomon    typedef SkNoncopyable INHERITED;
7195740981c36266e4595ddde2264aa38e3c7e2d02bsalomon};
7295740981c36266e4595ddde2264aa38e3c7e2d02bsalomon
7395740981c36266e4595ddde2264aa38e3c7e2d02bsalomon#endif
74