mirror of
				https://github.com/RetroDECK/Duckstation.git
				synced 2025-04-10 19:15:14 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			176 lines
		
	
	
		
			6.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			176 lines
		
	
	
		
			6.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| // Copyright (c) Microsoft Corporation. All rights reserved.
 | |
| 
 | |
| /*==========================================================================;
 | |
|  *
 | |
|  *  Copyright (C) Microsoft Corporation.  All Rights Reserved.
 | |
|  *
 | |
|  *  File:       pix3.h
 | |
|  *  Content:    PIX include file
 | |
|  *
 | |
|  ****************************************************************************/
 | |
| #pragma once
 | |
| 
 | |
| #ifndef _PIX3_H_
 | |
| #define _PIX3_H_
 | |
| 
 | |
| #include <sal.h>
 | |
| 
 | |
| #ifndef __cplusplus
 | |
| #error "Only C++ files can include pix3.h. C is not supported."
 | |
| #endif
 | |
| 
 | |
| #if !defined(USE_PIX_SUPPORTED_ARCHITECTURE)
 | |
| #if defined(_M_X64) || defined(USE_PIX_ON_ALL_ARCHITECTURES) || defined(_M_ARM64)
 | |
| #define USE_PIX_SUPPORTED_ARCHITECTURE
 | |
| #endif
 | |
| #endif
 | |
| 
 | |
| #if !defined(USE_PIX)
 | |
| #if defined(USE_PIX_SUPPORTED_ARCHITECTURE) && (defined(_DEBUG) || DBG || defined(PROFILE) || defined(PROFILE_BUILD)) && !defined(_PREFAST_)
 | |
| #define USE_PIX
 | |
| #endif
 | |
| #endif
 | |
| 
 | |
| #if defined(USE_PIX) && !defined(USE_PIX_SUPPORTED_ARCHITECTURE)
 | |
| #pragma message("Warning: Pix markers are only supported on AMD64 and ARM64")
 | |
| #endif
 | |
| 
 | |
| 
 | |
| // These flags are used by both PIXBeginCapture and PIXGetCaptureState
 | |
| #define PIX_CAPTURE_TIMING                  (1 << 0)
 | |
| #define PIX_CAPTURE_GPU                     (1 << 1)
 | |
| #define PIX_CAPTURE_FUNCTION_SUMMARY        (1 << 2)
 | |
| #define PIX_CAPTURE_FUNCTION_DETAILS        (1 << 3)
 | |
| #define PIX_CAPTURE_CALLGRAPH               (1 << 4)
 | |
| #define PIX_CAPTURE_INSTRUCTION_TRACE       (1 << 5)
 | |
| #define PIX_CAPTURE_SYSTEM_MONITOR_COUNTERS (1 << 6)
 | |
| #define PIX_CAPTURE_VIDEO                   (1 << 7)
 | |
| #define PIX_CAPTURE_AUDIO                   (1 << 8)
 | |
| #define PIX_CAPTURE_RESERVED                (1 << 15)
 | |
| 
 | |
| union PIXCaptureParameters
 | |
| {
 | |
|     enum PIXCaptureStorage
 | |
|     {
 | |
|         Memory = 0,
 | |
|     };
 | |
| 
 | |
|     struct GpuCaptureParameters
 | |
|     {
 | |
|         PCWSTR FileName;
 | |
|     } GpuCaptureParameters;
 | |
| 
 | |
|     struct TimingCaptureParameters
 | |
|     {
 | |
|         PCWSTR FileName;
 | |
|         UINT32 MaximumToolingMemorySizeMb;
 | |
|         PIXCaptureStorage CaptureStorage;
 | |
| 
 | |
|         BOOL CaptureGpuTiming;
 | |
| 
 | |
|         BOOL CaptureCallstacks;
 | |
|         BOOL CaptureCpuSamples;
 | |
|         UINT32 CpuSamplesPerSecond;
 | |
| 
 | |
|         BOOL CaptureFileIO;
 | |
| 
 | |
|         BOOL CaptureVirtualAllocEvents;
 | |
|         BOOL CaptureHeapAllocEvents;
 | |
|         BOOL CaptureXMemEvents; // Xbox only
 | |
|         BOOL CapturePixMemEvents; // Xbox only
 | |
|     } TimingCaptureParameters;
 | |
| };
 | |
| 
 | |
| typedef PIXCaptureParameters* PPIXCaptureParameters;
 | |
| 
 | |
| #if defined(XBOX) || defined(_XBOX_ONE) || defined(_DURANGO) || defined(_GAMING_XBOX) || defined(_GAMING_XBOX_SCARLETT)
 | |
| #include "pix3_xbox.h"
 | |
| #else
 | |
| #include "pix3_win.h"
 | |
| #endif
 | |
| 
 | |
| #if defined(USE_PIX_SUPPORTED_ARCHITECTURE) && (defined(USE_PIX) || defined(USE_PIX_RETAIL))
 | |
| 
 | |
| #define PIX_EVENTS_ARE_TURNED_ON
 | |
| 
 | |
| #include "PIXEventsCommon.h"
 | |
| #include "PIXEvents.h"
 | |
| 
 | |
| #ifdef USE_PIX
 | |
| // Starts a programmatically controlled capture.
 | |
| // captureFlags uses the PIX_CAPTURE_* family of flags to specify the type of capture to take
 | |
| extern "C" HRESULT WINAPI PIXBeginCapture2(DWORD captureFlags, _In_opt_ const PPIXCaptureParameters captureParameters);
 | |
| inline HRESULT PIXBeginCapture(DWORD captureFlags, _In_opt_ const PPIXCaptureParameters captureParameters) { return PIXBeginCapture2(captureFlags, captureParameters); }
 | |
| 
 | |
| // Stops a programmatically controlled capture
 | |
| //  If discard == TRUE, the captured data is discarded
 | |
| //  If discard == FALSE, the captured data is saved
 | |
| //  discard parameter is not supported on Windows
 | |
| extern "C" HRESULT WINAPI PIXEndCapture(BOOL discard);
 | |
| 
 | |
| extern "C" DWORD WINAPI PIXGetCaptureState();
 | |
| 
 | |
| extern "C" void WINAPI PIXReportCounter(_In_ PCWSTR name, float value);
 | |
| 
 | |
| #endif // USE_PIX
 | |
| 
 | |
| #endif // (USE_PIX_SUPPORTED_ARCHITECTURE) && (USE_PIX || USE_PIX_RETAIL)
 | |
| 
 | |
| #if !defined(USE_PIX_SUPPORTED_ARCHITECTURE) || !defined(USE_PIX)
 | |
| 
 | |
| // Eliminate these APIs when not using PIX
 | |
| inline HRESULT PIXBeginCapture2(DWORD, _In_opt_ const PIXCaptureParameters*) { return S_OK; }
 | |
| inline HRESULT PIXBeginCapture(DWORD, _In_opt_ const PIXCaptureParameters*) { return S_OK; }
 | |
| inline HRESULT PIXEndCapture(BOOL) { return S_OK; }
 | |
| inline HRESULT PIXGpuCaptureNextFrames(PCWSTR, UINT32) { return S_OK; }
 | |
| inline HRESULT PIXSetTargetWindow(HWND) { return S_OK; }
 | |
| inline HRESULT PIXForceD3D11On12() { return S_OK; }
 | |
| inline HRESULT WINAPI PIXSetHUDOptions(PIXHUDOptions) { return S_OK; }
 | |
| inline bool WINAPI PIXIsAttachedForGpuCapture() { return false; }
 | |
| inline HINSTANCE WINAPI PIXOpenCaptureInUI(PCWSTR) { return 0; }
 | |
| inline HMODULE PIXLoadLatestWinPixGpuCapturerLibrary() { return nullptr; }
 | |
| inline HMODULE PIXLoadLatestWinPixTimingCapturerLibrary() { return nullptr; }
 | |
| inline DWORD PIXGetCaptureState() { return 0; }
 | |
| inline void PIXReportCounter(_In_ PCWSTR, float) {}
 | |
| inline void PIXNotifyWakeFromFenceSignal(_In_ HANDLE) {}
 | |
| 
 | |
| #if !defined(USE_PIX_RETAIL)
 | |
| 
 | |
| inline void PIXBeginEvent(UINT64, _In_ PCSTR, ...) {}
 | |
| inline void PIXBeginEvent(UINT64, _In_ PCWSTR, ...) {}
 | |
| inline void PIXBeginEvent(void*, UINT64, _In_ PCSTR, ...) {}
 | |
| inline void PIXBeginEvent(void*, UINT64, _In_ PCWSTR, ...) {}
 | |
| inline void PIXEndEvent() {}
 | |
| inline void PIXEndEvent(void*) {}
 | |
| inline void PIXSetMarker(UINT64, _In_ PCSTR, ...) {}
 | |
| inline void PIXSetMarker(UINT64, _In_ PCWSTR, ...) {}
 | |
| inline void PIXSetMarker(void*, UINT64, _In_ PCSTR, ...) {}
 | |
| inline void PIXSetMarker(void*, UINT64, _In_ PCWSTR, ...) {}
 | |
| inline void PIXBeginRetailEvent(void*, UINT64, _In_ PCSTR, ...) {}
 | |
| inline void PIXBeginRetailEvent(void*, UINT64, _In_ PCWSTR, ...) {}
 | |
| inline void PIXEndRetailEvent(void*) {}
 | |
| inline void PIXSetRetailMarker(void*, UINT64, _In_ PCSTR, ...) {}
 | |
| inline void PIXSetRetailMarker(void*, UINT64, _In_ PCWSTR, ...) {}
 | |
| inline void PIXScopedEvent(UINT64, _In_ PCSTR, ...) {}
 | |
| inline void PIXScopedEvent(UINT64, _In_ PCWSTR, ...) {}
 | |
| inline void PIXScopedEvent(void*, UINT64, _In_ PCSTR, ...) {}
 | |
| inline void PIXScopedEvent(void*, UINT64, _In_ PCWSTR, ...) {}
 | |
| 
 | |
| #endif // !USE_PIX_RETAIL
 | |
| 
 | |
| // don't show warnings about expressions with no effect
 | |
| #pragma warning(disable:4548)
 | |
| #pragma warning(disable:4555)
 | |
| 
 | |
| #endif // !USE_PIX_SUPPORTED_ARCHITECTURE || !USE_PIX
 | |
| 
 | |
| // Use these functions to specify colors to pass as metadata to a PIX event/marker API.
 | |
| // Use PIX_COLOR() to specify a particular color for an event.
 | |
| // Or, use PIX_COLOR_INDEX() to specify a set of unique event categories, and let PIX choose
 | |
| // the colors to represent each category.
 | |
| inline UINT PIX_COLOR(BYTE r, BYTE g, BYTE b) { return 0xff000000 | (r << 16) | (g << 8) | b; }
 | |
| inline UINT PIX_COLOR_INDEX(BYTE i) { return i; }
 | |
| const UINT PIX_COLOR_DEFAULT = PIX_COLOR_INDEX(0);
 | |
| 
 | |
| #endif // _PIX3_H_
 | 
