diff --git a/DDrawCompat/D3dDdi/Resource.cpp b/DDrawCompat/D3dDdi/Resource.cpp index 5c1dc22..4f29b73 100644 --- a/DDrawCompat/D3dDdi/Resource.cpp +++ b/DDrawCompat/D3dDdi/Resource.cpp @@ -204,6 +204,10 @@ namespace D3dDdi prepareForRendering(data.DstSubResourceIndex, false); return it->second.splitBlt(data, data.SrcSubResourceIndex, data.SrcRect, data.DstRect); } + else if (m_fixedData.Flags.Primary) + { + return presentationBlt(data, it->second); + } else { return sysMemPreferredBlt(data, it->second); @@ -444,6 +448,25 @@ namespace D3dDdi } } + HRESULT Resource::presentationBlt(const D3DDDIARG_BLT& data, Resource& srcResource) + { + if (data.SrcSubResourceIndex < srcResource.m_lockData.size()) + { + if (srcResource.m_lockData[data.SrcSubResourceIndex].isVidMemUpToDate) + { + if (srcResource.m_lockData[data.SrcSubResourceIndex].isSysMemUpToDate) + { + copySubResource(srcResource, *srcResource.m_lockResource, data.SrcSubResourceIndex); + } + } + else + { + srcResource.copyToVidMem(data.SrcSubResourceIndex); + } + } + return m_device.getOrigVtable().pfnBlt(m_device, &data); + } + void Resource::setLockResource(Resource* lockResource) { if (!m_lockResource == !lockResource) diff --git a/DDrawCompat/D3dDdi/Resource.h b/DDrawCompat/D3dDdi/Resource.h index bb88945..2740e3a 100644 --- a/DDrawCompat/D3dDdi/Resource.h +++ b/DDrawCompat/D3dDdi/Resource.h @@ -82,6 +82,7 @@ namespace D3dDdi void moveToSysMem(UINT subResourceIndex); void moveToVidMem(UINT subResourceIndex); void prepareSubResourceForRendering(UINT subResourceIndex, bool isReadOnly); + HRESULT presentationBlt(const D3DDDIARG_BLT& data, Resource& srcResource); void setSysMemUpToDate(UINT subResourceIndex, bool upToDate); void setVidMemUpToDate(UINT subResourceIndex, bool upToDate); HRESULT splitBlt(D3DDDIARG_BLT& data, UINT& subResourceIndex, RECT& rect, RECT& otherRect);