| 1418 | } |
| 1419 | |
| 1420 | void BindlessDeferred::RenderForward() |
| 1421 | { |
| 1422 | ID3D12GraphicsCommandList* cmdList = DX12::CmdList; |
| 1423 | |
| 1424 | PIXMarker marker(cmdList, "Forward rendering"); |
| 1425 | |
| 1426 | { |
| 1427 | // Transition render targets and depth buffers back to a writable state |
| 1428 | D3D12_RESOURCE_BARRIER barriers[3] = {}; |
| 1429 | barriers[0].Type = D3D12_RESOURCE_BARRIER_TYPE_TRANSITION; |
| 1430 | barriers[0].Flags = D3D12_RESOURCE_BARRIER_FLAG_NONE; |
| 1431 | barriers[0].Transition.pResource = mainTarget.Resource(); |
| 1432 | barriers[0].Transition.StateBefore = D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE; |
| 1433 | barriers[0].Transition.StateAfter = D3D12_RESOURCE_STATE_RENDER_TARGET; |
| 1434 | barriers[0].Transition.Subresource = 0; |
| 1435 | |
| 1436 | barriers[1].Type = D3D12_RESOURCE_BARRIER_TYPE_TRANSITION; |
| 1437 | barriers[1].Flags = D3D12_RESOURCE_BARRIER_FLAG_NONE; |
| 1438 | barriers[1].Transition.pResource = tangentFrameTarget.Resource(); |
| 1439 | barriers[1].Transition.StateBefore = D3D12_RESOURCE_STATE_NON_PIXEL_SHADER_RESOURCE; |
| 1440 | barriers[1].Transition.StateAfter = D3D12_RESOURCE_STATE_RENDER_TARGET; |
| 1441 | barriers[1].Transition.Subresource = 0; |
| 1442 | |
| 1443 | barriers[2].Type = D3D12_RESOURCE_BARRIER_TYPE_TRANSITION; |
| 1444 | barriers[2].Flags = D3D12_RESOURCE_BARRIER_FLAG_NONE; |
| 1445 | barriers[2].Transition.pResource = depthBuffer.Resource(); |
| 1446 | barriers[2].Transition.StateBefore = D3D12_RESOURCE_STATE_NON_PIXEL_SHADER_RESOURCE; |
| 1447 | barriers[2].Transition.StateAfter = D3D12_RESOURCE_STATE_DEPTH_WRITE; |
| 1448 | barriers[2].Transition.Subresource = 0; |
| 1449 | |
| 1450 | cmdList->ResourceBarrier(ArraySize_(barriers), barriers); |
| 1451 | } |
| 1452 | |
| 1453 | D3D12_CPU_DESCRIPTOR_HANDLE rtvHandles[2] = { mainTarget.RTV.CPUHandle, tangentFrameTarget.RTV.CPUHandle }; |
| 1454 | cmdList->OMSetRenderTargets(2, rtvHandles, false, &depthBuffer.DSV.CPUHandle); |
| 1455 | |
| 1456 | const float clearColor[] = { 0.0f, 0.0f, 0.0f, 0.0f }; |
| 1457 | cmdList->ClearRenderTargetView(rtvHandles[0], clearColor, 0, nullptr); |
| 1458 | cmdList->ClearRenderTargetView(rtvHandles[1], clearColor, 0, nullptr); |
| 1459 | cmdList->ClearDepthStencilView(depthBuffer.DSV.CPUHandle, D3D12_CLEAR_FLAG_DEPTH | D3D12_CLEAR_FLAG_STENCIL, 1.0f, 0, 0, nullptr); |
| 1460 | |
| 1461 | DX12::SetViewport(cmdList, mainTarget.Width(), mainTarget.Height()); |
| 1462 | |
| 1463 | if(AppSettings::DepthPrepass) |
| 1464 | meshRenderer.RenderDepthPrepass(cmdList, camera); |
| 1465 | |
| 1466 | { |
| 1467 | ProfileBlock profileBlock(cmdList, "Forward Rendering Pass"); |
| 1468 | |
| 1469 | // Render the main forward pass |
| 1470 | MainPassData mainPassData; |
| 1471 | mainPassData.SkyCache = &skyCache; |
| 1472 | mainPassData.DecalTextures = decalTextures; |
| 1473 | mainPassData.DecalBuffer = &decalBuffer; |
| 1474 | mainPassData.CursorDecal = cursorDecal; |
| 1475 | mainPassData.CursorDecalIntensity = cursorDecalIntensity; |
| 1476 | mainPassData.DecalClusterBuffer = &decalClusterBuffer; |
| 1477 | mainPassData.SpotLightBuffer = &spotLightBuffer; |
nothing calls this directly
no test coverage detected