Commit dbd74a09 by Jamie Madill

Add BufferStorage11::setData.

This helper method will be useful for implementing dynamic buffers. BUG=angle:705 Change-Id: I8461a59724fb8866b36059c9ef5b838f072cc63a Reviewed-on: https://chromium-review.googlesource.com/213812Tested-by: 's avatarJamie Madill <jmadill@chromium.org> Reviewed-by: 's avatarGeoff Lang <geofflang@chromium.org>
parent 45965b10
...@@ -118,6 +118,8 @@ class Buffer11::NativeBuffer11 : public Buffer11::BufferStorage11 ...@@ -118,6 +118,8 @@ class Buffer11::NativeBuffer11 : public Buffer11::BufferStorage11
virtual void *map(size_t offset, size_t length, GLbitfield access); virtual void *map(size_t offset, size_t length, GLbitfield access);
virtual void unmap(); virtual void unmap();
bool setData(D3D11_MAP mapMode, const uint8_t *data, size_t size, size_t offset);
private: private:
ID3D11Buffer *mNativeBuffer; ID3D11Buffer *mNativeBuffer;
...@@ -178,7 +180,7 @@ Buffer11 *Buffer11::makeBuffer11(BufferImpl *buffer) ...@@ -178,7 +180,7 @@ Buffer11 *Buffer11::makeBuffer11(BufferImpl *buffer)
return static_cast<Buffer11*>(buffer); return static_cast<Buffer11*>(buffer);
} }
void Buffer11::setData(const void* data, size_t size, GLenum usage) void Buffer11::setData(const void *data, size_t size, GLenum usage)
{ {
setSubData(data, size, 0); setSubData(data, size, 0);
...@@ -229,7 +231,7 @@ void *Buffer11::getData() ...@@ -229,7 +231,7 @@ void *Buffer11::getData()
return mResolvedData.data(); return mResolvedData.data();
} }
void Buffer11::setSubData(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; size_t requiredSize = size + offset;
mSize = std::max(mSize, requiredSize); mSize = std::max(mSize, requiredSize);
...@@ -258,20 +260,7 @@ void Buffer11::setSubData(const void* data, size_t size, size_t offset) ...@@ -258,20 +260,7 @@ void Buffer11::setSubData(const void* data, size_t size, size_t offset)
} }
} }
ID3D11DeviceContext *context = mRenderer->getDeviceContext(); stagingBuffer->setData(D3D11_MAP_WRITE, reinterpret_cast<const uint8_t *>(data), size, offset);
D3D11_MAPPED_SUBRESOURCE mappedResource;
HRESULT result = context->Map(stagingBuffer->getNativeBuffer(), 0, D3D11_MAP_WRITE, 0, &mappedResource);
if (FAILED(result))
{
return gl::error(GL_OUT_OF_MEMORY);
}
unsigned char *offsetBufferPointer = reinterpret_cast<unsigned char *>(mappedResource.pData) + offset;
memcpy(offsetBufferPointer, data, size);
context->Unmap(stagingBuffer->getNativeBuffer(), 0);
stagingBuffer->setDataRevision(stagingBuffer->getDataRevision() + 1); stagingBuffer->setDataRevision(stagingBuffer->getDataRevision() + 1);
} }
} }
...@@ -762,6 +751,25 @@ void *Buffer11::NativeBuffer11::map(size_t offset, size_t length, GLbitfield acc ...@@ -762,6 +751,25 @@ void *Buffer11::NativeBuffer11::map(size_t offset, size_t length, GLbitfield acc
return static_cast<GLubyte*>(mappedResource.pData) + offset; return static_cast<GLubyte*>(mappedResource.pData) + offset;
} }
bool Buffer11::NativeBuffer11::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(mNativeBuffer, 0, mapMode, 0, &mappedResource);
if (FAILED(result))
{
return gl::error(GL_OUT_OF_MEMORY, false);
}
uint8_t *offsetBufferPointer = reinterpret_cast<uint8_t *>(mappedResource.pData) + offset;
memcpy(offsetBufferPointer, data, size);
context->Unmap(mNativeBuffer, 0);
return true;
}
void Buffer11::NativeBuffer11::unmap() void Buffer11::NativeBuffer11::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