forked from MoonsideGames/Refresh
D16 fallback when unsupported
parent
488cb8c535
commit
0e7720ccf6
|
@ -1687,6 +1687,10 @@ typedef struct VulkanRenderer
|
||||||
|
|
||||||
VkDeviceSize minUBOAlignment;
|
VkDeviceSize minUBOAlignment;
|
||||||
|
|
||||||
|
/* Some drivers don't support D16 for some reason. Fun! */
|
||||||
|
VkFormat D16Format;
|
||||||
|
VkFormat D16S8Format;
|
||||||
|
|
||||||
VulkanTexture **texturesToDestroy;
|
VulkanTexture **texturesToDestroy;
|
||||||
uint32_t texturesToDestroyCount;
|
uint32_t texturesToDestroyCount;
|
||||||
uint32_t texturesToDestroyCapacity;
|
uint32_t texturesToDestroyCapacity;
|
||||||
|
@ -1795,6 +1799,40 @@ static inline void LogVulkanResultAsWarn(
|
||||||
|
|
||||||
/* Utility */
|
/* Utility */
|
||||||
|
|
||||||
|
static inline VkFormat RefreshToVK_DepthFormat(
|
||||||
|
VulkanRenderer* renderer,
|
||||||
|
Refresh_TextureFormat format
|
||||||
|
) {
|
||||||
|
switch (format)
|
||||||
|
{
|
||||||
|
case REFRESH_TEXTUREFORMAT_D16_UNORM:
|
||||||
|
return renderer->D16Format;
|
||||||
|
case REFRESH_TEXTUREFORMAT_D16_UNORM_S8_UINT:
|
||||||
|
return renderer->D16S8Format;
|
||||||
|
case REFRESH_TEXTUREFORMAT_D32_SFLOAT:
|
||||||
|
return VK_FORMAT_D32_SFLOAT;
|
||||||
|
case REFRESH_TEXTUREFORMAT_D32_SFLOAT_S8_UINT:
|
||||||
|
return VK_FORMAT_D32_SFLOAT_S8_UINT;
|
||||||
|
default:
|
||||||
|
return VK_FORMAT_UNDEFINED;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline uint8_t IsRefreshDepthFormat(Refresh_TextureFormat format)
|
||||||
|
{
|
||||||
|
switch (format)
|
||||||
|
{
|
||||||
|
case REFRESH_TEXTUREFORMAT_D16_UNORM:
|
||||||
|
case REFRESH_TEXTUREFORMAT_D32_SFLOAT:
|
||||||
|
case REFRESH_TEXTUREFORMAT_D16_UNORM_S8_UINT:
|
||||||
|
case REFRESH_TEXTUREFORMAT_D32_SFLOAT_S8_UINT:
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
default:
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static inline uint8_t IsDepthFormat(VkFormat format)
|
static inline uint8_t IsDepthFormat(VkFormat format)
|
||||||
{
|
{
|
||||||
switch(format)
|
switch(format)
|
||||||
|
@ -5662,9 +5700,10 @@ static VkRenderPass VULKAN_INTERNAL_CreateTransientRenderPass(
|
||||||
if (attachmentInfo.hasDepthStencilAttachment)
|
if (attachmentInfo.hasDepthStencilAttachment)
|
||||||
{
|
{
|
||||||
attachmentDescriptions[attachmentDescriptionCount].flags = 0;
|
attachmentDescriptions[attachmentDescriptionCount].flags = 0;
|
||||||
attachmentDescriptions[attachmentDescriptionCount].format = RefreshToVK_SurfaceFormat[
|
attachmentDescriptions[attachmentDescriptionCount].format = RefreshToVK_DepthFormat(
|
||||||
|
renderer,
|
||||||
attachmentInfo.depthStencilFormat
|
attachmentInfo.depthStencilFormat
|
||||||
];
|
);
|
||||||
attachmentDescriptions[attachmentDescriptionCount].samples =
|
attachmentDescriptions[attachmentDescriptionCount].samples =
|
||||||
VK_SAMPLE_COUNT_1_BIT; /* FIXME: do these take multisamples? */
|
VK_SAMPLE_COUNT_1_BIT; /* FIXME: do these take multisamples? */
|
||||||
attachmentDescriptions[attachmentDescriptionCount].loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
|
attachmentDescriptions[attachmentDescriptionCount].loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
|
||||||
|
@ -6361,7 +6400,16 @@ static Refresh_Texture* VULKAN_CreateTexture(
|
||||||
VK_IMAGE_USAGE_TRANSFER_SRC_BIT
|
VK_IMAGE_USAGE_TRANSFER_SRC_BIT
|
||||||
);
|
);
|
||||||
VkImageAspectFlags imageAspectFlags;
|
VkImageAspectFlags imageAspectFlags;
|
||||||
VkFormat format = RefreshToVK_SurfaceFormat[textureCreateInfo->format];
|
VkFormat format;
|
||||||
|
|
||||||
|
if (IsRefreshDepthFormat(textureCreateInfo->format))
|
||||||
|
{
|
||||||
|
format = RefreshToVK_DepthFormat(renderer, textureCreateInfo->format);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
format = RefreshToVK_SurfaceFormat[textureCreateInfo->format];
|
||||||
|
}
|
||||||
|
|
||||||
if (textureCreateInfo->usageFlags & REFRESH_TEXTUREUSAGE_SAMPLER_BIT)
|
if (textureCreateInfo->usageFlags & REFRESH_TEXTUREUSAGE_SAMPLER_BIT)
|
||||||
{
|
{
|
||||||
|
@ -10189,6 +10237,9 @@ static Refresh_Device* VULKAN_CreateDevice(
|
||||||
VkDescriptorPoolSize poolSizes[4];
|
VkDescriptorPoolSize poolSizes[4];
|
||||||
VkDescriptorSetAllocateInfo descriptorAllocateInfo;
|
VkDescriptorSetAllocateInfo descriptorAllocateInfo;
|
||||||
|
|
||||||
|
/* Variables: Image Format Detection */
|
||||||
|
VkImageFormatProperties imageFormatProperties;
|
||||||
|
|
||||||
VULKAN_INTERNAL_LoadEntryPoints(renderer);
|
VULKAN_INTERNAL_LoadEntryPoints(renderer);
|
||||||
|
|
||||||
renderer->presentMode = presentationParameters->presentMode;
|
renderer->presentMode = presentationParameters->presentMode;
|
||||||
|
@ -10628,12 +10679,53 @@ static Refresh_Device* VULKAN_CreateDevice(
|
||||||
renderer->renderTargetHashArray.capacity = 0;
|
renderer->renderTargetHashArray.capacity = 0;
|
||||||
|
|
||||||
/* Initialize transfer buffer pool */
|
/* Initialize transfer buffer pool */
|
||||||
|
|
||||||
renderer->transferBufferPool.lock = SDL_CreateMutex();
|
renderer->transferBufferPool.lock = SDL_CreateMutex();
|
||||||
|
|
||||||
renderer->transferBufferPool.availableBufferCapacity = 4;
|
renderer->transferBufferPool.availableBufferCapacity = 4;
|
||||||
renderer->transferBufferPool.availableBufferCount = 0;
|
renderer->transferBufferPool.availableBufferCount = 0;
|
||||||
renderer->transferBufferPool.availableBuffers = SDL_malloc(renderer->transferBufferPool.availableBufferCapacity * sizeof(VulkanTransferBuffer*));
|
renderer->transferBufferPool.availableBuffers = SDL_malloc(renderer->transferBufferPool.availableBufferCapacity * sizeof(VulkanTransferBuffer*));
|
||||||
|
|
||||||
|
/* Some drivers don't support D16, so we have to fall back to D32. */
|
||||||
|
|
||||||
|
vulkanResult = renderer->vkGetPhysicalDeviceImageFormatProperties(
|
||||||
|
renderer->physicalDevice,
|
||||||
|
VK_FORMAT_D16_UNORM,
|
||||||
|
VK_IMAGE_TYPE_2D,
|
||||||
|
VK_IMAGE_TILING_OPTIMAL,
|
||||||
|
VK_IMAGE_ASPECT_DEPTH_BIT,
|
||||||
|
0,
|
||||||
|
&imageFormatProperties
|
||||||
|
);
|
||||||
|
|
||||||
|
if (vulkanResult == VK_ERROR_FORMAT_NOT_SUPPORTED)
|
||||||
|
{
|
||||||
|
renderer->D16Format = VK_FORMAT_D32_SFLOAT;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
renderer->D16Format = VK_FORMAT_D16_UNORM;
|
||||||
|
}
|
||||||
|
|
||||||
|
vulkanResult = renderer->vkGetPhysicalDeviceImageFormatProperties(
|
||||||
|
renderer->physicalDevice,
|
||||||
|
VK_FORMAT_D16_UNORM_S8_UINT,
|
||||||
|
VK_IMAGE_TYPE_2D,
|
||||||
|
VK_IMAGE_TILING_OPTIMAL,
|
||||||
|
VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT,
|
||||||
|
0,
|
||||||
|
&imageFormatProperties
|
||||||
|
);
|
||||||
|
|
||||||
|
if (vulkanResult == VK_ERROR_FORMAT_NOT_SUPPORTED)
|
||||||
|
{
|
||||||
|
renderer->D16S8Format = VK_FORMAT_D32_SFLOAT_S8_UINT;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
renderer->D16S8Format = VK_FORMAT_D16_UNORM_S8_UINT;
|
||||||
|
}
|
||||||
|
|
||||||
/* Deferred destroy storage */
|
/* Deferred destroy storage */
|
||||||
|
|
||||||
renderer->texturesToDestroyCapacity = 16;
|
renderer->texturesToDestroyCapacity = 16;
|
||||||
|
|
Loading…
Reference in New Issue