| 317 | } |
| 318 | |
| 319 | TempRenderTarget* PostProcessorBase::GetTempRenderTarget(uint32 width, uint32 height, DXGI_FORMAT format, |
| 320 | uint32 msCount, uint32 msQuality, uint32 mipLevels, |
| 321 | bool generateMipMaps, bool useAsUAV) |
| 322 | { |
| 323 | // Look through existing render targets |
| 324 | for (size_t i = 0; i < tempRenderTargets.size(); ++i) |
| 325 | { |
| 326 | TempRenderTarget* rt = tempRenderTargets[i]; |
| 327 | if (!rt->InUse && rt->Width == width && rt->Height == height && rt->Format == format |
| 328 | && rt->MSCount == msCount && rt->MSQuality == msQuality && (rt->UAView != nullptr) == useAsUAV) |
| 329 | { |
| 330 | rt->InUse = true; |
| 331 | return rt; |
| 332 | } |
| 333 | } |
| 334 | |
| 335 | // Didn't find one, have to make one |
| 336 | TempRenderTarget* rt = new TempRenderTarget(); |
| 337 | D3D11_TEXTURE2D_DESC desc; |
| 338 | desc.Width = width; |
| 339 | desc.Height = height; |
| 340 | desc.ArraySize = 1; |
| 341 | desc.BindFlags = D3D11_BIND_SHADER_RESOURCE|D3D11_BIND_RENDER_TARGET; |
| 342 | if(useAsUAV) |
| 343 | desc.BindFlags |= D3D11_BIND_UNORDERED_ACCESS; |
| 344 | desc.CPUAccessFlags = 0; |
| 345 | desc.Format = format; |
| 346 | desc.MipLevels = mipLevels; |
| 347 | desc.MiscFlags = generateMipMaps ? D3D11_RESOURCE_MISC_GENERATE_MIPS : 0; |
| 348 | desc.SampleDesc.Count = msCount; |
| 349 | desc.SampleDesc.Quality = msQuality; |
| 350 | desc.Usage = D3D11_USAGE_DEFAULT; |
| 351 | DXCall(device->CreateTexture2D(&desc, nullptr, &rt->Texture)); |
| 352 | DXCall(device->CreateRenderTargetView(rt->Texture, nullptr, &rt->RTView)); |
| 353 | DXCall(device->CreateShaderResourceView(rt->Texture, nullptr, &rt->SRView)); |
| 354 | |
| 355 | if(useAsUAV) |
| 356 | device->CreateUnorderedAccessView(rt->Texture, nullptr, &rt->UAView); |
| 357 | else |
| 358 | rt->UAView = nullptr; |
| 359 | |
| 360 | rt->Width = width; |
| 361 | rt->Height = height; |
| 362 | rt->MSCount = msCount; |
| 363 | rt->MSQuality = msQuality; |
| 364 | rt->Format = format; |
| 365 | rt->InUse = true; |
| 366 | tempRenderTargets.push_back(rt); |
| 367 | |
| 368 | return tempRenderTargets[tempRenderTargets.size() - 1]; |
| 369 | } |
| 370 | |
| 371 | void PostProcessorBase::ClearTempRenderTargetCache() |
| 372 | { |