From 8b31a9448ad049b6446fd4ec338d01991054b3ec Mon Sep 17 00:00:00 2001 From: kd-11 Date: Thu, 21 Dec 2017 16:27:26 +0300 Subject: [PATCH] vulkan: Tweaks to sampler state fallback paths - Make all texture access on non-existent textures return 0 - If border color is closer to 0, then set alpha to 0 as well (might break some corner cases with alpha test) - Zero initialize null sampler --- rpcs3/Emu/RSX/VK/VKFormats.cpp | 5 ++--- rpcs3/Emu/RSX/VK/VKHelpers.cpp | 15 +++++++++++---- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/rpcs3/Emu/RSX/VK/VKFormats.cpp b/rpcs3/Emu/RSX/VK/VKFormats.cpp index ee4cdef8b3..c99ec0d1c5 100644 --- a/rpcs3/Emu/RSX/VK/VKFormats.cpp +++ b/rpcs3/Emu/RSX/VK/VKFormats.cpp @@ -71,12 +71,11 @@ VkFilter get_mag_filter(rsx::texture_magnify_filter mag_filter) VkBorderColor get_border_color(u8 color) { + // TODO: Handle simulated alpha tests and modify texture operations accordingly if ((color / 0x10) >= 0x8) return VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE; else - return VK_BORDER_COLOR_FLOAT_OPAQUE_BLACK; - - // TODO: VK_BORDER_COLOR_FLOAT_TRANSPARENT_BLACK + return VK_BORDER_COLOR_FLOAT_TRANSPARENT_BLACK; } VkSamplerAddressMode vk_wrap_mode(rsx::texture_wrap_mode gcm_wrap) diff --git a/rpcs3/Emu/RSX/VK/VKHelpers.cpp b/rpcs3/Emu/RSX/VK/VKHelpers.cpp index ebb89b9300..ad75573a8a 100644 --- a/rpcs3/Emu/RSX/VK/VKHelpers.cpp +++ b/rpcs3/Emu/RSX/VK/VKHelpers.cpp @@ -194,9 +194,9 @@ namespace vk VkSamplerCreateInfo sampler_info = {}; sampler_info.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO; - sampler_info.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER; - sampler_info.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER; - sampler_info.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER; + sampler_info.addressModeU = VK_SAMPLER_ADDRESS_MODE_REPEAT; + sampler_info.addressModeV = VK_SAMPLER_ADDRESS_MODE_REPEAT; + sampler_info.addressModeW = VK_SAMPLER_ADDRESS_MODE_REPEAT; sampler_info.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST; sampler_info.anisotropyEnable = VK_FALSE; sampler_info.compareEnable = VK_FALSE; @@ -225,7 +225,14 @@ namespace vk VK_FORMAT_B8G8R8A8_UNORM, {VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A}, {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1})); - change_image_layout(cmd, g_null_texture.get(), VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1}); + // Initialize memory to transparent black + VkClearColorValue clear_color = {}; + VkImageSubresourceRange range = { VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1 }; + change_image_layout(cmd, g_null_texture.get(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, range); + vkCmdClearColorImage(cmd, g_null_texture->value, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, &clear_color, 1, &range); + + // Prep for shader access + change_image_layout(cmd, g_null_texture.get(), VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, range); return g_null_image_view->value; }