diff --git a/Common/GPU/Vulkan/VulkanImage.cpp b/Common/GPU/Vulkan/VulkanImage.cpp index 47b1432360..8efcb69834 100644 --- a/Common/GPU/Vulkan/VulkanImage.cpp +++ b/Common/GPU/Vulkan/VulkanImage.cpp @@ -5,9 +5,15 @@ #include "Common/GPU/Vulkan/VulkanAlloc.h" #include "Common/GPU/Vulkan/VulkanImage.h" #include "Common/GPU/Vulkan/VulkanMemory.h" +#include "Common/StringUtils.h" using namespace PPSSPP_VK; +VulkanTexture::VulkanTexture(VulkanContext *vulkan, const char *tag) + : vulkan_(vulkan) { + truncate_cpy(tag_, tag); +} + void VulkanTexture::Wipe() { if (view_ != VK_NULL_HANDLE) { vulkan_->Delete().QueueDeleteImageView(view_); @@ -80,7 +86,7 @@ bool VulkanTexture::CreateDirect(VkCommandBuffer cmd, int w, int h, int depth, i VkResult res = vmaCreateImage(vulkan_->Allocator(), &image_create_info, &allocCreateInfo, &image_, &allocation_, &allocInfo); // Apply the tag - vulkan_->SetDebugName(image_, VK_OBJECT_TYPE_IMAGE, tag_.c_str()); + vulkan_->SetDebugName(image_, VK_OBJECT_TYPE_IMAGE, tag_); // Write a command to transition the image to the requested layout, if it's not already that layout. if (initialLayout != VK_IMAGE_LAYOUT_UNDEFINED && initialLayout != VK_IMAGE_LAYOUT_PREINITIALIZED) { @@ -123,14 +129,14 @@ bool VulkanTexture::CreateDirect(VkCommandBuffer cmd, int w, int h, int depth, i _assert_(res == VK_ERROR_OUT_OF_HOST_MEMORY || res == VK_ERROR_OUT_OF_DEVICE_MEMORY || res == VK_ERROR_TOO_MANY_OBJECTS); return false; } - vulkan_->SetDebugName(view_, VK_OBJECT_TYPE_IMAGE_VIEW, tag_.c_str()); + vulkan_->SetDebugName(view_, VK_OBJECT_TYPE_IMAGE_VIEW, tag_); // Additionally, create an array view, but only if it's a 2D texture. if (view_info.viewType == VK_IMAGE_VIEW_TYPE_2D) { view_info.viewType = VK_IMAGE_VIEW_TYPE_2D_ARRAY; res = vkCreateImageView(vulkan_->GetDevice(), &view_info, NULL, &arrayView_); _assert_(res == VK_SUCCESS); - vulkan_->SetDebugName(arrayView_, VK_OBJECT_TYPE_IMAGE_VIEW, tag_.c_str()); + vulkan_->SetDebugName(arrayView_, VK_OBJECT_TYPE_IMAGE_VIEW, tag_); } return true; diff --git a/Common/GPU/Vulkan/VulkanImage.h b/Common/GPU/Vulkan/VulkanImage.h index e0aa32d385..e4835059ed 100644 --- a/Common/GPU/Vulkan/VulkanImage.h +++ b/Common/GPU/Vulkan/VulkanImage.h @@ -1,6 +1,5 @@ #pragma once -#include #include "VulkanLoader.h" class VulkanContext; @@ -12,9 +11,7 @@ VK_DEFINE_HANDLE(VmaAllocation); // ALWAYS use an allocator when calling CreateDirect. class VulkanTexture { public: - VulkanTexture(VulkanContext *vulkan) - : vulkan_(vulkan) { - } + VulkanTexture(VulkanContext *vulkan, const char *tag); ~VulkanTexture() { Destroy(); } @@ -37,12 +34,10 @@ public: void Destroy(); - void SetTag(const char *tag) { - tag_ = tag; - } - const std::string &Tag() const { + const char *Tag() const { return tag_; } + void Touch() {} // Used in image copies, etc. @@ -74,5 +69,5 @@ private: int16_t depth_ = 1; VkFormat format_ = VK_FORMAT_UNDEFINED; - std::string tag_; + char tag_[64]; }; diff --git a/Common/GPU/Vulkan/thin3d_vulkan.cpp b/Common/GPU/Vulkan/thin3d_vulkan.cpp index 46be4cf00b..ae6808d87c 100644 --- a/Common/GPU/Vulkan/thin3d_vulkan.cpp +++ b/Common/GPU/Vulkan/thin3d_vulkan.cpp @@ -652,8 +652,7 @@ static inline VkSamplerAddressMode AddressModeToVulkan(Draw::TextureAddressMode VulkanTexture *VKContext::GetNullTexture() { if (!nullTexture_) { VkCommandBuffer cmdInit = renderManager_.GetInitCmd(); - nullTexture_ = new VulkanTexture(vulkan_); - nullTexture_->SetTag("Null"); + nullTexture_ = new VulkanTexture(vulkan_, "Null"); int w = 8; int h = 8; nullTexture_->CreateDirect(cmdInit, w, h, 1, 1, VK_FORMAT_A8B8G8R8_UNORM_PACK32, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, @@ -737,10 +736,7 @@ bool VKTexture::Create(VkCommandBuffer cmd, VulkanPushBuffer *push, const Textur width_ = desc.width; height_ = desc.height; depth_ = desc.depth; - vkTex_ = new VulkanTexture(vulkan_); - if (desc.tag) { - vkTex_->SetTag(desc.tag); - } + vkTex_ = new VulkanTexture(vulkan_, desc.tag); VkFormat vulkanFormat = DataFormatToVulkan(format_); int bpp = GetBpp(vulkanFormat); int bytesPerPixel = bpp / 8; diff --git a/GPU/Vulkan/TextureCacheVulkan.cpp b/GPU/Vulkan/TextureCacheVulkan.cpp index d536bedabd..f060b47c54 100644 --- a/GPU/Vulkan/TextureCacheVulkan.cpp +++ b/GPU/Vulkan/TextureCacheVulkan.cpp @@ -482,7 +482,10 @@ void TextureCacheVulkan::BuildTexture(TexCacheEntry *const entry) { VkCommandBuffer cmdInit = (VkCommandBuffer)draw_->GetNativeObject(Draw::NativeObject::INIT_COMMANDBUFFER); delete entry->vkTex; - entry->vkTex = new VulkanTexture(vulkan); + + char texName[64]{}; + snprintf(texName, sizeof(texName), "tex_%08x_%s", entry->addr, GeTextureFormatToString((GETextureFormat)entry->format, gstate.getClutPaletteFormat())); + entry->vkTex = new VulkanTexture(vulkan, texName); VulkanTexture *image = entry->vkTex; const VkComponentMapping *mapping; @@ -513,10 +516,6 @@ void TextureCacheVulkan::BuildTexture(TexCacheEntry *const entry) { actualFmt = VULKAN_8888_FORMAT; } - char texName[128]{}; - snprintf(texName, sizeof(texName), "tex_%08x_%s", entry->addr, GeTextureFormatToString((GETextureFormat)entry->format, gstate.getClutPaletteFormat())); - image->SetTag(texName); - bool allocSuccess = image->CreateDirect(cmdInit, plan.createW, plan.createH, plan.depth, plan.levelsToCreate, actualFmt, imageLayout, usage, mapping); if (!allocSuccess && !lowMemoryMode_) { WARN_LOG_REPORT(G3D, "Texture cache ran out of GPU memory; switching to low memory mode");