Revert "Optimize dynamic buffers."

This reverts commit 3e3813f787ee5e8bb7808eed539a606a4e2e3fd3.

Conflicts:
	src/libGLESv2/renderer/d3d/d3d11/Buffer11.cpp

Change-Id: I6470059672d3b377ce0fafbc8b637318a91f62c8
Reviewed-on: https://chromium-review.googlesource.com/217106
Tested-by: Jamie Madill <jmadill@chromium.org>
Reviewed-by: Geoff Lang <geofflang@chromium.org>
diff --git a/src/common/mathutil.h b/src/common/mathutil.h
index 9e7a8de..ffcb908 100644
--- a/src/common/mathutil.h
+++ b/src/common/mathutil.h
@@ -507,12 +507,12 @@
 struct Range
 {
     Range() {}
-    Range(T lo, T hi) : start(lo), end(hi) { }
+    Range(T lo, T hi) : start(lo), end(hi) { ASSERT(lo <= hi); }
 
     T start;
     T end;
 
-    T length() const { return (end > start ? (end - start) : 0); }
+    T length() const { return end - start; }
 };
 
 typedef Range<int> RangeI;
diff --git a/src/libGLESv2/renderer/d3d/MemoryBuffer.cpp b/src/libGLESv2/renderer/d3d/MemoryBuffer.cpp
index 4634a34..301bbe8 100644
--- a/src/libGLESv2/renderer/d3d/MemoryBuffer.cpp
+++ b/src/libGLESv2/renderer/d3d/MemoryBuffer.cpp
@@ -28,7 +28,9 @@
 {
     if (size == 0)
     {
-        clear();
+        free(mData);
+        mData = NULL;
+        mSize = 0;
     }
     else
     {
@@ -67,11 +69,4 @@
     return mData;
 }
 
-void MemoryBuffer::clear()
-{
-    free(mData);
-    mData = NULL;
-    mSize = 0;
-}
-
 }
diff --git a/src/libGLESv2/renderer/d3d/MemoryBuffer.h b/src/libGLESv2/renderer/d3d/MemoryBuffer.h
index 47b5772..2484c07 100644
--- a/src/libGLESv2/renderer/d3d/MemoryBuffer.h
+++ b/src/libGLESv2/renderer/d3d/MemoryBuffer.h
@@ -21,13 +21,10 @@
 
     bool resize(size_t size);
     size_t size() const;
-    void clear();
 
     const uint8_t *data() const;
     uint8_t *data();
 
-    bool empty() const { return (mSize == 0); }
-
   private:
     size_t mSize;
     uint8_t *mData;
diff --git a/src/libGLESv2/renderer/d3d/d3d11/Buffer11.cpp b/src/libGLESv2/renderer/d3d/d3d11/Buffer11.cpp
index 3fee3fd..ea6660e 100644
--- a/src/libGLESv2/renderer/d3d/d3d11/Buffer11.cpp
+++ b/src/libGLESv2/renderer/d3d/d3d11/Buffer11.cpp
@@ -162,9 +162,7 @@
       mSize(0),
       mMappedStorage(NULL),
       mResolvedDataRevision(0),
-      mReadUsageCount(0),
-      mDynamicUsage(0),
-      mDynamicDirtyRange(std::numeric_limits<size_t>::max(), std::numeric_limits<size_t>::min())
+      mReadUsageCount(0)
 {}
 
 Buffer11::~Buffer11()
@@ -183,16 +181,6 @@
 
 gl::Error Buffer11::setData(const void *data, size_t size, GLenum usage)
 {
-    mDynamicUsage = (usage == GL_DYNAMIC_DRAW);
-
-    if (mDynamicUsage)
-    {
-        if (!mDynamicData.resize(size))
-        {
-            return gl::Error(GL_OUT_OF_MEMORY);
-        }
-    }
-
     gl::Error error = setSubData(data, size, 0);
     if (error.isError())
     {
@@ -254,39 +242,30 @@
 
     if (data && size > 0)
     {
-        if (mDynamicUsage)
+        NativeBuffer11 *stagingBuffer = getStagingBuffer();
+
+        if (!stagingBuffer)
         {
-            mDynamicDirtyRange.start = std::min(mDynamicDirtyRange.start, offset);
-            mDynamicDirtyRange.end = std::max(mDynamicDirtyRange.end, size + offset);
-            memcpy(mDynamicData.data() + offset, data, size);
+            return gl::Error(GL_OUT_OF_MEMORY, "Failed to allocate internal staging buffer.");
         }
-        else
+
+        // Explicitly resize the staging buffer, preserving data if the new data will not
+        // completely fill the buffer
+        if (stagingBuffer->getSize() < requiredSize)
         {
-            NativeBuffer11 *stagingBuffer = getStagingBuffer();
-
-            if (!stagingBuffer)
+            bool preserveData = (offset > 0);
+            if (!stagingBuffer->resize(requiredSize, preserveData))
             {
-                return gl::Error(GL_OUT_OF_MEMORY, "Failed to allocate internal staging buffer.");
+                return gl::Error(GL_OUT_OF_MEMORY, "Failed to resize internal staging buffer.");
             }
-
-            // Explicitly resize the staging buffer, preserving data if the new data will not
-            // completely fill the buffer
-            if (stagingBuffer->getSize() < requiredSize)
-            {
-                bool preserveData = (offset > 0);
-                if (!stagingBuffer->resize(requiredSize, preserveData))
-                {
-                    return gl::Error(GL_OUT_OF_MEMORY, "Failed to resize internal staging buffer.");
-                }
-            }
-
-            if (!stagingBuffer->setData(D3D11_MAP_WRITE, reinterpret_cast<const uint8_t *>(data), size, offset))
-            {
-                return gl::Error(GL_OUT_OF_MEMORY, "Failed to set data on internal staging buffer.");
-            }
-
-            stagingBuffer->setDataRevision(stagingBuffer->getDataRevision() + 1);
         }
+
+        if (!stagingBuffer->setData(D3D11_MAP_WRITE, reinterpret_cast<const uint8_t *>(data), size, offset))
+        {
+            return gl::Error(GL_OUT_OF_MEMORY, "Failed to set data on internal staging buffer.");
+        }
+
+        stagingBuffer->setDataRevision(stagingBuffer->getDataRevision() + 1);
     }
 
     mSize = std::max(mSize, requiredSize);
@@ -331,7 +310,7 @@
     {
         if (copySource->getUsage() == BUFFER_USAGE_STAGING)
         {
-            copySource = getBufferStorage(BUFFER_USAGE_VERTEX);
+            copySource = getBufferStorage(BUFFER_USAGE_VERTEX_OR_TRANSFORM_FEEDBACK);
         }
         else
         {
@@ -398,7 +377,7 @@
 
 void Buffer11::markTransformFeedbackUsage()
 {
-    BufferStorage11 *transformFeedbackStorage = getBufferStorage(BUFFER_USAGE_TRANSFORM_FEEDBACK);
+    BufferStorage11 *transformFeedbackStorage = getBufferStorage(BUFFER_USAGE_VERTEX_OR_TRANSFORM_FEEDBACK);
 
     if (transformFeedbackStorage)
     {
@@ -510,38 +489,10 @@
     return gl::Error(GL_NO_ERROR);
 }
 
-Buffer11::BufferStorage11 *Buffer11::getBufferStorage(BufferUsage requestedUsage)
+Buffer11::BufferStorage11 *Buffer11::getBufferStorage(BufferUsage usage)
 {
-    ASSERT(requestedUsage != BUFFER_USAGE_VERTEX_DYNAMIC);
-    ASSERT(requestedUsage != BUFFER_USAGE_INDEX_DYNAMIC);
-
-    BufferUsage internalUsage = requestedUsage;
-
-    if (mDynamicUsage)
-    {
-        if (requestedUsage == BUFFER_USAGE_VERTEX)
-        {
-            internalUsage = BUFFER_USAGE_VERTEX_DYNAMIC;
-        }
-        else if (requestedUsage == BUFFER_USAGE_INDEX)
-        {
-            internalUsage = BUFFER_USAGE_INDEX_DYNAMIC;
-        }
-        else
-        {
-            // Convert out of dynamic usage
-            setData(mDynamicData.data(), mDynamicData.size(), GL_STATIC_DRAW);
-        }
-    }
-
-    // Internally we share the same NativeBuffer11 for stream out and vertex data
-    if (requestedUsage == BUFFER_USAGE_TRANSFORM_FEEDBACK)
-    {
-        internalUsage = BUFFER_USAGE_VERTEX;
-    }
-
     BufferStorage11 *directBuffer = NULL;
-    auto directBufferIt = mBufferStorages.find(internalUsage);
+    auto directBufferIt = mBufferStorages.find(usage);
     if (directBufferIt != mBufferStorages.end())
     {
         directBuffer = directBufferIt->second;
@@ -549,17 +500,17 @@
 
     if (!directBuffer)
     {
-        if (internalUsage == BUFFER_USAGE_PIXEL_PACK)
+        if (usage == BUFFER_USAGE_PIXEL_PACK)
         {
             directBuffer = new PackStorage11(mRenderer);
         }
         else
         {
             // buffer is not allocated, create it
-            directBuffer = new NativeBuffer11(mRenderer, internalUsage);
+            directBuffer = new NativeBuffer11(mRenderer, usage);
         }
 
-        mBufferStorages.insert(std::make_pair(internalUsage, directBuffer));
+        mBufferStorages.insert(std::make_pair(usage, directBuffer));
     }
 
     // resize buffer
@@ -572,18 +523,6 @@
         }
     }
 
-    if (mDynamicUsage)
-    {
-        if (!mDynamicData.empty() && mDynamicDirtyRange.length() > 0)
-        {
-            ASSERT(HAS_DYNAMIC_TYPE(NativeBuffer11*, directBuffer));
-            NativeBuffer11 *dynamicBuffer = static_cast<NativeBuffer11*>(directBuffer);
-            dynamicBuffer->setData(D3D11_MAP_WRITE_NO_OVERWRITE, mDynamicData.data(), mDynamicDirtyRange.length(), mDynamicDirtyRange.start);
-        }
-
-        return directBuffer;
-    }
-
     BufferStorage11 *latestBuffer = getLatestBufferStorage();
     if (latestBuffer && latestBuffer->getDataRevision() > directBuffer->getDataRevision())
     {
@@ -787,8 +726,7 @@
         bufferDesc->CPUAccessFlags = D3D11_CPU_ACCESS_READ | D3D11_CPU_ACCESS_WRITE;
         break;
 
-      case BUFFER_USAGE_VERTEX:
-      case BUFFER_USAGE_TRANSFORM_FEEDBACK:
+      case BUFFER_USAGE_VERTEX_OR_TRANSFORM_FEEDBACK:
         bufferDesc->Usage = D3D11_USAGE_DEFAULT;
         bufferDesc->BindFlags = D3D11_BIND_VERTEX_BUFFER | D3D11_BIND_STREAM_OUTPUT;
         bufferDesc->CPUAccessFlags = 0;
@@ -817,18 +755,6 @@
         bufferDesc->ByteWidth = std::min<UINT>(bufferDesc->ByteWidth, renderer->getRendererCaps().maxUniformBlockSize);
         break;
 
-      case BUFFER_USAGE_VERTEX_DYNAMIC:
-        bufferDesc->Usage = D3D11_USAGE_DYNAMIC;
-        bufferDesc->BindFlags = D3D11_BIND_VERTEX_BUFFER;
-        bufferDesc->CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
-        break;
-
-      case BUFFER_USAGE_INDEX_DYNAMIC:
-        bufferDesc->Usage = D3D11_USAGE_DYNAMIC;
-        bufferDesc->BindFlags = D3D11_BIND_INDEX_BUFFER;
-        bufferDesc->CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
-        break;
-
     default:
         UNREACHABLE();
     }
diff --git a/src/libGLESv2/renderer/d3d/d3d11/Buffer11.h b/src/libGLESv2/renderer/d3d/d3d11/Buffer11.h
index 70449bb..5740566 100644
--- a/src/libGLESv2/renderer/d3d/d3d11/Buffer11.h
+++ b/src/libGLESv2/renderer/d3d/d3d11/Buffer11.h
@@ -20,16 +20,11 @@
 enum BufferUsage
 {
     BUFFER_USAGE_STAGING,
-    BUFFER_USAGE_VERTEX,
-    BUFFER_USAGE_TRANSFORM_FEEDBACK,
+    BUFFER_USAGE_VERTEX_OR_TRANSFORM_FEEDBACK,
     BUFFER_USAGE_INDEX,
     BUFFER_USAGE_PIXEL_UNPACK,
     BUFFER_USAGE_PIXEL_PACK,
     BUFFER_USAGE_UNIFORM,
-
-    // Internal flags
-    BUFFER_USAGE_VERTEX_DYNAMIC,
-    BUFFER_USAGE_INDEX_DYNAMIC
 };
 
 struct PackPixelsParams
@@ -83,13 +78,6 @@
     class NativeBuffer11;
     class PackStorage11;
 
-    void markBufferUsage();
-    NativeBuffer11 *getStagingBuffer();
-    PackStorage11 *getPackStorage();
-
-    BufferStorage11 *getBufferStorage(BufferUsage usage);
-    BufferStorage11 *getLatestBufferStorage() const;
-
     rx::Renderer11 *mRenderer;
     size_t mSize;
 
@@ -104,9 +92,12 @@
     DataRevision mResolvedDataRevision;
     unsigned int mReadUsageCount;
 
-    MemoryBuffer mDynamicData;
-    bool mDynamicUsage;
-    Range<size_t> mDynamicDirtyRange;
+    void markBufferUsage();
+    NativeBuffer11 *getStagingBuffer();
+    PackStorage11 *getPackStorage();
+
+    BufferStorage11 *getBufferStorage(BufferUsage usage);
+    BufferStorage11 *getLatestBufferStorage() const;
 };
 
 }
diff --git a/src/libGLESv2/renderer/d3d/d3d11/InputLayoutCache.cpp b/src/libGLESv2/renderer/d3d/d3d11/InputLayoutCache.cpp
index 3050a49..b06526e 100644
--- a/src/libGLESv2/renderer/d3d/d3d11/InputLayoutCache.cpp
+++ b/src/libGLESv2/renderer/d3d/d3d11/InputLayoutCache.cpp
@@ -195,7 +195,7 @@
             VertexBuffer11 *vertexBuffer = VertexBuffer11::makeVertexBuffer11(attributes[i].vertexBuffer);
             Buffer11 *bufferStorage = attributes[i].storage ? Buffer11::makeBuffer11(attributes[i].storage) : NULL;
 
-            buffer = bufferStorage ? bufferStorage->getBuffer(BUFFER_USAGE_VERTEX)
+            buffer = bufferStorage ? bufferStorage->getBuffer(BUFFER_USAGE_VERTEX_OR_TRANSFORM_FEEDBACK)
                                    : vertexBuffer->getBuffer();
         }
 
diff --git a/src/libGLESv2/renderer/d3d/d3d11/Renderer11.cpp b/src/libGLESv2/renderer/d3d/d3d11/Renderer11.cpp
index 1a652fd..fba179f 100644
--- a/src/libGLESv2/renderer/d3d/d3d11/Renderer11.cpp
+++ b/src/libGLESv2/renderer/d3d/d3d11/Renderer11.cpp
@@ -975,7 +975,7 @@
         if (transformFeedbackBuffers[i])
         {
             Buffer11 *storage = Buffer11::makeBuffer11(transformFeedbackBuffers[i]->getImplementation());
-            ID3D11Buffer *buffer = storage->getBuffer(BUFFER_USAGE_TRANSFORM_FEEDBACK);
+            ID3D11Buffer *buffer = storage->getBuffer(BUFFER_USAGE_VERTEX_OR_TRANSFORM_FEEDBACK);
 
             d3dBuffers[i] = buffer;
             d3dOffsets[i] = (mAppliedTFBuffers[i] != buffer) ? static_cast<UINT>(offsets[i]) : -1;