void RosUmdResource::Map( RosUmdDevice *pUmdDevice, UINT subResource, D3D10_DDI_MAP mapType, UINT mapFlags, D3D10DDI_MAPPED_SUBRESOURCE* pMappedSubRes) { assert(m_mipLevels == 1); assert(m_arraySize == 1); UNREFERENCED_PARAMETER(subResource); pUmdDevice->m_commandBuffer.FlushIfMatching(m_mostRecentFence); D3DDDICB_LOCK lock; memset(&lock, 0, sizeof(lock)); lock.hAllocation = m_hKMAllocation; SetLockFlags(mapType, mapFlags, &lock.Flags); pUmdDevice->Lock(&lock); pMappedSubRes->pData = lock.pData; pMappedSubRes->RowPitch = m_hwPitchBytes; pMappedSubRes->DepthPitch = (UINT)m_hwSizeBytes; }
void RosUmdResource::Map( RosUmdDevice *pUmdDevice, UINT subResource, D3D10_DDI_MAP mapType, UINT mapFlags, D3D10DDI_MAPPED_SUBRESOURCE* pMappedSubRes) { assert(m_mipLevels <= 1); assert(m_arraySize == 1); UNREFERENCED_PARAMETER(subResource); // // Constant data is copied into command buffer, so there is no need for flushing // if (m_bindFlags & D3D10_DDI_BIND_CONSTANT_BUFFER) { pMappedSubRes->pData = m_pSysMemCopy; pMappedSubRes->RowPitch = this->Pitch(); pMappedSubRes->DepthPitch = (UINT)m_hwSizeBytes; return; } pUmdDevice->m_commandBuffer.FlushIfMatching(m_mostRecentFence); D3DDDICB_LOCK lock; memset(&lock, 0, sizeof(lock)); lock.hAllocation = m_hKMAllocation; // // TODO[indyz]: Consider how to optimize D3D10_DDI_MAP_WRITE_NOOVERWRITE // // D3DDDICB_LOCKFLAGS::IgnoreSync and IgnoreReadSync are used for // D3D10_DDI_MAP_WRITE_NOOVERWRITE optimization and are only allowed // for allocations that can resides in aperture segment. // // Currently ROS driver puts all allocations in local video memory. // SetLockFlags(mapType, mapFlags, &lock.Flags); pUmdDevice->Lock(&lock); if (lock.Flags.Discard) { assert(m_hKMAllocation != lock.hAllocation); m_hKMAllocation = lock.hAllocation; if (pUmdDevice->m_commandBuffer.IsResourceUsed(this)) { // // Indicate that the new allocation instance of the resource // is not used in the current command batch. // m_mostRecentFence -= 1; } } pMappedSubRes->pData = lock.pData; m_pData = (BYTE*)lock.pData; pMappedSubRes->RowPitch = this->Pitch(); pMappedSubRes->DepthPitch = (UINT)m_hwSizeBytes; }