//---------------------------------------------------------------------------- bool DX11Texture::CopyCpuToGpu(ID3D11DeviceContext* context, unsigned int sri) { Texture* texture = GetTexture(); if (sri >= texture->GetNumSubresources()) { LogWarning("Subresource index out of range."); return false; } if (!PreparedForCopy(D3D11_CPU_ACCESS_WRITE)) { return false; } // Map the staging texture. D3D11_MAPPED_SUBRESOURCE sub; HRESULT hr = context->Map(mStaging, sri, D3D11_MAP_WRITE, 0, &sub); CHECK_HR_RETURN("Failed to map staging texture", false); // Copy from CPU memory to staging texture. auto sr = texture->GetSubresource(sri); unsigned int numDimensions = texture->GetNumDimensions(); if (numDimensions == 1) { memcpy(sub.pData, sr.data, texture->GetNumBytesFor(sr.level)); } else if (numDimensions == 2) { CopyPitched2(texture->GetDimensionFor(sr.level, 1), sr.rowPitch, sr.data, sub.RowPitch, sub.pData); } else // numDimensions == 3 { CopyPitched3(texture->GetDimensionFor(sr.level, 1), texture->GetDimensionFor(sr.level, 2), sr.rowPitch, sr.slicePitch, sr.data, sub.RowPitch, sub.DepthPitch, sub.pData); } context->Unmap(mStaging, sri); // Copy from staging texture to GPU memory. ID3D11Resource* dxTexture = GetDXResource(); context->CopySubresourceRegion(dxTexture, sri, 0, 0, 0, mStaging, sri, nullptr); return true; }
//---------------------------------------------------------------------------- bool DX11Texture::Update(ID3D11DeviceContext* context, unsigned int sri) { Texture* texture = GetTexture(); if (sri >= texture->GetNumSubresources()) { LogWarning("Subresource index out of range."); return false; } if (texture->GetUsage() != Resource::DYNAMIC_UPDATE) { LogWarning("Texture usage is not DYNAMIC_UPDATE."); return false; } // Map the texture. ID3D11Resource* dxTexture = GetDXResource(); D3D11_MAPPED_SUBRESOURCE sub; HRESULT hr = context->Map(dxTexture, sri, D3D11_MAP_WRITE_DISCARD, 0, &sub); CHECK_HR_RETURN("Failed to map staging texture", false); // Copy from CPU memory. auto sr = texture->GetSubresource(sri); unsigned int numDimensions = texture->GetNumDimensions(); if (numDimensions == 1) { Memcpy(sub.pData, sr.data, texture->GetNumBytesFor(sr.level)); } else if (numDimensions == 2) { CopyPitched2(texture->GetDimensionFor(sr.level, 1), sr.rowPitch, sr.data, sub.RowPitch, sub.pData); } else // numDimensions == 3 { CopyPitched3(texture->GetDimensionFor(sr.level, 1), texture->GetDimensionFor(sr.level, 2), sr.rowPitch, sr.slicePitch, sr.data, sub.RowPitch, sub.DepthPitch, sub.pData); } context->Unmap(dxTexture, sri); return true; }