| 579 | } |
| 580 | |
| 581 | void TextureManager::bindShaderData(const ShaderVar& texturesVar, const size_t descCount, const ShaderVar& udimsVar) const |
| 582 | { |
| 583 | std::lock_guard<std::mutex> lock(mMutex); |
| 584 | |
| 585 | if (mTextureDescs.size() > descCount) |
| 586 | { |
| 587 | FALCOR_THROW("Descriptor array size ({}) is too small for the required number of textures ({})", descCount, mTextureDescs.size()); |
| 588 | } |
| 589 | |
| 590 | ref<Texture> nullTexture; |
| 591 | for (size_t i = 0; i < mTextureDescs.size(); i++) |
| 592 | { |
| 593 | texturesVar[i] = mTextureDescs[i].pTexture; |
| 594 | } |
| 595 | for (size_t i = mTextureDescs.size(); i < descCount; i++) |
| 596 | { |
| 597 | texturesVar[i] = nullTexture; |
| 598 | } |
| 599 | |
| 600 | if (mUdimIndirection.empty()) |
| 601 | { |
| 602 | mpUdimIndirection.reset(); |
| 603 | mUdimIndirectionDirty = false; |
| 604 | return; |
| 605 | } |
| 606 | |
| 607 | if (!mpUdimIndirection || mUdimIndirection.size() > mpUdimIndirection->getElementCount()) |
| 608 | { |
| 609 | mpUdimIndirection = mpDevice->createStructuredBuffer( |
| 610 | sizeof(int32_t), |
| 611 | mUdimIndirection.size(), |
| 612 | ResourceBindFlags::ShaderResource | ResourceBindFlags::UnorderedAccess, |
| 613 | MemoryType::DeviceLocal, |
| 614 | mUdimIndirection.data(), |
| 615 | false |
| 616 | ); |
| 617 | mUdimIndirectionDirty = false; |
| 618 | } |
| 619 | |
| 620 | if (mUdimIndirectionDirty) |
| 621 | { |
| 622 | mpUdimIndirection->setBlob(mUdimIndirection.data(), 0, mUdimIndirection.size() * sizeof(int32_t)); |
| 623 | } |
| 624 | |
| 625 | udimsVar = mpUdimIndirection; |
| 626 | } |
| 627 | |
| 628 | TextureManager::Stats TextureManager::getStats() const |
| 629 | { |