• 불칸 디버깅
    • 렌더독에서 불칸을 캡쳐하면 패스이름등이 나오지 않음 컬러1 뎊스1 이런식으로 나오고
    • 텍스쳐도 어태치먼트 등으로 표기됨
  • 아래 처럼 컬러패스 뎊스 패스 등을 보기 편한 이름으로 바꾸기
  • 바로 사용할수있는 방법만 알고 싶다면 맨 아래로 가시면 됩니다

 

 

  • 검색해봐도 이렇거나 관련 블로그도 존재함
  • 그래서 달아주기위해 구조를 파악하던중

 

typedef VkResult (VKAPI_PTR *PFN_vkSetDebugUtilsObjectNameEXT)(VkDevice device, const VkDebugUtilsObjectNameInfoEXT* pNameInfo);

typedef VkResult (VKAPI_PTR *PFN_vkSetDebugUtilsObjectTagEXT)(VkDevice device, const VkDebugUtilsObjectTagInfoEXT* pTagInfo);

typedef void (VKAPI_PTR *PFN_vkQueueBeginDebugUtilsLabelEXT)(VkQueue queue, const VkDebugUtilsLabelEXT* pLabelInfo);

typedef void (VKAPI_PTR *PFN_vkQueueEndDebugUtilsLabelEXT)(VkQueue queue);

typedef void (VKAPI_PTR *PFN_vkQueueInsertDebugUtilsLabelEXT)(VkQueue queue, const VkDebugUtilsLabelEXT* pLabelInfo);

..

..

 

#ifndef VK_ONLY_EXPORTED_PROTOTYPES

VKAPI_ATTR void VKAPI_CALL vkQueueBeginDebugUtilsLabelEXT(

    VkQueue                                     queue,

    const VkDebugUtilsLabelEXT*                 pLabelInfo);

#endif

#ifndef VK_ONLY_EXPORTED_PROTOTYPES

VKAPI_ATTR void VKAPI_CALL vkQueueEndDebugUtilsLabelEXT(

    VkQueue                                     queue);

#endif

#ifndef VK_ONLY_EXPORTED_PROTOTYPES

VKAPI_ATTR void VKAPI_CALL vkQueueInsertDebugUtilsLabelEXT(

    VkQueue                                     queue,

    const VkDebugUtilsLabelEXT*                 pLabelInfo);

#endif

  • 이런식으로 디버깅을 위한 함수들히 언리얼 엔진상에 한번 래핑되있는것을 보게됨
  • 또한

 

void FVulkanCommandListContext::RHIPushEvent(const TCHAR* Name, FColor Color)

{

#if VULKAN_ENABLE_DRAW_MARKERS

    if (auto CmdBeginLabel = Device->GetCmdBeginDebugLabel())

    {

        FTCHARToUTF8 Converter(Name);

        VkDebugUtilsLabelEXT Label;

        ZeroVulkanStruct(Label, VK_STRUCTURE_TYPE_DEBUG_UTILS_LABEL_EXT);

        Label.pLabelName = Converter.Get();

        FLinearColor LColor(Color);

        Label.color[0] = LColor.R;

        Label.color[1] = LColor.G;

        Label.color[2] = LColor.B;

        Label.color[3] = LColor.A;

        CmdBeginLabel(GetCommandBufferManager()->GetActiveCmdBuffer()->GetHandle(), &Label);

    }

#endif

  • 같이 컬러나 이름을 있는 별도의 함수가 존재하는거로 확인이 되어 해당 위치에 값을 넣어봤으나 작동하지 않음
  • 위같은 함수를 포함 다수의 코드에서

 

void FVulkanDevice::VulkanSetObjectName(VkObjectType Type, uint64_t Handle, const TCHAR* Name)

{

#if VULKAN_ENABLE_DRAW_MARKERS

    if(DebugMarkers.SetDebugName)

    {

        FTCHARToUTF8 Converter(Name);

        VkDebugUtilsObjectNameInfoEXT Info;

        ZeroVulkanStruct(Info, VK_STRUCTURE_TYPE_DEBUG_UTILS_OBJECT_NAME_INFO_EXT);

        Info.objectType = Type;

        Info.objectHandle = Handle;

        Info.pObjectName = Converter.Get();

        DebugMarkers.SetDebugName(Device, &Info);

    }

#endif // VULKAN_ENABLE_DRAW_MARKERS

}

  • 와같이 이미 작성하려는 내용이 존재하는걸 확인 이게 이미 구현이 되어있다고 생각하고
  • VULKAN_ENABLE_DRAW_MARKERS 전처리 매크로를 확인해봄

 

VulkanConfiguration.h

// Enables logging wrappers per Vulkan call

#ifndef VULKAN_ENABLE_DUMP_LAYER

    #define VULKAN_ENABLE_DUMP_LAYER                            0

#endif

#define VULKAN_ENABLE_DRAW_MARKERS                              VULKAN_SHOULD_ENABLE_DRAW_MARKERS

#ifndef VULKAN_ENABLE_IMAGE_TRACKING_LAYER

    #define VULKAN_ENABLE_IMAGE_TRACKING_LAYER                  0

#endif

 

 

VulkanAndroidPlatform.h

#define VK_USE_PLATFORM_ANDROID_KHR                 1

#define VULKAN_ENABLE_DUMP_LAYER                    0

#define VULKAN_DYNAMICALLYLOADED                    1

#define VULKAN_SHOULD_ENABLE_DRAW_MARKERS           (UE_BUILD_DEVELOPMENT || UE_BUILD_DEBUG)

#define VULKAN_USE_IMAGE_ACQUIRE_FENCES             0

#define VULKAN_USE_CREATE_ANDROID_SURFACE           1

#define VULKAN_SHOULD_USE_LLM                       (UE_BUILD_DEBUG || UE_BUILD_DEVELOPMENT) // If enabled Vulkan will report detailed allocation statistics, overrides some tags with custom ones

#define VULKAN_SHOULD_USE_COMMANDWRAPPERS           VULKAN_SHOULD_USE_LLM //LLM on Vulkan needs command wrappers to account for vkallocs

#define VULKAN_ENABLE_LRU_CACHE                     1

  • 매크로를 보면 이미 매크로자체는 활성화 되어있음(디버그와 디벨로 빌드에서 자동 활성화)
  • VULKAN_ENABLE_DRAW_MARKERS 매크로를 검색하다보면 예상대로 원래 일일히 오브젝트 이름등을 입력해야하는 코드 구조가 이미 구성이 되어있음

 

#if VULKAN_ENABLE_DRAW_MARKERS

    inline void SetDebugName(PFN_vkSetDebugUtilsObjectNameEXT SetDebugName, VkDevice Device, VkImage Image, const char* Name)

    {

        VkDebugUtilsObjectNameInfoEXT Info;

        ZeroVulkanStruct(Info, VK_STRUCTURE_TYPE_DEBUG_UTILS_OBJECT_NAME_INFO_EXT);

        Info.objectType = VK_OBJECT_TYPE_IMAGE;

        Info.objectHandle = (uint64)Image;

        Info.pObjectName = Name;

        SetDebugName(Device, &Info);

}

#endif

  • 이런식으로
  • 그러다 찾게된 함수가

 

void FVulkanDevice::SetupDrawMarkers()

{

#if VULKAN_ENABLE_DRAW_MARKERS

    if (RHI->SupportsDebugUtilsExt())

    {

        // HOTFIX for UE-218250: Disable vulkan draw markers to get around crash/performance issues

        if (FParse::Param(FCommandLine::Get(), TEXT("forcevulkanddrawmarkers")))

        {

            DebugMarkers.CmdBeginDebugLabel = (PFN_vkCmdBeginDebugUtilsLabelEXT)(void*)VulkanRHI::vkGetInstanceProcAddr(RHI->GetInstance(), "vkCmdBeginDebugUtilsLabelEXT");

            DebugMarkers.CmdEndDebugLabel = (PFN_vkCmdEndDebugUtilsLabelEXT)(void*)VulkanRHI::vkGetInstanceProcAddr(RHI->GetInstance(), "vkCmdEndDebugUtilsLabelEXT");

            DebugMarkers.SetDebugName = (PFN_vkSetDebugUtilsObjectNameEXT)(void*)VulkanRHI::vkGetInstanceProcAddr(RHI->GetInstance(), "vkSetDebugUtilsObjectNameEXT");

        }

        if (DebugMarkers.CmdBeginDebugLabel && DebugMarkers.CmdEndDebugLabel && DebugMarkers.SetDebugName)

        {

            bDebugMarkersFound = true;

        }

    }

#if VULKAN_HAS_DEBUGGING_ENABLED

    if (bDebugMarkersFound && GRenderDocFound)

    {

        // running under RenderDoc or other trace tool, so enable capturing mode

        EnableDrawMarkers();

  • 최종적으로 디바이스에서 활성화 되지 않았던 이유가 나와있음(사실은 디버그 레이어등 모든게 활성화는 되어있는데 라벨과 이름만 출력이 안되었던것)
  • 우리가 오브젝트에 이름을 붙이고 패스에 라벨을 붙이는 함수가 여기서 호출이 되어야 하는데
  • 매크로 외에  if (FParse::Param(FCommandLine::Get(), TEXT("forcevulkanddrawmarkers")))
  • 이런조건이 붙어있음 커맨드라인에 forcevulkanddrawmarkers 붙어있어야만 라벨과 오브젝트 이름을 붙여주는 조건이 있었던것
  • 결국 해당 아규먼트를 넣어서 실행하도록 처리하면 렌더독에서 눈에 익은 패스와 오브젝트 이름을 있음
  •  

이미지와 같이 익숙한이름으로 렌더패스를 구분할 있다

 

렌더독에서 아규먼트 붙여서 처리하는건 현재는 안되는듯 바로 아래의 파일 추가로 진행을 해야함

이부분은 엔진버전등에따라 변경될수 있어서 구조기록을 남겨 버전이 달라지더라도 쉽게 파악해서 처리 있도록 준비하는 과정을 남김

 

  • UECommandLine.txt 파일 생성 - 어느곳이든 상관이 없음 디바이스 내에서는 생성하기 어려우니 윈도우에서 생성
  • 내용 붙여넣기 -> -project="../../../[프로젝트이름]/[프로젝트이름].uproject" -forcevulkanddrawmarkers 혹은 -forcevulkanddrawmarkers
  • 해당 파일을
  • 기기\내장 저장공간\UnrealGame\[프로젝트이름] 저장

혹시 안된다면 안드 스튜디오에서 직접 커맨드라인 텍스트를 생성 > 그레이들 빌드(자동)

최종적으로 수정한 내용은 별거 없이 준비되어 있는 기능을 사용한것뿐

가끔 엔진코드보면 정말 이해가 안되게 작성되어 있는 코드들이 존재하는데 이것도 마찬가지

왜 기본적으로 렌더독 활성화시 자동으로 활성화되게 해두지 않았는지 궁금하고 이런부분은 안드로이드 앱 빌드하기나 렌더독 플러그인 설명서에 공지를 해두지 않았는지가 궁금함

 

 

+ Recent posts