diff --git a/include/Refresh.h b/include/Refresh.h index 5879b8e..3bd407f 100644 --- a/include/Refresh.h +++ b/include/Refresh.h @@ -344,12 +344,6 @@ typedef struct REFRESH_DepthStencilValue uint32_t stencil; } REFRESH_DepthStencilValue; -typedef struct REFRESH_ClearValue -{ - REFRESH_Color color; - REFRESH_DepthStencilValue depthStencil; -} REFRESH_ClearValue; - typedef struct REFRESH_Rect { int32_t x; @@ -1206,18 +1200,20 @@ REFRESHAPI void REFRESH_AddDisposeGraphicsPipeline( * All load, store and resolve operations are restricted * to the given rectangle. * clearValues: - * A pointer to an array of REFRESH_ClearValue structures - * that contains clear values for each render target in the - * framebuffer. - * clearCount: The amount of clearValue structs in the above array. + * A pointer to an array of REFRESH_Color structures + * that contains clear values for each color target in the + * framebuffer. May be NULL. + * clearCount: The amount of color structs in the above array. + * depthStencilClearValue: The depth/stencil clear value. May be NULL. */ REFRESHAPI void REFRESH_BeginRenderPass( REFRESH_Device *device, REFRESH_RenderPass *renderPass, REFRESH_Framebuffer *framebuffer, REFRESH_Rect renderArea, - REFRESH_ClearValue *pClearValues, - uint32_t clearCount + REFRESH_Color *pColorClearValues, + uint32_t colorClearCount, + REFRESH_DepthStencilValue *depthStencilClearValue ); /* Ends the current render pass. */ diff --git a/src/Refresh.c b/src/Refresh.c index 6992741..4bc53c9 100644 --- a/src/Refresh.c +++ b/src/Refresh.c @@ -746,8 +746,9 @@ void REFRESH_BeginRenderPass( REFRESH_RenderPass *renderPass, REFRESH_Framebuffer *framebuffer, REFRESH_Rect renderArea, - REFRESH_ClearValue *pClearValues, - uint32_t clearCount + REFRESH_Color *pColorClearValues, + uint32_t colorClearCount, + REFRESH_DepthStencilValue *depthStencilClearValue ) { NULL_RETURN(device); device->BeginRenderPass( @@ -755,8 +756,9 @@ void REFRESH_BeginRenderPass( renderPass, framebuffer, renderArea, - pClearValues, - clearCount + pColorClearValues, + colorClearCount, + depthStencilClearValue ); } diff --git a/src/Refresh_Driver.h b/src/Refresh_Driver.h index c2f62a6..a9f3e5d 100644 --- a/src/Refresh_Driver.h +++ b/src/Refresh_Driver.h @@ -463,8 +463,9 @@ struct REFRESH_Device REFRESH_RenderPass *renderPass, REFRESH_Framebuffer *framebuffer, REFRESH_Rect renderArea, - REFRESH_ClearValue *pClearValues, - uint32_t clearCount + REFRESH_Color *pColorClearValues, + uint32_t colorClearCount, + REFRESH_DepthStencilValue *depthStencilClearValue ); void(*EndRenderPass)( diff --git a/src/Refresh_Driver_Vulkan.c b/src/Refresh_Driver_Vulkan.c index 5ea99ab..2481a8b 100644 --- a/src/Refresh_Driver_Vulkan.c +++ b/src/Refresh_Driver_Vulkan.c @@ -3859,10 +3859,57 @@ static void VULKAN_BeginRenderPass( REFRESH_RenderPass *renderPass, REFRESH_Framebuffer *framebuffer, REFRESH_Rect renderArea, - REFRESH_ClearValue *pClearValues, - uint32_t clearCount + REFRESH_Color *pColorClearValues, + uint32_t colorClearCount, + REFRESH_DepthStencilValue *depthStencilClearValue ) { - SDL_assert(0); + VulkanRenderer *renderer = (VulkanRenderer*) driverData; + VkClearValue *clearValues; + uint32_t i; + uint32_t colorCount = colorClearCount; + + if (depthStencilClearValue != NULL) + { + colorCount += 1; + } + + clearValues = SDL_stack_alloc(VkClearValue, colorCount); + + for (i = 0; i < colorClearCount; i += 1) + { + clearValues[i].color.uint32[0] = pColorClearValues[i].r; + clearValues[i].color.uint32[1] = pColorClearValues[i].g; + clearValues[i].color.uint32[2] = pColorClearValues[i].b; + clearValues[i].color.uint32[3] = pColorClearValues[i].a; + } + + if (depthStencilClearValue != NULL) + { + clearValues[colorClearCount].depthStencil.depth = + depthStencilClearValue->depth; + clearValues[colorClearCount].depthStencil.stencil = + depthStencilClearValue->stencil; + } + + VkRenderPassBeginInfo renderPassBeginInfo; + renderPassBeginInfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO; + renderPassBeginInfo.pNext = NULL; + renderPassBeginInfo.renderPass = (VkRenderPass) renderPass; + renderPassBeginInfo.framebuffer = (VkFramebuffer) framebuffer; + renderPassBeginInfo.renderArea.extent.width = renderArea.w; + renderPassBeginInfo.renderArea.extent.height = renderArea.h; + renderPassBeginInfo.renderArea.offset.x = renderArea.x; + renderPassBeginInfo.renderArea.offset.y = renderArea.y; + renderPassBeginInfo.pClearValues = clearValues; + renderPassBeginInfo.clearValueCount = colorCount; + + RECORD_CMD(renderer->vkCmdBeginRenderPass( + renderer->currentCommandBuffer, + &renderPassBeginInfo, + VK_SUBPASS_CONTENTS_INLINE + )); + + SDL_stack_free(clearValues); } static void VULKAN_EndRenderPass(