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