|
| 1 | +// |
| 2 | +// Copyright (c) Microsoft. All rights reserved. |
| 3 | +// This code is licensed under the MIT License (MIT). |
| 4 | +// THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF |
| 5 | +// ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY |
| 6 | +// IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR |
| 7 | +// PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT. |
| 8 | +// |
| 9 | +// Developed by Minigraph |
| 10 | +// |
| 11 | +// Author: James Stanard |
| 12 | +// |
| 13 | + |
| 14 | +#include "pch.h" |
| 15 | +#include "BufferManager.h" |
| 16 | +#include "GraphicsCore.h" |
| 17 | +#include "CommandContext.h" |
| 18 | +#include "EsramAllocator.h" |
| 19 | + |
| 20 | +namespace Graphics |
| 21 | +{ |
| 22 | + DepthBuffer g_SceneDepthBuffer; |
| 23 | + ColorBuffer g_SceneColorBuffer; |
| 24 | + ColorBuffer g_OverlayBuffer; |
| 25 | + ColorBuffer g_HorizontalBuffer; |
| 26 | + |
| 27 | + DXGI_FORMAT DefaultHdrColorFormat = DXGI_FORMAT_R11G11B10_FLOAT; |
| 28 | +} |
| 29 | + |
| 30 | +#define T2X_COLOR_FORMAT DXGI_FORMAT_R10G10B10A2_UNORM |
| 31 | +#define HDR_MOTION_FORMAT DXGI_FORMAT_R16G16B16A16_FLOAT |
| 32 | +#define DSV_FORMAT DXGI_FORMAT_D32_FLOAT |
| 33 | + |
| 34 | +void Graphics::InitializeRenderingBuffers( uint32_t bufferWidth, uint32_t bufferHeight ) |
| 35 | +{ |
| 36 | + GraphicsContext& InitContext = GraphicsContext::Begin(); |
| 37 | + |
| 38 | +// const uint32_t bufferWidth1 = (bufferWidth + 1) / 2; |
| 39 | +// const uint32_t bufferWidth2 = (bufferWidth + 3) / 4; |
| 40 | +// const uint32_t bufferWidth3 = (bufferWidth + 7) / 8; |
| 41 | +// const uint32_t bufferWidth4 = (bufferWidth + 15) / 16; |
| 42 | +// const uint32_t bufferWidth5 = (bufferWidth + 31) / 32; |
| 43 | +// const uint32_t bufferWidth6 = (bufferWidth + 63) / 64; |
| 44 | +// const uint32_t bufferHeight1 = (bufferHeight + 1) / 2; |
| 45 | +// const uint32_t bufferHeight2 = (bufferHeight + 3) / 4; |
| 46 | +// const uint32_t bufferHeight3 = (bufferHeight + 7) / 8; |
| 47 | +// const uint32_t bufferHeight4 = (bufferHeight + 15) / 16; |
| 48 | +// const uint32_t bufferHeight5 = (bufferHeight + 31) / 32; |
| 49 | +// const uint32_t bufferHeight6 = (bufferHeight + 63) / 64; |
| 50 | + |
| 51 | + EsramAllocator esram; |
| 52 | + |
| 53 | + esram.PushStack(); |
| 54 | + |
| 55 | + g_SceneColorBuffer.Create(L"Main Color Buffer", bufferWidth, bufferHeight, 1, DefaultHdrColorFormat, esram); |
| 56 | +// g_VelocityBuffer.Create(L"Motion Vectors", bufferWidth, bufferHeight, 1, DXGI_FORMAT_R32_UINT); |
| 57 | +// g_PostEffectsBuffer.Create(L"Post Effects Buffer", bufferWidth, bufferHeight, 1, DXGI_FORMAT_R32_UINT); |
| 58 | + |
| 59 | + esram.PushStack(); // Render HDR image |
| 60 | + |
| 61 | +// g_LinearDepth[0].Create(L"Linear Depth 0", bufferWidth, bufferHeight, 1, DXGI_FORMAT_R16_UNORM); |
| 62 | +// g_LinearDepth[1].Create(L"Linear Depth 1", bufferWidth, bufferHeight, 1, DXGI_FORMAT_R16_UNORM); |
| 63 | +// g_MinMaxDepth8.Create(L"MinMaxDepth 8x8", bufferWidth3, bufferHeight3, 1, DXGI_FORMAT_R32_UINT, esram); |
| 64 | +// g_MinMaxDepth16.Create(L"MinMaxDepth 16x16", bufferWidth4, bufferHeight4, 1, DXGI_FORMAT_R32_UINT, esram); |
| 65 | +// g_MinMaxDepth32.Create(L"MinMaxDepth 32x32", bufferWidth5, bufferHeight5, 1, DXGI_FORMAT_R32_UINT, esram); |
| 66 | + |
| 67 | + g_SceneDepthBuffer.Create(L"Scene Depth Buffer", bufferWidth, bufferHeight, DSV_FORMAT, esram); |
| 68 | + |
| 69 | +// esram.PushStack(); // Begin opaque geometry |
| 70 | +// |
| 71 | +// esram.PushStack(); // Begin Shading |
| 72 | +// |
| 73 | +// g_SSAOFullScreen.Create(L"SSAO Full Res", bufferWidth, bufferHeight, 1, DXGI_FORMAT_R8_UNORM); |
| 74 | +// |
| 75 | +// esram.PushStack(); // Begin generating SSAO |
| 76 | +// g_DepthDownsize1.Create(L"Depth Down-Sized 1", bufferWidth1, bufferHeight1, 1, DXGI_FORMAT_R32_FLOAT, esram); |
| 77 | +// g_DepthDownsize2.Create(L"Depth Down-Sized 2", bufferWidth2, bufferHeight2, 1, DXGI_FORMAT_R32_FLOAT, esram); |
| 78 | +// g_DepthDownsize3.Create(L"Depth Down-Sized 3", bufferWidth3, bufferHeight3, 1, DXGI_FORMAT_R32_FLOAT, esram); |
| 79 | +// g_DepthDownsize4.Create(L"Depth Down-Sized 4", bufferWidth4, bufferHeight4, 1, DXGI_FORMAT_R32_FLOAT, esram); |
| 80 | +// g_DepthTiled1.CreateArray(L"Depth De-Interleaved 1", bufferWidth3, bufferHeight3, 16, DXGI_FORMAT_R16_FLOAT, esram); |
| 81 | +// g_DepthTiled2.CreateArray(L"Depth De-Interleaved 2", bufferWidth4, bufferHeight4, 16, DXGI_FORMAT_R16_FLOAT, esram); |
| 82 | +// g_DepthTiled3.CreateArray(L"Depth De-Interleaved 3", bufferWidth5, bufferHeight5, 16, DXGI_FORMAT_R16_FLOAT, esram); |
| 83 | +// g_DepthTiled4.CreateArray(L"Depth De-Interleaved 4", bufferWidth6, bufferHeight6, 16, DXGI_FORMAT_R16_FLOAT, esram); |
| 84 | +// g_AOMerged1.Create(L"AO Re-Interleaved 1", bufferWidth1, bufferHeight1, 1, DXGI_FORMAT_R8_UNORM, esram); |
| 85 | +// g_AOMerged2.Create(L"AO Re-Interleaved 2", bufferWidth2, bufferHeight2, 1, DXGI_FORMAT_R8_UNORM, esram); |
| 86 | +// g_AOMerged3.Create(L"AO Re-Interleaved 3", bufferWidth3, bufferHeight3, 1, DXGI_FORMAT_R8_UNORM, esram); |
| 87 | +// g_AOMerged4.Create(L"AO Re-Interleaved 4", bufferWidth4, bufferHeight4, 1, DXGI_FORMAT_R8_UNORM, esram); |
| 88 | +// g_AOSmooth1.Create(L"AO Smoothed 1", bufferWidth1, bufferHeight1, 1, DXGI_FORMAT_R8_UNORM, esram); |
| 89 | +// g_AOSmooth2.Create(L"AO Smoothed 2", bufferWidth2, bufferHeight2, 1, DXGI_FORMAT_R8_UNORM, esram); |
| 90 | +// g_AOSmooth3.Create(L"AO Smoothed 3", bufferWidth3, bufferHeight3, 1, DXGI_FORMAT_R8_UNORM, esram); |
| 91 | +// g_AOHighQuality1.Create(L"AO High Quality 1", bufferWidth1, bufferHeight1, 1, DXGI_FORMAT_R8_UNORM, esram); |
| 92 | +// g_AOHighQuality2.Create(L"AO High Quality 2", bufferWidth2, bufferHeight2, 1, DXGI_FORMAT_R8_UNORM, esram); |
| 93 | +// g_AOHighQuality3.Create(L"AO High Quality 3", bufferWidth3, bufferHeight3, 1, DXGI_FORMAT_R8_UNORM, esram); |
| 94 | +// g_AOHighQuality4.Create(L"AO High Quality 4", bufferWidth4, bufferHeight4, 1, DXGI_FORMAT_R8_UNORM, esram); |
| 95 | +// esram.PopStack(); // End generating SSAO |
| 96 | +// |
| 97 | +// g_ShadowBuffer.Create(L"Shadow Map", 2048, 2048, esram); |
| 98 | +// |
| 99 | +// esram.PopStack(); // End Shading |
| 100 | +// |
| 101 | +// esram.PushStack(); // Begin depth of field |
| 102 | +// g_DoFTileClass[0].Create(L"DoF Tile Classification Buffer 0", bufferWidth4, bufferHeight4, 1, DXGI_FORMAT_R11G11B10_FLOAT); |
| 103 | +// g_DoFTileClass[1].Create(L"DoF Tile Classification Buffer 1", bufferWidth4, bufferHeight4, 1, DXGI_FORMAT_R11G11B10_FLOAT); |
| 104 | +// |
| 105 | +// g_DoFPresortBuffer.Create(L"DoF Presort Buffer", bufferWidth1, bufferHeight1, 1, DXGI_FORMAT_R11G11B10_FLOAT, esram); |
| 106 | +// g_DoFPrefilter.Create(L"DoF PreFilter Buffer", bufferWidth1, bufferHeight1, 1, DXGI_FORMAT_R11G11B10_FLOAT, esram); |
| 107 | +// g_DoFBlurColor[0].Create(L"DoF Blur Color", bufferWidth1, bufferHeight1, 1, DXGI_FORMAT_R11G11B10_FLOAT, esram); |
| 108 | +// g_DoFBlurColor[1].Create(L"DoF Blur Color", bufferWidth1, bufferHeight1, 1, DXGI_FORMAT_R11G11B10_FLOAT, esram); |
| 109 | +// g_DoFBlurAlpha[0].Create(L"DoF FG Alpha", bufferWidth1, bufferHeight1, 1, DXGI_FORMAT_R8_UNORM, esram); |
| 110 | +// g_DoFBlurAlpha[1].Create(L"DoF FG Alpha", bufferWidth1, bufferHeight1, 1, DXGI_FORMAT_R8_UNORM, esram); |
| 111 | +// g_DoFWorkQueue.Create(L"DoF Work Queue", bufferWidth4 * bufferHeight4, 4, esram); |
| 112 | +// g_DoFFastQueue.Create(L"DoF Fast Queue", bufferWidth4 * bufferHeight4, 4, esram); |
| 113 | +// g_DoFFixupQueue.Create(L"DoF Fixup Queue", bufferWidth4 * bufferHeight4, 4, esram); |
| 114 | +// esram.PopStack(); // End depth of field |
| 115 | +// |
| 116 | +// g_TemporalColor[0].Create(L"Temporal Color 0", bufferWidth, bufferHeight, 1, DXGI_FORMAT_R16G16B16A16_FLOAT); |
| 117 | +// g_TemporalColor[1].Create(L"Temporal Color 1", bufferWidth, bufferHeight, 1, DXGI_FORMAT_R16G16B16A16_FLOAT); |
| 118 | +// TemporalEffects::ClearHistory(InitContext); |
| 119 | +// |
| 120 | +// esram.PushStack(); // Begin motion blur |
| 121 | +// g_MotionPrepBuffer.Create(L"Motion Blur Prep", bufferWidth1, bufferHeight1, 1, HDR_MOTION_FORMAT, esram); |
| 122 | +// esram.PopStack(); // End motion blur |
| 123 | +// |
| 124 | +// esram.PopStack(); // End opaque geometry |
| 125 | +// |
| 126 | +// esram.PopStack(); // End HDR image |
| 127 | +// |
| 128 | +// esram.PushStack(); // Begin post processing |
| 129 | +// |
| 130 | +// // This is useful for storing per-pixel weights such as motion strength or pixel luminance |
| 131 | +// g_LumaBuffer.Create(L"Luminance", bufferWidth, bufferHeight, 1, DXGI_FORMAT_R8_UNORM, esram); |
| 132 | +// g_Histogram.Create(L"Histogram", 256, 4, esram); |
| 133 | +// |
| 134 | +// // Divisible by 128 so that after dividing by 16, we still have multiples of 8x8 tiles. The bloom |
| 135 | +// // dimensions must be at least 1/4 native resolution to avoid undersampling. |
| 136 | +// //uint32_t kBloomWidth = bufferWidth > 2560 ? Math::AlignUp(bufferWidth / 4, 128) : 640; |
| 137 | +// //uint32_t kBloomHeight = bufferHeight > 1440 ? Math::AlignUp(bufferHeight / 4, 128) : 384; |
| 138 | +// uint32_t kBloomWidth = bufferWidth > 2560 ? 1280 : 640; |
| 139 | +// uint32_t kBloomHeight = bufferHeight > 1440 ? 768 : 384; |
| 140 | +// |
| 141 | +// esram.PushStack(); // Begin bloom and tone mapping |
| 142 | +// g_LumaLR.Create(L"Luma Buffer", kBloomWidth, kBloomHeight, 1, DXGI_FORMAT_R8_UINT, esram); |
| 143 | +// g_aBloomUAV1[0].Create(L"Bloom Buffer 1a", kBloomWidth, kBloomHeight, 1, DefaultHdrColorFormat, esram); |
| 144 | +// g_aBloomUAV1[1].Create(L"Bloom Buffer 1b", kBloomWidth, kBloomHeight, 1, DefaultHdrColorFormat, esram); |
| 145 | +// g_aBloomUAV2[0].Create(L"Bloom Buffer 2a", kBloomWidth / 2, kBloomHeight / 2, 1, DefaultHdrColorFormat, esram); |
| 146 | +// g_aBloomUAV2[1].Create(L"Bloom Buffer 2b", kBloomWidth / 2, kBloomHeight / 2, 1, DefaultHdrColorFormat, esram); |
| 147 | +// g_aBloomUAV3[0].Create(L"Bloom Buffer 3a", kBloomWidth / 4, kBloomHeight / 4, 1, DefaultHdrColorFormat, esram); |
| 148 | +// g_aBloomUAV3[1].Create(L"Bloom Buffer 3b", kBloomWidth / 4, kBloomHeight / 4, 1, DefaultHdrColorFormat, esram); |
| 149 | +// g_aBloomUAV4[0].Create(L"Bloom Buffer 4a", kBloomWidth / 8, kBloomHeight / 8, 1, DefaultHdrColorFormat, esram); |
| 150 | +// g_aBloomUAV4[1].Create(L"Bloom Buffer 4b", kBloomWidth / 8, kBloomHeight / 8, 1, DefaultHdrColorFormat, esram); |
| 151 | +// g_aBloomUAV5[0].Create(L"Bloom Buffer 5a", kBloomWidth / 16, kBloomHeight / 16, 1, DefaultHdrColorFormat, esram); |
| 152 | +// g_aBloomUAV5[1].Create(L"Bloom Buffer 5b", kBloomWidth / 16, kBloomHeight / 16, 1, DefaultHdrColorFormat, esram); |
| 153 | +// esram.PopStack(); // End tone mapping |
| 154 | +// |
| 155 | +// esram.PushStack(); // Begin antialiasing |
| 156 | +// const uint32_t kFXAAWorkSize = bufferWidth * bufferHeight / 4 + 128; |
| 157 | +// g_FXAAWorkQueue.Create(L"FXAA Work Queue", kFXAAWorkSize, sizeof(uint32_t), esram); |
| 158 | +// g_FXAAColorQueue.Create(L"FXAA Color Queue", kFXAAWorkSize, sizeof(uint32_t), esram); |
| 159 | +// g_FXAAWorkCounters.Create(L"FXAA Work Counters", 2, sizeof(uint32_t)); |
| 160 | +// InitContext.ClearUAV(g_FXAAWorkCounters); |
| 161 | +// esram.PopStack(); // End antialiasing |
| 162 | +// |
| 163 | +// esram.PopStack(); // End post processing |
| 164 | +// |
| 165 | +// esram.PushStack(); // GenerateMipMaps() test |
| 166 | +// g_GenMipsBuffer.Create(L"GenMips", bufferWidth, bufferHeight, 0, DXGI_FORMAT_R11G11B10_FLOAT, esram); |
| 167 | +// esram.PopStack(); |
| 168 | + |
| 169 | + g_OverlayBuffer.Create(L"UI Overlay", g_DisplayWidth, g_DisplayHeight, 1, DXGI_FORMAT_R8G8B8A8_UNORM, esram); |
| 170 | + g_HorizontalBuffer.Create(L"Bicubic Intermediate", g_DisplayWidth, bufferHeight, 1, DefaultHdrColorFormat, esram); |
| 171 | + |
| 172 | + esram.PopStack(); // End final image |
| 173 | + |
| 174 | + InitContext.Finish(); |
| 175 | +} |
| 176 | + |
| 177 | +void Graphics::ResizeDisplayDependentBuffers(uint32_t NativeWidth, uint32_t NativeHeight) |
| 178 | +{ |
| 179 | + g_OverlayBuffer.Create(L"UI Overlay", g_DisplayWidth, g_DisplayHeight, 1, DXGI_FORMAT_R8G8B8A8_UNORM); |
| 180 | + g_HorizontalBuffer.Create(L"Bicubic Intermediate", g_DisplayWidth, NativeHeight, 1, DefaultHdrColorFormat); |
| 181 | +} |
| 182 | + |
| 183 | +void Graphics::DestroyRenderingBuffers() |
| 184 | +{ |
| 185 | + g_SceneDepthBuffer.Destroy(); |
| 186 | + g_SceneColorBuffer.Destroy(); |
| 187 | + g_OverlayBuffer.Destroy(); |
| 188 | + g_HorizontalBuffer.Destroy(); |
| 189 | +} |
0 commit comments