diff --git a/qrenderdoc/Code/CaptureContext.cpp b/qrenderdoc/Code/CaptureContext.cpp
index 002671f15..affeb919b 100644
--- a/qrenderdoc/Code/CaptureContext.cpp
+++ b/qrenderdoc/Code/CaptureContext.cpp
@@ -919,6 +919,8 @@ void CaptureContext::LoadCaptureThreaded(const QString &captureFile, const Repla
#elif defined(RENDERDOC_PLATFORM_APPLE)
m_CurWinSystem = WindowingSystem::MacOS;
+#elif defined(RENDERDOC_PLATFORM_GGP)
+ m_CurWinSystem = WindowingSystem::GGP;
#endif
m_StructuredFile = &r->GetStructuredFile();
@@ -2049,6 +2051,11 @@ WindowingData CaptureContext::CreateWindowingData(QWidget *window)
WindowingData ret = {WindowingSystem::Unknown};
return ret;
+#elif defined(RENDERDOC_PLATFORM_GGP)
+
+ WindowingData ret = {WindowingSystem::GGP};
+ return ret;
+
#else
#error "Unknown platform"
diff --git a/renderdoc/driver/ihv/amd/amd_counters.cpp b/renderdoc/driver/ihv/amd/amd_counters.cpp
index 32c367940..ac711e01a 100644
--- a/renderdoc/driver/ihv/amd/amd_counters.cpp
+++ b/renderdoc/driver/ihv/amd/amd_counters.cpp
@@ -68,7 +68,7 @@ AMDCounters::AMDCounters(bool dx12DebugLayerEnabled)
bool AMDCounters::Init(ApiType apiType, void *pContext)
{
-#if DISABLED(RDOC_WIN32) && DISABLED(RDOC_LINUX)
+#if DISABLED(RDOC_WIN32) && DISABLED(RDOC_LINUX) && DISABLED(RDOC_GGP)
(void)m_dx12DebugLayerEnabled;
return false;
#else
diff --git a/renderdoc/driver/vulkan/CMakeLists.txt b/renderdoc/driver/vulkan/CMakeLists.txt
index 35c125d6d..c3c4f5196 100644
--- a/renderdoc/driver/vulkan/CMakeLists.txt
+++ b/renderdoc/driver/vulkan/CMakeLists.txt
@@ -48,6 +48,7 @@ set(sources
official/vulkan.h
official/vulkan_android.h
official/vulkan_core.h
+ official/vulkan_ggp.h
official/vulkan_ios.h
official/vulkan_macos.h
official/vulkan_fuchsia.h
diff --git a/renderdoc/driver/vulkan/renderdoc_vulkan.vcxproj.filters b/renderdoc/driver/vulkan/renderdoc_vulkan.vcxproj.filters
index aec7b68e7..8077da456 100644
--- a/renderdoc/driver/vulkan/renderdoc_vulkan.vcxproj.filters
+++ b/renderdoc/driver/vulkan/renderdoc_vulkan.vcxproj.filters
@@ -210,6 +210,9 @@
official
+
+ official
+
official
diff --git a/renderdoc/driver/vulkan/vk_common.h b/renderdoc/driver/vulkan/vk_common.h
index 7208ed6d0..820c38fee 100644
--- a/renderdoc/driver/vulkan/vk_common.h
+++ b/renderdoc/driver/vulkan/vk_common.h
@@ -1502,6 +1502,13 @@ DECLARE_DESERIALISE_TYPE(VkMemoryGetAndroidHardwareBufferInfoANDROID);
DECLARE_DESERIALISE_TYPE(VkExternalFormatANDROID);
#endif
+// GGP only structs
+#ifdef VK_USE_PLATFORM_GGP
+DECLARE_REFLECTION_STRUCT(VkPresentFrameTokenGGP);
+
+DECLARE_DESERIALISE_TYPE(VkPresentFrameTokenGGP);
+#endif
+
// enums
DECLARE_REFLECTION_ENUM(VkAccessFlagBits);
diff --git a/renderdoc/driver/vulkan/vk_next_chains.cpp b/renderdoc/driver/vulkan/vk_next_chains.cpp
index c38aa76a6..6629137cb 100644
--- a/renderdoc/driver/vulkan/vk_next_chains.cpp
+++ b/renderdoc/driver/vulkan/vk_next_chains.cpp
@@ -586,7 +586,6 @@ static void AppendModifiedChainedStruct(byte *&tempMem, VkStruct *outputStruct,
case VK_STRUCTURE_TYPE_IOS_SURFACE_CREATE_INFO_MVK: \
case VK_STRUCTURE_TYPE_MACOS_SURFACE_CREATE_INFO_MVK: \
case VK_STRUCTURE_TYPE_METAL_SURFACE_CREATE_INFO_EXT: \
- case VK_STRUCTURE_TYPE_PRESENT_FRAME_TOKEN_GGP: \
case VK_STRUCTURE_TYPE_STREAM_DESCRIPTOR_SURFACE_CREATE_INFO_GGP: \
case VK_STRUCTURE_TYPE_VI_SURFACE_CREATE_INFO_NN: \
case VK_STRUCTURE_TYPE_WAYLAND_SURFACE_CREATE_INFO_KHR: \
@@ -992,6 +991,16 @@ size_t GetNextPatchSize(const void *pNext)
}
#endif
+#if ENABLED(RDOC_GGP)
+ COPY_STRUCT_CAPTURE_ONLY(VK_STRUCTURE_TYPE_PRESENT_FRAME_TOKEN_GGP, VkPresentFrameTokenGGP);
+#else
+ case VK_STRUCTURE_TYPE_PRESENT_FRAME_TOKEN_GGP:
+ {
+ RDCERR("Support for GGP frame token extension not compiled in");
+ break;
+ }
+#endif
+
// NV win32 external memory extensions
#if ENABLED(RDOC_WIN32)
COPY_STRUCT_CAPTURE_ONLY(VK_STRUCTURE_TYPE_IMPORT_MEMORY_WIN32_HANDLE_INFO_NV,
@@ -1795,6 +1804,16 @@ void UnwrapNextChain(CaptureState state, const char *structName, byte *&tempMem,
}
#endif
+#if ENABLED(RDOC_GGP)
+ COPY_STRUCT_CAPTURE_ONLY(VK_STRUCTURE_TYPE_PRESENT_FRAME_TOKEN_GGP, VkPresentFrameTokenGGP);
+#else
+ case VK_STRUCTURE_TYPE_PRESENT_FRAME_TOKEN_GGP:
+ {
+ RDCERR("Support for GGP frame token extension not compiled in");
+ break;
+ }
+#endif
+
// NV win32 external memory extensions
#if ENABLED(RDOC_WIN32)
// Structs that can be copied into place
@@ -2053,6 +2072,16 @@ void CopyNextChainForPatching(const char *structName, byte *&tempMem, VkBaseInSt
}
#endif
+#if ENABLED(RDOC_GGP)
+ COPY_STRUCT_CAPTURE_ONLY(VK_STRUCTURE_TYPE_PRESENT_FRAME_TOKEN_GGP, VkPresentFrameTokenGGP);
+#else
+ case VK_STRUCTURE_TYPE_PRESENT_FRAME_TOKEN_GGP:
+ {
+ RDCERR("Support for GGP frame token extension not compiled in");
+ break;
+ }
+#endif
+
// NV win32 external memory extensions
#if ENABLED(RDOC_WIN32)
// Structs that can be copied into place
diff --git a/renderdoc/driver/vulkan/vk_serialise.cpp b/renderdoc/driver/vulkan/vk_serialise.cpp
index 86b3d7a10..4119c5545 100644
--- a/renderdoc/driver/vulkan/vk_serialise.cpp
+++ b/renderdoc/driver/vulkan/vk_serialise.cpp
@@ -275,6 +275,17 @@ void DoSerialiseViaResourceId(SerialiserType &ser, type &el)
SERIALISE_VK_HANDLES();
+#ifdef VK_USE_PLATFORM_GGP
+
+#define HANDLE_PNEXT_OS_GGP() \
+ PNEXT_STRUCT(VK_STRUCTURE_TYPE_PRESENT_FRAME_TOKEN_GGP, VkPresentFrameTokenGGP)
+
+#else
+
+#define HANDLE_PNEXT_OS_GGP() PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_PRESENT_FRAME_TOKEN_GGP)
+
+#endif
+
#ifdef VK_USE_PLATFORM_WIN32_KHR
#define HANDLE_PNEXT_OS_WIN32() \
@@ -390,6 +401,7 @@ SERIALISE_VK_HANDLES();
/* OS-specific extensions */ \
HANDLE_PNEXT_OS_WIN32() \
HANDLE_PNEXT_OS_ANDROID() \
+ HANDLE_PNEXT_OS_GGP() \
\
/* Core 1.0 structs. Should never be serialised in a pNext chain */ \
PNEXT_STRUCT(VK_STRUCTURE_TYPE_APPLICATION_INFO, VkApplicationInfo) \
@@ -1098,7 +1110,6 @@ SERIALISE_VK_HANDLES();
PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_IOS_SURFACE_CREATE_INFO_MVK) \
PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_MACOS_SURFACE_CREATE_INFO_MVK) \
PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_METAL_SURFACE_CREATE_INFO_EXT) \
- PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_PRESENT_FRAME_TOKEN_GGP) \
PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_STREAM_DESCRIPTOR_SURFACE_CREATE_INFO_GGP) \
PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_VI_SURFACE_CREATE_INFO_NN) \
PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_WAYLAND_SURFACE_CREATE_INFO_KHR) \
@@ -5411,7 +5422,7 @@ void DoSerialise(SerialiserType &ser, VkPastPresentationTimingGOOGLE &el)
template
void DoSerialise(SerialiserType &ser, VkPresentTimesInfoGOOGLE &el)
{
- RDCASSERT(ser.IsReading() || el.sType == VK_STRUCTURE_TYPE_PRESENT_REGIONS_KHR);
+ RDCASSERT(ser.IsReading() || el.sType == VK_STRUCTURE_TYPE_PRESENT_TIMES_INFO_GOOGLE);
SerialiseNext(ser, el.sType, el.pNext);
SERIALISE_MEMBER(swapchainCount);
@@ -9211,6 +9222,23 @@ INSTANTIATE_SERIALISE_TYPE(ImageSubresourceRange);
INSTANTIATE_SERIALISE_TYPE(ImageSubresourceStateForRange);
INSTANTIATE_SERIALISE_TYPE(ImageState);
+#ifdef VK_USE_PLATFORM_GGP
+
+template
+void DoSerialise(SerialiserType &ser, VkPresentFrameTokenGGP &el)
+{
+ RDCASSERT(ser.IsReading() || el.sType == VK_STRUCTURE_TYPE_PRESENT_FRAME_TOKEN_GGP);
+ SerialiseNext(ser, el.sType, el.pNext);
+}
+
+template <>
+void Deserialise(const VkPresentFrameTokenGGP &el)
+{
+ DeserialiseNext(el.pNext);
+}
+
+#endif
+
#ifdef VK_USE_PLATFORM_WIN32_KHR
template
void DoSerialise(SerialiserType &ser, VkImportMemoryWin32HandleInfoNV &el)
diff --git a/renderdoc/os/posix/ggp/ggp_callstack.cpp b/renderdoc/os/posix/ggp/ggp_callstack.cpp
index 822fd9bf4..213b90cb6 100644
--- a/renderdoc/os/posix/ggp/ggp_callstack.cpp
+++ b/renderdoc/os/posix/ggp/ggp_callstack.cpp
@@ -121,22 +121,29 @@ bool GetLoadedModules(byte *buf, size_t &size)
// parsing without needing to recapture
FILE *f = FileIO::fopen("/proc/self/maps", FileIO::ReadText);
- size = 0;
-
- if(buf)
- memcpy(buf, "LNUXCALL", 8);
-
- size += 8;
-
- byte dummy[512];
-
- while(!feof(f))
+ if(f == NULL)
{
- byte *readbuf = buf ? buf + size : dummy;
- size += FileIO::fread(readbuf, 1, 512, f);
+ RDCWARN("Opening %s failed", "/proc/self/maps");
}
+ else
+ {
+ size = 0;
- FileIO::fclose(f);
+ if(buf)
+ memcpy(buf, "LNUXCALL", 8);
+
+ size += 8;
+
+ byte dummy[512];
+
+ while(!feof(f))
+ {
+ byte *readbuf = buf ? buf + size : dummy;
+ size += FileIO::fread(readbuf, 1, 512, f);
+ }
+
+ FileIO::fclose(f);
+ }
return true;
}