FUnorderedAccessViewRHIRef FD3D11DynamicRHI::RHICreateUnorderedAccessView(FTextureRHIParamRef TextureRHI) { FD3D11TextureBase* Texture = GetD3D11TextureFromRHITexture(TextureRHI); D3D11_UNORDERED_ACCESS_VIEW_DESC UAVDesc; if (TextureRHI->GetTexture3D() != NULL) { FD3D11Texture3D* Texture3D = (FD3D11Texture3D*)Texture; UAVDesc.ViewDimension = D3D11_UAV_DIMENSION_TEXTURE3D; UAVDesc.Texture3D.MipSlice = 0; UAVDesc.Texture3D.FirstWSlice = 0; UAVDesc.Texture3D.WSize = Texture3D->GetSizeZ(); } else { UAVDesc.ViewDimension = D3D11_UAV_DIMENSION_TEXTURE2D; UAVDesc.Texture2D.MipSlice = 0; } UAVDesc.Format = FindShaderResourceDXGIFormat((DXGI_FORMAT)GPixelFormats[TextureRHI->GetFormat()].PlatformFormat, false); TRefCountPtr<ID3D11UnorderedAccessView> UnorderedAccessView; VERIFYD3D11RESULT(Direct3DDevice->CreateUnorderedAccessView(Texture->GetResource(),&UAVDesc,(ID3D11UnorderedAccessView**)UnorderedAccessView.GetInitReference())); return new FD3D11UnorderedAccessView(UnorderedAccessView,Texture); }
void FD3D11UniformBuffer::CacheResourcesInternal() { const FRHIUniformBufferLayout& Layout = GetLayout(); int32 NumResources = Layout.Resources.Num(); const uint8* RESTRICT ResourceTypes = Layout.Resources.GetData(); const TRefCountPtr<FRHIResource>* RESTRICT Resources = ResourceTable.GetData(); FResourcePair* RESTRICT RawResources = RawResourceTable.GetData(); float CurrentTime = FApp::GetCurrentTime(); // todo: Immutable resources, i.e. not textures, can be safely cached across frames. // Texture streaming makes textures complicated :) for (int32 i = 0; i < NumResources; ++i) { switch (ResourceTypes[i]) { case UBMT_SRV: { FD3D11ShaderResourceView* ShaderResourceViewRHI = (FD3D11ShaderResourceView*)Resources[i].GetReference(); RawResources[i].ShaderResource = ShaderResourceViewRHI->Resource.GetReference(); RawResources[i].D3D11Resource = (IUnknown*)ShaderResourceViewRHI->View.GetReference(); } break; case UBMT_TEXTURE: { // todo: this does multiple virtual function calls to find the right type to cast to // this is due to multiple inheritance nastiness, NEEDS CLEANUP FRHITexture* TextureRHI = (FRHITexture*)Resources[i].GetReference(); TextureRHI->SetLastRenderTime(CurrentTime); FD3D11TextureBase* TextureD3D11 = GetD3D11TextureFromRHITexture(TextureRHI); RawResources[i].ShaderResource = TextureD3D11->GetBaseShaderResource(); RawResources[i].D3D11Resource = (IUnknown*)TextureD3D11->GetShaderResourceView(); } break; case UBMT_UAV: RawResources[i].ShaderResource = NULL; RawResources[i].D3D11Resource = NULL; check(0); break; case UBMT_SAMPLER: RawResources[i].ShaderResource = NULL; RawResources[i].D3D11Resource = (IUnknown*)((FD3D11SamplerState*)Resources[i].GetReference())->Resource.GetReference(); break; default: check(0); break; } } }
FUnorderedAccessViewRHIRef FD3D11DynamicRHI::RHICreateUnorderedAccessView(FTextureRHIParamRef TextureRHI, uint32 MipLevel) { FD3D11TextureBase* Texture = GetD3D11TextureFromRHITexture(TextureRHI); D3D11_UNORDERED_ACCESS_VIEW_DESC UAVDesc; if (TextureRHI->GetTexture3D() != NULL) { FD3D11Texture3D* Texture3D = (FD3D11Texture3D*)Texture; UAVDesc.ViewDimension = D3D11_UAV_DIMENSION_TEXTURE3D; UAVDesc.Texture3D.MipSlice = MipLevel; UAVDesc.Texture3D.FirstWSlice = 0; UAVDesc.Texture3D.WSize = Texture3D->GetSizeZ() >> MipLevel; }
FUnorderedAccessViewRHIRef FD3D12DynamicRHI::RHICreateUnorderedAccessView(FTextureRHIParamRef TextureRHI, uint32 MipLevel) { FD3D12TextureBase* Texture = GetD3D11TextureFromRHITexture(TextureRHI); D3D12_UNORDERED_ACCESS_VIEW_DESC UAVDesc ={}; const DXGI_FORMAT PlatformResourceFormat = (DXGI_FORMAT)GPixelFormats[TextureRHI->GetFormat()].PlatformFormat; UAVDesc.Format = FindShaderResourceDXGIFormat(PlatformResourceFormat, false); if (TextureRHI->GetTexture3D() != NULL) { FD3D12Texture3D* Texture3D = (FD3D12Texture3D*)Texture; UAVDesc.ViewDimension = D3D12_UAV_DIMENSION_TEXTURE3D; UAVDesc.Texture3D.MipSlice = MipLevel; UAVDesc.Texture3D.FirstWSlice = 0; UAVDesc.Texture3D.WSize = Texture3D->GetSizeZ() >> MipLevel; }