aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJamie Madill <jmadill@chromium.org>2014-08-04 11:59:23 -0400
committerJamie Madill <jmadill@chromium.org>2014-08-04 18:27:20 +0000
commit6ba451ba9b49b506a79411713434937fc6eb9909 (patch)
treedf57199d7827b400eaafa5a11ce6875de77f0c47 /src
parent778d5279b964230b3d2821ad5e7aa55897fc9e89 (diff)
downloadangle-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.cpp17
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();