Added an abstract BufferStorage::copyData method and implemented it for…

Added an abstract BufferStorage::copyData method and implemented it for BufferStorage9 and BufferStorage11. TRAC #22811 Signed-off-by: Jamie Madill Signed-off-by: Shannon Woods Author: Geoff Lang git-svn-id: https://angleproject.googlecode.com/svn/branches/es3proto@2132 736b8ea6-26fd-11df-bfd4-992fa37f6226
parent c926e5f1
......@@ -23,6 +23,8 @@ class BufferStorage
// The data returned is only guaranteed valid until next non-const method.
virtual void *getData() = 0;
virtual void setData(const void* data, unsigned int size, unsigned int offset) = 0;
virtual void copyData(BufferStorage* sourceStorage, unsigned int size,
unsigned int sourceOffset, unsigned int destOffset) = 0;
virtual void clear() = 0;
virtual unsigned int getSize() const = 0;
virtual bool supportsDirectBinding() const = 0;
......
......@@ -295,6 +295,26 @@ void BufferStorage11::setData(const void* data, unsigned int size, unsigned int
mResolvedDataValid = false;
}
void BufferStorage11::copyData(BufferStorage* sourceStorage, unsigned int size,
unsigned int sourceOffset, unsigned int destOffset)
{
BufferStorage11* source = makeBufferStorage11(sourceStorage);
if (source)
{
ID3D11DeviceContext *context = mRenderer->getDeviceContext();
D3D11_BOX srcBox;
srcBox.left = sourceOffset;
srcBox.right = sourceOffset + size;
srcBox.top = 0;
srcBox.bottom = 1;
srcBox.front = 0;
srcBox.back = 1;
context->CopySubresourceRegion(mBuffer, 0, destOffset, 0, 0, source->mBuffer, 0, &srcBox);
}
}
void BufferStorage11::clear()
{
mResolvedDataValid = false;
......
......@@ -25,6 +25,8 @@ class BufferStorage11 : public BufferStorage
virtual void *getData();
virtual void setData(const void* data, unsigned int size, unsigned int offset);
virtual void copyData(BufferStorage* sourceStorage, unsigned int size,
unsigned int sourceOffset, unsigned int destOffset);
virtual void clear();
virtual unsigned int getSize() const;
virtual bool supportsDirectBinding() const;
......
......@@ -57,6 +57,19 @@ void BufferStorage9::setData(const void* data, unsigned int size, unsigned int o
memcpy(reinterpret_cast<char*>(mMemory) + offset, data, size);
}
void BufferStorage9::copyData(BufferStorage* sourceStorage, unsigned int size,
unsigned int sourceOffset, unsigned int destOffset)
{
BufferStorage9* source = makeBufferStorage9(sourceStorage);
if (source)
{
void* sourceMemory = reinterpret_cast<char*>(source->mMemory) + sourceOffset;
void* destMemory = reinterpret_cast<char*>(mMemory) + destOffset;
memcpy(destMemory, sourceMemory, size);
}
}
void BufferStorage9::clear()
{
mSize = 0;
......
......@@ -24,6 +24,8 @@ class BufferStorage9 : public BufferStorage
virtual void *getData();
virtual void setData(const void* data, unsigned int size, unsigned int offset);
virtual void copyData(BufferStorage* sourceStorage, unsigned int size,
unsigned int sourceOffset, unsigned int destOffset);
virtual void clear();
virtual unsigned int getSize() const;
virtual bool supportsDirectBinding() const;
......
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