Index: src/gpu/GrResourceProvider.h |
diff --git a/src/gpu/GrResourceProvider.h b/src/gpu/GrResourceProvider.h |
index f0b79b97f5ebbf8d60aa62091aaeeec23a7fecf8..9ba1426fb6e73c425dfedaf4250e1033ef060ded 100644 |
--- a/src/gpu/GrResourceProvider.h |
+++ b/src/gpu/GrResourceProvider.h |
@@ -24,10 +24,13 @@ class SkTypeface; |
* An extension of the texture provider for arbitrary resource types. This class is intended for |
* use within the Gr code base, not by clients or extensions (e.g. third party GrProcessor |
* derivatives). |
+ * |
+ * This currently inherits from GrTextureProvider non-publically to force callers to provider |
+ * make a flags (pendingIO) decision and not use the GrTP methods that don't take flags. This |
+ * can be relaxed once http://skbug.com/4156 is fixed. |
*/ |
-class GrResourceProvider : public GrTextureProvider { |
+class GrResourceProvider : protected GrTextureProvider { |
public: |
- |
GrResourceProvider(GrGpu* gpu, GrResourceCache* cache); |
template <typename T> T* findAndRefTByUniqueKey(const GrUniqueKey& key) { |
@@ -47,11 +50,11 @@ public: |
* |
* @return The index buffer if successful, otherwise NULL. |
*/ |
- const GrIndexBuffer* refOrCreateInstancedIndexBuffer(const uint16_t* pattern, |
- int patternSize, |
- int reps, |
- int vertCount, |
- const GrUniqueKey& key) { |
+ const GrIndexBuffer* findOrCreateInstancedIndexBuffer(const uint16_t* pattern, |
+ int patternSize, |
+ int reps, |
+ int vertCount, |
+ const GrUniqueKey& key) { |
if (GrIndexBuffer* buffer = this->findAndRefTByUniqueKey<GrIndexBuffer>(key)) { |
return buffer; |
} |
@@ -81,13 +84,34 @@ public: |
GrPathRange* createPathRange(GrPathRange::PathGenerator*, const GrStrokeInfo&); |
GrPathRange* createGlyphs(const SkTypeface*, const SkDescriptor*, const GrStrokeInfo&); |
- |
using GrTextureProvider::assignUniqueKeyToResource; |
using GrTextureProvider::findAndRefResourceByUniqueKey; |
using GrTextureProvider::abandon; |
- GrIndexBuffer* getIndexBuffer(size_t size, bool dynamic, bool calledDuringFlush); |
- GrVertexBuffer* getVertexBuffer(size_t size, bool dynamic, bool calledDuringFlush); |
+ enum Flags { |
+ /** If the caller intends to do direct reads/writes to/from the CPU then this flag must be |
+ * set when accessing resources during a GrDrawTarget flush. This includes the execution of |
+ * GrBatch objects. The reason is that these memory operations are done immediately and |
+ * will occur out of order WRT the operations being flushed. |
+ * Make this automatic: http://skbug.com/4156 |
+ */ |
+ kNoPendingIO_Flag = kNoPendingIO_ScratchTextureFlag, |
+ }; |
+ |
+ enum BufferUsage { |
+ /** Caller intends to specify the buffer data rarely with respect to the number of draws |
+ that read the data. */ |
+ kStatic_BufferUsage, |
+ /** Caller intends to respecify the buffer data frequently between draws. */ |
+ kDynamic_BufferUsage, |
+ }; |
+ GrIndexBuffer* createIndexBuffer(size_t size, BufferUsage, uint32_t flags); |
+ GrVertexBuffer* createVertexBuffer(size_t size, BufferUsage, uint32_t flags); |
+ |
+ GrTexture* createApproxTexture(const GrSurfaceDesc& desc, uint32_t flags) { |
+ SkASSERT(0 == flags || kNoPendingIO_Flag == flags); |
+ return this->internalCreateApproxTexture(desc, flags); |
+ } |
private: |
const GrIndexBuffer* createInstancedIndexBuffer(const uint16_t* pattern, |