/*===================== begin_copyright_notice ==================================

Copyright (c) 2017 Intel Corporation

Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:

The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.


======================= end_copyright_notice ==================================*/
#pragma once
#include "usc_config.h"

#define USC_DBG_OFF                  (0x00000000)
#define USC_DBG_CRITICAL             (0x00000001)
#define USC_DBG_NORMAL               (0x00000002)
#define USC_DBG_VERBOSE              (0x00000004)
#define USC_DBG_VERBOSE_VERBOSITY    (0x00000040)

#define USC_DBG_FUNCTION             (0x80000000)

#define USC_DBG_INTERFACE                ((0x00010000) | USC_DBG_FUNCTION)
#define USC_DBG_HARDWARE                 ((0x00020000) | USC_DBG_VERBOSE)
#define USC_DBG_COMPILER                 ((0x00040000) | USC_DBG_VERBOSE)
#define USC_DBG_COMPILER_LIR_DUMP        ((0x00001000) | USC_DBG_VERBOSE)
#define USC_DBG_COMPILER_IR_TO_LIR_TRACE ((0x00002000))

namespace USC
{

#if defined (_DEBUG) || defined (_INTERNAL)
/*****************************************************************************\
    Debug structure for manual control over debug logging level.
\*****************************************************************************/
struct SDebugLevel
{
    unsigned int   Critical              : 1;    
    unsigned int   Normal                : 1;     
    unsigned int   Verbose               : 1;    
    unsigned int   VerboseVerbosity      : 1;

    unsigned int   : 4;   
    
    unsigned int   : 4;

    unsigned int   CompilerLirDump       : 1;
    unsigned int   CompilerIRToLIRTrace  : 1;
    unsigned int   : 2;

    unsigned int   Interface             : 1;
    unsigned int   Hardware              : 1;
    unsigned int   Compiler              : 1;

    unsigned int   : 5;

    unsigned int   : 4;

    unsigned int   : 3;
    unsigned int   Function              : 1;
};

/*****************************************************************************\
    Debug structure that holds MsgLevel together with break on assert option.
\*****************************************************************************/
struct SDebugControl
{
    bool            breakOnAssert;

    union
    {
        unsigned int       MsgLevelValue; 
        SDebugLevel MsgLevel;
    };
};

 // Debug variable that holds MsgLevel together with break on assert option
 // for USC.
USC_API extern SDebugControl g_DebugControl;
#endif //_DEBUG

/*****************************************************************************\
    Debug structure for overriding USC behavior.
\*****************************************************************************/
struct SDebugVariables
{
    ///////////////////////////////////////////////////////////////////////////
    // Hardware Debug Controls
    ///////////////////////////////////////////////////////////////////////////
    unsigned int   PassThroughVertexShaderEnable           : 1;
    unsigned int   PassThroughPixelShaderEnable            : 1;

    unsigned int   MaxSoftwareGRFRegistersOverride;

    unsigned int   MaxVSThreadsOverride;
    unsigned int   MaxGSThreadsOverride;
    unsigned int   MaxGSThreadsOverrideWithSO;
    unsigned int   MaxPSThreadsOverride;
    unsigned int   MaxHSThreadsOverride;
    unsigned int   MaxDSThreadsOverride;
    unsigned int   MaxCSThreadsOverride;

    unsigned int   MaxVSURBEntriesOverride;
    unsigned int   MaxGSURBEntriesOverride;

    unsigned int   MaxShaderScratchSpaceOverride; // Overrides the limit on the maximum scratch space
                                                  // size used by all threads in each stage of 3D pipeline.

    unsigned int   GSExecutionMode;

    unsigned int   ExtendAllSourceLiveRanges;
    ///////////////////////////////////////////////////////////////////////////
    // Software Debug Controls
    ///////////////////////////////////////////////////////////////////////////
    unsigned int   BreakInCreateCompiler                   : 1;
    unsigned int   PrintVertexShaderKeyEnable              : 1;
    unsigned int   PrintGeometryShaderKeyEnable            : 1;
    unsigned int   PrintPixelShaderKeyEnable               : 1;
    unsigned int   ReportAssertEnable                      : 1;
    unsigned int   ImprovedIsaDisassemblyEnable            : 1;
    unsigned int   ShaderDumpEnable                        : 1;
    unsigned int   ShaderDumpToRamdisk                     : 1;
    unsigned int   PrintLirRegSetsEnable                   : 1;
    unsigned int   PrintFunctionBodyInstructionListEnable  : 1;
    unsigned int   ShaderDumpPidDisable                    : 1;
    unsigned int   ShaderDumpDuplicatesEnable              : 1;
    unsigned int   IsaInjectionEnable                      : 1;
    unsigned int   IsaLabelPrintingEnable                  : 1;
    unsigned int   EnableDebugFileDump                     : 1;
    unsigned int   AllDumpsInSingleFile                    : 1;
    unsigned int   OptimizationStatsEnable                 : 1;
    unsigned int   CompilationTimeDumpEnable               : 1;
    unsigned int   QualityMetricsEnable                    : 1;
    unsigned int   CodeStatsEnable                         : 1;
    unsigned int   MemoryStatsEnable                       : 1;
    unsigned int   MemoryStatsDetailedEnable               : 1;
    unsigned int   TimeStatsEnable                         : 1;
    unsigned int   DisablePixelShaderSampleInstructions    : 1;
    unsigned int   DisableVertexShaderSampleInstructions   : 1;
    unsigned int   ForceSampler2x2                         : 1;
    unsigned int   DisableRenderTargetSurfaceState         : 1;
    unsigned int   ForceSampleCToSample                    : 1;
    unsigned int   IllegalInstructionAfterEOTEnable        : 1; 
    unsigned int   ResetUninitializedVariablesEnable       : 1;
    unsigned int   CompilerLogsInReleaseBuildEnable        : 1;

    unsigned int   ISASchedulerLogs;

    unsigned int   RetailMessageControl;

    unsigned int   FullLIRDumpHashCode;
    unsigned int   DisableMcsFastClear;
    unsigned int   DisableMcsMsaa;

    unsigned int   ShaderDebugHashCode;
    unsigned int   ShaderDebugExtra;
    unsigned int   ShaderDebugHashCodeInKernel             : 1;
    unsigned int   SystemThreadCacheFlushEnable            : 1;
    unsigned int   SystemThreadCacheFlushCountOverride;

    unsigned int   PrintSimdMaskInLIR                     : 1;

    unsigned int   KillPixelHangWorkaroundOverrideEnable;
    unsigned int   KillPixelHangWorkaroundOverride;     // 0-always enable message header for RT write messages
                                                        // 1-dispatch simd8 only when kill pixel enabled
                                                        // 2-thread count = 84(42 GT1) always
                                                        // 3-thread count = 84(42 GT1) when kill pixel enabled
    unsigned int   SendsSupportEnable                      : 1;

    ///////////////////////////////////////////////////////////////////////////
    // Compiler Debug Controls
    ///////////////////////////////////////////////////////////////////////////
    unsigned int   SystemThreadEnable                      : 1;
    unsigned int   InstructionCompactionEnable             : 1;    // TODO: change to Override
    unsigned int   SIMD32CompileOverride                   : 1;
    unsigned int   SIMD32CompileEnable                     : 1;
    unsigned int   SIMD32CompileForce                      : 1;
    unsigned int   SIMD32AllowSpillFill                    : 1;
    unsigned int   SIMD16CompileOverride                   : 1;
    unsigned int   SIMD16CompileEnable                     : 1;
    unsigned int   SIMD16CompileForce                      : 1;
    unsigned int   SIMD8CompileOverride                    : 1;
    unsigned int   SIMD8CompileEnable                      : 1;
    unsigned int   CSSIMD32CompileForce                    : 1;
    unsigned int   CSSIMD16CompileForce                    : 1;
    unsigned int   CSSIMD8CompileForce                     : 1;
    unsigned int   HeaderBypassDisable                     : 1;
    unsigned int   DisableOptimizeDependencies             : 1;
    unsigned int   DisableMergePatchConstantShaders        : 1;
    unsigned int   DisableInstanceUnroll                   : 1;
    unsigned int   HSIndexedControlPointShaderEnable       : 1;
    unsigned int   HSUseSingleHardwareThreadEnable         : 1;
    unsigned int   ForceVSPullModel                        : 1;
    unsigned int   ForceGSPullModel                        : 1;
    unsigned int   ForceHSPullModel                        : 1;
    unsigned int   ForceDSPullModel                        : 1;
    unsigned int   ForceSampleUVtoZero                     : 1;
    unsigned int   ForceSkipValueNumberingForSample        : 1;
    unsigned int   VSSIMD4x2CompileForce                   : 1;
    unsigned int   HSSIMD4x2CompileForce                   : 1;
    unsigned int   DSSIMD4x2CompileForce                   : 1;
    unsigned int   GSSIMD4x2CompileForce                   : 1;
    unsigned int   VSSIMD8CompileForce                     : 1;
    unsigned int   HSSIMD8CompileForce                     : 1;
    unsigned int   DSSIMD8CompileForce                     : 1; // For Gen9+ this mean SIMD8 single- and dual-patch compilation instead of SIMD4x2.
    unsigned int   DSSIMD8SPCompileForce                   : 1; // For Gen9+ only, this mean only single-patch compilation.
    unsigned int   GSSIMD8CompileForce                     : 1;
    unsigned int   VSSIMD8WithFullEpilogEnable             : 1;
    unsigned int   GSSIMD8WithSpillFillCompileEnable       : 1;
    unsigned int   HSSIMD8DualPatchModeCompileEnable       : 1;
    unsigned int   HSSIMD8EightPatchModeCompileEnable      : 1;
    unsigned int   DSSIMD8SingleOrDualPatchModeCompileEnable : 1;
    unsigned int   DisableGPGPUIndirectPayload             : 1;
    unsigned int   LowPrecisionOverride                    : 1;
    unsigned int   LowPrecisionEnable                      : 1;
    unsigned int   SampleLdWithNativeZeroLodDisable        : 1;
    unsigned int   SIMDExpansionEnable                     : 1;
    unsigned int   OCLSurfaceStateSpillFillEnable          : 1;
    unsigned int   DisableHSBarrierRead                    : 1;
    unsigned int   ClearVHEnable                           : 1;
    unsigned int   ForceSamplerPointer                     : 1;
    unsigned int   ForceDoubleSamplerSlots                 : 1;
    unsigned int   URBPaddingSIMD8Disable                  : 1;
    unsigned int   ForceSendTGSMFence                      : 1;
    unsigned int   DisableRSPushConstants                  : 1;
    unsigned int   DisableRSPushConstantsCompute           : 1;
    unsigned int   SWStencilPushConstantEnable             : 1;
    unsigned int   AppendPaddingToISA                      : 1;
    unsigned int   CallToSubroutineCallForceEnable         : 1;

    unsigned int   ForceCompilerInlineFunctionPolicy;

    unsigned int   MaxHSPatchConstantShaders;
    unsigned int   MaxSIMD16PixelShaderInstructionCount;
    unsigned int   MaxSIMD32PixelShaderInstructionCount;

    unsigned int   SIMD32CpiThreshold;
    unsigned int   OCLSIMD32InstructionThreshold;
    unsigned int   OCLSIMD32LIRThreshold;
    unsigned int   OCLSIMD32TPMThreshold;
    unsigned int   MaxSIMD16ComputeShaderInstructionCount;
    unsigned int   MaxSIMD32ComputeShaderInstructionCount;  

    unsigned int   SamplerOffsetWorkaroundMinSampleCount;
    unsigned int   L3WAMaxShortVSLength;
    unsigned int   DoLlvmOptimize;
    unsigned int   ShaderTestFlagsFound;
    unsigned int   MaxInstructionsToFixPrecision;

    unsigned int   ForceShortenURBDataLenght :1;
    unsigned int   DisableILReflectOpts;
    unsigned int   DisableSIMD32DueEarlyEOTAfterDiscard :1;
    unsigned int   EnableResourceIndexAlwaysNonUniform :1;
    // USCTester and USCLauncher use different compiler settings, e.g. USCTester does not support CB2CR on other platforms than HSW
    // This is needed to pass this information from USCTester.
    unsigned int   DisableUSCTesterUnsupportedFeatures  : 1;

    ///////////////////////////////////////////////////////////////////////////
    // USC WA Override Controls
    ///////////////////////////////////////////////////////////////////////////
    unsigned int    WaDisable_WIZUnit_ScratchSpace;
    unsigned int    WaClampSamplerArrayIndex;
    unsigned int    WaForcePushConstantEvenReadLength;
    unsigned int    WaDisableHeaderBypassForPSDepthOutput;
    unsigned int    WaForceHeaderForKillPixInstructions;
    unsigned int    WaDecomposePowToLogMulExp;
    unsigned int    WaDisableMadSrc0Replicate;
    unsigned int    WaSamplerChannelDisables;
    unsigned int    WaUAVTypedWriteOverlapping;
    unsigned int    WaUAVTypedReadOverwritesAllDestChannels;
    unsigned int    WaUseOnlySIMD8UntypedRead;
    unsigned int    WaUVoffsetToZeroForLd2dms;
    unsigned int    WaPerThreadScratchSpaceInGPGPUIncrease;
    unsigned int    WaUseFDP3InsteadOfFDP2;
    unsigned int    WaApplyAbsToFrcInstruction;
    unsigned int    WaForPlusInfRoundingModeFrcInstruction;
    unsigned int    WaEmulateIBFEInstrucion;
    unsigned int    WaShaderCalculateResourceOffsets;
    unsigned int    WaUseThreadPayloadCompression;
    unsigned int    WaUnlitCentroidInterpolation;
    unsigned int    WaAddCallToEOTEnabled;
    unsigned int    WaZeroUnusedSampleDGradientsParameters;
    unsigned int    WaAlphaToOneOGL;
    unsigned int    WaOGLGSVertexReordering;
    unsigned int    WaOGLGSVertexReorderingTriStripAdjOnly;
    unsigned int    WaXScaledFormatConversion;
    unsigned int    WaCMPInstFlagDepClearedEarly;
    unsigned int    WaScalarAtomic;
    unsigned int    WaL3UseSamplerForLoadDualConstant;
    unsigned int    WaL3UseSamplerForVectorLoadScatter;
    unsigned int    Wa1DSurfaceSIMD4x2ArrayIndexInRAddress;
    unsigned int    WaBreakSimd16TernaryInstructionsIntoSimd8;
    unsigned int    WaGSPullModelForPatchlistInputTopology;
    unsigned int    WaGSSingleDispatchModeForTriangleInput;
    unsigned int    WaForceSIMD8ForBFIInstruction;
    unsigned int    WaBreakSimd16InstWhenAccIsUsedIntoSimd8;
    unsigned int    WaEnableDummyMovInGpgpuContextSave;
    unsigned int    WaClearNotificationRegInGpgpuContextSave;
    unsigned int    WaNotifRegSwapInGpGpuContextRestore;
    unsigned int    WaStoreSlmOffsetInSRDuringGpGpuPreemption;
    unsigned int    WaSampleGCToSampleLC;
    unsigned int    WaCMPInstNullDstForcesThreadSwitch;
    unsigned int    WaCMPInstNullDstBreaksR0Scoreboarding;
    unsigned int    WaForceHeaderForDualSourceBlendHi;
    unsigned int    WaForceHSPullModel;
    unsigned int    WaInsertNopToHaltDestination;
    unsigned int    WaForceTypeConvertF32To16ToAlign1;
    unsigned int    WaAdditionalMovWhenSrc1ModOnMulMach;
    unsigned int    WaForceMulSrc1WordToAlign1;
    unsigned int    WaCallForcesThreadSwitch;
    unsigned int    WaThreadSwitchAfterCall;
    unsigned int    WANOPBeetweenIndirectAdressingAndBranch;
    unsigned int    WaA32StatelessMessagesRequireHeader;
    unsigned int    WaNoA32ByteScatteredStatelessMessages;
    unsigned int    WaUrbAtomics;
    unsigned int    WaBasicCompilationForDPInstructions;
    unsigned int    WaHalfFloatSelNotAllowedWithSourceModifiers;
    unsigned int    WaLowPrecWriteRTOnlyFloat;
    unsigned int    WaBreakF32MixedModeIntoSimd8;
    unsigned int    WaDisableDSDualPatchMode;
    unsigned int    WaDisableNoSrcDepSetBeforeEOTSend;
    unsigned int    WaDstSubRegNumNotAllowedWithLowPrecPacked;
    unsigned int    WaHeaderRequiredOnSimd16Sample16bit;
    unsigned int    WaLodRequiredOnTypedMsaaUav;
    unsigned int    AccWrEnNotAllowedToAcc1With16bit;
    unsigned int    WaSendsSrc1Length0NotAllowed;
    unsigned int    WaDisableEuBypassOnSimd16Float16;
    unsigned int    WaDisableEuBypassOnSimd16Float32;
    unsigned int    WaStructuredBufferAsRawBufferOverride;
    unsigned int    WaSrc1ImmHfNotAllowed;
    unsigned int    WaCselUnsupported;
    unsigned int    WaDisableDSCaching;
    unsigned int    WaDisallow64BitImmMov;
    unsigned int    WaDisallowDFImmMovWithSimd8;
    unsigned int    WaEmitVtxWhenOutVtxCntIsZero;
    unsigned int    WaFixCentroidInterpolationRTIR16X;
    unsigned int    WaDisableIndirectDataForGPGPUWalker;
    unsigned int    WaDisableIndirectDataAndFlushGPGPUWalker;
    unsigned int    WaDisablePushConstantHSGS;
    unsigned int    WaEnableAllWriteChannelMask;
    unsigned int    WaGather4WithGreenChannelSelectOnR32G32Float;
    unsigned int    WaPreventHSTessLevelsInterference;
    unsigned int    WaAvoidDomainShaderCacheStall;
    unsigned int    WaClearArfDependenciesBeforeEot;
    unsigned int    WaDoNotPushConstantsForAllPulledGSTopologies;
    unsigned int    WaDisableDbg0Register;
    unsigned int    WaGrfDependecyClearInGpgpuContextRestore;
    unsigned int    WaRestoreFCandMSGRegistersFromUpperOword;
    unsigned int    WaRestoreFC4RegisterDW0fromDW1;
    unsigned int    WaRestoreFc0RegistersWithOffset;
    unsigned int    WaGrfDepClearOnOutstandingSamplerInGpgpuContextSave;
    unsigned int    WaStoreAcc2to9InAlign16InGpgpuContextSave;
    unsigned int    WaGrfScoreboardClearInGpgpuContextSave;
    unsigned int    WaClearFlowControlGpgpuContextSave;
    unsigned int    WaClearCr0SpfInGpgpuContextRestore;
    unsigned int    WaSendsSrc1SizeLimitWhenEOT;
    unsigned int    WaDisableMixedModeLog;
    unsigned int    WaDisableMixedModePow;
    unsigned int    WaDisableMixedModeFdiv;
    unsigned int    WaFloatMixedModeSelNotAllowedWithPackedDestination;  
    unsigned int    WaDisableNativeDWxDWMultiplication;
    unsigned int    WaForceMinMaxGSThreadCount;
    unsigned int    WaIntegerDivisionSourceModifierNotSupported;
    unsigned int    WaDisableLowPrecisionWriteRTRepData;
    unsigned int    WAResetN0AfterRenderTargetRead;

    unsigned int    WADisableWriteCommitForPageFault;   // Disables Write commit for page fault
    unsigned int    WaDisableDeepLoopsUnrolling;
    unsigned int    EnableRegSizeConsistencyCheck   :1; // Enables RegSizeConsistencyCheck
    unsigned int    EnableUntypedSrfRead    :1;
};

#if ( defined _DEBUG ) || ( defined _INTERNAL )
//  Debug variable for overriding USC behavior.
USC_API extern SDebugVariables g_DebugVariables;
#endif // defined _DEBUG || defined _INTERNAL

/*****************************************************************************\
MACRO: USC_RV_Declare
PURPOSE: Declares a new entry in the global registry table.  
\*****************************************************************************/
#define USC_RV_Declare(type, name, value, subkey, description)                             \
struct SRegistryEntry##name : public SRegistryEntry                                            \
{                                                                                               \
    SRegistryEntry##name()                                                                      \
    : SRegistryEntry(value, false, #name, subkey, #type, description, USC_RV_SetGroup) \
{                                                                                           \
}                                                                                           \
} name

#define DGB_VAR_INITIAL_VALUE   0xCCCCCCCC
/*****************************************************************************\
MACRO: USC_RV_USCWAOverrideControl
PURPOSE: Declares a new control debug variable which can be use to override
workaround related to USC.
\*****************************************************************************/
#define USC_RV_USCWAOverrideControl( name )  \
    USC_RV_Declare( DWORD, name, DGB_VAR_INITIAL_VALUE, "", "" )

/*****************************************************************************\
MACRO: USC_RV_DeclareCompilerControl
PURPOSE: Declares a new compiler control debug variable meta data, one per
shader unit
\*****************************************************************************/
#define USC_RV_DeclareCompilerControl( type, name, value, subkey, description )  \
    USC_RV_Declare( type, VS_##name, value, subkey, description ); \
    USC_RV_Declare( type, GS_##name, value, subkey, description ); \
    USC_RV_Declare( type, PS_##name, value, subkey, description ); \
    USC_RV_Declare( type, HS_##name, value, subkey, description ); \
    USC_RV_Declare( type, DS_##name, value, subkey, description ); \
    USC_RV_Declare( type, CS_##name, value, subkey, description )

/*****************************************************************************\
STRUCT:  SRegistryVariable
PURPOSE: Defines data for holding/defining registry variables
\*****************************************************************************/
struct SRegistryEntry
{
    SRegistryEntry(
        unsigned int in_value, 
        bool         in_isSet, 
        const char*  in_pName, 
        const char*  in_pSubKey,
        const char*  in_pType, 
        const char*  in_pDescription, 
        const char*  in_pGroup)
        : Value(in_value), 
        IsSet(in_isSet), 
        pName(in_pName), 
        pSubKey(in_pSubKey), 
        pType(in_pType), 
        pDescription(in_pDescription), 
        pGroup(in_pGroup)
    {
    }

    unsigned int Value;
    bool         IsSet;
    const char*  pName;
    const char*  pSubKey;
    const char*  pType;
    const char*  pDescription;
    const char*  pGroup;
};
/*****************************************************************************\
STRUCT: Global definition for the USC registry variables.
\*****************************************************************************/
struct SUSCRegistryVariables
{
    // Only use USC_RV_Declare macros in this structure.  Any other data declaration will break the 
    // functionality when parsing this data.  

#define USC_RV_SetGroup "DebugVariables"
    USC_RV_Declare( bool, PassThroughVertexShaderEnable, false, "", " Doesn't do anything, just pass through the default values" );
    USC_RV_Declare( bool, PassThroughPixelShaderEnable , false, "", " Doesn't do anything, just pass through the default values" );
    USC_RV_Declare( dword, MaxSoftwareGRFRegistersOverride, 0, "", " Sets maximum number of software registers(max is 128)" );
    USC_RV_Declare( dword, MaxVSThreadsOverride , 0, "", " Max number of Vertex Shader thread" );
    USC_RV_Declare( dword, MaxGSThreadsOverride , 0, "", " Max number of Geometry Shader thread" );
    USC_RV_Declare( dword, MaxGSThreadsOverrideWithSO   , 0, "", " Max number of Geometry Shader threads when stream output is enabled" );
    USC_RV_Declare( dword, MaxPSThreadsOverride , 0, "", " Max number  of Pixel Shader thread" );
    USC_RV_Declare( dword, MaxHSThreadsOverride , 0, "", " Max number  of Hull Shader thread " );
    USC_RV_Declare( dword, MaxDSThreadsOverride , 0, "", " Max number  of Domain Shader thread " );
    USC_RV_Declare( dword, MaxCSThreadsOverride , 0, "", " Max number  of Compute Shader thread " );
    USC_RV_Declare( dword, MaxVSURBEntriesOverride, 0, "", " Max number  of Vertex Shader URB entries" );
    USC_RV_Declare( dword, MaxGSURBEntriesOverride, 0, "", " Max number  of Geometry Shader URB entries" );
    USC_RV_Declare( dword, MaxShaderScratchSpaceOverride, 0, "", " Maximum amount of scratch space to be used by all threads. " );
    USC_RV_Declare( dword, GSExecutionMode, 0xffffffff, "", " Mode of GS compilation. Set 0 for single mode or 1 for dual mode. " );
    USC_RV_Declare( dword, ExtendAllSourceLiveRanges, 0, "", "" );

    USC_RV_Declare( bool, IllegalInstructionAfterEOTEnable, false, "", "Enables debug/release internal driver to insert illegal instruction at the end of each kernel. " );
    USC_RV_Declare( bool, BreakInCreateCompiler, false, "", "Will cause halt on breakpoint situated in CreateCompiler. " );
    USC_RV_Declare( bool, PrintVertexShaderKeyEnable   , false, "", "Enables the printing of different vertex shader keys" );
    USC_RV_Declare( bool, PrintGeometryShaderKeyEnable , false, "", "Enables the printing of different geometry shader keys" );
    USC_RV_Declare( bool, PrintPixelShaderKeyEnable    , false, "", "Enables the printing of different pixel shader keys " );
    USC_RV_Declare( bool, ShaderDumpEnable     , false, "", "Enables debug/release driver to dump IL and ISA shaders to GHAL3D_OUTPUT_DIRECTORY" );
    USC_RV_Declare( bool, ShaderDumpToRamdisk, false, "", "Enables debug/release driver to dump IL and ISA shaders to ramdisk defined in system environmental variable. Works only with ShaderDumpEnable flag, used only for Jenkins automatization purposes. " );
    USC_RV_Declare( bool, PrintLirRegSetsEnable, false, "", "Enables/Disables printing LIR reg sets (e.g. Live-In, Live-Out, etc) in LIR shader dumps" );
    USC_RV_Declare( bool, PrintFunctionBodyInstructionListEnable, false, "", "" );
    USC_RV_Declare( bool, ShaderDumpPidDisable     , false, "", "Enables adding PID to the name of shader dump directory" );
    USC_RV_Declare( bool, ShaderDumpDuplicatesEnable   , false, "", "Enables dumping duplicate shader dumps. Works only with ShaderDumpEnable flag." );
    USC_RV_Declare( bool, IsaInjectionEnable   , false, "", "Enables loading of kernels precompiled with IsaASM." );
    USC_RV_Declare( bool, IsaLabelPrintingEnable   , true, "", "Enables using Labels instead of JIP and UIP numbers." );
    USC_RV_Declare( bool, EnableDebugFileDump  , false, "", "Enables dumping debug output to file. " );
    USC_RV_Declare( bool, AllDumpsInSingleFile, false, "", "All dumps will be dumped into one file. ");
    USC_RV_Declare( bool, OptimizationStatsEnable, false, "", "Enables counting optimizations statistics. " );
    USC_RV_Declare( bool, CompilationTimeDumpEnable    , false, "", "Enables compilation time dump. " );
    USC_RV_Declare( bool, QualityMetricsEnable , false, "", "Enables computing Shader Quality Metrics. " );
    USC_RV_Declare( bool, TimeStatsEnable, false, "", "Enables computing time statisics. " );
    USC_RV_Declare( bool, DisablePixelShaderSampleInstructions, false, "", "Disables sample Pixel shader instructions for debug purposes" );
    USC_RV_Declare( bool, ForceSampler2x2, false, "", "" );
    USC_RV_Declare( bool, DisableRenderTargetSurfaceState, false, "", "" );
    USC_RV_Declare( bool, ForceSampleCToSample, false, "", "" );
    USC_RV_Declare( bool, ResetUninitializedVariablesEnable, false, "", "Enables initialization of all uninitialized variables" );
    USC_RV_Declare( bool, CompilerLogsInReleaseBuildEnable, false, "", "Enables some compiler logs in release-internal builds" );
    USC_RV_Declare( dword, ISASchedulerLogs, 0, "", "Enables ISA scheduler logs: 1 - timings only, 2 - summary file " );
    USC_RV_Declare( dword, RetailMessageControl, 0, "", "" );
    USC_RV_Declare( dword, FullLIRDumpHashCode  , 0, "", "" );
    USC_RV_Declare( bool, DisableMcsFastClear  , false, "", "Runs without color fast clear" );
    USC_RV_Declare( bool, DisableMcsMsaa, false, "", "Runs without MSAA compression" );
    USC_RV_Declare( dword, ShaderDebugHashCode  , 0, "", "The driver will set a breakpoint in the first instruction of the shader which has the provided hash code. It works only when the value is different then 0 and SystemThreadEnable is set to TRUE." );
    USC_RV_Declare( dword, ShaderDebugExtra, 0, "", "Bits 0-5: flags for setting breakpoint in VS,HS,DS,GS,PS,CS. Bits 16-31 contain zero-based number of ISA instruction to set a breakpoint. Remained bits are unused.");
    USC_RV_Declare( bool, ShaderDebugHashCodeInKernel, false, "", "" );
    USC_RV_Declare( bool, SystemThreadCacheFlushDisable, false, "", "" );
    USC_RV_Declare( dword, SystemThreadCacheFlushCountOverride , 0, "", "" );
    USC_RV_Declare( bool, PrintSimdMaskInLIR, false, "", "Prints the destination SIMD mask in the LIR dump" );
    USC_RV_Declare( bool, KillPixelHangWorkaroundOverrideEnable, false, "", "" );
    USC_RV_Declare( dword, KillPixelHangWorkaroundOverride, 0, "", "" );
    USC_RV_Declare( bool, SendsSupportEnable, false, "", "Enables Sends instruction support for Gen9+." );

    USC_RV_Declare( bool, SystemThreadEnable, false, "", "This key forces software to create a system thread. The system thread may still be created by software even if this control is set to false. The system thread is invoked if either the software requires exception handling or if kernel debugging is active and a breakpoint is hit." );
    USC_RV_Declare( bool, InstructionCompactionEnable, true, "", "Enables instruction compaction capability" );
    USC_RV_Declare( bool, SIMD32CompileOverride, false, "", "Overrides current SIMD32 settings with regkey settings for Pixel Shaders." );
    USC_RV_Declare( bool, SIMD32CompileEnable, true, "", "Enables/Disables SIMD32 Compile. If we compile SIMD32 we also need to compile SIMD16 Note: JIT compiler may use additional heuristics which will suppress SIMD32 kernels with this settings (for example SIMD32 kernels will not be generated if there is already SIMD16 kernel which hides IO latencies)." );
    USC_RV_Declare( bool, SIMD32CompileForce, false, "", "Forces SIMD32 compile, all JIT heuristics are bypassed. SIMD32 kernels will not be generated only if SIMD32AllowSpillFill flag is set to FALSE and SIMD32 kernel would require spill-fills." );
    USC_RV_Declare( bool, SIMD32AllowSpillFill, false, "", "Allow / disallow SIMD32 compilation with spill-fills" );
    USC_RV_Declare( bool, SIMD16CompileOverride, false, "", "Overrides current SIMD16 settings with regkey settings" );
    USC_RV_Declare( bool, SIMD16CompileEnable, true, "", "Enables/Disables SIMD16 Compile" );
    USC_RV_Declare( bool, SIMD16CompileForce, false, "", "Forces SIMD16 compile " );
    USC_RV_Declare( bool, SIMD8CompileOverride, false, "", "Overrides current SIMD8 settings with regkey settings" );
    USC_RV_Declare( bool, SIMD8CompileEnable, true, "", "Enables/Disables SIMD8 Compile" );
    USC_RV_Declare( bool, CSSIMD32CompileForce, false, "", "Forces SIMD32 compilation of compute shaders (may result in spill-fills)." );
    USC_RV_Declare( bool, CSSIMD16CompileForce, false, "", "Forces SIMD16 compilation of compute shaders (may result in spill-fills)." );
    USC_RV_Declare( bool, CSSIMD8CompileForce, false, "", "Forces SIMD8 compilation of compute shaders (may result in spill-fills)." );
    USC_RV_Declare( bool, HeaderBypassDisable, false, "", "" );    
    USC_RV_Declare( bool, DisableOptimizeDependencies, false, "", "" );
    USC_RV_Declare( bool, DisableMergePatchConstantShaders, false, "", "Set to disable merging Patch Constant Hull Shaders" );
    USC_RV_Declare( bool, DisableInstanceUnroll, false, "", "Set to disable Hull Shader instance unrolling optimization" );
    USC_RV_Declare( bool, HSIndexedControlPointShaderEnable, true, "", "Enable/Disable Hull Shader pass-through Control Point phase to use indexing" );
    USC_RV_Declare( bool, HSUseSingleHardwareThreadEnable , true, "", "Enable/Disable Hull Shader single thread compile heuristic" );
    USC_RV_Declare( bool, ForceVSPullModel  , false, "", "" );
    USC_RV_Declare( bool, ForceGSPullModel  , false, "", "" );
    USC_RV_Declare( bool, ForceHSPullModel  , false, "", "" );
    USC_RV_Declare( bool, ForceDSPullModel  , false, "", "" );
    USC_RV_Declare( bool, ForceSampleUVtoZero, false, "", "" );
    USC_RV_Declare( bool, ForceSkipValueNumberingForSample, false, "", "" );
    USC_RV_Declare( bool, VSSIMD4x2CompileForce, false, "", "" );
    USC_RV_Declare( bool, HSSIMD4x2CompileForce, false, "", "" );
    USC_RV_Declare( bool, DSSIMD4x2CompileForce, false, "", "" );
    USC_RV_Declare( bool, GSSIMD4x2CompileForce, false, "", "" );
    USC_RV_Declare( bool, VSSIMD8CompileForce, false, "", "" );
    USC_RV_Declare( bool, HSSIMD8CompileForce, false, "", "" );
    USC_RV_Declare( bool, DSSIMD8CompileForce, false, "", "" );
    USC_RV_Declare( bool, DSSIMD8SPCompileForce, false, "", "" );
    USC_RV_Declare( bool, GSSIMD8CompileForce, false, "", "" );
    USC_RV_Declare( bool, VSSIMD8WithFullEpilogEnable, false, "", "Enabling this causes sending all parts of Vertex Header and position as paramter for DX9 from VS" );
    USC_RV_Declare( bool, HSSIMD8DualPatchModeCompileEnable, false, "", "" );
    USC_RV_Declare( bool, HSSIMD8EightPatchModeCompileEnable, false, "", "For Gen9+ this mean SIMD8 single- and dual-patch compilation instead of SIMD4x2" );
    USC_RV_Declare( bool, DSSIMD8SingleOrDualPatchModeCompileEnable, false, "", "For Gen9+ only, this mean only single-patch compilation" );
    USC_RV_Declare( dword, MaxHSPatchConstantShaders  , 0, "", "Set the upper limit for the number of Patch Constant Hull Shaders" );
    USC_RV_Declare( dword, MaxSIMD16PixelShaderInstructionCount, 8192, "", "SIMD16 kernels will be disabled if their instruction count exceeds the default number" );
    USC_RV_Declare( dword, MaxSIMD32PixelShaderInstructionCount, 8192, "", "SIMD32 kernels will be disabled if their instruction count exceeds the default number" );
    USC_RV_Declare( dword, SIMD32CpiThreshold, 150, "", "(0 for VLV2) SIMD32 kernels will be disabled if SIMD16 CPI will be lower than number of threads per EU on given platform times this number/100" );
    USC_RV_Declare( dword, OCLSIMD32InstructionThreshold, 2048, "", "Compute Shader Compiler will attempt SIMD32 if the number of IL instructions is below this number.  Currently used by OpenCL only." );
    USC_RV_Declare( dword, OCLSIMD32LIRThreshold, 65, "", "Compute Shader Compiler will attempt SIMD32 with any extra heuristic checks if the number of LIR instructions is below this number.  Currently used by OpenCL only." );
    USC_RV_Declare( dword, OCLSIMD32TPMThreshold, 256, "", "Compute Shader Compiler will attempt SIMD32 if the TPM (thread private memory) used by the shader is less than or equal to this number." );
    USC_RV_Declare( dword, MaxSIMD16ComputeShaderInstructionCount, 8192, "", "" );
    USC_RV_Declare( dword, MaxSIMD32ComputeShaderInstructionCount  , 4096, "", "" );
    USC_RV_Declare( dword, SamplerOffsetWorkaroundMinSampleCount, 4, "", "" );
    USC_RV_Declare( dword, L3WAMaxShortVSLength, 0xffff, "", "" );
    USC_RV_Declare( bool, DoLlvmOptimize, false, "", "" );
    USC_RV_Declare( bool, DisableGPGPUIndirectPayload, false, "", "" );
    USC_RV_Declare( bool, LowPrecisionOverride, false, "", " Overrides support for low precision values" );
    USC_RV_Declare( bool, LowPrecisionEnable, true, "", " Enables support for low precision values" );
    USC_RV_Declare( bool, SampleLdWithNativeZeroLodDisable, false, "", " Disables usage of native HW sample_lz, sample_c_lz_and ld_lz. Instead sample, sample_c and ld with LOD 0 are used." );
    USC_RV_Declare( bool, SIMDExpansionEnable, true, "", "When enabled simd expansion will be performed while compiling shader to higher simd (compile time optimization)" );
    USC_RV_Declare( bool, OCLSurfaceStateSpillFillEnable, false, "", "Set to enable OpenCL spill/fills to go to a surface instead of stateless memory." );
    USC_RV_Declare( dword, MaxInstructionsToFixPrecision, 2, "", " Maximum number of instructions that can have degraded performence due to precision change before compiler decides to insert converting MOV" );
    USC_RV_Declare( bool, ForceShortenURBDataLenght, false, "", "Forces shorten URBData lenght" );
    USC_RV_Declare( bool, DisableILReflectOpts, false, "", "Disable T-Rex Reflection Optimization");
    USC_RV_Declare( bool, DisableSIMD32DueEarlyEOTAfterDiscard, false, "","Disable SIMD32 Due Early EOT After Discard");
    USC_RV_Declare( bool, EnableResourceIndexAlwaysNonUniform, false, "", "D3d12 - Treat all indexing as they are maked non-uniform");
    USC_RV_Declare( bool, EnableRegSizeConsistencyCheck, true, "","Enables RegSizeConsistencyCheck");
    USC_RV_Declare( bool, EnableUntypedSrfRead, false, "", "Common optimization for all shaders. Use untyped surface read message to load scattered constant buffer.");
    USC_RV_Declare( bool, DisableHSBarrierRead, false, "", "Removes pre-barrier URB read intended to force URB sync." );
    USC_RV_Declare( bool, ClearVHEnable, false, "", "Clear VH DW0..DW7 for VS,DS,GS." );    
    USC_RV_Declare( bool, ForceSamplerPointer, false, "", "Forces sampler instructions to use sampler table pointer " );
    USC_RV_Declare( bool, ForceDoubleSamplerSlots, false, "", "Forces sampler instructions to use double spaced slots in sampler table access" );
    USC_RV_Declare( bool, URBPaddingSIMD8Disable, false, "", "Disables URB padding for shaders compiled in SIMD8 mode." );
    USC_RV_Declare( bool, ForceSendTGSMFence, false, "", "Send a memory fence for TGSM/SLM even if this it not required for the device." );
    USC_RV_Declare( bool, DisableRSPushConstants, false, "", "Control whether CBs for RC/RD/samplers are used for graphics stages. Must be kept in line with IGFX\\D3D_\\DisableRSPushConstants." );
    USC_RV_Declare( bool, DisableRSPushConstantsCompute, false, "", "Control whether CBs for RC/RD/samplers are used for compute stage. Must be kept in line with (as opposite to) IGFX\\D3D_\\UseRTLPushConstantsCompute." );
    USC_RV_Declare( bool, SWStencilPushConstantEnable, false, "", "Whether SW stencil should use push or pull constants" );
    USC_RV_Declare( bool, CallToSubroutineCallForceEnable, false, "", "Forces replacing simple CALL with SUBROUTINE_CALL" );
    USC_RV_Declare( dword, ForceCompilerInlineFunctionPolicy, 0, "", "Inling function policies: 0 - do not force, 1 - never, 2 - always, 3 - heuristic, 4 - when possible" );
#undef USC_RV_SetGroup

#define USC_RV_SetGroup "USCWAOverrideControl"
    USC_RV_USCWAOverrideControl( WaDisable_WIZUnit_ScratchSpace );
    USC_RV_USCWAOverrideControl( WaClampSamplerArrayIndex );
    USC_RV_USCWAOverrideControl( WaForcePushConstantEvenReadLength );
    USC_RV_USCWAOverrideControl( WaDisableHeaderBypassForPSDepthOutput );
    USC_RV_USCWAOverrideControl( WaForceHeaderForKillPixInstructions );
    USC_RV_USCWAOverrideControl( WaDecomposePowToLogMulExp );
    USC_RV_USCWAOverrideControl( WaDisableMadSrc0Replicate );
    USC_RV_USCWAOverrideControl( WaSamplerChannelDisables );
    USC_RV_USCWAOverrideControl( WaUAVTypedWriteOverlapping );
    USC_RV_USCWAOverrideControl( WaUAVTypedReadOverwritesAllDestChannels );
    USC_RV_USCWAOverrideControl( WaUseOnlySIMD8UntypedRead );
    USC_RV_USCWAOverrideControl( WaUVoffsetToZeroForLd2dms );
    USC_RV_USCWAOverrideControl( WaPerThreadScratchSpaceInGPGPUIncrease );
    USC_RV_USCWAOverrideControl( WaUseFDP3InsteadOfFDP2 );
    USC_RV_USCWAOverrideControl( WaApplyAbsToFrcInstruction );
    USC_RV_USCWAOverrideControl( WaForPlusInfRoundingModeFrcInstruction );
    USC_RV_USCWAOverrideControl( WaEmulateIBFEInstrucion );
    USC_RV_USCWAOverrideControl( WaShaderCalculateResourceOffsets );
    USC_RV_USCWAOverrideControl( WaUseThreadPayloadCompression );
    USC_RV_USCWAOverrideControl( WaUnlitCentroidInterpolation );
    USC_RV_USCWAOverrideControl( WaAddCallToEOTEnabled );
    USC_RV_USCWAOverrideControl( WaZeroUnusedSampleDGradientsParameters );
    USC_RV_USCWAOverrideControl( WaAlphaToOneOGL );
    USC_RV_USCWAOverrideControl( WaOGLGSVertexReordering );
    USC_RV_USCWAOverrideControl( WaOGLGSVertexReorderingTriStripAdjOnly );
    USC_RV_USCWAOverrideControl( WaXScaledFormatConversion );
    USC_RV_USCWAOverrideControl( WaCMPInstFlagDepClearedEarly );
    USC_RV_USCWAOverrideControl( WaScalarAtomic );
    USC_RV_USCWAOverrideControl( WaL3UseSamplerForLoadDualConstant );
    USC_RV_USCWAOverrideControl( WaL3UseSamplerForVectorLoadScatter );
    USC_RV_USCWAOverrideControl( Wa1DSurfaceSIMD4x2ArrayIndexInRAddress );
    USC_RV_USCWAOverrideControl( WaBreakSimd16TernaryInstructionsIntoSimd8 );
    USC_RV_USCWAOverrideControl( WaGSPullModelForPatchlistInputTopology );
    USC_RV_USCWAOverrideControl( WaGSSingleDispatchModeForTriangleInput );
    USC_RV_USCWAOverrideControl( WaForceSIMD8ForBFIInstruction );
    USC_RV_USCWAOverrideControl( WaBreakSimd16InstWhenAccIsUsedIntoSimd8 );
    USC_RV_USCWAOverrideControl( WaEnableDummyMovInGpgpuContextSave );
    USC_RV_USCWAOverrideControl( WaClearNotificationRegInGpgpuContextSave );
    USC_RV_USCWAOverrideControl( WaNotifRegSwapInGpGpuContextRestore );
    USC_RV_USCWAOverrideControl( WaStoreSlmOffsetInSRDuringGpGpuPreemption );
    USC_RV_USCWAOverrideControl( WaSampleGCToSampleLC );
    USC_RV_USCWAOverrideControl( WaCMPInstNullDstForcesThreadSwitch );
    USC_RV_USCWAOverrideControl( WaCMPInstNullDstBreaksR0Scoreboarding );
    USC_RV_USCWAOverrideControl( WaForceHeaderForDualSourceBlendHi );
    USC_RV_USCWAOverrideControl( WaForceHSPullModel );
    USC_RV_USCWAOverrideControl( WaInsertNopToHaltDestination );
    USC_RV_USCWAOverrideControl( WaForceTypeConvertF32To16ToAlign1 );
    USC_RV_USCWAOverrideControl( WaAdditionalMovWhenSrc1ModOnMulMach );
    USC_RV_USCWAOverrideControl( WaForceMulSrc1WordToAlign1 );
    USC_RV_USCWAOverrideControl( WaCallForcesThreadSwitch );
    USC_RV_USCWAOverrideControl( WaThreadSwitchAfterCall );
    USC_RV_USCWAOverrideControl( WANOPBeetweenIndirectAdressingAndBranch );
    USC_RV_USCWAOverrideControl( WaA32StatelessMessagesRequireHeader );
    USC_RV_USCWAOverrideControl( WaNoA32ByteScatteredStatelessMessages );
    USC_RV_USCWAOverrideControl( WaUrbAtomics );
    USC_RV_USCWAOverrideControl( WaBasicCompilationForDPInstructions );
    USC_RV_USCWAOverrideControl( WaHalfFloatSelNotAllowedWithSourceModifiers );
    USC_RV_USCWAOverrideControl( WaLowPrecWriteRTOnlyFloat );
    USC_RV_USCWAOverrideControl( WaBreakF32MixedModeIntoSimd8 );
    USC_RV_USCWAOverrideControl( WaDisableDSDualPatchMode );
    USC_RV_USCWAOverrideControl( WaDisallow64BitImmMov );
    USC_RV_USCWAOverrideControl( WaDisallowDFImmMovWithSimd8 );
    USC_RV_USCWAOverrideControl( WaDisableNoSrcDepSetBeforeEOTSend );
    USC_RV_USCWAOverrideControl( WaDstSubRegNumNotAllowedWithLowPrecPacked );
    USC_RV_USCWAOverrideControl( WaHeaderRequiredOnSimd16Sample16bit );
    USC_RV_USCWAOverrideControl( WaLodRequiredOnTypedMsaaUav );
    USC_RV_USCWAOverrideControl( AccWrEnNotAllowedToAcc1With16bit );
    USC_RV_USCWAOverrideControl( WaSendsSrc1Length0NotAllowed );
    USC_RV_USCWAOverrideControl( WaDisableEuBypassOnSimd16Float16 );
    USC_RV_USCWAOverrideControl( WaDisableEuBypassOnSimd16Float32 );
    USC_RV_USCWAOverrideControl( WaStructuredBufferAsRawBufferOverride );
    USC_RV_USCWAOverrideControl( WaSrc1ImmHfNotAllowed );
    USC_RV_USCWAOverrideControl( WaCselUnsupported );
    USC_RV_USCWAOverrideControl( WaDisableDSCaching );
    USC_RV_USCWAOverrideControl( WaEmitVtxWhenOutVtxCntIsZero );
    USC_RV_USCWAOverrideControl( WaFixCentroidInterpolationRTIR16X );
    USC_RV_USCWAOverrideControl( WaDisableIndirectDataForGPGPUWalker );
    USC_RV_USCWAOverrideControl( WaDisableIndirectDataAndFlushGPGPUWalker );
    USC_RV_USCWAOverrideControl( WaDisablePushConstantHSGS );
    USC_RV_USCWAOverrideControl( WaEnableAllWriteChannelMask );
    USC_RV_USCWAOverrideControl( WaGather4WithGreenChannelSelectOnR32G32Float );
    USC_RV_USCWAOverrideControl( WaPreventHSTessLevelsInterference );
    USC_RV_USCWAOverrideControl( WaAvoidDomainShaderCacheStall );
    USC_RV_USCWAOverrideControl( WaClearArfDependenciesBeforeEot );
    USC_RV_USCWAOverrideControl( WaDoNotPushConstantsForAllPulledGSTopologies );
    USC_RV_USCWAOverrideControl( WaDisableDbg0Register );
    USC_RV_USCWAOverrideControl( WaGrfDependecyClearInGpgpuContextRestore );
    USC_RV_USCWAOverrideControl( WaRestoreFCandMSGRegistersFromUpperOword );
    USC_RV_USCWAOverrideControl( WaRestoreFC4RegisterDW0fromDW1 );
    USC_RV_USCWAOverrideControl( WaRestoreFc0RegistersWithOffset );
    USC_RV_USCWAOverrideControl( WaGrfDepClearOnOutstandingSamplerInGpgpuContextSave );
    USC_RV_USCWAOverrideControl( WaStoreAcc2to9InAlign16InGpgpuContextSave );
    USC_RV_USCWAOverrideControl( WaGrfScoreboardClearInGpgpuContextSave );
    USC_RV_USCWAOverrideControl( WaClearFlowControlGpgpuContextSave );
    USC_RV_USCWAOverrideControl( WaClearCr0SpfInGpgpuContextRestore );
    USC_RV_USCWAOverrideControl( WaSendsSrc1SizeLimitWhenEOT );
    USC_RV_USCWAOverrideControl( WaDisableMixedModeLog );
    USC_RV_USCWAOverrideControl( WaDisableMixedModePow );
    USC_RV_USCWAOverrideControl( WaDisableMixedModeFdiv );
    USC_RV_USCWAOverrideControl( WaFloatMixedModeSelNotAllowedWithPackedDestination );
    USC_RV_USCWAOverrideControl( WaDisableNativeDWxDWMultiplication );
    USC_RV_USCWAOverrideControl( WaForceMinMaxGSThreadCount );
    USC_RV_USCWAOverrideControl( WaIntegerDivisionSourceModifierNotSupported ); 
    USC_RV_USCWAOverrideControl( WaDisableLowPrecisionWriteRTRepData ); 
    USC_RV_USCWAOverrideControl( WADisableWriteCommitForPageFault );
    USC_RV_USCWAOverrideControl( WaDisableDeepLoopsUnrolling );
#undef USC_RV_SetGroup

//NOTE: no default values in first step of this implementation.
#define USC_RV_SetGroup "ShaderCompilerControls"
    USC_RV_DeclareCompilerControl( bool,  IndirectTemporaryRemovalEnable,              false, "", "" );
    USC_RV_DeclareCompilerControl( bool,  CallCndTranslationEnable,                    false, "", "" );
    USC_RV_DeclareCompilerControl( bool,  LoopUnrollingEnable,                         false, "", "" );
    USC_RV_DeclareCompilerControl( bool,  ILPatternMatchingEnable,                     false, "", "" );
    USC_RV_DeclareCompilerControl( bool,  ConditionalExpressionSimplificationEnable,   false, "", "" );
    USC_RV_DeclareCompilerControl( bool,  TrivialSwitchRemovalEnable,                  false, "", "" );
    USC_RV_DeclareCompilerControl( bool,  TrivialIfRemovalEnable,                      false, "", "" );
    USC_RV_DeclareCompilerControl( bool,  EarlyEOTAfterDiscardEnable,                  false, "", "" );
    USC_RV_DeclareCompilerControl( bool,  SwitchTranslationEnable,                     false, "", "" );
    USC_RV_DeclareCompilerControl( bool,  EarlyReturnRemovalEnable,                    false, "", "" );
    USC_RV_DeclareCompilerControl( bool,  InlineSubstitutionEnable,                    false, "", "" );
    USC_RV_DeclareCompilerControl( bool,  CallToSubroutineCallEnable,                  false, "", "" );
    USC_RV_DeclareCompilerControl( bool,  ConstantBufferToConstantRegisterEnable,      false, "", "" );
    USC_RV_DeclareCompilerControl( bool,  ConstantBufferToConstantRegisterLDRAWEnable, false, "", "" );
    USC_RV_DeclareCompilerControl( bool,  ParseOpcodesToPrecModifierEnable,            true,  "", "" );
    USC_RV_DeclareCompilerControl( bool,  IndexedTempGRFCachingEnable,                 false, "", "" );
    USC_RV_DeclareCompilerControl( bool,  ILConstantFoldingEnable,                     false, "", "" );
    USC_RV_DeclareCompilerControl( bool,  ILConstantFoldingAggressive,                 false, "", "" );
    USC_RV_DeclareCompilerControl( bool,  PrintfExpansionEnable,                       false, "", "" );
    USC_RV_DeclareCompilerControl( bool,  TranslateVendorExtensionsEnable,             false, "", "" );
    USC_RV_DeclareCompilerControl( bool,  RemoveDeadOutputEnable,                      false, "", "" );
    USC_RV_DeclareCompilerControl( dword, MaxLoopUnrollLength,                         0,	   "", "" );
    USC_RV_DeclareCompilerControl( dword, MaxConstantBufferPairs,                      0,	   "", "" );
    USC_RV_DeclareCompilerControl( dword, PartialUnrollFactor,                         0,	   "", "" );
    USC_RV_DeclareCompilerControl( bool,  ProcessDynamicResourceIndexingEnable,        true,    "", "" );
    USC_RV_DeclareCompilerControl( dword, IfConversionLength,                          0,	   "", "" );
#undef USC_RV_SetGroup

#define USC_RV_SetGroup "SShaderPatternMatchControls"
    USC_RV_DeclareCompilerControl( bool,    FMulFAddToFMad,                       false, "", "" );
    USC_RV_DeclareCompilerControl( bool,    MovFCmpBranchToMovFCmp,               false, "", "" );
    USC_RV_DeclareCompilerControl( bool,    MovCndToMov,                          false, "", "" );     
    USC_RV_DeclareCompilerControl( bool,    LDStructuredScalarToVector,           false, "", "" );
    USC_RV_DeclareCompilerControl( bool,    FLogFExp2ScalarToVector,              false, "", "" );
    USC_RV_DeclareCompilerControl( bool,    MovFCmpToFMax,                        false, "", "" );
    USC_RV_DeclareCompilerControl( bool,    FCmpGtToFMaxOrFCmpLtToFMin,           false, "", "" );
    USC_RV_DeclareCompilerControl( bool,    PreserveFunctionRetMovs,              false, "", "" );
    USC_RV_DeclareCompilerControl( bool,    IfDiscardToDiscardCND,                false, "", "" );
    USC_RV_DeclareCompilerControl( bool,    IfBranchFlattening,                   false, "", "" );
    USC_RV_DeclareCompilerControl( bool,    ContinueCndRemoval,                   false, "", "" );
    USC_RV_DeclareCompilerControl( bool,    LDRawPtrToIndexedCB,                  false, "", "" );
#undef USC_RV_SetGroup

#define USC_RV_SetGroup "KernelCompilerControls"
    USC_RV_DeclareCompilerControl( bool,    ValueNumberingEnable,                 false, "", "" );
    USC_RV_DeclareCompilerControl( bool,    BlockLoadDirectConstantsEnable,       false, "", "" );
    USC_RV_DeclareCompilerControl( bool,    BlockLoadIndirectConstantsEnable,     false, "", "" );
    USC_RV_DeclareCompilerControl( bool,    BlockLoadScatteredConstantsEnable,    false, "", "" );
    USC_RV_DeclareCompilerControl( bool,    OptimizeReplicateEnable,              false, "", "" );
    USC_RV_DeclareCompilerControl( bool,    Optimize64bitReplicateEnable,         false, "", "" );
    USC_RV_DeclareCompilerControl( bool,    ReorderInstructionsEnable,            false, "", "" );
    USC_RV_DeclareCompilerControl( bool,    ClusterSamplesEnable,                 false, "", "" );
    USC_RV_DeclareCompilerControl( bool,    DeferredInterpolationEnable,          false, "", "" );
    USC_RV_DeclareCompilerControl( bool,    AtomicReorderInstructionsEnable,      false, "", "" );
    USC_RV_DeclareCompilerControl( bool,    CoalescingEnable,                     false, "", "" );
    USC_RV_DeclareCompilerControl( bool,    CoalesceCopiesEnable,                 false, "", "" );
    USC_RV_DeclareCompilerControl( bool,    CoalesceBitcastsEnable,               false, "", "" );
    USC_RV_DeclareCompilerControl( bool,    CoalesceSplitsEnable,                 false, "", "" );
    USC_RV_DeclareCompilerControl( bool,    CoalesceJoinsEnable,                  false, "", "" );
    USC_RV_DeclareCompilerControl( bool,    CoalesceMultiplePayloadsEnable,       false, "", "" );
    USC_RV_DeclareCompilerControl( bool,    CoalesceHeadersLastEnable,            false, "", "" );
    USC_RV_DeclareCompilerControl( bool,    ImmediatesToConstantBufferEnable,     false, "", "" );
    USC_RV_DeclareCompilerControl( dword,   IndirectCBOptimizationMode,           0,     "", "" );
    USC_RV_DeclareCompilerControl( dword,   ImmediatesToConstantBufferMinImmediates, 5,  "", "" );
    USC_RV_DeclareCompilerControl( dword,   MaxNumOfMulInstructionsPerPowUnwind,     3,	 "", "" );
    USC_RV_DeclareCompilerControl( dword,   MulWeightOfSqrtInstructionInPowUnwind,   2,	 "", "" );
    USC_RV_DeclareCompilerControl( dword,   MulWeightOfInvInstructionInPowUnwind,    2,	 "", "" );
    USC_RV_DeclareCompilerControl( bool,    OptimizeResourceLoadsEnable,          false, "", "" );
    USC_RV_DeclareCompilerControl( bool,    ISASchedulingEnable,                  false, "", "" );
    USC_RV_DeclareCompilerControl( bool,    Reduce64To32ALUBitEnable,             false, "", "" );    
    USC_RV_DeclareCompilerControl( bool,    Reduce32To8ALUBitEnable,              false, "", "" );
    USC_RV_DeclareCompilerControl( bool,    Reduce64To32ALUTopDownPassBitEnable,  false, "", "" );
    USC_RV_DeclareCompilerControl( bool,    Reduce64To32ALUBottomUpPassBitEnable, false, "", "" );
    USC_RV_DeclareCompilerControl( bool,    Reduce64To32ALUSplitPassBitEnable,    false, "", "" );
    USC_RV_DeclareCompilerControl( bool,    MergeSplitJoinDpEnable,               false, "", "" );
    USC_RV_DeclareCompilerControl( bool,    FoldUnpacksEnable,                    false, "", "" );    
    USC_RV_DeclareCompilerControl( bool,    ConstantFoldingEnable,                false, "", "" );
    USC_RV_DeclareCompilerControl( bool,    LoopInvariantCodeMotionEnable,        false, "", "" );
    USC_RV_DeclareCompilerControl( bool,    InputMarkingEnable,                   false, "", "" );
    USC_RV_DeclareCompilerControl( bool,    DispatchDetectionEnable,              false, "", "" );
    USC_RV_DeclareCompilerControl( bool,    SimdReductionEnable,                  false, "", "" );
    USC_RV_DeclareCompilerControl( bool,    LocallyScalarSimdReductionEnable,     false, "", "" );
    USC_RV_DeclareCompilerControl( bool,    CPLoadBufferOptimizationEnable,       false, "", "" );
    USC_RV_DeclareCompilerControl( bool,    RoundRobinRegisterAllocationEnable,   false, "", "" );
    USC_RV_DeclareCompilerControl( bool,    PatternMatchReplaceEnable,            false, "", "" );
    USC_RV_DeclareCompilerControl( bool,    EuBypassEnable,                       false, "", "" );
    USC_RV_DeclareCompilerControl( bool,    GRFBankAlignmentEnable,               false, "", "" );
    USC_RV_DeclareCompilerControl( bool,    OptimizeValuesNamespaceEnable,        false, "", "" );
    USC_RV_DeclareCompilerControl( bool,    UrbAtomicsEnable,                     false, "", "" );
    USC_RV_DeclareCompilerControl( bool,    ScalarAtomicEnable,                   false, "", "" );
    USC_RV_DeclareCompilerControl( bool,    ComputeToAccumulatorEnable,           false, "", "" );
    USC_RV_DeclareCompilerControl( bool,    OptimizeSimd8MovsEnable,              false, "", "" );
    USC_RV_DeclareCompilerControl( bool,    AlignedPointerDetectionEnable,        false, "", "" );
    USC_RV_DeclareCompilerControl( bool,    BlockLoadGloballyScalarPointerEnable, false, "", "" );
    USC_RV_DeclareCompilerControl( bool,    ChannelPropagationEnable,             false, "", "" );
    USC_RV_DeclareCompilerControl( bool,    CoalesceLdThreadEnable,               false, "", "" );
    USC_RV_DeclareCompilerControl( bool,    CoalesceLdCrossLaneEnable,            false, "", "" );
    USC_RV_DeclareCompilerControl( bool,    CoalesceLdEnable,                     false, "", "" );
    USC_RV_DeclareCompilerControl( bool,    CoalesceStoreEnable,                  false, "", "" );
    USC_RV_DeclareCompilerControl( bool,    CutNonspillableLiveRangesEnable,      false, "", "" );
    USC_RV_DeclareCompilerControl( bool,    DecreaseGRFPressureIfSpilledEnable,   false, "", "" );
    USC_RV_DeclareCompilerControl( bool,    CodeSinkingEnable,                    false, "", "" );
    USC_RV_DeclareCompilerControl( bool,    MovPropagationEnable,                 false, "", "" );
    USC_RV_DeclareCompilerControl( bool,    CondModPropagationEnable,             false, "", "" );
    USC_RV_DeclareCompilerControl( bool,    RematerializationEnable,              false, "", "" );
    USC_RV_DeclareCompilerControl( bool,    RegionPreSchedulingEnable,            false, "", "" );
    USC_RV_DeclareCompilerControl( bool,    PruningEnable,                        false, "", "" );
    USC_RV_DeclareCompilerControl( bool,    DeadBranchRemovalEnable,              false, "", "" );
    USC_RV_DeclareCompilerControl( bool,    NoSrcDepSetEnable,                    false, "", "" );
    USC_RV_DeclareCompilerControl( bool,    ShaderHWInputPackingEnable,           false, "", "" );
    USC_RV_DeclareCompilerControl( bool,    ShaderDeclarationPackingEnable,       false, "", "" );
    USC_RV_DeclareCompilerControl( bool,    GotoJoinOptEnable,                    false, "", "" );
    USC_RV_DeclareCompilerControl( bool,    GotoAroundGotoMergeEnable,            false, "", "" );
    USC_RV_DeclareCompilerControl( bool,    StatefulCompilationEnable,            false, "", "" );
    USC_RV_DeclareCompilerControl( bool,    AtomicDstRemovalEnable,               false, "", "" );
    USC_RV_DeclareCompilerControl( bool,    MergeSimd8SamplerCBLoadsToSimd16Enable, false, "", "" );        
    USC_RV_DeclareCompilerControl( bool,    SoftwareFp16PayloadEnable,              false, "", "");
    USC_RV_DeclareCompilerControl( bool,    SplitQuadTo32bitForALUEnable,           false, "", "" );
    USC_RV_DeclareCompilerControl( bool,    SIMD32DivergentLoopHeuristicEnable,     false, "", "" );
    USC_RV_DeclareCompilerControl( bool,    SIMD32SampleCountHeuristicEnable,       false, "", "" );
    USC_RV_DeclareCompilerControl( bool,    SIMD32ConcurrentValuesHeuristicEnable,false, "", "" );
    USC_RV_DeclareCompilerControl( bool,    SIMD32ExtraHeuristicsEnable,          false, "", "" );

    USC_RV_DeclareCompilerControl( bool, PMRChannelMatchEnable,                   false, "", "" );
    USC_RV_DeclareCompilerControl( bool, PMRPowerMatchEnable,                     false, "", "" );
    USC_RV_DeclareCompilerControl( bool, PMREUBypassMatchEnable,                  false, "", "" );
    USC_RV_DeclareCompilerControl( bool, PMRComparisonMatchEnable,                false, "", "" );
    USC_RV_DeclareCompilerControl( bool, PMRFlowControlMatchEnable,               false, "", "" );
    USC_RV_DeclareCompilerControl( bool, PMRMultiplyMatchEnable,                  false, "", "" );
    USC_RV_DeclareCompilerControl( bool, PMRMulMadMatchEnable,                    false, "", "" );
    USC_RV_DeclareCompilerControl( bool, PMRSqrtMatchEnable,                      false, "", "" );
    USC_RV_DeclareCompilerControl( bool, PMRFDivMatchEnable,                      false, "", "" );
    USC_RV_DeclareCompilerControl( bool, PMRSelectMatchEnable,                    false, "", "" );
    USC_RV_DeclareCompilerControl( bool, PMRMinMaxMatchEnable,                    false, "", "" );
    USC_RV_DeclareCompilerControl( bool, PMRMulDivMatchEnable,                    false, "", "" );
    USC_RV_DeclareCompilerControl( bool, PMRFDP3MatchEnable,                      false, "", "" );
    USC_RV_DeclareCompilerControl( bool, PMRFDP4ToHMatchEnable,                   false, "", "" );
    USC_RV_DeclareCompilerControl( bool, PMRMov0FDPMatchEnable,                   false, "", "" );
    USC_RV_DeclareCompilerControl( bool, PMRMadMatchEnable,                       false, "", "" );
    USC_RV_DeclareCompilerControl( bool, PMRBfeMatchEnable,                       false, "", "" );
    USC_RV_DeclareCompilerControl( bool, PMRLrpMatchEnable,                       false, "", "" );
    USC_RV_DeclareCompilerControl( bool, PMRTrivialLrpMatchEnable,                false, "", "" );
    USC_RV_DeclareCompilerControl( bool, PMRMovLrpToAddMadMatchEnable,            false, "", "" );
    USC_RV_DeclareCompilerControl( bool, PMRBfiMatchEnable,                       false, "", "" );
    USC_RV_DeclareCompilerControl( bool, PMRShrShlMatchEnable,                    false, "", "" );
    USC_RV_DeclareCompilerControl( bool, PMRAddShlMatchEnable,                    false, "", "" );
    USC_RV_DeclareCompilerControl( bool, PMRAddAddMatchEnable,                    false, "", "" );
    USC_RV_DeclareCompilerControl( bool, PMRAndShiftMatchEnable,                  false, "", "" );
    USC_RV_DeclareCompilerControl( bool, PMRJOIN_DPMatchEnable,                   false, "", "" );
    USC_RV_DeclareCompilerControl( bool, PMRConvert64bitTo32bit,                  false, "", "" );
    USC_RV_DeclareCompilerControl( bool, PMRGetValueFromActiveChannelMatchEnable, false, "", "" );
    USC_RV_DeclareCompilerControl( bool, PMRCselMatchEnable,                      false, "", "" );
    USC_RV_DeclareCompilerControl( bool, PMRReplicateComponentMatchEnable,        false, "", "" );
    USC_RV_DeclareCompilerControl( bool, PMRFDPHMatchEnable,                      false, "", "" );
    USC_RV_DeclareCompilerControl( bool, PMRPackMatchEnable,                      false, "", "" );
    USC_RV_DeclareCompilerControl( bool, PMRFFRCMatchEnable,                      false, "", "" );
    USC_RV_DeclareCompilerControl( bool, PMRConstantPropagationMatchEnable,       true, "", "Enables Constant Propagation" );
    USC_RV_DeclareCompilerControl( bool, PMRTrivialPOWMatchEnable,                false, "", "" );
    USC_RV_DeclareCompilerControl( bool, PMRMulAddToMulMatchEnable,               false, "", "" );
    USC_RV_DeclareCompilerControl( bool, PMRVecImmScalarMatchEnable,              false, "", "" );
    USC_RV_DeclareCompilerControl( bool, PMRMovTwoLowPrecImmEnable,               false, "", "" );
    USC_RV_DeclareCompilerControl( bool, PMRIntConvertToBitcastEnable,            false, "", "" );
    USC_RV_DeclareCompilerControl( bool, PMRHoistBitcastsEnable,                  false, "", "" );
    USC_RV_DeclareCompilerControl( bool, PMRMediaBlockReadPackMatchEnable,        false, "", "" );
    USC_RV_DeclareCompilerControl( bool, PMRAverageMatchEnable,                   false, "", "" );
    USC_RV_DeclareCompilerControl( bool, PMRPropIntConvMatchEnable,               false, "", "" );
    USC_RV_DeclareCompilerControl( bool, PMRConvToMovMatchEnable,                 false, "", "" );
    USC_RV_DeclareCompilerControl( bool, PMRPropagateRedundantPackEnable,         false, "", "" );
    USC_RV_DeclareCompilerControl( bool, PMRHoistSaturateEnable,                  false, "", "" );
    USC_RV_DeclareCompilerControl( bool, PMRMergeWordByteUnpacksEnable,           false, "", "" );
    USC_RV_DeclareCompilerControl( bool, PMRMergeWordUnpacksEnable,               false, "", "" );
    USC_RV_DeclareCompilerControl( bool, PMRPropLowPrecEnable,                    false, "", "" );
    USC_RV_DeclareCompilerControl( bool, DecomposeFDivToFRcpFMul,                 false, "", "" );

#undef USC_RV_SetGroup

};
const unsigned int NUM_REGISTRY_VARIABLES = sizeof(SUSCRegistryVariables) / sizeof(SRegistryEntry);

} //namespace USC

/*****************************************************************************\
DEFINE: GHAL3D_OUTPUT_DIRECTORY and USC_ISA_INJECTION_DIRECTORY
\*****************************************************************************/
#if defined(_WIN32)  
	#define GHAL3D_OUTPUT_DIRECTORY "\\Intel\\USC\\"
#elif defined(ANDROID)
    #define GHAL3D_OUTPUT_DIRECTORY "/sdcard/IntelUSC/"
    #define USC_ISA_INJECTION_DIRECTORY	"/sdcard/IntelUSC/IsaInjection/"
#else
    #define GHAL3D_OUTPUT_DIRECTORY "/tmp/IntelUSC/"
	#define USC_ISA_INJECTION_DIRECTORY	"/tmp/IntelUSC/IsaInjection/"	
#endif
