void GlobalIlluminationPass::Init(int width, int height) { D3DRenderer* renderer = EngineStatics::getRenderer(); InitShader(renderer); InitConstantBuffers(renderer); InitDestinationTexture(renderer, width, height); InitSamplerStates(renderer); }
FD3D11DynamicRHI::FD3D11DynamicRHI(IDXGIFactory* InDXGIFactory,D3D_FEATURE_LEVEL InFeatureLevel, int32 InChosenAdapter) : DXGIFactory(InDXGIFactory), bDeviceRemoved(false), FeatureLevel(InFeatureLevel), bUsingTessellation(false), PendingNumVertices(0), PendingVertexDataStride(0), PendingPrimitiveType(0), PendingNumPrimitives(0), PendingMinVertexIndex(0), PendingNumIndices(0), PendingIndexDataStride(0), CurrentDepthTexture(NULL), NumSimultaneousRenderTargets(0), NumUAVs(0), SceneFrameCounter(0), ResourceTableFrameCounter(INDEX_NONE), CurrentDSVAccessType(DSAT_Writable), bDiscardSharedConstants(false), GPUProfilingData(this), ChosenAdapter(InChosenAdapter) { // This should be called once at the start check(ChosenAdapter >= 0); check( IsInGameThread() ); check( !GIsThreadedRendering ); // Allocate a buffer of zeroes. This is used when we need to pass D3D memory // that we don't care about and will overwrite with valid data in the future. ZeroBufferSize = 4 * (1 << 20); // 4MB in the zero buffer. ZeroBuffer = FMemory::Malloc(ZeroBufferSize); FMemory::Memzero(ZeroBuffer,ZeroBufferSize); GPoolSizeVRAMPercentage = 0; GTexturePoolSize = 0; GConfig->GetInt( TEXT( "TextureStreaming" ), TEXT( "PoolSizeVRAMPercentage" ), GPoolSizeVRAMPercentage, GEngineIni ); // Initialize the RHI capabilities. check(FeatureLevel == D3D_FEATURE_LEVEL_11_0 || FeatureLevel == D3D_FEATURE_LEVEL_10_0 ); if(FeatureLevel == D3D_FEATURE_LEVEL_10_0) { GSupportsDepthFetchDuringDepthTest = false; } // ES2 feature level emulation in D3D11 if (FParse::Param(FCommandLine::Get(), TEXT("FeatureLevelES2")) && !GIsEditor) { GMaxRHIFeatureLevel = ERHIFeatureLevel::ES2; GMaxRHIShaderPlatform = SP_PCD3D_ES2; } else if(FeatureLevel == D3D_FEATURE_LEVEL_11_0) { GMaxRHIFeatureLevel = ERHIFeatureLevel::SM5; GMaxRHIShaderPlatform = SP_PCD3D_SM5; } else if(FeatureLevel == D3D_FEATURE_LEVEL_10_0) { GMaxRHIFeatureLevel = ERHIFeatureLevel::SM4; GMaxRHIShaderPlatform = SP_PCD3D_SM4; } // Initialize the platform pixel format map. GPixelFormats[ PF_Unknown ].PlatformFormat = DXGI_FORMAT_UNKNOWN; GPixelFormats[ PF_A32B32G32R32F ].PlatformFormat = DXGI_FORMAT_R32G32B32A32_FLOAT; GPixelFormats[ PF_B8G8R8A8 ].PlatformFormat = DXGI_FORMAT_B8G8R8A8_TYPELESS; GPixelFormats[ PF_G8 ].PlatformFormat = DXGI_FORMAT_R8_UNORM; GPixelFormats[ PF_G16 ].PlatformFormat = DXGI_FORMAT_R16_UNORM; GPixelFormats[ PF_DXT1 ].PlatformFormat = DXGI_FORMAT_BC1_TYPELESS; GPixelFormats[ PF_DXT3 ].PlatformFormat = DXGI_FORMAT_BC2_TYPELESS; GPixelFormats[ PF_DXT5 ].PlatformFormat = DXGI_FORMAT_BC3_TYPELESS; GPixelFormats[ PF_BC4 ].PlatformFormat = DXGI_FORMAT_BC4_UNORM; GPixelFormats[ PF_UYVY ].PlatformFormat = DXGI_FORMAT_UNKNOWN; // TODO: Not supported in D3D11 #if DEPTH_32_BIT_CONVERSION GPixelFormats[ PF_DepthStencil ].PlatformFormat = DXGI_FORMAT_R32G8X24_TYPELESS; GPixelFormats[ PF_DepthStencil ].BlockBytes = 5; GPixelFormats[ PF_X24_G8 ].PlatformFormat = DXGI_FORMAT_X32_TYPELESS_G8X24_UINT; GPixelFormats[ PF_X24_G8].BlockBytes = 5; #else GPixelFormats[ PF_DepthStencil ].PlatformFormat = DXGI_FORMAT_R24G8_TYPELESS; GPixelFormats[ PF_DepthStencil ].BlockBytes = 4; GPixelFormats[ PF_X24_G8 ].PlatformFormat = DXGI_FORMAT_X24_TYPELESS_G8_UINT; GPixelFormats[ PF_X24_G8].BlockBytes = 4; #endif GPixelFormats[ PF_ShadowDepth ].PlatformFormat = DXGI_FORMAT_R16_TYPELESS; GPixelFormats[ PF_ShadowDepth ].BlockBytes = 2; GPixelFormats[ PF_R32_FLOAT ].PlatformFormat = DXGI_FORMAT_R32_FLOAT; GPixelFormats[ PF_G16R16 ].PlatformFormat = DXGI_FORMAT_R16G16_UNORM; GPixelFormats[ PF_G16R16F ].PlatformFormat = DXGI_FORMAT_R16G16_FLOAT; GPixelFormats[ PF_G16R16F_FILTER].PlatformFormat = DXGI_FORMAT_R16G16_FLOAT; GPixelFormats[ PF_G32R32F ].PlatformFormat = DXGI_FORMAT_R32G32_FLOAT; GPixelFormats[ PF_A2B10G10R10 ].PlatformFormat = DXGI_FORMAT_R10G10B10A2_UNORM; GPixelFormats[ PF_A16B16G16R16 ].PlatformFormat = DXGI_FORMAT_R16G16B16A16_UNORM; GPixelFormats[ PF_D24 ].PlatformFormat = DXGI_FORMAT_R24G8_TYPELESS; GPixelFormats[ PF_R16F ].PlatformFormat = DXGI_FORMAT_R16_FLOAT; GPixelFormats[ PF_R16F_FILTER ].PlatformFormat = DXGI_FORMAT_R16_FLOAT; GPixelFormats[ PF_FloatRGB ].PlatformFormat = DXGI_FORMAT_R11G11B10_FLOAT; GPixelFormats[ PF_FloatRGB ].BlockBytes = 4; GPixelFormats[ PF_FloatRGBA ].PlatformFormat = DXGI_FORMAT_R16G16B16A16_FLOAT; GPixelFormats[ PF_FloatRGBA ].BlockBytes = 8; GPixelFormats[ PF_FloatR11G11B10].PlatformFormat = DXGI_FORMAT_R11G11B10_FLOAT; GPixelFormats[ PF_FloatR11G11B10].BlockBytes = 4; GPixelFormats[ PF_V8U8 ].PlatformFormat = DXGI_FORMAT_R8G8_SNORM; GPixelFormats[ PF_BC5 ].PlatformFormat = DXGI_FORMAT_BC5_UNORM; GPixelFormats[ PF_A1 ].PlatformFormat = DXGI_FORMAT_R1_UNORM; // Not supported for rendering. GPixelFormats[ PF_A8 ].PlatformFormat = DXGI_FORMAT_A8_UNORM; GPixelFormats[ PF_R32_UINT ].PlatformFormat = DXGI_FORMAT_R32_UINT; GPixelFormats[ PF_R32_SINT ].PlatformFormat = DXGI_FORMAT_R32_SINT; GPixelFormats[ PF_R16_UINT ].PlatformFormat = DXGI_FORMAT_R16_UINT; GPixelFormats[ PF_R16_SINT ].PlatformFormat = DXGI_FORMAT_R16_SINT; GPixelFormats[ PF_R16G16B16A16_UINT].PlatformFormat = DXGI_FORMAT_R16G16B16A16_UINT; GPixelFormats[ PF_R16G16B16A16_SINT].PlatformFormat = DXGI_FORMAT_R16G16B16A16_SINT; GPixelFormats[ PF_R5G6B5_UNORM ].PlatformFormat = DXGI_FORMAT_B5G6R5_UNORM; GPixelFormats[ PF_R8G8B8A8 ].PlatformFormat = DXGI_FORMAT_R8G8B8A8_TYPELESS; GPixelFormats[ PF_R8G8 ].PlatformFormat = DXGI_FORMAT_R8G8_UNORM; GPixelFormats[ PF_R32G32B32A32_UINT].PlatformFormat = DXGI_FORMAT_R32G32B32A32_UINT; GPixelFormats[ PF_R16G16_UINT].PlatformFormat = DXGI_FORMAT_R16G16_UINT; GPixelFormats[ PF_BC6H ].PlatformFormat = DXGI_FORMAT_BC6H_UF16; GPixelFormats[ PF_BC7 ].PlatformFormat = DXGI_FORMAT_BC7_TYPELESS; if (FeatureLevel >= D3D_FEATURE_LEVEL_11_0) { GSupportsSeparateRenderTargetBlendState = true; GMaxTextureDimensions = D3D11_REQ_TEXTURE2D_U_OR_V_DIMENSION; GMaxCubeTextureDimensions = D3D11_REQ_TEXTURECUBE_DIMENSION; GMaxTextureArrayLayers = D3D11_REQ_TEXTURE2D_ARRAY_AXIS_DIMENSION; } else if (FeatureLevel >= D3D_FEATURE_LEVEL_10_0) { GMaxTextureDimensions = D3D10_REQ_TEXTURE2D_U_OR_V_DIMENSION; GMaxCubeTextureDimensions = D3D10_REQ_TEXTURECUBE_DIMENSION; GMaxTextureArrayLayers = D3D10_REQ_TEXTURE2D_ARRAY_AXIS_DIMENSION; } GMaxTextureMipCount = FMath::CeilLogTwo( GMaxTextureDimensions ) + 1; GMaxTextureMipCount = FMath::Min<int32>( MAX_TEXTURE_MIP_COUNT, GMaxTextureMipCount ); GMaxShadowDepthBufferSizeX = 4096; GMaxShadowDepthBufferSizeY = 4096; // Initialize the constant buffers. InitConstantBuffers(); // Create the dynamic vertex and index buffers used for Draw[Indexed]PrimitiveUP. uint32 DynamicVBSizes[] = {128,1024,64*1024,1024*1024,0}; DynamicVB = new FD3D11DynamicBuffer(this,D3D11_BIND_VERTEX_BUFFER,DynamicVBSizes); uint32 DynamicIBSizes[] = {128,1024,64*1024,1024*1024,0}; DynamicIB = new FD3D11DynamicBuffer(this,D3D11_BIND_INDEX_BUFFER,DynamicIBSizes); for (int32 Frequency = 0; Frequency < SF_NumFrequencies; ++Frequency) { DirtyUniformBuffers[Frequency] = 0; } }
FD3D11DynamicRHI::FD3D11DynamicRHI(IDXGIFactory* InDXGIFactory,D3D_FEATURE_LEVEL InFeatureLevel): DXGIFactory(InDXGIFactory), bDeviceRemoved(false), FeatureLevel(InFeatureLevel), bUsingTessellation(false), PendingNumVertices(0), PendingVertexDataStride(0), PendingPrimitiveType(0), PendingNumPrimitives(0), PendingMinVertexIndex(0), PendingNumIndices(0), PendingIndexDataStride(0), CurrentDepthTexture(NULL), NumSimultaneousRenderTargets(0), NumUAVs(0), CurrentDSVAccessType(DSAT_Writable), bDiscardSharedConstants(false), GPUProfilingData(this) { // This should be called once at the start check( IsInGameThread() ); check( !GIsThreadedRendering ); // Allocate a buffer of zeroes. This is used when we need to pass D3D memory // that we don't care about and will overwrite with valid data in the future. ZeroBufferSize = 4 * (1 << 20); // 4MB in the zero buffer. ZeroBuffer = FMemory::Malloc(ZeroBufferSize); FMemory::Memzero(ZeroBuffer,ZeroBufferSize); #if WITH_D3DX_LIBS // ensure we are running against the proper D3DX runtime if (FAILED(D3DX11CheckVersion(D3D11_SDK_VERSION, D3DX11_SDK_VERSION))) { UE_LOG(LogD3D11RHI, Fatal, TEXT("The D3DX11 runtime version does not match what the application was built with (%d). Cannot continue."), D3DX11_SDK_VERSION ); } #else UE_LOG(LogD3D11RHI, Warning, TEXT("DX11 built without D3DX. Version checking disabled!")); #endif GPoolSizeVRAMPercentage = 0; GTexturePoolSize = 0; if ( GReadTexturePoolSizeFromIni ) { int32 PoolSize; GConfig->GetInt(TEXT("TextureStreaming"), TEXT("PoolSize"), PoolSize, GEngineIni); GTexturePoolSize = int64(PoolSize) * 1024 * 1024; } else { GConfig->GetInt( TEXT( "TextureStreaming" ), TEXT( "PoolSizeVRAMPercentage" ), GPoolSizeVRAMPercentage, GEngineIni ); } // Initialize the RHI capabilities. check(FeatureLevel == D3D_FEATURE_LEVEL_11_0 || FeatureLevel == D3D_FEATURE_LEVEL_10_0 ); if(FeatureLevel == D3D_FEATURE_LEVEL_10_0) { GSupportsDepthFetchDuringDepthTest = false; } // ES2 feature level emulation in D3D11 if (FParse::Param(FCommandLine::Get(), TEXT("FeatureLevelES2"))) { GRHIFeatureLevel = ERHIFeatureLevel::ES2; GRHIShaderPlatform = SP_PCD3D_ES2; } else if(FeatureLevel == D3D_FEATURE_LEVEL_11_0) { GRHIFeatureLevel = ERHIFeatureLevel::SM5; GRHIShaderPlatform = SP_PCD3D_SM5; } else if(FeatureLevel == D3D_FEATURE_LEVEL_10_0) { GRHIFeatureLevel = ERHIFeatureLevel::SM4; GRHIShaderPlatform = SP_PCD3D_SM4; } GPixelCenterOffset = 0.0f; // Note that in D3D11, there is no half-texel offset (ala DX9) GSupportsVertexInstancing = true; GSupportsVertexTextureFetch = true; // Initialize the platform pixel format map. GPixelFormats[ PF_Unknown ].PlatformFormat = DXGI_FORMAT_UNKNOWN; GPixelFormats[ PF_A32B32G32R32F ].PlatformFormat = DXGI_FORMAT_R32G32B32A32_FLOAT; GPixelFormats[ PF_B8G8R8A8 ].PlatformFormat = DXGI_FORMAT_B8G8R8A8_TYPELESS; GPixelFormats[ PF_G8 ].PlatformFormat = DXGI_FORMAT_R8_UNORM; GPixelFormats[ PF_G16 ].PlatformFormat = DXGI_FORMAT_R16_UNORM; GPixelFormats[ PF_DXT1 ].PlatformFormat = DXGI_FORMAT_BC1_TYPELESS; GPixelFormats[ PF_DXT3 ].PlatformFormat = DXGI_FORMAT_BC2_TYPELESS; GPixelFormats[ PF_DXT5 ].PlatformFormat = DXGI_FORMAT_BC3_TYPELESS; GPixelFormats[ PF_BC4 ].PlatformFormat = DXGI_FORMAT_BC4_UNORM; GPixelFormats[ PF_UYVY ].PlatformFormat = DXGI_FORMAT_UNKNOWN; // TODO: Not supported in D3D11 #if DEPTH_32_BIT_CONVERSION GPixelFormats[ PF_DepthStencil ].PlatformFormat = DXGI_FORMAT_R32G8X24_TYPELESS; GPixelFormats[ PF_DepthStencil ].BlockBytes = 5; GPixelFormats[ PF_X24_G8 ].PlatformFormat = DXGI_FORMAT_X32_TYPELESS_G8X24_UINT; GPixelFormats[ PF_X24_G8].BlockBytes = 5; #else GPixelFormats[ PF_DepthStencil ].PlatformFormat = DXGI_FORMAT_R24G8_TYPELESS; GPixelFormats[ PF_DepthStencil ].BlockBytes = 4; GPixelFormats[ PF_X24_G8 ].PlatformFormat = DXGI_FORMAT_X24_TYPELESS_G8_UINT; GPixelFormats[ PF_X24_G8].BlockBytes = 4; #endif GPixelFormats[ PF_ShadowDepth ].PlatformFormat = DXGI_FORMAT_R16_TYPELESS; GPixelFormats[ PF_ShadowDepth ].BlockBytes = 2; GPixelFormats[ PF_R32_FLOAT ].PlatformFormat = DXGI_FORMAT_R32_FLOAT; GPixelFormats[ PF_G16R16 ].PlatformFormat = DXGI_FORMAT_R16G16_UNORM; GPixelFormats[ PF_G16R16F ].PlatformFormat = DXGI_FORMAT_R16G16_FLOAT; GPixelFormats[ PF_G16R16F_FILTER].PlatformFormat = DXGI_FORMAT_R16G16_FLOAT; GPixelFormats[ PF_G32R32F ].PlatformFormat = DXGI_FORMAT_R32G32_FLOAT; GPixelFormats[ PF_A2B10G10R10 ].PlatformFormat = DXGI_FORMAT_R10G10B10A2_UNORM; GPixelFormats[ PF_A16B16G16R16 ].PlatformFormat = DXGI_FORMAT_R16G16B16A16_UNORM; GPixelFormats[ PF_D24 ].PlatformFormat = DXGI_FORMAT_R24G8_TYPELESS; GPixelFormats[ PF_R16F ].PlatformFormat = DXGI_FORMAT_R16_FLOAT; GPixelFormats[ PF_R16F_FILTER ].PlatformFormat = DXGI_FORMAT_R16_FLOAT; GPixelFormats[ PF_FloatRGB ].PlatformFormat = DXGI_FORMAT_R11G11B10_FLOAT; GPixelFormats[ PF_FloatRGB ].BlockBytes = 4; GPixelFormats[ PF_FloatRGBA ].PlatformFormat = DXGI_FORMAT_R16G16B16A16_FLOAT; GPixelFormats[ PF_FloatRGBA ].BlockBytes = 8; GPixelFormats[ PF_FloatR11G11B10].PlatformFormat = DXGI_FORMAT_R11G11B10_FLOAT; GPixelFormats[ PF_FloatR11G11B10].BlockBytes = 4; GPixelFormats[ PF_V8U8 ].PlatformFormat = DXGI_FORMAT_R8G8_SNORM; GPixelFormats[ PF_BC5 ].PlatformFormat = DXGI_FORMAT_BC5_UNORM; GPixelFormats[ PF_A1 ].PlatformFormat = DXGI_FORMAT_R1_UNORM; // Not supported for rendering. GPixelFormats[ PF_A8 ].PlatformFormat = DXGI_FORMAT_A8_UNORM; GPixelFormats[ PF_R32_UINT ].PlatformFormat = DXGI_FORMAT_R32_UINT; GPixelFormats[ PF_R32_SINT ].PlatformFormat = DXGI_FORMAT_R32_SINT; GPixelFormats[ PF_R16_UINT ].PlatformFormat = DXGI_FORMAT_R16_UINT; GPixelFormats[ PF_R16_SINT ].PlatformFormat = DXGI_FORMAT_R16_SINT; GPixelFormats[ PF_R16G16B16A16_UINT].PlatformFormat = DXGI_FORMAT_R16G16B16A16_UINT; GPixelFormats[ PF_R16G16B16A16_SINT].PlatformFormat = DXGI_FORMAT_R16G16B16A16_SINT; GPixelFormats[ PF_R5G6B5_UNORM ].PlatformFormat = DXGI_FORMAT_B5G6R5_UNORM; GPixelFormats[ PF_R8G8B8A8 ].PlatformFormat = DXGI_FORMAT_R8G8B8A8_TYPELESS; GPixelFormats[ PF_R8G8 ].PlatformFormat = DXGI_FORMAT_R8G8_UNORM; if (FeatureLevel >= D3D_FEATURE_LEVEL_11_0) { GMaxTextureDimensions = D3D11_REQ_TEXTURE2D_U_OR_V_DIMENSION; GMaxCubeTextureDimensions = D3D11_REQ_TEXTURECUBE_DIMENSION; GMaxTextureArrayLayers = D3D11_REQ_TEXTURE2D_ARRAY_AXIS_DIMENSION; } else if (FeatureLevel >= D3D_FEATURE_LEVEL_10_0) { GMaxTextureDimensions = D3D10_REQ_TEXTURE2D_U_OR_V_DIMENSION; GMaxCubeTextureDimensions = D3D10_REQ_TEXTURECUBE_DIMENSION; GMaxTextureArrayLayers = D3D10_REQ_TEXTURE2D_ARRAY_AXIS_DIMENSION; } GMaxTextureMipCount = FMath::CeilLogTwo( GMaxTextureDimensions ) + 1; GMaxTextureMipCount = FMath::Min<int32>( MAX_TEXTURE_MIP_COUNT, GMaxTextureMipCount ); GMaxShadowDepthBufferSizeX = 4096; GMaxShadowDepthBufferSizeY = 4096; // Initialize the constant buffers. InitConstantBuffers(); // Create the dynamic vertex and index buffers used for Draw[Indexed]PrimitiveUP. uint32 DynamicVBSizes[] = {128,1024,64*1024,1024*1024,0}; DynamicVB = new FD3D11DynamicBuffer(this,D3D11_BIND_VERTEX_BUFFER,DynamicVBSizes); uint32 DynamicIBSizes[] = {128,1024,64*1024,1024*1024,0}; DynamicIB = new FD3D11DynamicBuffer(this,D3D11_BIND_INDEX_BUFFER,DynamicIBSizes); }