From 0d8dceea4310fde5706b3ce1c70609d72a38efdf Mon Sep 17 00:00:00 2001 From: John Schoenick Date: Wed, 9 Sep 2015 18:35:41 -0700 Subject: Updated the SDK with the latest code from the TF and HL2 branches. --- mp/src/public/materialsystem/IShader.h | 110 +---------------- mp/src/public/materialsystem/combineoperations.h | 29 +++++ mp/src/public/materialsystem/imaterialsystem.h | 44 ++++++- .../materialsystem/ishadersystem_declarations.h | 131 +++++++++++++++++++++ mp/src/public/materialsystem/itexture.h | 11 ++ mp/src/public/materialsystem/itexturecompositor.h | 50 ++++++++ 6 files changed, 268 insertions(+), 107 deletions(-) create mode 100644 mp/src/public/materialsystem/combineoperations.h create mode 100644 mp/src/public/materialsystem/ishadersystem_declarations.h create mode 100644 mp/src/public/materialsystem/itexturecompositor.h (limited to 'mp/src/public/materialsystem') diff --git a/mp/src/public/materialsystem/IShader.h b/mp/src/public/materialsystem/IShader.h index 27bf91e3..7815e8aa 100644 --- a/mp/src/public/materialsystem/IShader.h +++ b/mp/src/public/materialsystem/IShader.h @@ -21,8 +21,9 @@ // it's not 256, because you can't use all 256 slots in 10.5.x. // use this constant everywhere you might normally use "256" in reference to a parameter array size. // The highest shader constant is c218, plus we allocate c219 and c220 for two clip planes -#define DXABSTRACT_VS_PARAM_SLOTS 219 +#define DXABSTRACT_VS_PARAM_SLOTS 228 #define DXABSTRACT_VS_FIRST_BONE_SLOT VERTEX_SHADER_MODEL +#define DXABSTRACT_VS_LAST_BONE_SLOT (VERTEX_SHADER_SHADER_SPECIFIC_CONST_13-1) // user clip plane 0 goes in DXABSTRACT_VS_CLIP_PLANE_BASE... plane 1 goes in the slot after that // dxabstract uses these constants to check plane index limit and to deliver planes to shader for DP4 -> oCLP[n] @@ -33,6 +34,8 @@ #include "materialsystem/imaterialsystem.h" #include "materialsystem/ishaderapi.h" +#include "materialsystem/ishadersystem_declarations.h" + //----------------------------------------------------------------------------- // forward declarations @@ -43,24 +46,6 @@ class IShaderDynamicAPI; class IShaderInit; class CBasePerMaterialContextData; -//----------------------------------------------------------------------------- -// Shader flags -//----------------------------------------------------------------------------- -enum ShaderFlags_t -{ - SHADER_NOT_EDITABLE = 0x1 -}; - - -//----------------------------------------------------------------------------- -// Shader parameter flags -//----------------------------------------------------------------------------- -enum ShaderParamFlags_t -{ - SHADER_PARAM_NOT_EDITABLE = 0x1 -}; - - //----------------------------------------------------------------------------- // Information about each shader parameter //----------------------------------------------------------------------------- @@ -74,72 +59,10 @@ struct ShaderParamInfo_t }; -//----------------------------------------------------------------------------- -// Standard vertex shader constants -//----------------------------------------------------------------------------- -enum -{ - // Standard vertex shader constants - VERTEX_SHADER_MATH_CONSTANTS0 = 0, - VERTEX_SHADER_MATH_CONSTANTS1 = 1, - VERTEX_SHADER_CAMERA_POS = 2, - VERTEX_SHADER_FLEXSCALE = 3, // used by DX9 only! - VERTEX_SHADER_LIGHT_INDEX = 3, // used by DX8 only! - VERTEX_SHADER_MODELVIEWPROJ = 4, - VERTEX_SHADER_VIEWPROJ = 8, - VERTEX_SHADER_MODELVIEWPROJ_THIRD_ROW = 12, - VERTEX_SHADER_VIEWPROJ_THIRD_ROW = 13, - VERTEX_SHADER_SHADER_SPECIFIC_CONST_10 = 14, - VERTEX_SHADER_SHADER_SPECIFIC_CONST_11 = 15, - VERTEX_SHADER_FOG_PARAMS = 16, - VERTEX_SHADER_VIEWMODEL = 17, - VERTEX_SHADER_AMBIENT_LIGHT = 21, - VERTEX_SHADER_LIGHTS = 27, - VERTEX_SHADER_LIGHT0_POSITION = 29, - VERTEX_SHADER_MODULATION_COLOR = 47, - VERTEX_SHADER_SHADER_SPECIFIC_CONST_0 = 48, - VERTEX_SHADER_SHADER_SPECIFIC_CONST_1 = 49, - VERTEX_SHADER_SHADER_SPECIFIC_CONST_2 = 50, - VERTEX_SHADER_SHADER_SPECIFIC_CONST_3 = 51, - VERTEX_SHADER_SHADER_SPECIFIC_CONST_4 = 52, - VERTEX_SHADER_SHADER_SPECIFIC_CONST_5 = 53, - VERTEX_SHADER_SHADER_SPECIFIC_CONST_6 = 54, - VERTEX_SHADER_SHADER_SPECIFIC_CONST_7 = 55, - VERTEX_SHADER_SHADER_SPECIFIC_CONST_8 = 56, - VERTEX_SHADER_SHADER_SPECIFIC_CONST_9 = 57, - VERTEX_SHADER_MODEL = 58, - - // - // We reserve up through 216 for the 53 bones - // - - // 219 ClipPlane0 |------ OpenGL will jam clip planes into these two - // 220 ClipPlane1 | - - VERTEX_SHADER_FLEX_WEIGHTS = 1024, - VERTEX_SHADER_MAX_FLEX_WEIGHT_COUNT = 512, -}; #define VERTEX_SHADER_BONE_TRANSFORM( k ) ( VERTEX_SHADER_MODEL + 3 * (k) ) -//----------------------------------------------------------------------------- -// Standard vertex shader constants -//----------------------------------------------------------------------------- -enum -{ - // Standard vertex shader constants - VERTEX_SHADER_LIGHT_ENABLE_BOOL_CONST = 0, - VERTEX_SHADER_LIGHT_ENABLE_BOOL_CONST_COUNT = 4, - - VERTEX_SHADER_SHADER_SPECIFIC_BOOL_CONST_0 = 4, - VERTEX_SHADER_SHADER_SPECIFIC_BOOL_CONST_1 = 5, - VERTEX_SHADER_SHADER_SPECIFIC_BOOL_CONST_2 = 6, - VERTEX_SHADER_SHADER_SPECIFIC_BOOL_CONST_3 = 7, - VERTEX_SHADER_SHADER_SPECIFIC_BOOL_CONST_4 = 8, - VERTEX_SHADER_SHADER_SPECIFIC_BOOL_CONST_5 = 9, - VERTEX_SHADER_SHADER_SPECIFIC_BOOL_CONST_6 = 10, - VERTEX_SHADER_SHADER_SPECIFIC_BOOL_CONST_7 = 11, -}; + // The public methods exposed by each shader //----------------------------------------------------------------------------- abstract_class IShader @@ -179,27 +102,4 @@ public: // virtual const ShaderParamInfo_t& GetParamInfo( int paramIndex ) const = 0; }; - -//----------------------------------------------------------------------------- -// Shader dictionaries defined in DLLs -//----------------------------------------------------------------------------- -enum PrecompiledShaderType_t -{ - PRECOMPILED_VERTEX_SHADER = 0, - PRECOMPILED_PIXEL_SHADER, - - PRECOMPILED_SHADER_TYPE_COUNT, -}; - - -//----------------------------------------------------------------------------- -// Flags field of PrecompiledShader_t -//----------------------------------------------------------------------------- -enum -{ - // runtime flags - SHADER_DYNAMIC_COMPILE_IS_HLSL = 0x1, - SHADER_FAILED_LOAD = 0x2, -}; - #endif // ISHADER_H diff --git a/mp/src/public/materialsystem/combineoperations.h b/mp/src/public/materialsystem/combineoperations.h new file mode 100644 index 00000000..195f19f4 --- /dev/null +++ b/mp/src/public/materialsystem/combineoperations.h @@ -0,0 +1,29 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +// $NoKeywords: $ +//=============================================================================// + +#ifndef COMBINEOPERATIONS_H +#define COMBINEOPERATIONS_H +#pragma once + +// New combines can be written in the middle (and generally should be written before Error). +// Keep these in sync with cCombineMaterialName in ctexturecompositor.cpp +enum ECombineOperation +{ + ECO_Multiply = 0, + ECO_Add, + ECO_Lerp, + + ECO_Select, + + ECO_Legacy_Lerp_FirstPass, + ECO_Legacy_Lerp_SecondPass, + + ECO_Error, + ECO_COUNT +}; + +#endif /* COMBINEOPERATIONS_H */ diff --git a/mp/src/public/materialsystem/imaterialsystem.h b/mp/src/public/materialsystem/imaterialsystem.h index 3f3563b6..bf896579 100644 --- a/mp/src/public/materialsystem/imaterialsystem.h +++ b/mp/src/public/materialsystem/imaterialsystem.h @@ -43,6 +43,7 @@ struct MaterialSystem_Config_t; class VMatrix; struct matrix3x4_t; class ITexture; +class ITextureCompositor; struct MaterialSystemHardwareIdentifier_t; class KeyValues; class IShader; @@ -88,6 +89,7 @@ enum ShaderParamType_t SHADER_PARAM_TYPE_MATRIX, SHADER_PARAM_TYPE_MATERIAL, SHADER_PARAM_TYPE_STRING, + SHADER_PARAM_TYPE_MATRIX4X2 }; enum MaterialMatrixMode_t @@ -289,7 +291,6 @@ private: #define CREATERENDERTARGETFLAGS_NOEDRAM 0x00000008 // inhibit allocation in 360 EDRAM #define CREATERENDERTARGETFLAGS_TEMP 0x00000010 // only allocates memory upon first resolve, destroyed at level end - //----------------------------------------------------------------------------- // allowed stencil operations. These match the d3d operations //----------------------------------------------------------------------------- @@ -478,6 +479,21 @@ private: int m_nBottom; }; +// Passed as the callback object to Async functions in the material system +// so that callers don't have to worry about memory going out of scope before the +// results return. +abstract_class IAsyncTextureOperationReceiver : public IRefCounted +{ +public: + virtual void OnAsyncCreateComplete( ITexture* pTex, void* pExtraArgs ) = 0; + virtual void OnAsyncFindComplete( ITexture* pTex, void* pExtraArgs ) = 0; + virtual void OnAsyncMapComplete( ITexture* pTex, void* pExtraArgs, void* pMemory, int nPitch ) = 0; + virtual void OnAsyncReadbackBegin( ITexture* pDst, ITexture* pSrc, void* pExtraArgs ) = 0; + + virtual int GetRefCount() const = 0; +}; + + //----------------------------------------------------------------------------- // Flags to be used with the Init call //----------------------------------------------------------------------------- @@ -525,7 +541,9 @@ enum RenderTargetSizeMode_t RT_SIZE_OFFSCREEN=5, // Target of specified size, don't mess with dimensions RT_SIZE_FULL_FRAME_BUFFER_ROUNDED_UP=6, // Same size as the frame buffer, rounded up if necessary for systems that can't do non-power of two textures. RT_SIZE_REPLAY_SCREENSHOT = 7, // Rounded down to power of 2, essentially... - RT_SIZE_LITERAL = 8 // Use the size passed in. Don't clamp it to the frame buffer size. Really. + RT_SIZE_LITERAL = 8, // Use the size passed in. Don't clamp it to the frame buffer size. Really. + RT_SIZE_LITERAL_PICMIP = 9 // Use the size passed in, don't clamp to the frame buffer size, but do apply picmip restrictions. + }; typedef void (*MaterialBufferReleaseFunc_t)( ); @@ -1043,6 +1061,23 @@ public: // creates a texture suitable for use with materials from a raw stream of bits. // The bits will be retained by the material system and can be freed upon return. virtual ITexture* CreateTextureFromBits(int w, int h, int mips, ImageFormat fmt, int srcBufferSize, byte* srcBits) = 0; + + // Lie to the material system to pretend to be in render target allocation mode at the beginning of time. + // This was a thing that mattered a lot to old hardware, but doesn't matter at all to new hardware, + // where new is defined to be "anything from the last decade." However, we want to preserve legacy behavior + // for the old games because it's easier than testing them. + virtual void OverrideRenderTargetAllocation( bool rtAlloc ) = 0; + + // creates a texture compositor that will attempt to composite a new textuer from the steps of the specified KeyValues. + virtual ITextureCompositor* NewTextureCompositor( int w, int h, const char* pCompositeName, int nTeamNum, uint64 randomSeed, KeyValues* stageDesc, uint32 texCompositeCreateFlags = 0 ) = 0; + + // Loads the texture with the specified name, calls pRecipient->OnAsyncFindComplete with the result from the main thread. + // once the texture load is complete. If the texture cannot be found, the returned texture will return true for IsError(). + virtual void AsyncFindTexture( const char* pFilename, const char *pTextureGroupName, IAsyncTextureOperationReceiver* pRecipient, void* pExtraArgs, bool bComplain = true, int nAdditionalCreationFlags = 0 ) = 0; + + // creates a texture suitable for use with materials from a raw stream of bits. + // The bits will be retained by the material system and can be freed upon return. + virtual ITexture* CreateNamedTextureFromBitsEx( const char* pName, const char *pTextureGroupName, int w, int h, int mips, ImageFormat fmt, int srcBufferSize, byte* srcBits, int nFlags ) = 0; }; @@ -1504,6 +1539,11 @@ public: virtual void OverrideColorWriteEnable( bool bOverrideEnable, bool bColorWriteEnable ) = 0; virtual void ClearBuffersObeyStencilEx( bool bClearColor, bool bClearAlpha, bool bClearDepth ) = 0; + + // Create a texture from the specified src render target, then call pRecipient->OnAsyncCreateComplete from the main thread. + // The texture will be created using the destination format, and will optionally have mipmaps generated. + // In case of error, the provided callback function will be called with the error texture. + virtual void AsyncCreateTextureFromRenderTarget( ITexture* pSrcRt, const char* pDstName, ImageFormat dstFmt, bool bGenMips, int nAdditionalCreationFlags, IAsyncTextureOperationReceiver* pRecipient, void* pExtraArgs ) = 0; }; template< class E > inline E* IMatRenderContext::LockRenderDataTyped( int nCount, const E* pSrcData ) diff --git a/mp/src/public/materialsystem/ishadersystem_declarations.h b/mp/src/public/materialsystem/ishadersystem_declarations.h new file mode 100644 index 00000000..3c54edca --- /dev/null +++ b/mp/src/public/materialsystem/ishadersystem_declarations.h @@ -0,0 +1,131 @@ +//===== Copyright © Valve Corporation, All rights reserved. ======// +#ifndef ISHADER_DECLARATIONS_HDR +#define ISHADER_DECLARATIONS_HDR + +//----------------------------------------------------------------------------- +// Standard vertex shader constants +//----------------------------------------------------------------------------- +enum +{ + // Standard vertex shader constants + VERTEX_SHADER_MATH_CONSTANTS0 = 0, + VERTEX_SHADER_MATH_CONSTANTS1 = 1, + VERTEX_SHADER_CAMERA_POS = 2, + VERTEX_SHADER_FLEXSCALE = 3, // DX9 only + VERTEX_SHADER_LIGHT_INDEX = 3, // DX8 only + VERTEX_SHADER_MODELVIEWPROJ = 4, + VERTEX_SHADER_VIEWPROJ = 8, + VERTEX_SHADER_MODELVIEWPROJ_THIRD_ROW = 12, + VERTEX_SHADER_VIEWPROJ_THIRD_ROW = 13, + VERTEX_SHADER_SHADER_SPECIFIC_CONST_10 = 14, + VERTEX_SHADER_SHADER_SPECIFIC_CONST_11 = 15, + VERTEX_SHADER_FOG_PARAMS = 16, + VERTEX_SHADER_VIEWMODEL = 17, + VERTEX_SHADER_AMBIENT_LIGHT = 21, + VERTEX_SHADER_LIGHTS = 27, + VERTEX_SHADER_LIGHT0_POSITION = 29, + VERTEX_SHADER_MODULATION_COLOR = 47, + VERTEX_SHADER_SHADER_SPECIFIC_CONST_0 = 48, + VERTEX_SHADER_SHADER_SPECIFIC_CONST_1 = 49, + VERTEX_SHADER_SHADER_SPECIFIC_CONST_2 = 50, + VERTEX_SHADER_SHADER_SPECIFIC_CONST_3 = 51, + VERTEX_SHADER_SHADER_SPECIFIC_CONST_4 = 52, + VERTEX_SHADER_SHADER_SPECIFIC_CONST_5 = 53, + VERTEX_SHADER_SHADER_SPECIFIC_CONST_6 = 54, + VERTEX_SHADER_SHADER_SPECIFIC_CONST_7 = 55, + VERTEX_SHADER_SHADER_SPECIFIC_CONST_8 = 56, + VERTEX_SHADER_SHADER_SPECIFIC_CONST_9 = 57, + VERTEX_SHADER_MODEL = 58, + // + // We reserve up through 216 for the 53 bones supported on DX9 + // + VERTEX_SHADER_SHADER_SPECIFIC_CONST_13 = 217, + VERTEX_SHADER_SHADER_SPECIFIC_CONST_14 = 218, + VERTEX_SHADER_SHADER_SPECIFIC_CONST_15 = 219, + VERTEX_SHADER_SHADER_SPECIFIC_CONST_16 = 220, + VERTEX_SHADER_SHADER_SPECIFIC_CONST_17 = 221, + VERTEX_SHADER_SHADER_SPECIFIC_CONST_18 = 222, + VERTEX_SHADER_SHADER_SPECIFIC_CONST_19 = 223, + VERTEX_SHADER_SHADER_SPECIFIC_CONST_12 = 224, + + // 226 ClipPlane0 |------ OpenGL will jam clip planes into these two + // 227 ClipPlane1 | + + + VERTEX_SHADER_FLEX_WEIGHTS = 1024, + VERTEX_SHADER_MAX_FLEX_WEIGHT_COUNT = 512, +}; + +//----------------------------------------------------------------------------- +// forward declarations +//----------------------------------------------------------------------------- +class IMaterialVar; +class IShaderShadow; +class IShaderDynamicAPI; +class IShaderInit; +class CBasePerMaterialContextData; + + +//----------------------------------------------------------------------------- +// Shader flags +//----------------------------------------------------------------------------- +enum ShaderFlags_t +{ + SHADER_NOT_EDITABLE = 0x1 +}; + + +//----------------------------------------------------------------------------- +// Shader parameter flags +//----------------------------------------------------------------------------- +enum ShaderParamFlags_t +{ + SHADER_PARAM_NOT_EDITABLE = 0x1 +}; + + + +//----------------------------------------------------------------------------- +// Standard vertex shader constants +//----------------------------------------------------------------------------- +enum +{ + // Standard vertex shader constants + VERTEX_SHADER_LIGHT_ENABLE_BOOL_CONST = 0, + VERTEX_SHADER_LIGHT_ENABLE_BOOL_CONST_COUNT = 4, + + VERTEX_SHADER_SHADER_SPECIFIC_BOOL_CONST_0 = 4, + VERTEX_SHADER_SHADER_SPECIFIC_BOOL_CONST_1 = 5, + VERTEX_SHADER_SHADER_SPECIFIC_BOOL_CONST_2 = 6, + VERTEX_SHADER_SHADER_SPECIFIC_BOOL_CONST_3 = 7, + VERTEX_SHADER_SHADER_SPECIFIC_BOOL_CONST_4 = 8, + VERTEX_SHADER_SHADER_SPECIFIC_BOOL_CONST_5 = 9, + VERTEX_SHADER_SHADER_SPECIFIC_BOOL_CONST_6 = 10, + VERTEX_SHADER_SHADER_SPECIFIC_BOOL_CONST_7 = 11, +}; + + +//----------------------------------------------------------------------------- +// Shader dictionaries defined in DLLs +//----------------------------------------------------------------------------- +enum PrecompiledShaderType_t +{ + PRECOMPILED_VERTEX_SHADER = 0, + PRECOMPILED_PIXEL_SHADER, + + PRECOMPILED_SHADER_TYPE_COUNT, +}; + + +//----------------------------------------------------------------------------- +// Flags field of PrecompiledShader_t +//----------------------------------------------------------------------------- +enum +{ + // runtime flags + SHADER_IS_ASM = 0x1, + SHADER_FAILED_LOAD = 0x2, +}; + + +#endif \ No newline at end of file diff --git a/mp/src/public/materialsystem/itexture.h b/mp/src/public/materialsystem/itexture.h index a5aa20fd..0e315447 100644 --- a/mp/src/public/materialsystem/itexture.h +++ b/mp/src/public/materialsystem/itexture.h @@ -39,6 +39,10 @@ public: // This will be called when the regenerator needs to be deleted // which will happen when the texture is destroyed virtual void Release() = 0; + + // (erics): This should have a virtual destructor, but would be ABI breaking (non-versioned interface implemented + // by the game) +// virtual ~ITextureRegenerator(){} }; abstract_class ITexture @@ -120,6 +124,13 @@ public: // Save texture to a file. virtual bool SaveToFile( const char *fileName ) = 0; + + // Copy this texture, which must be a render target or a renderable texture, to the destination texture, + // which must have been created with the STAGING bit. + virtual void CopyToStagingTexture( ITexture* pDstTex ) = 0; + + // Set that this texture should return true for the call "IsError" + virtual void SetErrorTexture( bool bIsErrorTexture ) = 0; }; diff --git a/mp/src/public/materialsystem/itexturecompositor.h b/mp/src/public/materialsystem/itexturecompositor.h new file mode 100644 index 00000000..a158d36c --- /dev/null +++ b/mp/src/public/materialsystem/itexturecompositor.h @@ -0,0 +1,50 @@ +//========= Copyright Valve Corporation, All rights reserved. ================================== // +// +// Purpose: Defines a texture compositor infterface which uses simple operations and shaders to +// create complex procedural textures. +// +//============================================================================================== // + +#ifndef ITEXTURECOMPOSITOR_H +#define ITEXTURECOMPOSITOR_H +#pragma once + +#include "interface.h" +#include "itexture.h" + +#define ITEXTURE_COMPOSITOR_INTERFACE_VERSION "_ITextureCompositor000" + +enum ECompositeResolveStatus +{ + ECRS_Idle, + ECRS_Scheduled, + ECRS_PendingTextureLoads, + ECRS_PendingComposites, + ECRS_Error, + ECRS_Complete +}; + +enum TextureCompositeCreateFlags_t +{ + TEX_COMPOSITE_CREATE_FLAGS_FORCE = 0x00000001, + TEX_COMPOSITE_CREATE_FLAGS_NO_COMPRESSION = 0x00000002, + TEX_COMPOSITE_CREATE_FLAGS_NO_MIPMAPS = 0x00000004, +}; + +abstract_class ITextureCompositor +{ +public: + virtual int AddRef() = 0; + virtual int Release() = 0; + virtual int GetRefCount() const = 0; + + virtual void Update() = 0; + virtual ITexture* GetResultTexture() const = 0; + virtual ECompositeResolveStatus GetResolveStatus() const = 0; + virtual void ScheduleResolve() = 0; +protected: + virtual ~ITextureCompositor() {} +}; + + +#endif /* ITEXTURECOMPOSITOR_H */ -- cgit v1.2.3