void FDeferredShadingSceneRenderer::RenderVisualizeTexturePool()
{
	TRefCountPtr<IPooledRenderTarget> VisualizeTexturePool;

	/** Resolution for the texture pool visualizer texture. */
	enum
	{
		TexturePoolVisualizerSizeX = 280,
		TexturePoolVisualizerSizeY = 140,
	};

	FPooledRenderTargetDesc Desc(FPooledRenderTargetDesc::Create2DDesc(FIntPoint(TexturePoolVisualizerSizeX, TexturePoolVisualizerSizeY), PF_B8G8R8A8, TexCreate_None, TexCreate_None, false));
	GRenderTargetPool.FindFreeElement(Desc, VisualizeTexturePool, TEXT("VisualizeTexturePool"));
	
	uint32 Pitch;
	FColor* TextureData = (FColor*)RHILockTexture2D((FTexture2DRHIRef&)VisualizeTexturePool->GetRenderTargetItem().ShaderResourceTexture, 0, RLM_WriteOnly, Pitch, false );
	if(TextureData)
	{
		// clear with grey to get reliable background color
		FMemory::Memset(TextureData, 0x88, TexturePoolVisualizerSizeX * TexturePoolVisualizerSizeY * 4);
		RHIGetTextureMemoryVisualizeData(TextureData, TexturePoolVisualizerSizeX, TexturePoolVisualizerSizeY, Pitch, 4096);
	}

	RHIUnlockTexture2D((FTexture2DRHIRef&)VisualizeTexturePool->GetRenderTargetItem().ShaderResourceTexture, 0, false);

	FIntPoint RTExtent = GSceneRenderTargets.GetBufferSizeXY();

	FVector2D Tex00 = FVector2D(0, 0);
	FVector2D Tex11 = FVector2D(1, 1);

//todo	VisualizeTexture(*VisualizeTexturePool, ViewFamily.RenderTarget, FIntRect(0, 0, RTExtent.X, RTExtent.Y), RTExtent, 1.0f, 0.0f, 0.0f, Tex00, Tex11, 1.0f, false);
}
void FMediaTextureResource::UpdateDeferredResource(FRHICommandListImmediate& RHICmdList, bool bClearRenderTarget/*=true*/)
{
	FTimespan CurrentFrameTime = VideoBuffer->GetCurrentSampleTime();
	TSharedPtr<TArray<uint8>, ESPMode::ThreadSafe> CurrentFrame = VideoBuffer->GetCurrentSample();

	if (CurrentFrame.IsValid())
	{
		// draw the latest video frame
		if (CurrentFrameTime != LastFrameTime)
		{
			uint32 Stride = 0;
			FRHITexture2D* Texture2D = TextureRHI->GetTexture2D();
			uint8* TextureBuffer = (uint8*)RHILockTexture2D(Texture2D, 0, RLM_WriteOnly, Stride, false);

			FMemory::Memcpy(TextureBuffer, CurrentFrame->GetData(), CurrentFrame->Num());
			RHIUnlockTexture2D(Texture2D, 0, false);

			LastFrameTime = CurrentFrameTime;
			Cleared = false;
		}
	}
	else if (!Cleared || (LastClearColor != Owner->ClearColor))
	{
		// clear texture if video track selected
		FRHICommandListImmediate& CommandList = FRHICommandListExecutor::GetImmediateCommandList();

 		SetRenderTarget(CommandList, RenderTargetTextureRHI, FTextureRHIRef());
 		CommandList.SetViewport(0, 0, 0.0f, Owner->GetSurfaceWidth(), Owner->GetSurfaceHeight(), 1.0f);
 		CommandList.Clear(true, Owner->ClearColor, false, 0.f, false, 0, FIntRect());
		CommandList.CopyToResolveTarget(Texture2DRHI, TextureRHI, true, FResolveParams());

		LastClearColor = Owner->ClearColor;
		Cleared = true;
	}
}
void FStaticShadowDepthMap::InitRHI()
{
	if (ShadowMapSizeX > 0 && ShadowMapSizeY > 0 && GMaxRHIFeatureLevel >= ERHIFeatureLevel::SM4)
	{
		FRHIResourceCreateInfo CreateInfo;
		FTexture2DRHIRef Texture2DRHI = RHICreateTexture2D(ShadowMapSizeX, ShadowMapSizeY, PF_R16F, 1, 1, 0, CreateInfo);
		TextureRHI = Texture2DRHI;

		uint32 DestStride = 0;
		uint8* TextureData = (uint8*)RHILockTexture2D(Texture2DRHI, 0, RLM_WriteOnly, DestStride, false);
		uint32 RowSize = ShadowMapSizeX * GPixelFormats[PF_R16F].BlockBytes;

		for (int32 Y = 0; Y < ShadowMapSizeY; Y++)
		{
			FMemory::Memcpy(TextureData + DestStride * Y, ((uint8*)DepthSamples.GetData()) + RowSize * Y, RowSize);
		}

		RHIUnlockTexture2D(Texture2DRHI, 0, false);
	}
}
/* Copies the next frame into the render target ready for viewing */
void UCodecMovieImf::GetFrame(FRHICommandListImmediate& RHICmdList, class FTextureMovieResource* InTextureMovieResource)
{
	/* If only rendering one frame */
	if( OneFrameOnly && FrameCount > 1 )
		return;

	/* Is a sample ready? */
	if( InTextureMovieResource && InTextureMovieResource->IsInitialized( ) && SampleGrabberCallback->GetIsSampleReadyToUpdate() )
	{
		/* Copy to render target */
		uint32 Stride;
		uint8* DestTextureData = (uint8*) RHILockTexture2D( InTextureMovieResource->TextureRHI->GetTexture2D( ), 0, RLM_WriteOnly, Stride, false );
		FMemory::Memcpy( DestTextureData, TextureData.GetData( ), TextureData.Num( ) );
		RHIUnlockTexture2D( InTextureMovieResource->TextureRHI->GetTexture2D( ), 0, false );

		/* Wait for next sample */
		SampleGrabberCallback->SetNeedNewSample( );
		FrameCount++;
	}
}
bool FMediaFoundationMovieStreamer::Tick(float DeltaTime)
{
    FSlateTexture2DRHIRef* CurrentTexture = Texture.Get();

    if ((CurrentTexture != nullptr) && SampleGrabberCallback->GetIsSampleReadyToUpdate())
    {
        check( IsInRenderingThread() );

        if( !CurrentTexture->IsInitialized() )
        {
            CurrentTexture->InitResource();
        }

        uint32 Stride;
        uint8* DestTextureData = (uint8*)RHILockTexture2D( CurrentTexture->GetTypedResource(), 0, RLM_WriteOnly, Stride, false );
        FMemory::Memcpy( DestTextureData, TextureData.GetData(), TextureData.Num() );
        RHIUnlockTexture2D( CurrentTexture->GetTypedResource(), 0, false );

        SampleGrabberCallback->SetNeedNewSample();
    }

    if (!VideoPlayer->MovieIsRunning())
    {
        CloseMovie();
        if (StoredMoviePaths.Num() > 0)
        {
            OpenNextMovie();
        }
        else
        {
            return true;
        }
    }

    return false;
}