Index: src/gpu/GrBuffer.h |
diff --git a/src/gpu/GrGeometryBuffer.h b/src/gpu/GrBuffer.h |
similarity index 55% |
rename from src/gpu/GrGeometryBuffer.h |
rename to src/gpu/GrBuffer.h |
index 56a6cae3fb08f32f8e3e7fcbbb276ba81620b858..cf12d8bd29022ac1625450035571a4a52830f035 100644 |
--- a/src/gpu/GrGeometryBuffer.h |
+++ b/src/gpu/GrBuffer.h |
@@ -1,32 +1,44 @@ |
- |
/* |
- * Copyright 2011 Google Inc. |
+ * 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 GrGeometryBuffer_DEFINED |
-#define GrGeometryBuffer_DEFINED |
+#ifndef GrBuffer_DEFINED |
+#define GrBuffer_DEFINED |
#include "GrGpuResource.h" |
class GrGpu; |
-/** |
- * Parent class for vertex and index buffers |
- */ |
-class GrGeometryBuffer : public GrGpuResource { |
+class GrBuffer : public GrGpuResource { |
public: |
- |
- |
/** |
- *Retrieves whether the buffer was created with the dynamic flag |
- * |
- * @return true if the buffer was created with the dynamic flag |
+ * Computes a scratch key for a buffer with a "dynamic" access pattern. (Buffers with "static" |
+ * and "stream" access patterns are disqualified by nature from being cached and reused.) |
bsalomon
2016/03/24 14:30:44
why not stream?
Chris Dalton
2016/03/24 15:04:40
Stream is defined as "specified once, and used at
bsalomon
2016/03/24 15:55:47
Gotcha. I see you changed the alloc pool to reques
Chris Dalton
2016/03/24 16:07:06
Yep. I traced every GL call for all of gm and test
Chris Dalton
2016/03/24 18:14:10
Done.
|
*/ |
- bool dynamic() const { return fDynamic; } |
+ static void ComputeScratchKeyForDynamicBuffer(GrBufferType type, size_t size, |
+ GrScratchKey* key) { |
+ static const GrScratchKey::ResourceType kType = GrScratchKey::GenerateResourceType(); |
+ if (uint32_t hi = size >> 32) { |
+ GrScratchKey::Builder builder(key, kType, 3); |
+ builder[0] = type; |
+ builder[1] = size; |
+ builder[2] = hi; |
+ } else { |
+ GrScratchKey::Builder builder(key, kType, 2); |
+ // TODO: There's not always reason to cache a buffer by type. In some (all?) APIs it's |
+ // just a chunk of memory we can use/reuse for any type of data. We really only need to |
+ // differentiate between the "read" types (e.g. kGpuToCpu_BufferType) and "draw" types. |
+ builder[0] = type; |
+ builder[1] = size; |
+ } |
+ } |
+ |
+ GrBufferType type() const { return fType; } |
+ |
+ GrAccessPattern accessPattern() const { return fAccessPattern; } |
/** |
* Returns true if the buffer is a wrapper around a CPU array. If true it |
@@ -50,7 +62,10 @@ public: |
* |
* @return a pointer to the data or nullptr if the map fails. |
*/ |
- void* map() { return (fMapPtr = this->onMap()); } |
+ void* map() { |
+ this->onMap(); |
bsalomon
2016/03/24 14:30:44
if (!fMapPtr) {
this->onMap();
}
return fMapPtr
Chris Dalton
2016/03/24 15:04:40
Good idea.
Now the comment above says: "It is an
bsalomon
2016/03/24 15:55:47
I think we can just delete the comment.
|
+ return fMapPtr; |
+ } |
/** |
* Unmaps the buffer. |
@@ -99,24 +114,34 @@ public: |
} |
protected: |
- GrGeometryBuffer(GrGpu* gpu, size_t gpuMemorySize, bool dynamic, bool cpuBacked) |
- : INHERITED(gpu, kCached_LifeCycle) |
- , fMapPtr(nullptr) |
- , fGpuMemorySize(gpuMemorySize) |
- , fDynamic(dynamic) |
- , fCPUBacked(cpuBacked) {} |
+ GrBuffer(GrGpu* gpu, GrBufferType type, size_t gpuMemorySize, GrAccessPattern accessPattern, |
+ bool cpuBacked) |
+ : INHERITED(gpu, kCached_LifeCycle), |
+ fMapPtr(nullptr), |
+ fType(type), |
+ fGpuMemorySize(gpuMemorySize), // TODO: Zero for cpu backed buffers? |
+ fAccessPattern(accessPattern), |
+ fCPUBacked(cpuBacked) { |
+ if (!fCPUBacked && SkIsPow2(fGpuMemorySize) && kDynamic_GrAccessPattern == fAccessPattern) { |
+ GrScratchKey key; |
+ ComputeScratchKeyForDynamicBuffer(fType, fGpuMemorySize, &key); |
+ this->setScratchKey(key); |
+ } |
+ } |
+ |
+ void* fMapPtr; |
private: |
virtual size_t onGpuMemorySize() const { return fGpuMemorySize; } |
- virtual void* onMap() = 0; |
+ 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; |
+ GrBufferType fType; |
+ size_t fGpuMemorySize; |
+ GrAccessPattern fAccessPattern; |
+ bool fCPUBacked; |
typedef GrGpuResource INHERITED; |
}; |