@@ -290,36 +290,62 @@ void CommandBuffer::ClearRenderTarget(
290
290
grfx::Image* pImage,
291
291
const grfx::RenderTargetClearValue& clearValue)
292
292
{
293
- auto pCurrentRenderPass = GetCurrentRenderPass ();
294
- if ( IsNull (pCurrentRenderPass)) {
293
+ if (! HasActiveRenderPass ()) {
294
+ PPX_LOG_WARN ( " No active render pass. " );
295
295
return ;
296
296
}
297
297
298
- // Make sure pImage is a render target in current render pass
299
- const uint32_t renderTargetIndex = pCurrentRenderPass->GetRenderTargetImageIndex (pImage);
300
- if (renderTargetIndex == UINT32_MAX) {
301
- return ;
298
+ grfx::Rect renderArea;
299
+ uint32_t colorAttachment = UINT32_MAX;
300
+ uint32_t baseArrayLayer;
301
+
302
+ // Dynamic render pass
303
+ if (mDynamicRenderPassActive ) {
304
+ renderArea = mDynamicRenderPassInfo .mRenderArea ;
305
+
306
+ auto views = mDynamicRenderPassInfo .mRenderTargetViews ;
307
+ for (uint32_t i = 0 ; i < views.size (); ++i) {
308
+ auto rtv = views[i];
309
+ auto image = rtv->GetImage ();
310
+ if (image.Get () == pImage) {
311
+ colorAttachment = i;
312
+ baseArrayLayer = rtv->GetArrayLayer ();
313
+ break ;
314
+ }
315
+ }
302
316
}
317
+ else {
318
+ // active regular render pass
319
+ auto pCurrentRenderPass = GetCurrentRenderPass ();
320
+ renderArea = pCurrentRenderPass->GetRenderArea ();
321
+
322
+ // Make sure pImage is a render target in current render pass
323
+ const uint32_t renderTargetIndex = pCurrentRenderPass->GetRenderTargetImageIndex (pImage);
324
+ colorAttachment = renderTargetIndex;
303
325
304
- // Get view at renderTargetIndex
305
- auto view = pCurrentRenderPass->GetRenderTargetView (renderTargetIndex);
326
+ auto view = pCurrentRenderPass->GetRenderTargetView (renderTargetIndex);
327
+ baseArrayLayer = view->GetArrayLayer ();
328
+ }
329
+
330
+ if (colorAttachment == UINT32_MAX) {
331
+ PPX_ASSERT_MSG (false , " Passed image is not a render target." );
332
+ return ;
333
+ }
306
334
307
335
// Clear attachment
308
336
VkClearAttachment attachment = {};
309
337
attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
310
- attachment.colorAttachment = renderTargetIndex ;
338
+ attachment.colorAttachment = colorAttachment ;
311
339
attachment.clearValue .color .float32 [0 ] = clearValue.r ;
312
340
attachment.clearValue .color .float32 [1 ] = clearValue.g ;
313
341
attachment.clearValue .color .float32 [2 ] = clearValue.b ;
314
342
attachment.clearValue .color .float32 [3 ] = clearValue.a ;
315
343
316
344
// Clear rect
317
- auto renderArea = pCurrentRenderPass->GetRenderArea ();
318
-
319
345
VkClearRect clearRect = {};
320
346
clearRect.rect .offset = {renderArea.x , renderArea.y };
321
347
clearRect.rect .extent = {renderArea.width , renderArea.height };
322
- clearRect.baseArrayLayer = view-> GetArrayLayer () ;
348
+ clearRect.baseArrayLayer = baseArrayLayer ;
323
349
clearRect.layerCount = 1 ;
324
350
325
351
vkCmdClearAttachments (
@@ -335,18 +361,30 @@ void CommandBuffer::ClearDepthStencil(
335
361
const grfx::DepthStencilClearValue& clearValue,
336
362
uint32_t clearFlags)
337
363
{
338
- auto pCurrentRenderPass = GetCurrentRenderPass ();
339
- if ( IsNull (pCurrentRenderPass)) {
364
+ if (! HasActiveRenderPass ()) {
365
+ PPX_LOG_WARN ( " No active render pass. " );
340
366
return ;
341
367
}
342
368
343
- // Make sure pImage is depth stencil in current render pass
344
- if (pCurrentRenderPass->GetDepthStencilImage ().Get () != pImage) {
345
- return ;
369
+ grfx::Rect renderArea;
370
+ uint32_t baseArrayLayer;
371
+
372
+ // Dynamic render pass
373
+ if (mDynamicRenderPassActive ) {
374
+ renderArea = mDynamicRenderPassInfo .mRenderArea ;
375
+
376
+ baseArrayLayer = mDynamicRenderPassInfo .mDepthStencilView ->GetArrayLayer ();
346
377
}
378
+ else {
379
+ // active regular render pass
380
+ auto pCurrentRenderPass = GetCurrentRenderPass ();
347
381
348
- // Get view
349
- auto view = pCurrentRenderPass->GetDepthStencilView ();
382
+ auto view = pCurrentRenderPass->GetDepthStencilView ();
383
+
384
+ renderArea = pCurrentRenderPass->GetRenderArea ();
385
+
386
+ baseArrayLayer = view->GetArrayLayer ();
387
+ }
350
388
351
389
// Aspect mask
352
390
VkImageAspectFlags aspectMask = 0 ;
@@ -364,12 +402,10 @@ void CommandBuffer::ClearDepthStencil(
364
402
attachment.clearValue .depthStencil .stencil = clearValue.stencil ;
365
403
366
404
// Clear rect
367
- auto renderArea = pCurrentRenderPass->GetRenderArea ();
368
-
369
405
VkClearRect clearRect = {};
370
406
clearRect.rect .offset = {renderArea.x , renderArea.y };
371
407
clearRect.rect .extent = {renderArea.width , renderArea.height };
372
- clearRect.baseArrayLayer = view-> GetArrayLayer () ;
408
+ clearRect.baseArrayLayer = baseArrayLayer ;
373
409
clearRect.layerCount = 1 ;
374
410
375
411
vkCmdClearAttachments (
0 commit comments