Esempio n. 1
0
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;
		}
	}
}
Esempio n. 3
0
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;
	}