From 55ef97639a9aac45ef4e0fe8ff20d278aa2afea4 Mon Sep 17 00:00:00 2001 From: Henrik Rydgard Date: Sun, 10 Jan 2016 13:08:54 +0100 Subject: [PATCH] More zero-initialization. Fix scope issue, MSVC's optimizer was aggressive enough that this was a problem. Fixes textures in release mode. --- GPU/Vulkan/DrawEngineVulkan.cpp | 6 +++--- GPU/Vulkan/ShaderManagerVulkan.cpp | 3 +++ GPU/Vulkan/TextureCacheVulkan.cpp | 7 +++++-- GPU/Vulkan/TextureCacheVulkan.h | 1 - ext/native/thin3d/VulkanContext.h | 6 +++--- 5 files changed, 14 insertions(+), 9 deletions(-) diff --git a/GPU/Vulkan/DrawEngineVulkan.cpp b/GPU/Vulkan/DrawEngineVulkan.cpp index e49888fd83..cfd9b11564 100644 --- a/GPU/Vulkan/DrawEngineVulkan.cpp +++ b/GPU/Vulkan/DrawEngineVulkan.cpp @@ -394,6 +394,7 @@ VkDescriptorSet DrawEngineVulkan::GetDescriptorSet(VkImageView imageView, VkSamp VkDescriptorSet desc; VkDescriptorSetAllocateInfo descAlloc; + VkDescriptorImageInfo tex; descAlloc.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO; descAlloc.pNext = nullptr; descAlloc.pSetLayouts = &descriptorSetLayout_; @@ -408,7 +409,6 @@ VkDescriptorSet DrawEngineVulkan::GetDescriptorSet(VkImageView imageView, VkSamp // Main texture int n = 0; if (imageView) { - VkDescriptorImageInfo tex; // TODO: Also support LAYOUT_GENERAL to be able to texture from framebuffers without transitioning them? tex.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; tex.imageView = imageView; @@ -480,8 +480,8 @@ void DrawEngineVulkan::DoFlush(VkCommandBuffer cmd) { bool useHWTransform = CanUseHardwareTransform(prim); - VulkanVertexShader *vshader; - VulkanFragmentShader *fshader; + VulkanVertexShader *vshader = nullptr; + VulkanFragmentShader *fshader = nullptr; // TODO: Keep these between calls if not dirty. uint32_t baseUBOOffset = 0; diff --git a/GPU/Vulkan/ShaderManagerVulkan.cpp b/GPU/Vulkan/ShaderManagerVulkan.cpp index c85336868f..d8e390aebf 100644 --- a/GPU/Vulkan/ShaderManagerVulkan.cpp +++ b/GPU/Vulkan/ShaderManagerVulkan.cpp @@ -175,6 +175,9 @@ ShaderManagerVulkan::ShaderManagerVulkan(VulkanContext *vulkan) : vulkan_(vulkan), lastVShader_(nullptr), lastFShader_(nullptr), globalDirty_(0xFFFFFFFF) { codeBuffer_ = new char[16384]; uboAlignment_ = vulkan_->GetPhysicalDeviceProperties().limits.minUniformBufferOffsetAlignment; + memset(&ub_base, 0, sizeof(ub_base)); + memset(&ub_lights, 0, sizeof(ub_lights)); + memset(&ub_bones, 0, sizeof(ub_bones)); } ShaderManagerVulkan::~ShaderManagerVulkan() { diff --git a/GPU/Vulkan/TextureCacheVulkan.cpp b/GPU/Vulkan/TextureCacheVulkan.cpp index 43c2da5f3e..c3f88db497 100644 --- a/GPU/Vulkan/TextureCacheVulkan.cpp +++ b/GPU/Vulkan/TextureCacheVulkan.cpp @@ -95,7 +95,7 @@ VkSampler SamplerCache::GetOrCreateSampler(const SamplerCacheKey &key) { samp.compareEnable = false; samp.compareOp = VK_COMPARE_OP_ALWAYS; samp.flags = 0; - samp.magFilter = (key.magFilt & 1) ? VK_FILTER_LINEAR : VK_FILTER_NEAREST; + samp.magFilter = key.magFilt ? VK_FILTER_LINEAR : VK_FILTER_NEAREST; samp.minFilter = key.minFilt ? VK_FILTER_LINEAR : VK_FILTER_NEAREST; // TODO: Aniso samp.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST; // key.4) ? ((key.magFilt & 2) ? VK_SAMPLER_MIPMAP_MODE_LINEAR : VK_SAMPLER_MIPMAP_MODE_NEAREST) : VK_SAMPLER_MIPMAP_MODE_BASE; samp.maxAnisotropy = 1.0f; @@ -111,7 +111,10 @@ VkSampler SamplerCache::GetOrCreateSampler(const SamplerCacheKey &key) { return sampler; } -TextureCacheVulkan::TextureCacheVulkan(VulkanContext *vulkan) : vulkan_(vulkan), samplerCache_(vulkan), cacheSizeEstimate_(0), secondCacheSizeEstimate_(0), clearCacheNextFrame_(false), lowMemoryMode_(false), clutBuf_(NULL), texelsScaledThisFrame_(0) { +TextureCacheVulkan::TextureCacheVulkan(VulkanContext *vulkan) + : vulkan_(vulkan), samplerCache_(vulkan), cacheSizeEstimate_(0), secondCacheSizeEstimate_(0), + clearCacheNextFrame_(false), lowMemoryMode_(false), clutBuf_(NULL), texelsScaledThisFrame_(0), + clutAlphaLinear_(false) { timesInvalidatedAllThisFrame_ = 0; lastBoundTexture = nullptr; decimationCounter_ = TEXCACHE_DECIMATION_INTERVAL; diff --git a/GPU/Vulkan/TextureCacheVulkan.h b/GPU/Vulkan/TextureCacheVulkan.h index dd70514c3f..46bd17688e 100644 --- a/GPU/Vulkan/TextureCacheVulkan.h +++ b/GPU/Vulkan/TextureCacheVulkan.h @@ -170,7 +170,6 @@ private: u16 clutAlphaLinearColor_; CachedTextureVulkan *lastBoundTexture; - float maxAnisotropyLevel; int decimationCounter_; int texelsScaledThisFrame_; diff --git a/ext/native/thin3d/VulkanContext.h b/ext/native/thin3d/VulkanContext.h index 7568368d64..920aecaa9b 100644 --- a/ext/native/thin3d/VulkanContext.h +++ b/ext/native/thin3d/VulkanContext.h @@ -345,6 +345,7 @@ public: VulkanTexture(VulkanContext *vulkan) : vulkan_(vulkan), image(nullptr), imageLayout(VK_IMAGE_LAYOUT_UNDEFINED), mem(nullptr), view(nullptr), tex_width(0), tex_height(0), format_(VK_FORMAT_UNDEFINED), mappableImage(nullptr), mappableMemory(nullptr), needStaging(false) { + memset(&mem_reqs, 0, sizeof(mem_reqs)); } ~VulkanTexture() { Destroy(); @@ -383,7 +384,6 @@ private: class VulkanFramebuffer { public: void Create(VulkanContext *vulkan, int w, int h, VkFormat format); - // void TransitionToImage() void BeginPass(VkCommandBuffer cmd); void EndPass(VkCommandBuffer cmd); @@ -407,7 +407,7 @@ public: VulkanPushBuffer(VulkanContext *vulkan, size_t size) : offset_(0), size_(size), writePtr_(nullptr), deviceMemory_(nullptr) { VkDevice device = vulkan->GetDevice(); - VkBufferCreateInfo b; + VkBufferCreateInfo b = {}; b.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO; b.pNext = nullptr; b.size = size; @@ -420,7 +420,7 @@ public: assert(VK_SUCCESS == res); // Okay, that's the buffer. Now let's allocate some memory for it. - VkMemoryAllocateInfo alloc; + VkMemoryAllocateInfo alloc = {}; alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO; alloc.pNext = nullptr; vulkan->MemoryTypeFromProperties(0xFFFFFFFF, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT, &alloc.memoryTypeIndex);