Commit 026b4188 by Jamie Madill

Generalize NativeBuffer11::setData.

We can replace this method with a base class method which uses our implementation of "map". This allows us to reuse setData in other mappable buffer storage types. BUG=angle:912 Change-Id: I7848cb9440b806364d9b2a6e2251323e53206921 Reviewed-on: https://chromium-review.googlesource.com/249182Reviewed-by: 's avatarGeoff Lang <geofflang@chromium.org> Reviewed-by: 's avatarBrandon Jones <bajones@chromium.org> Tested-by: 's avatarJamie Madill <jmadill@chromium.org>
parent d2d21dca
...@@ -90,6 +90,8 @@ class Buffer11::BufferStorage ...@@ -90,6 +90,8 @@ class Buffer11::BufferStorage
virtual uint8_t *map(size_t offset, size_t length, GLbitfield access) = 0; virtual uint8_t *map(size_t offset, size_t length, GLbitfield access) = 0;
virtual void unmap() = 0; virtual void unmap() = 0;
gl::Error setData(const uint8_t *data, size_t offset, size_t size);
protected: protected:
DISALLOW_COPY_AND_ASSIGN(BufferStorage); DISALLOW_COPY_AND_ASSIGN(BufferStorage);
...@@ -118,8 +120,6 @@ class Buffer11::NativeStorage : public Buffer11::BufferStorage ...@@ -118,8 +120,6 @@ class Buffer11::NativeStorage : public Buffer11::BufferStorage
uint8_t *map(size_t offset, size_t length, GLbitfield access) override; uint8_t *map(size_t offset, size_t length, GLbitfield access) override;
void unmap() override; void unmap() override;
gl::Error setData(D3D11_MAP mapMode, const uint8_t *data, size_t size, size_t offset);
private: private:
DISALLOW_COPY_AND_ASSIGN(NativeStorage); DISALLOW_COPY_AND_ASSIGN(NativeStorage);
...@@ -276,12 +276,7 @@ gl::Error Buffer11::setSubData(const void *data, size_t size, size_t offset) ...@@ -276,12 +276,7 @@ gl::Error Buffer11::setSubData(const void *data, size_t size, size_t offset)
} }
} }
gl::Error error = stagingBuffer->setData(D3D11_MAP_WRITE, reinterpret_cast<const uint8_t *>(data), size, offset); stagingBuffer->setData(static_cast<const uint8_t *>(data), offset, size);
if (error.isError())
{
return error;
}
stagingBuffer->setDataRevision(stagingBuffer->getDataRevision() + 1); stagingBuffer->setDataRevision(stagingBuffer->getDataRevision() + 1);
} }
...@@ -639,6 +634,23 @@ Buffer11::BufferStorage::BufferStorage(Renderer11 *renderer, BufferUsage usage) ...@@ -639,6 +634,23 @@ Buffer11::BufferStorage::BufferStorage(Renderer11 *renderer, BufferUsage usage)
{ {
} }
gl::Error Buffer11::BufferStorage::setData(const uint8_t *data, size_t offset, size_t size)
{
ASSERT(isMappable());
uint8_t *writePointer = map(offset, size, GL_MAP_WRITE_BIT);
if (!writePointer)
{
return gl::Error(GL_OUT_OF_MEMORY, "Failed to map internal buffer.");
}
memcpy(writePointer, data, size);
unmap();
return gl::Error(GL_NO_ERROR);
}
Buffer11::NativeStorage::NativeStorage(Renderer11 *renderer, BufferUsage usage) Buffer11::NativeStorage::NativeStorage(Renderer11 *renderer, BufferUsage usage)
: BufferStorage(renderer, usage), : BufferStorage(renderer, usage),
mNativeStorage(NULL) mNativeStorage(NULL)
...@@ -819,25 +831,6 @@ uint8_t *Buffer11::NativeStorage::map(size_t offset, size_t length, GLbitfield a ...@@ -819,25 +831,6 @@ uint8_t *Buffer11::NativeStorage::map(size_t offset, size_t length, GLbitfield a
return static_cast<uint8_t*>(mappedResource.pData) + offset; return static_cast<uint8_t*>(mappedResource.pData) + offset;
} }
gl::Error Buffer11::NativeStorage::setData(D3D11_MAP mapMode, const uint8_t *data, size_t size, size_t offset)
{
ID3D11DeviceContext *context = mRenderer->getDeviceContext();
D3D11_MAPPED_SUBRESOURCE mappedResource;
HRESULT result = context->Map(mNativeStorage, 0, mapMode, 0, &mappedResource);
if (FAILED(result))
{
return gl::Error(GL_OUT_OF_MEMORY, "Failed to map internal buffer, result: 0x%X.", result);
}
uint8_t *offsetBufferPointer = reinterpret_cast<uint8_t *>(mappedResource.pData) + offset;
memcpy(offsetBufferPointer, data, size);
context->Unmap(mNativeStorage, 0);
return gl::Error(GL_NO_ERROR);
}
void Buffer11::NativeStorage::unmap() void Buffer11::NativeStorage::unmap()
{ {
ASSERT(mUsage == BUFFER_USAGE_STAGING); ASSERT(mUsage == BUFFER_USAGE_STAGING);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment