Refactoring Buffers

BUG=angle:681
Change-Id: I6c3809e0b9468dfe38465c55759c2572c21485da
Reviewed-on: https://chromium-review.googlesource.com/204896
Reviewed-by: Geoff Lang <geofflang@chromium.org>
Tested-by: Geoff Lang <geofflang@chromium.org>
diff --git a/src/libGLESv2/renderer/d3d/d3d11/BufferStorage11.cpp b/src/libGLESv2/renderer/d3d/d3d11/Buffer11.cpp
similarity index 78%
rename from src/libGLESv2/renderer/d3d/d3d11/BufferStorage11.cpp
rename to src/libGLESv2/renderer/d3d/d3d11/Buffer11.cpp
index c23b03c..facd709 100644
--- a/src/libGLESv2/renderer/d3d/d3d11/BufferStorage11.cpp
+++ b/src/libGLESv2/renderer/d3d/d3d11/Buffer11.cpp
@@ -1,17 +1,16 @@
 #include "precompiled.h"
 //
-// Copyright (c) 2013-2014 The ANGLE Project Authors. All rights reserved.
+// Copyright 2014 The ANGLE Project Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 //
 
-// BufferStorage11.cpp Defines the BufferStorage11 class.
+// Buffer11.cpp Defines the Buffer11 class.
 
-#include "libGLESv2/renderer/d3d/d3d11/BufferStorage11.h"
+#include "libGLESv2/renderer/d3d/d3d11/Buffer11.h"
 #include "libGLESv2/main.h"
 #include "libGLESv2/renderer/d3d/d3d11/Renderer11.h"
 #include "libGLESv2/renderer/d3d/d3d11/formatutils11.h"
-#include "libGLESv2/Buffer.h"
 
 namespace rx
 {
@@ -69,15 +68,15 @@
 
 }
 
-// Each instance of BufferStorageD3DBuffer11 is specialized for a class of D3D binding points
+// Each instance of Buffer11::BufferStorage11 is specialized for a class of D3D binding points
 // - vertex/transform feedback buffers
 // - index buffers
 // - pixel unpack buffers
 // - uniform buffers
-class BufferStorage11::TypedBufferStorage11
+class Buffer11::BufferStorage11
 {
   public:
-    virtual ~TypedBufferStorage11() {}
+    virtual ~BufferStorage11() {}
 
     DataRevision getDataRevision() const { return mRevision; }
     BufferUsage getUsage() const { return mUsage; }
@@ -86,15 +85,15 @@
 
     void setDataRevision(DataRevision rev) { mRevision = rev; }
 
-    virtual bool copyFromStorage(TypedBufferStorage11 *source, size_t sourceOffset,
+    virtual bool copyFromStorage(BufferStorage11 *source, size_t sourceOffset,
                                  size_t size, size_t destOffset) = 0;
     virtual bool resize(size_t size, bool preserveData) = 0;
 
-    virtual void *map(GLbitfield access) = 0;
+    virtual void *map(size_t offset, size_t length, GLbitfield access) = 0;
     virtual void unmap() = 0;
 
   protected:
-    TypedBufferStorage11(Renderer11 *renderer, BufferUsage usage);
+    BufferStorage11(Renderer11 *renderer, BufferUsage usage);
 
     Renderer11 *mRenderer;
     DataRevision mRevision;
@@ -104,7 +103,7 @@
 
 // A native buffer storage represents an underlying D3D11 buffer for a particular
 // type of storage.
-class BufferStorage11::NativeBuffer11 : public BufferStorage11::TypedBufferStorage11
+class Buffer11::NativeBuffer11 : public Buffer11::BufferStorage11
 {
   public:
     NativeBuffer11(Renderer11 *renderer, BufferUsage usage);
@@ -112,11 +111,11 @@
 
     ID3D11Buffer *getNativeBuffer() const { return mNativeBuffer; }
 
-    virtual bool copyFromStorage(TypedBufferStorage11 *source, size_t sourceOffset,
+    virtual bool copyFromStorage(BufferStorage11 *source, size_t sourceOffset,
                                  size_t size, size_t destOffset);
     virtual bool resize(size_t size, bool preserveData);
 
-    virtual void *map(GLbitfield access);
+    virtual void *map(size_t offset, size_t length, GLbitfield access);
     virtual void unmap();
 
   private:
@@ -127,17 +126,17 @@
 
 // Pack storage represents internal storage for pack buffers. We implement pack buffers
 // as CPU memory, tied to a staging texture, for asynchronous texture readback.
-class BufferStorage11::PackStorage11 : public BufferStorage11::TypedBufferStorage11
+class Buffer11::PackStorage11 : public Buffer11::BufferStorage11
 {
   public:
     PackStorage11(Renderer11 *renderer);
     ~PackStorage11();
 
-    virtual bool copyFromStorage(TypedBufferStorage11 *source, size_t sourceOffset,
+    virtual bool copyFromStorage(BufferStorage11 *source, size_t sourceOffset,
                                  size_t size, size_t destOffset);
     virtual bool resize(size_t size, bool preserveData);
 
-    virtual void *map(GLbitfield access);
+    virtual void *map(size_t offset, size_t length, GLbitfield access);
     virtual void unmap();
 
     void packPixels(ID3D11Texture2D *srcTexure, UINT srcSubresource, const PackPixelsParams &params);
@@ -155,27 +154,54 @@
     bool mDataModified;
 };
 
-BufferStorage11::BufferStorage11(Renderer11 *renderer)
-    : mRenderer(renderer),
+
+Buffer11::Buffer11(Renderer11 *renderer)
+    : BufferD3D(),
+      mRenderer(renderer),
+      mSize(0),
       mMappedStorage(NULL),
       mResolvedDataRevision(0),
-      mReadUsageCount(0),
-      mSize(0)
+      mReadUsageCount(0)
 {
 }
 
-BufferStorage11::~BufferStorage11()
+Buffer11::~Buffer11()
 {
     clear();
 }
 
-BufferStorage11 *BufferStorage11::makeBufferStorage11(BufferStorage *bufferStorage)
+Buffer11 *Buffer11::makeBuffer11(BufferImpl *buffer)
 {
-    ASSERT(HAS_DYNAMIC_TYPE(BufferStorage11*, bufferStorage));
-    return static_cast<BufferStorage11*>(bufferStorage);
+    ASSERT(HAS_DYNAMIC_TYPE(Buffer11*, buffer));
+    return static_cast<Buffer11*>(buffer);
 }
 
-void *BufferStorage11::getData()
+void Buffer11::clear()
+{
+    for (auto it = mBufferStorages.begin(); it != mBufferStorages.end(); it++)
+    {
+        SafeDelete(it->second);
+    }
+
+    mBufferStorages.clear();
+
+    mSize = 0;
+    mResolvedDataRevision = 0;
+}
+
+void Buffer11::setData(const void* data, size_t size, GLenum usage)
+{
+    mIndexRangeCache.clear();
+
+    setSubData(data, size, 0);
+
+    if (usage == GL_STATIC_DRAW)
+    {
+        initializeStaticData();
+    }
+}
+
+void *Buffer11::getData()
 {
     NativeBuffer11 *stagingBuffer = getStagingBuffer();
 
@@ -213,11 +239,14 @@
     return mResolvedData.data();
 }
 
-void BufferStorage11::setData(const void* data, size_t size, size_t offset)
+void Buffer11::setSubData(const void* data, size_t size, size_t offset)
 {
     size_t requiredSize = size + offset;
     mSize = std::max(mSize, requiredSize);
 
+    mIndexRangeCache.invalidateRange(offset, size);
+    invalidateStaticData();
+
     if (data && size > 0)
     {
         NativeBuffer11 *stagingBuffer = getStagingBuffer();
@@ -258,25 +287,25 @@
     }
 }
 
-void BufferStorage11::copyData(BufferStorage* sourceStorage, size_t size, size_t sourceOffset, size_t destOffset)
+void Buffer11::copySubData(BufferImpl* source, GLintptr sourceOffset, GLintptr destOffset, GLsizeiptr size)
 {
-    BufferStorage11* sourceStorage11 = makeBufferStorage11(sourceStorage);
-    if (sourceStorage11)
+    Buffer11 *sourceBuffer = makeBuffer11(source);
+    if (sourceBuffer)
     {
-        TypedBufferStorage11 *dest = getLatestStorage();
+        BufferStorage11 *dest = getLatestBufferStorage();
         if (!dest)
         {
             dest = getStagingBuffer();
         }
 
-        TypedBufferStorage11 *source = sourceStorage11->getLatestStorage();
+        BufferStorage11 *source = sourceBuffer->getLatestBufferStorage();
         if (source && dest)
         {
             // If copying to/from a pixel pack buffer, we must have a staging or
             // pack buffer partner, because other native buffers can't be mapped
             if (dest->getUsage() == BUFFER_USAGE_PIXEL_PACK && !source->isMappable())
             {
-                source = sourceStorage11->getStagingBuffer();
+                source = sourceBuffer->getStagingBuffer();
             }
             else if (source->getUsage() == BUFFER_USAGE_PIXEL_PACK && !dest->isMappable())
             {
@@ -289,42 +318,64 @@
 
         mSize = std::max<size_t>(mSize, destOffset + size);
     }
+
+    invalidateStaticData();
 }
 
-void BufferStorage11::clear()
+GLvoid *Buffer11::map(size_t offset, size_t length, GLbitfield access)
 {
-    for (auto it = mTypedBuffers.begin(); it != mTypedBuffers.end(); it++)
+    ASSERT(!mMappedStorage);
+
+    BufferStorage11 *latestStorage = getLatestBufferStorage();
+    if (latestStorage &&
+        (latestStorage->getUsage() == BUFFER_USAGE_PIXEL_PACK ||
+         latestStorage->getUsage() == BUFFER_USAGE_STAGING))
     {
-        SafeDelete(it->second);
+        // Latest storage is mappable.
+        mMappedStorage = latestStorage;
+    }
+    else
+    {
+        // Fall back to using the staging buffer if the latest storage does
+        // not exist or is not CPU-accessible.
+        mMappedStorage = getStagingBuffer();
     }
 
-    mTypedBuffers.clear();
+    if (!mMappedStorage)
+    {
+        // Out-of-memory
+        return NULL;
+    }
 
-    mSize = 0;
-    mResolvedDataRevision = 0;
+    if ((access & GL_MAP_WRITE_BIT) > 0)
+    {
+        // Update the data revision immediately, since the data might be changed at any time
+        mMappedStorage->setDataRevision(mMappedStorage->getDataRevision() + 1);
+    }
+
+    return mMappedStorage->map(offset, length, access);
 }
 
-void BufferStorage11::markTransformFeedbackUsage()
+void Buffer11::unmap()
 {
-    TypedBufferStorage11 *transformFeedbackStorage = getStorage(BUFFER_USAGE_VERTEX_OR_TRANSFORM_FEEDBACK);
+    ASSERT(mMappedStorage);
+    mMappedStorage->unmap();
+    mMappedStorage = NULL;
+}
+
+void Buffer11::markTransformFeedbackUsage()
+{
+    BufferStorage11 *transformFeedbackStorage = getBufferStorage(BUFFER_USAGE_VERTEX_OR_TRANSFORM_FEEDBACK);
 
     if (transformFeedbackStorage)
     {
         transformFeedbackStorage->setDataRevision(transformFeedbackStorage->getDataRevision() + 1);
     }
+
+    invalidateStaticData();
 }
 
-size_t BufferStorage11::getSize() const
-{
-    return mSize;
-}
-
-bool BufferStorage11::supportsDirectBinding() const
-{
-    return true;
-}
-
-void BufferStorage11::markBufferUsage()
+void Buffer11::markBufferUsage()
 {
     mReadUsageCount++;
 
@@ -337,26 +388,31 @@
     }
 }
 
-ID3D11Buffer *BufferStorage11::getBuffer(BufferUsage usage)
+Renderer* Buffer11::getRenderer()
+{
+    return mRenderer;
+}
+
+ID3D11Buffer *Buffer11::getBuffer(BufferUsage usage)
 {
     markBufferUsage();
 
-    TypedBufferStorage11 *typedBuffer = getStorage(usage);
+    BufferStorage11 *bufferStorage = getBufferStorage(usage);
 
-    if (!typedBuffer)
+    if (!bufferStorage)
     {
         // Storage out-of-memory
         return NULL;
     }
 
-    ASSERT(HAS_DYNAMIC_TYPE(NativeBuffer11*, typedBuffer));
+    ASSERT(HAS_DYNAMIC_TYPE(NativeBuffer11*, bufferStorage));
 
-    return static_cast<NativeBuffer11*>(typedBuffer)->getNativeBuffer();
+    return static_cast<NativeBuffer11*>(bufferStorage)->getNativeBuffer();
 }
 
-ID3D11ShaderResourceView *BufferStorage11::getSRV(DXGI_FORMAT srvFormat)
+ID3D11ShaderResourceView *Buffer11::getSRV(DXGI_FORMAT srvFormat)
 {
-    TypedBufferStorage11 *storage = getStorage(BUFFER_USAGE_PIXEL_UNPACK);
+    BufferStorage11 *storage = getBufferStorage(BUFFER_USAGE_PIXEL_UNPACK);
 
     if (!storage)
     {
@@ -400,11 +456,11 @@
     return bufferSRV;
 }
 
-void BufferStorage11::packPixels(ID3D11Texture2D *srcTexture, UINT srcSubresource, const PackPixelsParams &params)
+void Buffer11::packPixels(ID3D11Texture2D *srcTexture, UINT srcSubresource, const PackPixelsParams &params)
 {
     PackStorage11 *packStorage = getPackStorage();
 
-    TypedBufferStorage11 *latestStorage = getLatestStorage();
+    BufferStorage11 *latestStorage = getLatestBufferStorage();
 
     if (packStorage)
     {
@@ -413,11 +469,11 @@
     }
 }
 
-BufferStorage11::TypedBufferStorage11 *BufferStorage11::getStorage(BufferUsage usage)
+Buffer11::BufferStorage11 *Buffer11::getBufferStorage(BufferUsage usage)
 {
-    TypedBufferStorage11 *directBuffer = NULL;
-    auto directBufferIt = mTypedBuffers.find(usage);
-    if (directBufferIt != mTypedBuffers.end())
+    BufferStorage11 *directBuffer = NULL;
+    auto directBufferIt = mBufferStorages.find(usage);
+    if (directBufferIt != mBufferStorages.end())
     {
         directBuffer = directBufferIt->second;
     }
@@ -434,7 +490,7 @@
             directBuffer = new NativeBuffer11(mRenderer, usage);
         }
 
-        mTypedBuffers.insert(std::make_pair(usage, directBuffer));
+        mBufferStorages.insert(std::make_pair(usage, directBuffer));
     }
 
     // resize buffer
@@ -447,7 +503,7 @@
         }
     }
 
-    TypedBufferStorage11 *latestBuffer = getLatestStorage();
+    BufferStorage11 *latestBuffer = getLatestBufferStorage();
     if (latestBuffer && latestBuffer->getDataRevision() > directBuffer->getDataRevision())
     {
         // if copying from a pack buffer to a non-staging native buffer, we must first
@@ -474,15 +530,15 @@
     return directBuffer;
 }
 
-BufferStorage11::TypedBufferStorage11 *BufferStorage11::getLatestStorage() const
+Buffer11::BufferStorage11 *Buffer11::getLatestBufferStorage() const
 {
     // Even though we iterate over all the direct buffers, it is expected that only
     // 1 or 2 will be present.
-    TypedBufferStorage11 *latestStorage = NULL;
+    BufferStorage11 *latestStorage = NULL;
     DataRevision latestRevision = 0;
-    for (auto it = mTypedBuffers.begin(); it != mTypedBuffers.end(); it++)
+    for (auto it = mBufferStorages.begin(); it != mBufferStorages.end(); it++)
     {
-        TypedBufferStorage11 *storage = it->second;
+        BufferStorage11 *storage = it->second;
         if (!latestStorage || storage->getDataRevision() > latestRevision)
         {
             latestStorage = storage;
@@ -493,55 +549,9 @@
     return latestStorage;
 }
 
-bool BufferStorage11::isMapped() const
+Buffer11::NativeBuffer11 *Buffer11::getStagingBuffer()
 {
-    return mMappedStorage != NULL;
-}
-
-void *BufferStorage11::map(GLbitfield access)
-{
-    ASSERT(!mMappedStorage);
-
-    TypedBufferStorage11 *latestStorage = getLatestStorage();
-    if (latestStorage &&
-        (latestStorage->getUsage() == BUFFER_USAGE_PIXEL_PACK ||
-         latestStorage->getUsage() == BUFFER_USAGE_STAGING))
-    {
-        // Latest storage is mappable.
-        mMappedStorage = latestStorage;
-    }
-    else
-    {
-        // Fall back to using the staging buffer if the latest storage does
-        // not exist or is not CPU-accessible.
-        mMappedStorage = getStagingBuffer();
-    }
-
-    if (!mMappedStorage)
-    {
-        // Out-of-memory
-        return NULL;
-    }
-
-    if ((access & GL_MAP_WRITE_BIT) > 0)
-    {
-        // Update the data revision immediately, since the data might be changed at any time
-        mMappedStorage->setDataRevision(mMappedStorage->getDataRevision() + 1);
-    }
-
-    return mMappedStorage->map(access);
-}
-
-void BufferStorage11::unmap()
-{
-    ASSERT(mMappedStorage);
-    mMappedStorage->unmap();
-    mMappedStorage = NULL;
-}
-
-BufferStorage11::NativeBuffer11 *BufferStorage11::getStagingBuffer()
-{
-    TypedBufferStorage11 *stagingStorage = getStorage(BUFFER_USAGE_STAGING);
+    BufferStorage11 *stagingStorage = getBufferStorage(BUFFER_USAGE_STAGING);
 
     if (!stagingStorage)
     {
@@ -553,9 +563,9 @@
     return static_cast<NativeBuffer11*>(stagingStorage);
 }
 
-BufferStorage11::PackStorage11 *BufferStorage11::getPackStorage()
+Buffer11::PackStorage11 *Buffer11::getPackStorage()
 {
-    TypedBufferStorage11 *packStorage = getStorage(BUFFER_USAGE_PIXEL_PACK);
+    BufferStorage11 *packStorage = getBufferStorage(BUFFER_USAGE_PIXEL_PACK);
 
     if (!packStorage)
     {
@@ -567,7 +577,7 @@
     return static_cast<PackStorage11*>(packStorage);
 }
 
-BufferStorage11::TypedBufferStorage11::TypedBufferStorage11(Renderer11 *renderer, BufferUsage usage)
+Buffer11::BufferStorage11::BufferStorage11(Renderer11 *renderer, BufferUsage usage)
     : mRenderer(renderer),
       mUsage(usage),
       mRevision(0),
@@ -575,19 +585,19 @@
 {
 }
 
-BufferStorage11::NativeBuffer11::NativeBuffer11(Renderer11 *renderer, BufferUsage usage)
-    : TypedBufferStorage11(renderer, usage),
+Buffer11::NativeBuffer11::NativeBuffer11(Renderer11 *renderer, BufferUsage usage)
+    : BufferStorage11(renderer, usage),
       mNativeBuffer(NULL)
 {
 }
 
-BufferStorage11::NativeBuffer11::~NativeBuffer11()
+Buffer11::NativeBuffer11::~NativeBuffer11()
 {
     SafeRelease(mNativeBuffer);
 }
 
 // Returns true if it recreates the direct buffer
-bool BufferStorage11::NativeBuffer11::copyFromStorage(TypedBufferStorage11 *source, size_t sourceOffset,
+bool Buffer11::NativeBuffer11::copyFromStorage(BufferStorage11 *source, size_t sourceOffset,
                                                       size_t size, size_t destOffset)
 {
     ID3D11DeviceContext *context = mRenderer->getDeviceContext();
@@ -606,7 +616,7 @@
     {
         ASSERT(HAS_DYNAMIC_TYPE(PackStorage11*, source));
 
-        unsigned char *sourcePointer = static_cast<unsigned char *>(source->map(GL_MAP_READ_BIT)) + sourceOffset;
+        void *sourcePointer = source->map(sourceOffset, size, GL_MAP_READ_BIT);
 
         D3D11_MAPPED_SUBRESOURCE mappedResource;
         HRESULT hr = context->Map(mNativeBuffer, 0, D3D11_MAP_WRITE, 0, &mappedResource);
@@ -640,7 +650,7 @@
     return createBuffer;
 }
 
-bool BufferStorage11::NativeBuffer11::resize(size_t size, bool preserveData)
+bool Buffer11::NativeBuffer11::resize(size_t size, bool preserveData)
 {
     ID3D11Device *device = mRenderer->getDevice();
     ID3D11DeviceContext *context = mRenderer->getDeviceContext();
@@ -681,7 +691,7 @@
     return true;
 }
 
-void BufferStorage11::NativeBuffer11::fillBufferDesc(D3D11_BUFFER_DESC* bufferDesc, Renderer *renderer,
+void Buffer11::NativeBuffer11::fillBufferDesc(D3D11_BUFFER_DESC* bufferDesc, Renderer *renderer,
                                                      BufferUsage usage, unsigned int bufferSize)
 {
     bufferDesc->ByteWidth = bufferSize;
@@ -730,7 +740,7 @@
     }
 }
 
-void *BufferStorage11::NativeBuffer11::map(GLbitfield access)
+void *Buffer11::NativeBuffer11::map(size_t offset, size_t length, GLbitfield access)
 {
     ASSERT(mUsage == BUFFER_USAGE_STAGING);
 
@@ -743,18 +753,18 @@
     UNUSED_ASSERTION_VARIABLE(result);
     ASSERT(SUCCEEDED(result));
 
-    return mappedResource.pData;
+    return static_cast<GLubyte*>(mappedResource.pData) + offset;
 }
 
-void BufferStorage11::NativeBuffer11::unmap()
+void Buffer11::NativeBuffer11::unmap()
 {
     ASSERT(mUsage == BUFFER_USAGE_STAGING);
     ID3D11DeviceContext *context = mRenderer->getDeviceContext();
     context->Unmap(mNativeBuffer, 0);
 }
 
-BufferStorage11::PackStorage11::PackStorage11(Renderer11 *renderer)
-    : TypedBufferStorage11(renderer, BUFFER_USAGE_PIXEL_PACK),
+Buffer11::PackStorage11::PackStorage11(Renderer11 *renderer)
+    : BufferStorage11(renderer, BUFFER_USAGE_PIXEL_PACK),
       mStagingTexture(NULL),
       mTextureFormat(DXGI_FORMAT_UNKNOWN),
       mQueuedPackCommand(NULL),
@@ -762,20 +772,20 @@
 {
 }
 
-BufferStorage11::PackStorage11::~PackStorage11()
+Buffer11::PackStorage11::~PackStorage11()
 {
     SafeRelease(mStagingTexture);
     SafeDelete(mQueuedPackCommand);
 }
 
-bool BufferStorage11::PackStorage11::copyFromStorage(TypedBufferStorage11 *source, size_t sourceOffset,
+bool Buffer11::PackStorage11::copyFromStorage(BufferStorage11 *source, size_t sourceOffset,
                                                      size_t size, size_t destOffset)
 {
     UNIMPLEMENTED();
     return false;
 }
 
-bool BufferStorage11::PackStorage11::resize(size_t size, bool preserveData)
+bool Buffer11::PackStorage11::resize(size_t size, bool preserveData)
 {
     if (size != mBufferSize)
     {
@@ -786,8 +796,9 @@
     return true;
 }
 
-void *BufferStorage11::PackStorage11::map(GLbitfield access)
+void *Buffer11::PackStorage11::map(size_t offset, size_t length, GLbitfield access)
 {
+    ASSERT(offset + length <= getSize());
     // TODO: fast path
     //  We might be able to optimize out one or more memcpy calls by detecting when
     //  and if D3D packs the staging texture memory identically to how we would fill
@@ -796,15 +807,15 @@
     flushQueuedPackCommand();
     mDataModified = (mDataModified || (access & GL_MAP_WRITE_BIT) != 0);
 
-    return &mMemoryBuffer[0];
+    return &mMemoryBuffer[0] + offset;
 }
 
-void BufferStorage11::PackStorage11::unmap()
+void Buffer11::PackStorage11::unmap()
 {
     // No-op
 }
 
-void BufferStorage11::PackStorage11::packPixels(ID3D11Texture2D *srcTexure, UINT srcSubresource, const PackPixelsParams &params)
+void Buffer11::PackStorage11::packPixels(ID3D11Texture2D *srcTexure, UINT srcSubresource, const PackPixelsParams &params)
 {
     flushQueuedPackCommand();
     mQueuedPackCommand = new PackPixelsParams(params);
@@ -867,7 +878,7 @@
     immediateContext->CopySubresourceRegion(mStagingTexture, 0, 0, 0, 0, srcTexure, srcSubresource, &srcBox);
 }
 
-void BufferStorage11::PackStorage11::flushQueuedPackCommand()
+void Buffer11::PackStorage11::flushQueuedPackCommand()
 {
     ASSERT(!mMemoryBuffer.empty());
 
diff --git a/src/libGLESv2/renderer/d3d/d3d11/Buffer11.h b/src/libGLESv2/renderer/d3d/d3d11/Buffer11.h
new file mode 100644
index 0000000..43f95c3
--- /dev/null
+++ b/src/libGLESv2/renderer/d3d/d3d11/Buffer11.h
@@ -0,0 +1,105 @@
+//
+// Copyright 2014 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+
+// Buffer11.h: Defines the rx::Buffer11 class which implements rx::BufferImpl via rx::BufferD3D.
+
+#ifndef LIBGLESV2_RENDERER_BUFFER11_H_
+#define LIBGLESV2_RENDERER_BUFFER11_H_
+
+#include "libGLESv2/renderer/d3d/BufferD3D.h"
+#include "libGLESv2/angletypes.h"
+
+namespace rx
+{
+class Renderer11;
+
+enum BufferUsage
+{
+    BUFFER_USAGE_STAGING,
+    BUFFER_USAGE_VERTEX_OR_TRANSFORM_FEEDBACK,
+    BUFFER_USAGE_INDEX,
+    BUFFER_USAGE_PIXEL_UNPACK,
+    BUFFER_USAGE_PIXEL_PACK,
+    BUFFER_USAGE_UNIFORM,
+};
+
+struct PackPixelsParams
+{
+    PackPixelsParams();
+    PackPixelsParams(const gl::Rectangle &area, GLenum format, GLenum type, GLuint outputPitch,
+                     const gl::PixelPackState &pack, ptrdiff_t offset);
+
+    gl::Rectangle area;
+    GLenum format;
+    GLenum type;
+    GLuint outputPitch;
+    gl::Buffer *packBuffer;
+    gl::PixelPackState pack;
+    ptrdiff_t offset;
+};
+
+typedef size_t DataRevision;
+
+class Buffer11 : public BufferD3D
+{
+  public:
+    Buffer11(rx::Renderer11 *renderer);
+    virtual ~Buffer11();
+
+    static Buffer11 *makeBuffer11(BufferImpl *buffer);
+
+    ID3D11Buffer *getBuffer(BufferUsage usage);
+    ID3D11ShaderResourceView *getSRV(DXGI_FORMAT srvFormat);
+    bool isMapped() const { return mMappedStorage != NULL; }
+    void packPixels(ID3D11Texture2D *srcTexure, UINT srcSubresource, const PackPixelsParams &params);
+
+    // BufferD3D implementation
+    virtual size_t getSize() const { return mSize; }
+    virtual void clear();
+    virtual bool supportsDirectBinding() const { return true; }
+    virtual Renderer* getRenderer();
+
+    // BufferImpl implementation
+    virtual void setData(const void* data, size_t size, GLenum usage);
+    virtual void *getData();
+    virtual void setSubData(const void* data, size_t size, size_t offset);
+    virtual void copySubData(BufferImpl* source, GLintptr sourceOffset, GLintptr destOffset, GLsizeiptr size);
+    virtual GLvoid* map(size_t offset, size_t length, GLbitfield access);
+    virtual void unmap();
+    virtual void markTransformFeedbackUsage();
+
+  private:
+    DISALLOW_COPY_AND_ASSIGN(Buffer11);
+
+    class BufferStorage11;
+    class NativeBuffer11;
+    class PackStorage11;
+
+    rx::Renderer11 *mRenderer;
+    size_t mSize;
+
+    BufferStorage11 *mMappedStorage;
+
+    std::map<BufferUsage, BufferStorage11*> mBufferStorages;
+
+    typedef std::pair<ID3D11Buffer *, ID3D11ShaderResourceView *> BufferSRVPair;
+    std::map<DXGI_FORMAT, BufferSRVPair> mBufferResourceViews;
+
+    std::vector<unsigned char> mResolvedData;
+    DataRevision mResolvedDataRevision;
+    unsigned int mReadUsageCount;
+
+    void markBufferUsage();
+    NativeBuffer11 *getStagingBuffer();
+    PackStorage11 *getPackStorage();
+
+    BufferStorage11 *getBufferStorage(BufferUsage usage);
+    BufferStorage11 *getLatestBufferStorage() const;
+};
+
+}
+
+#endif // LIBGLESV2_RENDERER_BUFFER11_H_
diff --git a/src/libGLESv2/renderer/d3d/d3d11/BufferStorage11.h b/src/libGLESv2/renderer/d3d/d3d11/BufferStorage11.h
deleted file mode 100644
index 7934de1..0000000
--- a/src/libGLESv2/renderer/d3d/d3d11/BufferStorage11.h
+++ /dev/null
@@ -1,100 +0,0 @@
-//
-// Copyright (c) 2013-2014 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-
-// BufferStorage11.h Defines the BufferStorage11 class.
-
-#ifndef LIBGLESV2_RENDERER_BUFFERSTORAGE11_H_
-#define LIBGLESV2_RENDERER_BUFFERSTORAGE11_H_
-
-#include "libGLESv2/renderer/BufferStorage.h"
-#include "libGLESv2/angletypes.h"
-
-namespace rx
-{
-class Renderer;
-class Renderer11;
-
-enum BufferUsage
-{
-    BUFFER_USAGE_STAGING,
-    BUFFER_USAGE_VERTEX_OR_TRANSFORM_FEEDBACK,
-    BUFFER_USAGE_INDEX,
-    BUFFER_USAGE_PIXEL_UNPACK,
-    BUFFER_USAGE_PIXEL_PACK,
-    BUFFER_USAGE_UNIFORM,
-};
-
-struct PackPixelsParams
-{
-    PackPixelsParams();
-    PackPixelsParams(const gl::Rectangle &area, GLenum format, GLenum type, GLuint outputPitch,
-                     const gl::PixelPackState &pack, ptrdiff_t offset);
-
-    gl::Rectangle area;
-    GLenum format;
-    GLenum type;
-    GLuint outputPitch;
-    gl::Buffer *packBuffer;
-    gl::PixelPackState pack;
-    ptrdiff_t offset;
-};
-
-typedef size_t DataRevision;
-
-class BufferStorage11 : public BufferStorage
-{
-  public:
-    explicit BufferStorage11(Renderer11 *renderer);
-    virtual ~BufferStorage11();
-
-    static BufferStorage11 *makeBufferStorage11(BufferStorage *bufferStorage);
-
-    virtual void *getData();
-    virtual void setData(const void* data, size_t size, size_t offset);
-    virtual void copyData(BufferStorage* sourceStorage, size_t size, size_t sourceOffset, size_t destOffset);
-    virtual void clear();
-    virtual void markTransformFeedbackUsage();
-    virtual size_t getSize() const;
-    virtual bool supportsDirectBinding() const;
-
-    ID3D11Buffer *getBuffer(BufferUsage usage);
-    ID3D11ShaderResourceView *getSRV(DXGI_FORMAT srvFormat);
-    void packPixels(ID3D11Texture2D *srcTexure, UINT srcSubresource, const PackPixelsParams &params);
-
-    virtual bool isMapped() const;
-    virtual void *map(GLbitfield access);
-    virtual void unmap();
-
-  private:
-    class TypedBufferStorage11;
-    class NativeBuffer11;
-    class PackStorage11;
-
-    Renderer11 *mRenderer;
-    TypedBufferStorage11 *mMappedStorage;
-
-    std::map<BufferUsage, TypedBufferStorage11*> mTypedBuffers;
-
-    typedef std::pair<ID3D11Buffer *, ID3D11ShaderResourceView *> BufferSRVPair;
-    std::map<DXGI_FORMAT, BufferSRVPair> mBufferResourceViews;
-
-    std::vector<unsigned char> mResolvedData;
-    DataRevision mResolvedDataRevision;
-    unsigned int mReadUsageCount;
-
-    size_t mSize;
-
-    void markBufferUsage();
-    NativeBuffer11 *getStagingBuffer();
-    PackStorage11 *getPackStorage();
-
-    TypedBufferStorage11 *getStorage(BufferUsage usage);
-    TypedBufferStorage11 *getLatestStorage() const;
-};
-
-}
-
-#endif // LIBGLESV2_RENDERER_BUFFERSTORAGE11_H_
diff --git a/src/libGLESv2/renderer/d3d/d3d11/InputLayoutCache.cpp b/src/libGLESv2/renderer/d3d/d3d11/InputLayoutCache.cpp
index a5ec58a..a10f64e 100644
--- a/src/libGLESv2/renderer/d3d/d3d11/InputLayoutCache.cpp
+++ b/src/libGLESv2/renderer/d3d/d3d11/InputLayoutCache.cpp
@@ -10,7 +10,7 @@
 
 #include "libGLESv2/renderer/d3d/d3d11/InputLayoutCache.h"
 #include "libGLESv2/renderer/d3d/d3d11/VertexBuffer11.h"
-#include "libGLESv2/renderer/d3d/d3d11/BufferStorage11.h"
+#include "libGLESv2/renderer/d3d/d3d11/Buffer11.h"
 #include "libGLESv2/renderer/d3d/d3d11/ShaderExecutable11.h"
 #include "libGLESv2/ProgramBinary.h"
 #include "libGLESv2/VertexAttribute.h"
@@ -194,7 +194,7 @@
         if (attributes[i].active)
         {
             VertexBuffer11 *vertexBuffer = VertexBuffer11::makeVertexBuffer11(attributes[i].vertexBuffer);
-            BufferStorage11 *bufferStorage = attributes[i].storage ? BufferStorage11::makeBufferStorage11(attributes[i].storage) : NULL;
+            Buffer11 *bufferStorage = attributes[i].storage ? Buffer11::makeBuffer11(attributes[i].storage) : NULL;
 
             buffer = bufferStorage ? bufferStorage->getBuffer(BUFFER_USAGE_VERTEX_OR_TRANSFORM_FEEDBACK)
                                    : vertexBuffer->getBuffer();
diff --git a/src/libGLESv2/renderer/d3d/d3d11/PixelTransfer11.cpp b/src/libGLESv2/renderer/d3d/d3d11/PixelTransfer11.cpp
index 566ec26..1ca456c 100644
--- a/src/libGLESv2/renderer/d3d/d3d11/PixelTransfer11.cpp
+++ b/src/libGLESv2/renderer/d3d/d3d11/PixelTransfer11.cpp
@@ -17,7 +17,7 @@
 #include "libGLESv2/renderer/d3d/d3d11/Renderer11.h"
 #include "libGLESv2/renderer/d3d/d3d11/renderer11_utils.h"
 #include "libGLESv2/renderer/d3d/d3d11/formatutils11.h"
-#include "libGLESv2/renderer/d3d/d3d11/BufferStorage11.h"
+#include "libGLESv2/renderer/d3d/d3d11/Buffer11.h"
 #include "libGLESv2/renderer/d3d/d3d11/TextureStorage11.h"
 #include "libGLESv2/renderer/d3d/d3d11/RenderTarget11.h"
 #include "libGLESv2/Context.h"
@@ -162,7 +162,7 @@
 
     DXGI_FORMAT srvFormat = gl_d3d11::GetSRVFormat(sourceFormat);
     ASSERT(srvFormat != DXGI_FORMAT_UNKNOWN);
-    BufferStorage11 *bufferStorage11 = BufferStorage11::makeBufferStorage11(sourceBuffer.getStorage());
+    Buffer11 *bufferStorage11 = Buffer11::makeBuffer11(sourceBuffer.getImplementation());
     ID3D11ShaderResourceView *bufferSRV = bufferStorage11->getSRV(srvFormat);
     ASSERT(bufferSRV != NULL);
 
diff --git a/src/libGLESv2/renderer/d3d/d3d11/Renderer11.cpp b/src/libGLESv2/renderer/d3d/d3d11/Renderer11.cpp
index 092a028..ddb6236 100644
--- a/src/libGLESv2/renderer/d3d/d3d11/Renderer11.cpp
+++ b/src/libGLESv2/renderer/d3d/d3d11/Renderer11.cpp
@@ -22,7 +22,7 @@
 #include "libGLESv2/renderer/d3d/d3d11/Image11.h"
 #include "libGLESv2/renderer/d3d/d3d11/VertexBuffer11.h"
 #include "libGLESv2/renderer/d3d/d3d11/IndexBuffer11.h"
-#include "libGLESv2/renderer/d3d/d3d11/BufferStorage11.h"
+#include "libGLESv2/renderer/d3d/d3d11/Buffer11.h"
 #include "libGLESv2/renderer/d3d/VertexDataManager.h"
 #include "libGLESv2/renderer/d3d/IndexDataManager.h"
 #include "libGLESv2/renderer/d3d/d3d11/TextureStorage11.h"
@@ -32,6 +32,7 @@
 #include "libGLESv2/renderer/d3d/d3d11/Clear11.h"
 #include "libGLESv2/renderer/d3d/d3d11/PixelTransfer11.h"
 #include "libGLESv2/renderer/d3d/d3d11/VertexArray11.h"
+#include "libGLESv2/renderer/d3d/d3d11/Buffer11.h"
 #include "libEGL/Display.h"
 
 // Enable ANGLE_SKIP_DXGI_1_2_CHECK if there is not a possibility of using cross-process
@@ -540,7 +541,7 @@
         const gl::Buffer *uniformBuffer = vertexUniformBuffers[uniformBufferIndex];
         if (uniformBuffer)
         {
-            BufferStorage11 *bufferStorage = BufferStorage11::makeBufferStorage11(uniformBuffer->getStorage());
+            Buffer11 *bufferStorage = Buffer11::makeBuffer11(uniformBuffer->getImplementation());
             ID3D11Buffer *constantBuffer = bufferStorage->getBuffer(BUFFER_USAGE_UNIFORM);
 
             if (!constantBuffer)
@@ -562,7 +563,7 @@
         const gl::Buffer *uniformBuffer = fragmentUniformBuffers[uniformBufferIndex];
         if (uniformBuffer)
         {
-            BufferStorage11 *bufferStorage = BufferStorage11::makeBufferStorage11(uniformBuffer->getStorage());
+            Buffer11 *bufferStorage = Buffer11::makeBuffer11(uniformBuffer->getImplementation());
             ID3D11Buffer *constantBuffer = bufferStorage->getBuffer(BUFFER_USAGE_UNIFORM);
 
             if (!constantBuffer)
@@ -987,7 +988,7 @@
 
         if (indexInfo->storage)
         {
-            BufferStorage11 *storage = BufferStorage11::makeBufferStorage11(indexInfo->storage);
+            Buffer11 *storage = Buffer11::makeBuffer11(indexInfo->storage);
             buffer = storage->getBuffer(BUFFER_USAGE_INDEX);
         }
         else
@@ -1017,7 +1018,7 @@
     {
         if (transformFeedbackBuffers[i])
         {
-            BufferStorage11 *storage = BufferStorage11::makeBufferStorage11(transformFeedbackBuffers[i]->getStorage());
+            Buffer11 *storage = Buffer11::makeBuffer11(transformFeedbackBuffers[i]->getImplementation());
             ID3D11Buffer *buffer = storage->getBuffer(BUFFER_USAGE_VERTEX_OR_TRANSFORM_FEEDBACK);
 
             d3dBuffers[i] = buffer;
@@ -1125,7 +1126,7 @@
     if (type != GL_NONE && elementArrayBuffer)
     {
         gl::Buffer *indexBuffer = elementArrayBuffer;
-        BufferStorage *storage = indexBuffer->getStorage();
+        BufferImpl *storage = indexBuffer->getImplementation();
         intptr_t offset = reinterpret_cast<intptr_t>(indices);
         indices = static_cast<const GLubyte*>(storage->getData()) + offset;
     }
@@ -1230,7 +1231,7 @@
     if (type != GL_NONE && elementArrayBuffer)
     {
         gl::Buffer *indexBuffer = elementArrayBuffer;
-        BufferStorage *storage = indexBuffer->getStorage();
+        BufferImpl *storage = indexBuffer->getImplementation();
         intptr_t offset = reinterpret_cast<intptr_t>(indices);
         indices = static_cast<const GLubyte*>(storage->getData()) + offset;
     }
@@ -2778,9 +2779,9 @@
     return new IndexBuffer11(this);
 }
 
-BufferStorage *Renderer11::createBufferStorage()
+BufferImpl *Renderer11::createBuffer()
 {
-    return new BufferStorage11(this);
+    return new Buffer11(this);
 }
 
 VertexArrayImpl *Renderer11::createVertexArray()
@@ -2960,7 +2961,7 @@
 
         if (pack.pixelBuffer.get() != NULL)
         {
-            rx::BufferStorage11 *packBufferStorage = BufferStorage11::makeBufferStorage11(pack.pixelBuffer.get()->getStorage());
+            rx::Buffer11 *packBufferStorage = Buffer11::makeBuffer11(pack.pixelBuffer.get()->getImplementation());
             PackPixelsParams packParams(area, format, type, outputPitch, pack, reinterpret_cast<ptrdiff_t>(pixels));
             packBufferStorage->packPixels(colorBufferTexture, subresourceIndex, packParams);
         }
diff --git a/src/libGLESv2/renderer/d3d/d3d11/Renderer11.h b/src/libGLESv2/renderer/d3d/d3d11/Renderer11.h
index 0c02837..b490d14 100644
--- a/src/libGLESv2/renderer/d3d/d3d11/Renderer11.h
+++ b/src/libGLESv2/renderer/d3d/d3d11/Renderer11.h
@@ -186,9 +186,9 @@
     virtual TextureStorage *createTextureStorage2DArray(GLenum internalformat, bool renderTarget, GLsizei width, GLsizei height, GLsizei depth, int levels);
 
     // Buffer creation
+    virtual BufferImpl *createBuffer();
     virtual VertexBuffer *createVertexBuffer();
     virtual IndexBuffer *createIndexBuffer();
-    virtual BufferStorage *createBufferStorage();
 
     // Vertex Array creation
     virtual VertexArrayImpl *createVertexArray();
diff --git a/src/libGLESv2/renderer/d3d/d3d11/VertexBuffer11.cpp b/src/libGLESv2/renderer/d3d/d3d11/VertexBuffer11.cpp
index c5d63e6..2f47ec0 100644
--- a/src/libGLESv2/renderer/d3d/d3d11/VertexBuffer11.cpp
+++ b/src/libGLESv2/renderer/d3d/d3d11/VertexBuffer11.cpp
@@ -8,7 +8,7 @@
 // VertexBuffer11.cpp: Defines the D3D11 VertexBuffer implementation.
 
 #include "libGLESv2/renderer/d3d/d3d11/VertexBuffer11.h"
-#include "libGLESv2/renderer/BufferStorage.h"
+#include "libGLESv2/renderer/d3d/d3d11/Buffer11.h"
 
 #include "libGLESv2/Buffer.h"
 #include "libGLESv2/renderer/d3d/d3d11/Renderer11.h"
@@ -90,7 +90,7 @@
         {
             if (buffer)
             {
-                BufferStorage *storage = buffer->getStorage();
+                Buffer11 *storage = Buffer11::makeBuffer11(buffer->getImplementation());
                 input = static_cast<const char*>(storage->getData()) + static_cast<int>(attrib.offset);
             }
             else