forked from MoonsideGames/Refresh
add msaa support for depth textures (#38)
Depth textures handle MSAA differently than color textures do, because there's no need for a resolve texture. This means the root VulkanTexture can have the sample count instead of needing an additional `msaaTex`. This changeset also fixes a bug where the depth buffer wasn't getting cleared if there were MSAA color attachments. Co-authored-by: Caleb Cornett <caleb.cornett@outlook.com> Reviewed-on: MoonsideGames/Refresh#38 Co-authored-by: TheSpydog <thespydog@noreply.example.org> Co-committed-by: TheSpydog <thespydog@noreply.example.org>remotes/1695145649051507776/main
parent
6439516835
commit
1f2aaeed9f
|
@ -5657,12 +5657,11 @@ static VkRenderPass VULKAN_INTERNAL_CreateRenderPass(
|
||||||
{
|
{
|
||||||
texture = (VulkanTexture*) depthStencilAttachmentInfo->texture;
|
texture = (VulkanTexture*) depthStencilAttachmentInfo->texture;
|
||||||
|
|
||||||
/* FIXME: MSAA? */
|
|
||||||
|
|
||||||
attachmentDescriptions[attachmentDescriptionCount].flags = 0;
|
attachmentDescriptions[attachmentDescriptionCount].flags = 0;
|
||||||
attachmentDescriptions[attachmentDescriptionCount].format = texture->format;
|
attachmentDescriptions[attachmentDescriptionCount].format = texture->format;
|
||||||
attachmentDescriptions[attachmentDescriptionCount].samples =
|
attachmentDescriptions[attachmentDescriptionCount].samples = RefreshToVK_SampleCount[
|
||||||
VK_SAMPLE_COUNT_1_BIT;
|
texture->sampleCount
|
||||||
|
];
|
||||||
attachmentDescriptions[attachmentDescriptionCount].loadOp = RefreshToVK_LoadOp[
|
attachmentDescriptions[attachmentDescriptionCount].loadOp = RefreshToVK_LoadOp[
|
||||||
depthStencilAttachmentInfo->loadOp
|
depthStencilAttachmentInfo->loadOp
|
||||||
];
|
];
|
||||||
|
@ -5844,8 +5843,9 @@ static VkRenderPass VULKAN_INTERNAL_CreateTransientRenderPass(
|
||||||
renderer,
|
renderer,
|
||||||
attachmentInfo.depthStencilFormat
|
attachmentInfo.depthStencilFormat
|
||||||
);
|
);
|
||||||
attachmentDescriptions[attachmentDescriptionCount].samples =
|
attachmentDescriptions[attachmentDescriptionCount].samples = RefreshToVK_SampleCount[
|
||||||
VK_SAMPLE_COUNT_1_BIT; /* FIXME: do these take multisamples? */
|
sampleCount
|
||||||
|
];
|
||||||
attachmentDescriptions[attachmentDescriptionCount].loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
|
attachmentDescriptions[attachmentDescriptionCount].loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
|
||||||
attachmentDescriptions[attachmentDescriptionCount].storeOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
|
attachmentDescriptions[attachmentDescriptionCount].storeOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
|
||||||
attachmentDescriptions[attachmentDescriptionCount].stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
|
attachmentDescriptions[attachmentDescriptionCount].stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
|
||||||
|
@ -6547,10 +6547,11 @@ static Refresh_Texture* VULKAN_CreateTexture(
|
||||||
VK_IMAGE_USAGE_TRANSFER_SRC_BIT
|
VK_IMAGE_USAGE_TRANSFER_SRC_BIT
|
||||||
);
|
);
|
||||||
VkImageAspectFlags imageAspectFlags;
|
VkImageAspectFlags imageAspectFlags;
|
||||||
|
uint8_t isDepthFormat = IsRefreshDepthFormat(textureCreateInfo->format);
|
||||||
VkFormat format;
|
VkFormat format;
|
||||||
VulkanTexture *result;
|
VulkanTexture *result;
|
||||||
|
|
||||||
if (IsRefreshDepthFormat(textureCreateInfo->format))
|
if (isDepthFormat)
|
||||||
{
|
{
|
||||||
format = RefreshToVK_DepthFormat(renderer, textureCreateInfo->format);
|
format = RefreshToVK_DepthFormat(renderer, textureCreateInfo->format);
|
||||||
}
|
}
|
||||||
|
@ -6579,7 +6580,7 @@ static Refresh_Texture* VULKAN_CreateTexture(
|
||||||
imageUsageFlags |= VK_IMAGE_USAGE_STORAGE_BIT;
|
imageUsageFlags |= VK_IMAGE_USAGE_STORAGE_BIT;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (IsDepthFormat(format))
|
if (isDepthFormat)
|
||||||
{
|
{
|
||||||
imageAspectFlags = VK_IMAGE_ASPECT_DEPTH_BIT;
|
imageAspectFlags = VK_IMAGE_ASPECT_DEPTH_BIT;
|
||||||
|
|
||||||
|
@ -6600,14 +6601,18 @@ static Refresh_Texture* VULKAN_CreateTexture(
|
||||||
textureCreateInfo->depth,
|
textureCreateInfo->depth,
|
||||||
textureCreateInfo->isCube,
|
textureCreateInfo->isCube,
|
||||||
textureCreateInfo->levelCount,
|
textureCreateInfo->levelCount,
|
||||||
REFRESH_SAMPLECOUNT_1,
|
isDepthFormat ?
|
||||||
|
textureCreateInfo->sampleCount : /* depth textures do not have a separate msaaTex */
|
||||||
|
REFRESH_SAMPLECOUNT_1,
|
||||||
format,
|
format,
|
||||||
imageAspectFlags,
|
imageAspectFlags,
|
||||||
imageUsageFlags
|
imageUsageFlags
|
||||||
);
|
);
|
||||||
|
|
||||||
/* create the MSAA texture */
|
/* create the MSAA texture for color attachments, if needed */
|
||||||
if (result != NULL && textureCreateInfo->sampleCount > REFRESH_SAMPLECOUNT_1)
|
if ( result != NULL &&
|
||||||
|
!isDepthFormat &&
|
||||||
|
textureCreateInfo->sampleCount > REFRESH_SAMPLECOUNT_1 )
|
||||||
{
|
{
|
||||||
result->msaaTex = VULKAN_INTERNAL_CreateTexture(
|
result->msaaTex = VULKAN_INTERNAL_CreateTexture(
|
||||||
renderer,
|
renderer,
|
||||||
|
@ -8296,6 +8301,7 @@ static void VULKAN_BeginRenderPass(
|
||||||
VkClearValue *clearValues;
|
VkClearValue *clearValues;
|
||||||
uint32_t clearCount = colorAttachmentCount;
|
uint32_t clearCount = colorAttachmentCount;
|
||||||
uint32_t multisampleAttachmentCount = 0;
|
uint32_t multisampleAttachmentCount = 0;
|
||||||
|
uint32_t totalColorAttachmentCount = 0;
|
||||||
uint32_t i;
|
uint32_t i;
|
||||||
VkImageAspectFlags depthAspectFlags;
|
VkImageAspectFlags depthAspectFlags;
|
||||||
Refresh_Viewport defaultViewport;
|
Refresh_Viewport defaultViewport;
|
||||||
|
@ -8395,9 +8401,8 @@ static void VULKAN_BeginRenderPass(
|
||||||
texture = (VulkanTexture*) depthStencilAttachmentInfo->texture;
|
texture = (VulkanTexture*) depthStencilAttachmentInfo->texture;
|
||||||
depthAspectFlags = VK_IMAGE_ASPECT_DEPTH_BIT;
|
depthAspectFlags = VK_IMAGE_ASPECT_DEPTH_BIT;
|
||||||
|
|
||||||
if (IsStencilFormat(
|
if (IsStencilFormat(texture->format))
|
||||||
texture->format
|
{
|
||||||
)) {
|
|
||||||
depthAspectFlags |= VK_IMAGE_ASPECT_STENCIL_BIT;
|
depthAspectFlags |= VK_IMAGE_ASPECT_STENCIL_BIT;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -8424,7 +8429,9 @@ static void VULKAN_BeginRenderPass(
|
||||||
|
|
||||||
clearValues = SDL_stack_alloc(VkClearValue, clearCount);
|
clearValues = SDL_stack_alloc(VkClearValue, clearCount);
|
||||||
|
|
||||||
for (i = 0; i < colorAttachmentCount + multisampleAttachmentCount; i += 1)
|
totalColorAttachmentCount = colorAttachmentCount + multisampleAttachmentCount;
|
||||||
|
|
||||||
|
for (i = 0; i < totalColorAttachmentCount; i += 1)
|
||||||
{
|
{
|
||||||
clearValues[i].color.float32[0] = colorAttachmentInfos[i].clearColor.x;
|
clearValues[i].color.float32[0] = colorAttachmentInfos[i].clearColor.x;
|
||||||
clearValues[i].color.float32[1] = colorAttachmentInfos[i].clearColor.y;
|
clearValues[i].color.float32[1] = colorAttachmentInfos[i].clearColor.y;
|
||||||
|
@ -8444,9 +8451,9 @@ static void VULKAN_BeginRenderPass(
|
||||||
|
|
||||||
if (depthStencilAttachmentInfo != NULL)
|
if (depthStencilAttachmentInfo != NULL)
|
||||||
{
|
{
|
||||||
clearValues[colorAttachmentCount].depthStencil.depth =
|
clearValues[totalColorAttachmentCount].depthStencil.depth =
|
||||||
depthStencilAttachmentInfo->depthStencilClearValue.depth;
|
depthStencilAttachmentInfo->depthStencilClearValue.depth;
|
||||||
clearValues[colorAttachmentCount].depthStencil.stencil =
|
clearValues[totalColorAttachmentCount].depthStencil.stencil =
|
||||||
depthStencilAttachmentInfo->depthStencilClearValue.stencil;
|
depthStencilAttachmentInfo->depthStencilClearValue.stencil;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue