79 lines
2.3 KiB
HLSL
79 lines
2.3 KiB
HLSL
// Copyright Epic Games, Inc. All Rights Reserved.
|
|
|
|
/*=============================================================================
|
|
AssertionMacros.ush: Macros for Assertion
|
|
=============================================================================*/
|
|
|
|
#pragma once
|
|
|
|
#include "/Engine/Public/Platform.ush"
|
|
|
|
#if !defined(DO_CHECK)
|
|
#define DO_CHECK 0
|
|
#endif
|
|
|
|
#if !defined(DO_GUARD_SLOW)
|
|
#define DO_GUARD_SLOW 0
|
|
#endif
|
|
|
|
|
|
#if DO_CHECK
|
|
|
|
// Allow platform-specific overrides?
|
|
#if !defined(check)
|
|
/**
|
|
* Check macro, intended to detect serious, execution-disrupting (not continuable) errors in the shader code.
|
|
* Is controlled by the read-only CVar `r.Shaders.CheckLevel`:
|
|
* 0 => DO_CHECK=0 and DO_GUARD_SLOW=0
|
|
* 1 (default) => DO_CHECK=1 and DO_GUARD_SLOW=0
|
|
* 2 => DO_CHECK=1 and DO_GUARD_SLOW=1
|
|
* NOTE: As check() is enabled by default this will cause increased register pressure and have some overhead. Therefore, be careful when using this
|
|
* and if in doubt, default to using checkSlow et al.
|
|
* When not doing GPU performance profiling it may be a good idea to keep r.Shaders.CheckLevel=2 to catch errors early.
|
|
*/
|
|
#define check(expr) \
|
|
{ \
|
|
if (!(expr)) \
|
|
{ \
|
|
PLATFORM_BREAK(); \
|
|
} \
|
|
}
|
|
#endif // check
|
|
|
|
|
|
#define checkBufferAccess(buffer, index) \
|
|
{ \
|
|
uint BufferCheckNumElements = 0U; \
|
|
buffer.GetDimensions(BufferCheckNumElements); \
|
|
check(uint(index) < BufferCheckNumElements); \
|
|
}
|
|
|
|
|
|
#define checkStructuredBufferAccess(buffer, index) \
|
|
{ \
|
|
uint BufferCheckNumElements = 0U; \
|
|
uint BufferCheckStride = 0U; \
|
|
buffer.GetDimensions(BufferCheckNumElements, BufferCheckStride); \
|
|
check(uint(index) < BufferCheckNumElements); \
|
|
}
|
|
|
|
#else // !DO_CHECK
|
|
#define check(expr) { }
|
|
|
|
#define checkBufferAccess(buffer, index) { }
|
|
#define checkStructuredBufferAccess(buffer, index) { }
|
|
#endif // DO_CHECK
|
|
|
|
#if DO_GUARD_SLOW
|
|
#define checkSlow(expr) check(expr)
|
|
|
|
#define checkBufferAccessSlow(buffer, index) checkBufferAccess(buffer, index)
|
|
#define checkStructuredBufferAccessSlow(buffer, index) checkStructuredBufferAccess(buffer, index)
|
|
|
|
#else // DO_GUARD_SLOW
|
|
#define checkSlow(expr) { }
|
|
|
|
#define checkBufferAccessSlow(buffer, index) { }
|
|
#define checkStructuredBufferAccessSlow(buffer, index) { }
|
|
#endif // DO_GUARD_SLOW
|