Index: src/gpu/GrGeometryBuffer.h |
diff --git a/src/gpu/GrGeometryBuffer.h b/src/gpu/GrGeometryBuffer.h |
index 1e1a367260216d01fe94f74c783aabd7d6c60716..67e91cc4d90a45a239159904edbb84360fb965cf 100644 |
--- a/src/gpu/GrGeometryBuffer.h |
+++ b/src/gpu/GrGeometryBuffer.h |
@@ -45,42 +45,58 @@ public: |
* Currently only one map at a time is supported (no nesting of |
* map/unmap). |
* |
+ * Note that buffer mapping does not go through GrContext and therefore is |
+ * not serialized with other operations. |
+ * |
* @return a pointer to the data or NULL if the map fails. |
*/ |
- virtual void* map() = 0; |
+ void* map() { return (fMapPtr = this->onMap()); } |
/** |
- * Returns the same ptr that map() returned at time of map or NULL if the |
- * is not mapped. |
+ * Unmaps the buffer. |
* |
- * @return ptr to mapped buffer data or undefined if buffer is not mapped. |
+ * The pointer returned by the previous map call will no longer be valid. |
*/ |
- virtual void* mapPtr() const = 0; |
+ void unmap() { |
+ SkASSERT(NULL != fMapPtr); |
+ this->onUnmap(); |
+ fMapPtr = NULL; |
+ } |
/** |
- * Unmaps the buffer. |
+ * Returns the same ptr that map() returned at time of map or NULL if the |
+ * is not mapped. |
* |
- * The pointer returned by the previous map call will no longer be valid. |
+ * @return ptr to mapped buffer data or NULL if buffer is not mapped. |
*/ |
- virtual void unmap() = 0; |
+ void* mapPtr() const { return fMapPtr; } |
/** |
Queries whether the buffer has been mapped. |
@return true if the buffer is mapped, false otherwise. |
*/ |
- virtual bool isMapped() const = 0; |
+ bool isMapped() const { return NULL != fMapPtr; } |
/** |
* Updates the buffer data. |
* |
* The size of the buffer will be preserved. The src data will be |
* placed at the beginning of the buffer and any remaining contents will |
- * be undefined. |
+ * be undefined. srcSizeInBytes must be <= to the buffer size. |
+ * |
+ * The buffer must not be mapped. |
+ * |
+ * Note that buffer updates do not go through GrContext and therefore are |
+ * not serialized with other operations. |
* |
* @return returns true if the update succeeds, false otherwise. |
*/ |
- virtual bool updateData(const void* src, size_t srcSizeInBytes) = 0; |
+ bool updateData(const void* src, size_t srcSizeInBytes) { |
+ SkASSERT(!this->isMapped()); |
+ SkASSERT(srcSizeInBytes <= fGpuMemorySize); |
+ return this->onUpdateData(src, srcSizeInBytes); |
+ } |
// GrGpuObject overrides |
virtual size_t gpuMemorySize() const { return fGpuMemorySize; } |
@@ -88,11 +104,17 @@ public: |
protected: |
GrGeometryBuffer(GrGpu* gpu, bool isWrapped, size_t gpuMemorySize, bool dynamic, bool cpuBacked) |
: INHERITED(gpu, isWrapped) |
+ , fMapPtr(NULL) |
, fGpuMemorySize(gpuMemorySize) |
, fDynamic(dynamic) |
, fCPUBacked(cpuBacked) {} |
private: |
+ virtual void* onMap() = 0; |
+ virtual void onUnmap() = 0; |
+ virtual bool onUpdateData(const void* src, size_t srcSizeInBytes) = 0; |
+ |
+ void* fMapPtr; |
size_t fGpuMemorySize; |
bool fDynamic; |
bool fCPUBacked; |