diff options
author | Jamie Madill <jmadill@chromium.org> | 2014-08-04 11:59:23 -0400 |
---|---|---|
committer | Jamie Madill <jmadill@chromium.org> | 2014-08-04 18:27:20 +0000 |
commit | 6ba451ba9b49b506a79411713434937fc6eb9909 (patch) | |
tree | df57199d7827b400eaafa5a11ce6875de77f0c47 /src | |
parent | 778d5279b964230b3d2821ad5e7aa55897fc9e89 (diff) | |
download | angle-6ba451ba9b49b506a79411713434937fc6eb9909.tar.gz |
Fix single buffer copies.
In D3D11, the device doesn't allow overlapped buffer copies unless
the D3D11_FEATURE_DATA_D3D11_OPTIONS::CopyWithOverlap feature is
enabled. This isn't technically available until D3D11.1.
Get around the restriction by using a different storage buffer as
the source of the copy.
Fixes funcional.buffer.copy.single_buffer.* in dEQP.
BUG=angle:715
Change-Id: I03fea8a1c6180a29e07e05022e3454524e320803
Reviewed-on: https://chromium-review.googlesource.com/210902
Tested-by: Jamie Madill <jmadill@chromium.org>
Reviewed-by: Nicolas Capens <capn@chromium.org>
Diffstat (limited to 'src')
-rw-r--r-- | src/libGLESv2/renderer/d3d/d3d11/Buffer11.cpp | 17 |
1 files changed, 16 insertions, 1 deletions
diff --git a/src/libGLESv2/renderer/d3d/d3d11/Buffer11.cpp b/src/libGLESv2/renderer/d3d/d3d11/Buffer11.cpp index e3984fba..c069f28d 100644 --- a/src/libGLESv2/renderer/d3d/d3d11/Buffer11.cpp +++ b/src/libGLESv2/renderer/d3d/d3d11/Buffer11.cpp @@ -304,6 +304,21 @@ void Buffer11::copySubData(BufferImpl* source, GLintptr sourceOffset, GLintptr d dest = getStagingBuffer(); } + // D3D11 does not allow overlapped copies until 11.1, and only if the + // device supports D3D11_FEATURE_DATA_D3D11_OPTIONS::CopyWithOverlap + // Get around this via a different source buffer + if (source == dest) + { + if (source->getUsage() == BUFFER_USAGE_STAGING) + { + source = getBufferStorage(BUFFER_USAGE_VERTEX_OR_TRANSFORM_FEEDBACK); + } + else + { + source = getStagingBuffer(); + } + } + dest->copyFromStorage(source, sourceOffset, size, destOffset); dest->setDataRevision(dest->getDataRevision() + 1); } @@ -598,7 +613,7 @@ Buffer11::NativeBuffer11::~NativeBuffer11() // Returns true if it recreates the direct buffer bool Buffer11::NativeBuffer11::copyFromStorage(BufferStorage11 *source, size_t sourceOffset, - size_t size, size_t destOffset) + size_t size, size_t destOffset) { ID3D11DeviceContext *context = mRenderer->getDeviceContext(); |