mirror of
https://github.com/doitsujin/dxvk.git
synced 2025-03-15 07:29:17 +01:00
[d3d9] Fix FlushBuffer
Use stored mapped slice and use correct dst offset.
This commit is contained in:
parent
da23771df4
commit
525fd53bbc
@ -4443,7 +4443,7 @@ namespace dxvk {
|
|||||||
// If we don't respect the bounds, encompass it all in our tests/checks
|
// If we don't respect the bounds, encompass it all in our tests/checks
|
||||||
// These values may be out of range and don't get clamped.
|
// These values may be out of range and don't get clamped.
|
||||||
uint32_t offset = respectUserBounds ? OffsetToLock : 0;
|
uint32_t offset = respectUserBounds ? OffsetToLock : 0;
|
||||||
uint32_t size = respectUserBounds ? std::min(SizeToLock, desc.Size - offset) : (desc.Size - offset);
|
uint32_t size = respectUserBounds ? std::min(SizeToLock, desc.Size - offset) : desc.Size;
|
||||||
|
|
||||||
pResource->DirtyRange().Conjoin(D3D9Range(offset, offset + size));
|
pResource->DirtyRange().Conjoin(D3D9Range(offset, offset + size));
|
||||||
|
|
||||||
@ -4514,21 +4514,23 @@ namespace dxvk {
|
|||||||
HRESULT D3D9DeviceEx::FlushBuffer(
|
HRESULT D3D9DeviceEx::FlushBuffer(
|
||||||
D3D9CommonBuffer* pResource) {
|
D3D9CommonBuffer* pResource) {
|
||||||
auto dstBuffer = pResource->GetBufferSlice<D3D9_COMMON_BUFFER_TYPE_REAL>();
|
auto dstBuffer = pResource->GetBufferSlice<D3D9_COMMON_BUFFER_TYPE_REAL>();
|
||||||
auto srcBuffer = pResource->GetBufferSlice<D3D9_COMMON_BUFFER_TYPE_STAGING>();
|
auto srcSlice = pResource->GetMappedSlice();
|
||||||
|
|
||||||
D3D9Range& range = pResource->DirtyRange();
|
D3D9Range& range = pResource->DirtyRange();
|
||||||
|
|
||||||
D3D9BufferSlice slice = AllocTempBuffer<false>(range.max - range.min);
|
D3D9BufferSlice slice = AllocTempBuffer<false>(range.max - range.min);
|
||||||
memcpy(slice.mapPtr, srcBuffer.mapPtr(range.min), range.max - range.min);
|
void* srcData = reinterpret_cast<uint8_t*>(srcSlice.mapPtr) + range.min;
|
||||||
|
memcpy(slice.mapPtr, srcData, range.max - range.min);
|
||||||
|
|
||||||
EmitCs([
|
EmitCs([
|
||||||
cDstSlice = dstBuffer,
|
cDstSlice = dstBuffer,
|
||||||
cSrcSlice = slice.slice,
|
cSrcSlice = slice.slice,
|
||||||
|
cDstOffset = range.min,
|
||||||
cLength = range.max - range.min
|
cLength = range.max - range.min
|
||||||
] (DxvkContext* ctx) {
|
] (DxvkContext* ctx) {
|
||||||
ctx->copyBuffer(
|
ctx->copyBuffer(
|
||||||
cDstSlice.buffer(),
|
cDstSlice.buffer(),
|
||||||
cDstSlice.offset(),
|
cDstSlice.offset() + cDstOffset,
|
||||||
cSrcSlice.buffer(),
|
cSrcSlice.buffer(),
|
||||||
cSrcSlice.offset(),
|
cSrcSlice.offset(),
|
||||||
cLength);
|
cLength);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user