void Lighting::FillLightGrid(GraphicsContext& gfxContext, const Camera& camera)
{
	ScopedTimer _prof(L"FillLightGrid", gfxContext);

	ComputeContext& Context = gfxContext.GetComputeContext();

	Context.SetRootSignature(m_FillLightRootSig);

	switch ((int)LightGridDim)
	{
	case  8: Context.SetPipelineState(m_FillLightGridCS_8 ); break;
	case 16: Context.SetPipelineState(m_FillLightGridCS_16); break;
	case 24: Context.SetPipelineState(m_FillLightGridCS_24); break;
	case 32: Context.SetPipelineState(m_FillLightGridCS_32); break;
	default: ASSERT(false); break;
	}

	Context.TransitionResource(m_LightBuffer, D3D12_RESOURCE_STATE_NON_PIXEL_SHADER_RESOURCE);
	Context.TransitionResource(g_LinearDepth, D3D12_RESOURCE_STATE_NON_PIXEL_SHADER_RESOURCE);
	Context.TransitionResource(g_SceneDepthBuffer, D3D12_RESOURCE_STATE_NON_PIXEL_SHADER_RESOURCE);
	Context.TransitionResource(m_LightGrid, D3D12_RESOURCE_STATE_UNORDERED_ACCESS);
	Context.TransitionResource(m_LightGridBitMask, D3D12_RESOURCE_STATE_UNORDERED_ACCESS);

	Context.SetDynamicDescriptor(1, 0, m_LightBuffer.GetSRV());
	Context.SetDynamicDescriptor(1, 1, g_LinearDepth.GetSRV());
	//Context.SetDynamicDescriptor(1, 1, g_SceneDepthBuffer.GetDepthSRV());
	Context.SetDynamicDescriptor(2, 0, m_LightGrid.GetUAV());
	Context.SetDynamicDescriptor(2, 1, m_LightGridBitMask.GetUAV());

	// todo: assumes 1920x1080 resolution
	uint32_t tileCountX = Math::DivideByMultiple(g_SceneColorBuffer.GetWidth(), LightGridDim);
	uint32_t tileCountY = Math::DivideByMultiple(g_SceneColorBuffer.GetHeight(), LightGridDim);

	float FarClipDist = camera.GetFarClip();
	float NearClipDist = camera.GetNearClip();
	const float RcpZMagic = NearClipDist / (FarClipDist - NearClipDist);

	struct CSConstants
	{
		uint32_t ViewportWidth, ViewportHeight;
		float InvTileDim;
		float RcpZMagic;
		uint32_t TileCount;
		Matrix4 ViewProjMatrix;
	} csConstants;
	// todo: assumes 1920x1080 resolution
	csConstants.ViewportWidth = g_SceneColorBuffer.GetWidth();
	csConstants.ViewportHeight = g_SceneColorBuffer.GetHeight();
	csConstants.InvTileDim = 1.0f / LightGridDim;
	csConstants.RcpZMagic = RcpZMagic;
	csConstants.TileCount = tileCountX;
	csConstants.ViewProjMatrix = camera.GetViewProjMatrix();
	Context.SetDynamicConstantBufferView(0, sizeof(CSConstants), &csConstants);

	Context.Dispatch(tileCountX, tileCountY, 1);

	Context.TransitionResource(m_LightGrid, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE);
	Context.TransitionResource(m_LightGridBitMask, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE);
}