aboutsummaryrefslogtreecommitdiff
path: root/mp/src/public
diff options
context:
space:
mode:
authorJoe Ludwig <[email protected]>2013-12-03 08:54:16 -0800
committerJoe Ludwig <[email protected]>2013-12-03 08:54:16 -0800
commitbeaae8ac45a2f322a792404092d4482065bef7ef (patch)
tree747f35193ba235f0f0b070c05b53468a54559c8e /mp/src/public
parentMake .xcconfigs text files too. (diff)
downloadsource-sdk-2013-beaae8ac45a2f322a792404092d4482065bef7ef.tar.xz
source-sdk-2013-beaae8ac45a2f322a792404092d4482065bef7ef.zip
Updated the SDK with the latest code from the TF and HL2 branches
* Adds support for Visual Studio 2012 and 2013 * VR Mode: . Switches from headtrack.dll to sourcevr.dll . Improved readability of the UI in VR . Removed the IPD calibration tool. TF2 will now obey the Oculus configuration file. Use the Oculus calibration tool in your SDK or install and run "OpenVR" under Tools in Steam to calibrate your IPD. . Added dropdown to enable VR mode in the Video options. Removed the -vr command line option. . Added the ability to switch in and out of VR mode without quitting the game . By default VR mode will run full screen. To switch back to a borderless window set the vr_force_windowed convar. . Added support for VR mode on Linux * Many assorted bug fixes and other changes from Team Fortress in various shared files
Diffstat (limited to 'mp/src/public')
-rw-r--r--mp/src/public/VGuiMatSurface/IMatSystemSurface.h4
-rw-r--r--mp/src/public/XUnzip.cpp10
-rw-r--r--mp/src/public/bone_setup.cpp108
-rw-r--r--mp/src/public/bone_setup.h2
-rw-r--r--mp/src/public/filesystem_init.cpp64
-rw-r--r--mp/src/public/filesystem_init.h3
-rw-r--r--mp/src/public/materialsystem/imaterialsystem.h15
-rw-r--r--mp/src/public/materialsystem/materialsystem_config.h7
-rw-r--r--mp/src/public/mathlib/vector.h2
-rw-r--r--mp/src/public/mathlib/vmatrix.h3
-rw-r--r--mp/src/public/matsys_controls/mdlpanel.h8
-rw-r--r--mp/src/public/matsys_controls/mdlpicker.h1
-rw-r--r--mp/src/public/matsys_controls/potterywheelpanel.h3
-rw-r--r--mp/src/public/shaderapi/IShaderDevice.h1
-rw-r--r--mp/src/public/shaderapi/ishaderapi.h2
-rw-r--r--mp/src/public/sourcevr/isourcevirtualreality.h (renamed from mp/src/public/headtrack/isourcevirtualreality.h)102
-rw-r--r--mp/src/public/studio.h184
-rw-r--r--mp/src/public/tier0/afxmem_override.cpp8
-rw-r--r--mp/src/public/tier0/dbg.h10
-rw-r--r--mp/src/public/tier1/fmtstr.h115
-rw-r--r--mp/src/public/togl/osx/cglmbuffer.h194
-rw-r--r--mp/src/public/togl/osx/cglmfbo.h180
-rw-r--r--mp/src/public/togl/osx/cglmprogram.h578
-rw-r--r--mp/src/public/togl/osx/cglmquery.h168
-rw-r--r--mp/src/public/togl/osx/cglmtex.h544
-rw-r--r--mp/src/public/togl/osx/dxabstract.h1606
-rw-r--r--mp/src/public/togl/osx/glfuncs.h366
-rw-r--r--mp/src/public/togl/osx/glmdisplay.h352
-rw-r--r--mp/src/public/togl/osx/glmgr.h2174
-rw-r--r--mp/src/public/togl/osx/glmgrbasics.h596
-rw-r--r--mp/src/public/togl/osx/glmgrext.h184
-rw-r--r--mp/src/public/vgui/ISurface.h9
-rw-r--r--mp/src/public/windows_default.manifest2
33 files changed, 3951 insertions, 3654 deletions
diff --git a/mp/src/public/VGuiMatSurface/IMatSystemSurface.h b/mp/src/public/VGuiMatSurface/IMatSystemSurface.h
index ddc73e69..03ff33b0 100644
--- a/mp/src/public/VGuiMatSurface/IMatSystemSurface.h
+++ b/mp/src/public/VGuiMatSurface/IMatSystemSurface.h
@@ -105,6 +105,10 @@ public:
// Gets a material bound to a surface texture ID
virtual IMaterial *DrawGetTextureMaterial( int id ) = 0;
+
+ // The matching method is in ISurface, but we can't add anything there and remain mod-compatible.
+ // So this goes here instead.
+ virtual void GetFullscreenViewportAndRenderTarget( int & x, int & y, int & w, int & h, ITexture **ppRenderTarget ) = 0;
};
diff --git a/mp/src/public/XUnzip.cpp b/mp/src/public/XUnzip.cpp
index bd7dc20e..cea57582 100644
--- a/mp/src/public/XUnzip.cpp
+++ b/mp/src/public/XUnzip.cpp
@@ -4474,15 +4474,7 @@ bool SafeUnzipMemory( const void *pvZipped, int cubZipped, void *pvDest, int cub
int iRes = ZR_CORRUPT;
if ( hZip )
{
- try
- {
- iRes = UnzipItem( hZip, 0, pvDest, cubDest, ZIP_MEMORY );
- }
- catch ( ... )
- {
- // failed to unzip, try to continue
- iRes = ZR_CORRUPT;
- }
+ iRes = UnzipItem( hZip, 0, pvDest, cubDest, ZIP_MEMORY );
CloseZip( hZip );
}
diff --git a/mp/src/public/bone_setup.cpp b/mp/src/public/bone_setup.cpp
index 0cc81c67..250133d5 100644
--- a/mp/src/public/bone_setup.cpp
+++ b/mp/src/public/bone_setup.cpp
@@ -678,6 +678,12 @@ static void CalcLocalHierarchyAnimation(
int boneMask
)
{
+#ifdef STAGING_ONLY
+ Assert( iNewParent == -1 || (iNewParent >= 0 && iNewParent < MAXSTUDIOBONES) );
+ Assert( iBone > 0 );
+ Assert( iBone < MAXSTUDIOBONES );
+#endif // STAGING_ONLY
+
Vector localPos;
Quaternion localQ;
@@ -715,12 +721,19 @@ static void CalcLocalHierarchyAnimation(
CalcDecompressedAnimation( pHierarchy->pLocalAnim(), iFrame - pHierarchy->iStart, flFraq, localPos, localQ );
BuildBoneChain( pStudioHdr, rootXform, pos, q, iBone, boneToWorld, boneComputed );
- BuildBoneChain( pStudioHdr, rootXform, pos, q, iNewParent, boneToWorld, boneComputed );
matrix3x4_t localXform;
AngleMatrix( localQ, localPos, localXform );
- ConcatTransforms( boneToWorld[iNewParent], localXform, boneToWorld[iBone] );
+ if ( iNewParent != -1 )
+ {
+ BuildBoneChain( pStudioHdr, rootXform, pos, q, iNewParent, boneToWorld, boneComputed );
+ ConcatTransforms( boneToWorld[iNewParent], localXform, boneToWorld[iBone] );
+ }
+ else
+ {
+ boneToWorld[iBone] = localXform;
+ }
// back solve
Vector p1;
@@ -995,10 +1008,17 @@ static void CalcVirtualAnimation( virtualmodel_t *pVModel, const CStudioHdr *pSt
int iBone = pAnimGroup->masterBone[pHierarchy->iBone];
if (iBone >= 0 && (pStudioHdr->boneFlags(iBone) & boneMask))
{
- int iNewParent = pAnimGroup->masterBone[pHierarchy->iNewParent];
- if (iNewParent >= 0 && (pStudioHdr->boneFlags(iNewParent) & boneMask))
+ if ( pHierarchy->iNewParent != -1 )
{
- CalcLocalHierarchyAnimation( pStudioHdr, boneToWorld, boneComputed, pos, q, pbone, pHierarchy, iBone, iNewParent, cycle, iFrame, s, boneMask );
+ int iNewParent = pAnimGroup->masterBone[pHierarchy->iNewParent];
+ if (iNewParent >= 0 && (pStudioHdr->boneFlags(iNewParent) & boneMask))
+ {
+ CalcLocalHierarchyAnimation( pStudioHdr, boneToWorld, boneComputed, pos, q, pbone, pHierarchy, iBone, iNewParent, cycle, iFrame, s, boneMask );
+ }
+ }
+ else
+ {
+ CalcLocalHierarchyAnimation( pStudioHdr, boneToWorld, boneComputed, pos, q, pbone, pHierarchy, iBone, -1, cycle, iFrame, s, boneMask );
}
}
}
@@ -5948,3 +5968,81 @@ bool Studio_PrefetchSequence( const CStudioHdr *pStudioHdr, int iSequence )
// Everything for this sequence is resident?
return !pendingload;
}
+
+
+//-----------------------------------------------------------------------------
+// Purpose: Drive a flex controller from a component of a bone
+//-----------------------------------------------------------------------------
+void Studio_RunBoneFlexDrivers( float *pflFlexControllerWeights, const CStudioHdr *pStudioHdr, const Vector *pvPositions, const matrix3x4_t *pBoneToWorld, const matrix3x4_t &mRootToWorld )
+{
+ bool bRootToWorldInvComputed = false;
+ matrix3x4_t mRootToWorldInv;
+ matrix3x4_t mParentInv;
+ matrix3x4_t mBoneLocal;
+
+ const int nBoneFlexDriverCount = pStudioHdr->BoneFlexDriverCount();
+
+ for ( int i = 0; i < nBoneFlexDriverCount; ++i )
+ {
+ const mstudioboneflexdriver_t *pBoneFlexDriver = pStudioHdr->BoneFlexDriver( i );
+ const mstudiobone_t *pStudioBone = pStudioHdr->pBone( pBoneFlexDriver->m_nBoneIndex );
+
+ const int nControllerCount = pBoneFlexDriver->m_nControlCount;
+
+ if ( pStudioBone->flags & BONE_USED_BY_BONE_MERGE )
+ {
+ // The local space version of the bone is not available if this is a bonemerged bone
+ // so do the slow computation of the local version of the bone from boneToWorld
+
+ if ( pStudioBone->parent < 0 )
+ {
+ if ( !bRootToWorldInvComputed )
+ {
+ MatrixInvert( mRootToWorld, mRootToWorldInv );
+ bRootToWorldInvComputed = true;
+ }
+
+ MatrixMultiply( mRootToWorldInv, pBoneToWorld[ pBoneFlexDriver->m_nBoneIndex ], mBoneLocal );
+ }
+ else
+ {
+ MatrixInvert( pBoneToWorld[ pStudioBone->parent ], mParentInv );
+ MatrixMultiply( mParentInv, pBoneToWorld[ pBoneFlexDriver->m_nBoneIndex ], mBoneLocal );
+ }
+
+ for ( int j = 0; j < nControllerCount; ++j )
+ {
+ const mstudioboneflexdrivercontrol_t *pController = pBoneFlexDriver->pBoneFlexDriverControl( j );
+ const mstudioflexcontroller_t *pFlexController = pStudioHdr->pFlexcontroller( static_cast< LocalFlexController_t >( pController->m_nFlexControllerIndex ) );
+
+ if ( pFlexController->localToGlobal < 0 )
+ continue;
+
+ Assert( pController->m_nFlexControllerIndex >= 0 && pController->m_nFlexControllerIndex < pStudioHdr->numflexcontrollers() );
+ Assert( pController->m_nBoneComponent >= 0 && pController->m_nBoneComponent <= 2 );
+ pflFlexControllerWeights[pFlexController->localToGlobal] =
+ RemapValClamped( mBoneLocal[pController->m_nBoneComponent][3], pController->m_flMin, pController->m_flMax, 0.0f, 1.0f );
+ }
+ }
+ else
+ {
+ // Use the local space version of the bone directly for non-bonemerged bones
+
+ const Vector &position = pvPositions[ pBoneFlexDriver->m_nBoneIndex ];
+
+ for ( int j = 0; j < nControllerCount; ++j )
+ {
+ const mstudioboneflexdrivercontrol_t *pController = pBoneFlexDriver->pBoneFlexDriverControl( j );
+ const mstudioflexcontroller_t *pFlexController = pStudioHdr->pFlexcontroller( static_cast< LocalFlexController_t >( pController->m_nFlexControllerIndex ) );
+
+ if ( pFlexController->localToGlobal < 0 )
+ continue;
+
+ Assert( pController->m_nFlexControllerIndex >= 0 && pController->m_nFlexControllerIndex < pStudioHdr->numflexcontrollers() );
+ Assert( pController->m_nBoneComponent >= 0 && pController->m_nBoneComponent <= 2 );
+ pflFlexControllerWeights[pFlexController->localToGlobal] =
+ RemapValClamped( position[pController->m_nBoneComponent], pController->m_flMin, pController->m_flMax, 0.0f, 1.0f );
+ }
+ }
+ }
+}
diff --git a/mp/src/public/bone_setup.h b/mp/src/public/bone_setup.h
index ebbdfd57..76f00a66 100644
--- a/mp/src/public/bone_setup.h
+++ b/mp/src/public/bone_setup.h
@@ -444,4 +444,6 @@ void QuaternionMA( const Quaternion &p, float s, const Quaternion &q, Quaternion
bool Studio_PrefetchSequence( const CStudioHdr *pStudioHdr, int iSequence );
+void Studio_RunBoneFlexDrivers( float *pFlexController, const CStudioHdr *pStudioHdr, const Vector *pPositions, const matrix3x4_t *pBoneToWorld, const matrix3x4_t &mRootToWorld );
+
#endif // BONE_SETUP_H
diff --git a/mp/src/public/filesystem_init.cpp b/mp/src/public/filesystem_init.cpp
index 08e8da17..36b484f5 100644
--- a/mp/src/public/filesystem_init.cpp
+++ b/mp/src/public/filesystem_init.cpp
@@ -224,6 +224,7 @@ CFSSearchPathsInit::CFSSearchPathsInit()
m_pDirectoryName = NULL;
m_pLanguage = NULL;
m_ModPath[0] = 0;
+ m_bMountHDContent = m_bLowViolence = false;
}
@@ -460,52 +461,6 @@ FSReturnCode_t LoadGameInfoFile(
return FS_OK;
}
-// checks the registry for the low violence setting
-// Check "HKEY_CURRENT_USER\Software\Valve\Source\Settings" and "User Token 2" or "User Token 3"
-bool IsLowViolenceBuild( void )
-{
-#if defined(_WIN32)
- HKEY hKey;
- char szValue[64];
- unsigned long len = sizeof(szValue) - 1;
- bool retVal = false;
-
- if ( IsPC() && RegOpenKeyEx( HKEY_CURRENT_USER, "Software\\Valve\\Source\\Settings", NULL, KEY_READ, &hKey) == ERROR_SUCCESS )
- {
- // User Token 2
- if ( RegQueryValueEx( hKey, "User Token 2", NULL, NULL, (unsigned char*)szValue, &len ) == ERROR_SUCCESS )
- {
- if ( Q_strlen( szValue ) > 0 )
- {
- retVal = true;
- }
- }
-
- if ( !retVal )
- {
- // reset "len" for the next check
- len = sizeof(szValue) - 1;
-
- // User Token 3
- if ( RegQueryValueEx( hKey, "User Token 3", NULL, NULL, (unsigned char*)szValue, &len ) == ERROR_SUCCESS )
- {
- if ( Q_strlen( szValue ) > 0 )
- {
- retVal = true;
- }
- }
- }
-
- RegCloseKey(hKey);
- }
-
- return retVal;
-#elif POSIX
- return false;
-#else
- #error "Fix me"
-#endif
-}
static void FileSystem_AddLoadedSearchPath(
CFSSearchPathsInit &initInfo,
@@ -519,13 +474,26 @@ static void FileSystem_AddLoadedSearchPath(
{
// Not in LV build, don't mount
- if ( !bLowViolence )
+ if ( !initInfo.m_bLowViolence )
+ return;
+
+ // Mount, as a game path
+ pPathID = "game";
+ }
+
+ // Check for mounting HD game content if enabled
+ if ( V_stricmp( pPathID, "game_hd" ) == 0 )
+ {
+
+ // Not in LV build, don't mount
+ if ( !initInfo.m_bMountHDContent )
return;
// Mount, as a game path
pPathID = "game";
}
+
// Special processing for ordinary game folders
if ( V_stristr( fullLocationPath, ".vpk" ) == NULL && Q_stricmp( pPathID, "game" ) == 0 )
{
@@ -600,7 +568,7 @@ FSReturnCode_t FileSystem_LoadSearchPaths( CFSSearchPathsInit &initInfo )
}
}
- bool bLowViolence = IsLowViolenceBuild();
+ bool bLowViolence = initInfo.m_bLowViolence;
for ( KeyValues *pCur=pSearchPaths->GetFirstValue(); pCur; pCur=pCur->GetNextValue() )
{
const char *pLocation = pCur->GetString();
diff --git a/mp/src/public/filesystem_init.h b/mp/src/public/filesystem_init.h
index 182ea411..d95e7c3a 100644
--- a/mp/src/public/filesystem_init.h
+++ b/mp/src/public/filesystem_init.h
@@ -156,6 +156,9 @@ public:
// This is the filesystem FileSystem_LoadSearchPaths is talking to.
IFileSystem *m_pFileSystem;
+ bool m_bMountHDContent;
+ bool m_bLowViolence;
+
// Outputs.
public:
// This is the location of the first search path called "game", which also becomes your "mod" search path.
diff --git a/mp/src/public/materialsystem/imaterialsystem.h b/mp/src/public/materialsystem/imaterialsystem.h
index 9a16b9db..812eb262 100644
--- a/mp/src/public/materialsystem/imaterialsystem.h
+++ b/mp/src/public/materialsystem/imaterialsystem.h
@@ -524,7 +524,8 @@ enum RenderTargetSizeMode_t
RT_SIZE_FULL_FRAME_BUFFER=4, // Same size as frame buffer, or next lower power of 2 if we can't do that.
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_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.
};
typedef void (*MaterialBufferReleaseFunc_t)( );
@@ -1028,6 +1029,16 @@ public:
#ifdef DX_TO_GL_ABSTRACTION
virtual void DoStartupShaderPreloading( void ) = 0;
#endif
+
+ // Sets the override sizes for all render target size tests. These replace the frame buffer size.
+ // Set them when you are rendering primarily to something larger than the frame buffer (as in VR mode).
+ virtual void SetRenderTargetFrameBufferSizeOverrides( int nWidth, int nHeight ) = 0;
+
+ // Returns the (possibly overridden) framebuffer size for render target sizing.
+ virtual void GetRenderTargetFrameBufferDimensions( int & nWidth, int & nHeight ) = 0;
+
+ // returns the display device name that matches the adapter index we were started with
+ virtual char *GetDisplayDeviceName() const = 0;
};
@@ -1482,7 +1493,7 @@ public:
// Returns whether a pointer is render data. NOTE: passing NULL returns true
virtual bool IsRenderData( const void *pData ) const = 0;
virtual void PrintfVA( char *fmt, va_list vargs ) = 0;
- virtual void Printf( PRINTF_FORMAT_STRING char *fmt, ... ) = 0;
+ virtual void Printf( PRINTF_FORMAT_STRING const char *fmt, ... ) = 0;
virtual float Knob( char *knobname, float *setvalue = NULL ) = 0;
// Allows us to override the alpha write setting of a material
virtual void OverrideAlphaWriteEnable( bool bEnable, bool bAlphaWriteEnable ) = 0;
diff --git a/mp/src/public/materialsystem/materialsystem_config.h b/mp/src/public/materialsystem/materialsystem_config.h
index b0fe3a27..2908d2ce 100644
--- a/mp/src/public/materialsystem/materialsystem_config.h
+++ b/mp/src/public/materialsystem/materialsystem_config.h
@@ -33,6 +33,7 @@ enum MaterialSystem_Config_Flags_t
MATSYS_VIDCFG_FLAGS_SCALE_TO_OUTPUT_RESOLUTION = ( 1 << 14 ),
MATSYS_VIDCFG_FLAGS_USING_MULTIPLE_WINDOWS = ( 1 << 15 ),
MATSYS_VIDCFG_FLAGS_DISABLE_PHONG = ( 1 << 16 ),
+ MATSYS_VIDCFG_FLAGS_VR_MODE = ( 1 << 17 ),
};
struct MaterialSystemHardwareIdentifier_t
@@ -64,6 +65,7 @@ struct MaterialSystem_Config_t
bool ScaleToOutputResolution() const { return ( m_Flags & MATSYS_VIDCFG_FLAGS_SCALE_TO_OUTPUT_RESOLUTION ) != 0; }
bool UsingMultipleWindows() const { return ( m_Flags & MATSYS_VIDCFG_FLAGS_USING_MULTIPLE_WINDOWS ) != 0; }
bool UsePhong() const { return ( m_Flags & MATSYS_VIDCFG_FLAGS_DISABLE_PHONG ) == 0; }
+ bool VRMode() const { return ( m_Flags & MATSYS_VIDCFG_FLAGS_VR_MODE) != 0; }
bool ShadowDepthTexture() const { return m_bShadowDepthTexture; }
bool MotionBlur() const { return m_bMotionBlur; }
bool SupportFlashlight() const { return m_bSupportFlashlight; }
@@ -140,6 +142,8 @@ struct MaterialSystem_Config_t
bool m_bMotionBlur;
bool m_bSupportFlashlight;
+ int m_nVRModeAdapter;
+
MaterialSystem_Config_t()
{
memset( this, 0, sizeof( *this ) );
@@ -160,6 +164,7 @@ struct MaterialSystem_Config_t
SetFlag( MATSYS_VIDCFG_FLAGS_SCALE_TO_OUTPUT_RESOLUTION, false );
SetFlag( MATSYS_VIDCFG_FLAGS_USING_MULTIPLE_WINDOWS, false );
SetFlag( MATSYS_VIDCFG_FLAGS_DISABLE_PHONG, false );
+ SetFlag( MATSYS_VIDCFG_FLAGS_VR_MODE, false );
m_VideoMode.m_Width = 640;
m_VideoMode.m_Height = 480;
@@ -182,6 +187,8 @@ struct MaterialSystem_Config_t
m_bMotionBlur = false;
m_bSupportFlashlight = true;
+ m_nVRModeAdapter = -1;
+
// misc defaults
bAllowCheats = false;
bCompressedTextures = true;
diff --git a/mp/src/public/mathlib/vector.h b/mp/src/public/mathlib/vector.h
index c19261d7..a797da25 100644
--- a/mp/src/public/mathlib/vector.h
+++ b/mp/src/public/mathlib/vector.h
@@ -1187,7 +1187,7 @@ inline Vector &AllocTempVector()
}
ThreadPause();
}
- return s_vecTemp[nIndex & 0xffff];
+ return s_vecTemp[nIndex];
}
diff --git a/mp/src/public/mathlib/vmatrix.h b/mp/src/public/mathlib/vmatrix.h
index 2c536672..c18e4822 100644
--- a/mp/src/public/mathlib/vmatrix.h
+++ b/mp/src/public/mathlib/vmatrix.h
@@ -200,6 +200,9 @@ public:
// Setup a matrix for origin and angles.
void SetupMatrixOrgAngles( const Vector &origin, const QAngle &vAngles );
+ // Setup a matrix for angles and no translation.
+ void SetupMatrixAngles( const QAngle &vAngles );
+
// General inverse. This may fail so check the return!
bool InverseGeneral(VMatrix &vInverse) const;
diff --git a/mp/src/public/matsys_controls/mdlpanel.h b/mp/src/public/matsys_controls/mdlpanel.h
index 8f0ccb30..91f936e7 100644
--- a/mp/src/public/matsys_controls/mdlpanel.h
+++ b/mp/src/public/matsys_controls/mdlpanel.h
@@ -51,6 +51,8 @@ public:
virtual void OnTick();
+ virtual void Paint();
+
// Sets the current mdl
virtual void SetMDL( MDLHandle_t handle, void *pProxyData = NULL );
virtual void SetMDL( const char *pMDLName, void *pProxyData = NULL );
@@ -78,6 +80,7 @@ public:
void SetSkin( int nSkin );
void SetLookAtCamera( bool bLookAtCamera );
void SetIgnoreDoubleClick( bool bState );
+ void SetThumbnailSafeZone( bool bVisible );
// Bounds.
bool GetBoundingBox( Vector &vecBoundsMin, Vector &vecBoundsMax );
@@ -103,6 +106,8 @@ public:
protected:
+ virtual void SetupRenderState( int nDisplayWidth, int nDisplayHeight ) OVERRIDE;
+
struct MDLData_t
{
CMDL m_MDL;
@@ -122,7 +127,7 @@ protected:
private:
// paint it!
- void OnPaint3D();
+ virtual void OnPaint3D();
virtual void PrePaint3D( IMatRenderContext *pRenderContext ) { };
virtual void PostPaint3D( IMatRenderContext *pRenderContext ) { };
virtual void RenderingMergedModel( IMatRenderContext *pRenderContext, CStudioHdr *pStudioHdr, MDLHandle_t mdlHandle, matrix3x4_t *pWorldMatrix ) { };
@@ -141,6 +146,7 @@ private:
bool m_bWireFrame : 1;
bool m_bLookAtCamera : 1;
bool m_bIgnoreDoubleClick : 1;
+ bool m_bThumbnailSafeZone : 1;
float m_PoseParameters[ MAXSTUDIOPOSEPARAM ];
};
diff --git a/mp/src/public/matsys_controls/mdlpicker.h b/mp/src/public/matsys_controls/mdlpicker.h
index 202167c5..fcacfc9c 100644
--- a/mp/src/public/matsys_controls/mdlpicker.h
+++ b/mp/src/public/matsys_controls/mdlpicker.h
@@ -101,6 +101,7 @@ private:
void WriteBackbackVMTFiles( const char *assetName );
void GenerateBackpackIcons( void );
+ CUtlString GetOutputFileSuffix();
MESSAGE_FUNC_PARAMS( OnCheckButtonChecked, "CheckButtonChecked", kv );
MESSAGE_FUNC_PARAMS( OnItemSelected, "ItemSelected", kv );
diff --git a/mp/src/public/matsys_controls/potterywheelpanel.h b/mp/src/public/matsys_controls/potterywheelpanel.h
index 8cb41497..47125a3f 100644
--- a/mp/src/public/matsys_controls/potterywheelpanel.h
+++ b/mp/src/public/matsys_controls/potterywheelpanel.h
@@ -131,8 +131,9 @@ protected:
bool m_bRenderToTexture;
+ virtual void SetupRenderState( int nDisplayWidth, int nDisplayHeight );
+
private:
- void SetupRenderState( int nDisplayWidth, int nDisplayHeight );
void CreateDefaultLights();
void DestroyLights();
diff --git a/mp/src/public/shaderapi/IShaderDevice.h b/mp/src/public/shaderapi/IShaderDevice.h
index 34749de0..832e6ac7 100644
--- a/mp/src/public/shaderapi/IShaderDevice.h
+++ b/mp/src/public/shaderapi/IShaderDevice.h
@@ -271,6 +271,7 @@ public:
#ifdef DX_TO_GL_ABSTRACTION
virtual void DoStartupShaderPreloading( void ) = 0;
#endif
+ virtual char *GetDisplayDeviceName() = 0;
};
diff --git a/mp/src/public/shaderapi/ishaderapi.h b/mp/src/public/shaderapi/ishaderapi.h
index 69782a60..367cd0e9 100644
--- a/mp/src/public/shaderapi/ishaderapi.h
+++ b/mp/src/public/shaderapi/ishaderapi.h
@@ -603,7 +603,7 @@ public:
// debug logging
// only implemented in some subclasses
virtual void PrintfVA( char *fmt, va_list vargs ) = 0;
- virtual void Printf( PRINTF_FORMAT_STRING char *fmt, ... ) = 0;
+ virtual void Printf( PRINTF_FORMAT_STRING const char *fmt, ... ) = 0;
virtual float Knob( char *knobname, float *setvalue = NULL ) = 0;
// Allows us to override the alpha write setting of a material
virtual void OverrideAlphaWriteEnable( bool bEnable, bool bAlphaWriteEnable ) = 0;
diff --git a/mp/src/public/headtrack/isourcevirtualreality.h b/mp/src/public/sourcevr/isourcevirtualreality.h
index 291d28a6..3e438455 100644
--- a/mp/src/public/headtrack/isourcevirtualreality.h
+++ b/mp/src/public/sourcevr/isourcevirtualreality.h
@@ -21,21 +21,19 @@
//-----------------------------------------------------------------------------
// forward declarations
//-----------------------------------------------------------------------------
+class ITexture;
+class IMaterialSystem;
//-----------------------------------------------------------------------------
// important enumeration
//-----------------------------------------------------------------------------
-struct VRTrackerState_t
-{
- // Tracker has finished starting up and has produced at least one valid pose.
- bool bInitialized;
-
- // Tracker currently has a valid pose.
- bool bHasValidPose;
- // Tracker is in a state where it is likely to suffer from yaw drift. This
- // would apply to any gyro-only tracking system.
- bool bWillDriftInYaw;
+struct VRRect_t
+{
+ int32 nX;
+ int32 nY;
+ int32 nWidth;
+ int32 nHeight;
};
@@ -69,6 +67,14 @@ public:
VREye_Right
};
+ // Which texture is being requested in GetRenderTarget?
+ enum EWhichRenderTarget
+ {
+ RT_Color = 0,
+ RT_Depth,
+ };
+
+
// ----------------------------------------------------------------------
// General utilities
// ----------------------------------------------------------------------
@@ -76,24 +82,17 @@ public:
// Returns true if the game should run in VR mode
virtual bool ShouldRunInVR() = 0;
- // The name of the display at which the game should put its window.
- // TODO: This is pretty horrible from a "what the game has to do" point
- // of view. Make it better.
- virtual const char *GetDisplayName() = 0;
-
- // The size of the window that the game should create
- virtual bool GetWindowSize( int *pnWidth, int *pnHeight ) = 0;
-
- // Lets engine tell headtrack that it's going to use a different size window based
- // what the display is actually using. This happens when somebody clones
- // their desktop onto the HMD
- virtual void OverrideWindowSize( int nWidth, int nHeight ) = 0;
+ // Returns true if there is a compatible HMD connected
+ virtual bool IsHmdConnected() = 0;
// The size and position of the viewport for the specified eye
virtual void GetViewportBounds( VREye eEye, int *pnX, int *pnY, int *pnWidth, int *pnHeight ) = 0;
// Performs the distortion post-processing.
- virtual bool DoDistortionProcessing ( const vrect_t *SrcRect ) = 0;
+ virtual bool DoDistortionProcessing ( VREye eEye ) = 0;
+
+ // Composites the HUD directly onto the backbuffer / render target, including undistort.
+ virtual bool CompositeHud ( VREye eEye, float ndcHudBounds[4], bool bDoUndistort, bool bBlackout, bool bTranslucent ) = 0;
// ----------------------------------------------------------------------
// Getting the current pose
@@ -102,13 +101,6 @@ public:
// returns the pose relative to the zero point
virtual VMatrix GetMideyePose() = 0;
- // returns the gravity-relative HUD correction matrix (I think)
- virtual VMatrix GetHudUpCorrection() = 0;
-
- // transforms to mid eye form left/right
- virtual VMatrix GetMidEyeFromLeft() = 0;
- virtual VMatrix GetMidEyeFromRight() = 0;
-
// All-in-one interfaces (they call GetCameraPoseZeroFromCurrent)
// Grabs the current tracking data and sets up state for the Override* calls.
virtual bool SampleTrackingState ( float PlayerGameFov, float fPredictionSeconds ) = 0;
@@ -117,41 +109,49 @@ public:
// Information about the display
// ----------------------------------------------------------------------
- // returns the serial number for the display or NULL if no serial number
- // could be retrieved
- virtual const char *GetDisplaySerialNumber() = 0;
-
- // returns the model number for the display or NULL if no model number
- // could be retrieved
- virtual const char *GetDisplayModelNumber() = 0;
-
- // returns the "ipd" of the display. This is the separation of the centers
- // of the two lenses in mm
- virtual float GetDisplaySeparationMM() = 0;
+ // Passes back the bounds of the window that the game should create. This might
+ // span two displays if we're dealing with a two-input display. Returns true
+ // if the bounds were set.
+ virtual bool GetDisplayBounds( VRRect_t *pRect ) = 0;
// Computes and returns the projection matrix for the eye
virtual bool GetEyeProjectionMatrix ( VMatrix *pResult, VREye, float zNear, float zFar, float fovScale ) = 0;
- // Returns the horizontal FOV of the display in degrees
- virtual float GetHorizontalFOVDegrees() = 0;
+ // Returns the transform from the mid-eye to the specified eye. Multiply this by
+ // the tweaked (for mouse rotation and WASD translation) mideye position to get the
+ // view matrix. This matrix takes the user's IPD into account.
+ virtual VMatrix GetMidEyeFromEye( VREye eEye ) = 0;
+
+ // returns the adapter index to use for VR mode
+ virtual int GetVRModeAdapter() = 0;
// ----------------------------------------------------------------------
- // Information about the user
+ // Information about the tracker
// ----------------------------------------------------------------------
- // returns the intrapupilar distance of the user in mm
- virtual float GetUserIPDMM() = 0;
+ virtual bool WillDriftInYaw() = 0;
- // sets the intrapupilar distance of the user in mm
- virtual void SetUserIPDMM( float fIPDMM ) = 0;
+ // ----------------------------------------------------------------------
+ // Methods about oversized offscreen rendering
+ // ----------------------------------------------------------------------
+
+ // Sets up the pre-distortion render targets.
+ virtual void CreateRenderTargets( IMaterialSystem *pMaterialSystem ) = 0;
+ virtual void ShutdownRenderTargets() = 0;
+
+ // fetches the render target for the specified eye
+ virtual ITexture *GetRenderTarget( VREye eEye, EWhichRenderTarget eWhich ) = 0;
+ // Returns the (possibly overridden) framebuffer size for render target sizing.
+ virtual void GetRenderTargetFrameBufferDimensions( int & nWidth, int & nHeight ) = 0;
// ----------------------------------------------------------------------
- // Information about the tracker
+ // Enter/leave VR mode
// ----------------------------------------------------------------------
+ virtual bool Activate() = 0;
+ virtual void Deactivate() = 0;
+
- // returns the state of the tracking system
- virtual VRTrackerState_t GetTrackerState() = 0;
};
diff --git a/mp/src/public/studio.h b/mp/src/public/studio.h
index 95f22a36..bcc38d5d 100644
--- a/mp/src/public/studio.h
+++ b/mp/src/public/studio.h
@@ -313,6 +313,63 @@ private:
};
+//-----------------------------------------------------------------------------
+// The component of the bone used by mstudioboneflexdriver_t
+//-----------------------------------------------------------------------------
+enum StudioBoneFlexComponent_t
+{
+ STUDIO_BONE_FLEX_INVALID = -1, // Invalid
+ STUDIO_BONE_FLEX_TX = 0, // Translate X
+ STUDIO_BONE_FLEX_TY = 1, // Translate Y
+ STUDIO_BONE_FLEX_TZ = 2 // Translate Z
+};
+
+
+//-----------------------------------------------------------------------------
+// Component is one of Translate X, Y or Z [0,2] (StudioBoneFlexComponent_t)
+//-----------------------------------------------------------------------------
+struct mstudioboneflexdrivercontrol_t
+{
+ DECLARE_BYTESWAP_DATADESC();
+
+ int m_nBoneComponent; // Bone component that drives flex, StudioBoneFlexComponent_t
+ int m_nFlexControllerIndex; // Flex controller to drive
+ float m_flMin; // Min value of bone component mapped to 0 on flex controller
+ float m_flMax; // Max value of bone component mapped to 1 on flex controller
+
+ mstudioboneflexdrivercontrol_t(){}
+private:
+ // No copy constructors allowed
+ mstudioboneflexdrivercontrol_t( const mstudioboneflexdrivercontrol_t &vOther );
+};
+
+
+//-----------------------------------------------------------------------------
+// Drive flex controllers from bone components
+//-----------------------------------------------------------------------------
+struct mstudioboneflexdriver_t
+{
+ DECLARE_BYTESWAP_DATADESC();
+
+ int m_nBoneIndex; // Bone to drive flex controller
+ int m_nControlCount; // Number of flex controllers being driven
+ int m_nControlIndex; // Index into data where controllers are (relative to this)
+
+ inline mstudioboneflexdrivercontrol_t *pBoneFlexDriverControl( int i ) const
+ {
+ Assert( i >= 0 && i < m_nControlCount );
+ return (mstudioboneflexdrivercontrol_t *)(((byte *)this) + m_nControlIndex) + i;
+ }
+
+ int unused[3];
+
+ mstudioboneflexdriver_t(){}
+private:
+ // No copy constructors allowed
+ mstudioboneflexdriver_t( const mstudioboneflexdriver_t &vOther );
+};
+
+
#define BONE_CALCULATE_MASK 0x1F
#define BONE_PHYSICALLY_SIMULATED 0x01 // bone is physically simulated when physics are active
#define BONE_PHYSICS_PROCEDURAL 0x02 // procedural when physics is active
@@ -902,33 +959,6 @@ struct mstudioflexcontrollerui_t
};
-// these are the on-disk format vertex anims
-struct dstudiovertanim_t
-{
- unsigned short index;
- byte speed; // 255/max_length_in_flex
- byte side; // 255/left_right
- Vector48 delta;
- Vector48 ndelta;
-
-private:
- // No copy constructors allowed
- dstudiovertanim_t(const dstudiovertanim_t& vOther);
-};
-
-
-struct dstudiovertanim_wrinkle_t : public dstudiovertanim_t
-{
- short wrinkledelta; // Encodes a range from -1 to 1. NOTE: -32768 == -32767 == -1.0f, 32767 = 1.0f
-
-private:
- // No copy constructors allowed
- dstudiovertanim_wrinkle_t( const dstudiovertanim_t& vOther );
-};
-
-const float g_VertAnimFixedPointScale = 1.0f / 4096.0f;
-const float g_VertAnimFixedPointScaleInv = 1.0f / g_VertAnimFixedPointScale;
-
// this is the memory image of vertex anims (16-bit fixed point)
struct mstudiovertanim_t
{
@@ -952,21 +982,31 @@ protected:
};
public:
- inline Vector GetDeltaFixed()
+ inline void ConvertToFixed( float flVertAnimFixedPointScale )
{
- return Vector( delta[0]*g_VertAnimFixedPointScale, delta[1]*g_VertAnimFixedPointScale, delta[2]*g_VertAnimFixedPointScale );
+ delta[0] = flDelta[0].GetFloat() / flVertAnimFixedPointScale;
+ delta[1] = flDelta[1].GetFloat() / flVertAnimFixedPointScale;
+ delta[2] = flDelta[2].GetFloat() / flVertAnimFixedPointScale;
+ ndelta[0] = flNDelta[0].GetFloat() / flVertAnimFixedPointScale;
+ ndelta[1] = flNDelta[1].GetFloat() / flVertAnimFixedPointScale;
+ ndelta[2] = flNDelta[2].GetFloat() / flVertAnimFixedPointScale;
}
- inline Vector GetNDeltaFixed()
+
+ inline Vector GetDeltaFixed( float flVertAnimFixedPointScale )
{
- return Vector( ndelta[0]*g_VertAnimFixedPointScale, ndelta[1]*g_VertAnimFixedPointScale, ndelta[2]*g_VertAnimFixedPointScale );
+ return Vector( delta[0] * flVertAnimFixedPointScale, delta[1] * flVertAnimFixedPointScale, delta[2] * flVertAnimFixedPointScale );
}
- inline void GetDeltaFixed4DAligned( Vector4DAligned *vFillIn )
+ inline Vector GetNDeltaFixed( float flVertAnimFixedPointScale )
{
- vFillIn->Set( delta[0]*g_VertAnimFixedPointScale, delta[1]*g_VertAnimFixedPointScale, delta[2]*g_VertAnimFixedPointScale, 0.0f );
+ return Vector( ndelta[0] * flVertAnimFixedPointScale, ndelta[1] * flVertAnimFixedPointScale, ndelta[2] * flVertAnimFixedPointScale );
}
- inline void GetNDeltaFixed4DAligned( Vector4DAligned *vFillIn )
+ inline void GetDeltaFixed4DAligned( Vector4DAligned *vFillIn, float flVertAnimFixedPointScale )
{
- vFillIn->Set( ndelta[0]*g_VertAnimFixedPointScale, ndelta[1]*g_VertAnimFixedPointScale, ndelta[2]*g_VertAnimFixedPointScale, 0.0f );
+ vFillIn->Set( delta[0] * flVertAnimFixedPointScale, delta[1] * flVertAnimFixedPointScale, delta[2] * flVertAnimFixedPointScale, 0.0f );
+ }
+ inline void GetNDeltaFixed4DAligned( Vector4DAligned *vFillIn, float flVertAnimFixedPointScale )
+ {
+ vFillIn->Set( ndelta[0] * flVertAnimFixedPointScale, ndelta[1] * flVertAnimFixedPointScale, ndelta[2] * flVertAnimFixedPointScale, 0.0f );
}
inline Vector GetDeltaFloat()
{
@@ -976,17 +1016,17 @@ public:
{
return Vector (flNDelta[0].GetFloat(), flNDelta[1].GetFloat(), flNDelta[2].GetFloat());
}
- inline void SetDeltaFixed( const Vector& vInput )
+ inline void SetDeltaFixed( const Vector& vInput, float flVertAnimFixedPointScale )
{
- delta[0] = vInput.x * g_VertAnimFixedPointScaleInv;
- delta[1] = vInput.y * g_VertAnimFixedPointScaleInv;
- delta[2] = vInput.z * g_VertAnimFixedPointScaleInv;
+ delta[0] = vInput.x / flVertAnimFixedPointScale;
+ delta[1] = vInput.y / flVertAnimFixedPointScale;
+ delta[2] = vInput.z / flVertAnimFixedPointScale;
}
- inline void SetNDeltaFixed( const Vector& vInputNormal )
+ inline void SetNDeltaFixed( const Vector& vInputNormal, float flVertAnimFixedPointScale )
{
- ndelta[0] = vInputNormal.x * g_VertAnimFixedPointScaleInv;
- ndelta[1] = vInputNormal.y * g_VertAnimFixedPointScaleInv;
- ndelta[2] = vInputNormal.z * g_VertAnimFixedPointScaleInv;
+ ndelta[0] = vInputNormal.x / flVertAnimFixedPointScale;
+ ndelta[1] = vInputNormal.y / flVertAnimFixedPointScale;
+ ndelta[2] = vInputNormal.z / flVertAnimFixedPointScale;
}
// Ick...can also force fp16 data into this structure for writing to file in legacy format...
@@ -1003,10 +1043,20 @@ public:
flNDelta[2].SetFloat( vInputNormal.z );
}
+ class CSortByIndex
+ {
+ public:
+ bool operator()(const mstudiovertanim_t &left, const mstudiovertanim_t & right)const
+ {
+ return left.index < right.index;
+ }
+ };
+ friend class CSortByIndex;
+
mstudiovertanim_t(){}
-private:
- // No copy constructors allowed
- mstudiovertanim_t(const mstudiovertanim_t& vOther);
+//private:
+// No copy constructors allowed, but it's needed for std::sort()
+// mstudiovertanim_t(const mstudiovertanim_t& vOther);
};
@@ -1017,20 +1067,25 @@ struct mstudiovertanim_wrinkle_t : public mstudiovertanim_t
short wrinkledelta;
- inline void SetWrinkleFixed( float flWrinkle )
+ inline void SetWrinkleFixed( float flWrinkle, float flVertAnimFixedPointScale )
{
- int nWrinkleDeltaInt = flWrinkle * g_VertAnimFixedPointScaleInv;
+ int nWrinkleDeltaInt = flWrinkle / flVertAnimFixedPointScale;
wrinkledelta = clamp( nWrinkleDeltaInt, -32767, 32767 );
}
- inline Vector4D GetDeltaFixed()
+ inline Vector4D GetDeltaFixed( float flVertAnimFixedPointScale )
{
- return Vector4D( delta[0]*g_VertAnimFixedPointScale, delta[1]*g_VertAnimFixedPointScale, delta[2]*g_VertAnimFixedPointScale, wrinkledelta*g_VertAnimFixedPointScale );
+ return Vector4D( delta[0] * flVertAnimFixedPointScale, delta[1] * flVertAnimFixedPointScale, delta[2] * flVertAnimFixedPointScale, wrinkledelta * flVertAnimFixedPointScale );
}
- inline void GetDeltaFixed4DAligned( Vector4DAligned *vFillIn )
+ inline void GetDeltaFixed4DAligned( Vector4DAligned *vFillIn, float flVertAnimFixedPointScale )
{
- vFillIn->Set( delta[0]*g_VertAnimFixedPointScale, delta[1]*g_VertAnimFixedPointScale, delta[2]*g_VertAnimFixedPointScale, wrinkledelta*g_VertAnimFixedPointScale );
+ vFillIn->Set( delta[0] * flVertAnimFixedPointScale, delta[1] * flVertAnimFixedPointScale, delta[2] * flVertAnimFixedPointScale, wrinkledelta * flVertAnimFixedPointScale );
+ }
+
+ inline float GetWrinkleDeltaFixed( float flVertAnimFixedPointScale )
+ {
+ return wrinkledelta * flVertAnimFixedPointScale;
}
};
@@ -1959,6 +2014,9 @@ struct vertexFileFixup_t
#define STUDIOHDR_FLAGS_CAST_TEXTURE_SHADOWS ( 1 << 18 )
+// flagged on load to indicate no animation events on this model
+#define STUDIOHDR_FLAGS_VERT_ANIM_FIXED_POINT_SCALE ( 1 << 21 )
+
// NOTE! Next time we up the .mdl file format, remove studiohdr2_t
// and insert all fields in this structure into studiohdr_t.
struct studiohdr2_t
@@ -1982,7 +2040,11 @@ struct studiohdr2_t
int sznameindex;
inline char *pszName() { return (sznameindex) ? (char *)(((byte *)this) + sznameindex ) : NULL; }
- int reserved[58];
+ int m_nBoneFlexDriverCount;
+ int m_nBoneFlexDriverIndex;
+ inline mstudioboneflexdriver_t *pBoneFlexDriver( int i ) const { Assert( i >= 0 && i < m_nBoneFlexDriverCount ); return (mstudioboneflexdriver_t *)(((byte *)this) + m_nBoneFlexDriverIndex) + i; }
+
+ int reserved[56];
};
struct studiohdr_t
@@ -2229,7 +2291,10 @@ struct studiohdr_t
int flexcontrolleruiindex;
mstudioflexcontrollerui_t *pFlexControllerUI( int i ) const { Assert( i >= 0 && i < numflexcontrollerui); return (mstudioflexcontrollerui_t *)(((byte *)this) + flexcontrolleruiindex) + i; }
- int unused3[2];
+ float flVertAnimFixedPointScale;
+ inline float VertAnimFixedPointScale() const { return ( flags & STUDIOHDR_FLAGS_VERT_ANIM_FIXED_POINT_SCALE ) ? flVertAnimFixedPointScale : 1.0f / 4096.0f; }
+
+ int unused3[1];
// FIXME: Remove when we up the model version. Move all fields of studiohdr2_t into studiohdr_t.
int studiohdr2index;
@@ -2245,6 +2310,9 @@ struct studiohdr_t
inline mstudiolinearbone_t *pLinearBones() const { return studiohdr2index ? pStudioHdr2()->pLinearBones() : NULL; }
+ inline int BoneFlexDriverCount() const { return studiohdr2index ? pStudioHdr2()->m_nBoneFlexDriverCount : 0; }
+ inline const mstudioboneflexdriver_t* BoneFlexDriver( int i ) const { Assert( i >= 0 && i < BoneFlexDriverCount() ); return studiohdr2index ? pStudioHdr2()->pBoneFlexDriver( i ) : NULL; }
+
// NOTE: No room to add stuff? Up the .mdl file format version
// [and move all fields in studiohdr2_t into studiohdr_t and kill studiohdr2_t],
// or add your stuff to studiohdr2_t. See NumSrcBoneTransforms/SrcBoneTransform for the pattern to use.
@@ -2404,6 +2472,11 @@ public:
inline mstudiolinearbone_t *pLinearBones() const { return m_pStudioHdr->pLinearBones(); }
+ inline int BoneFlexDriverCount() const { return m_pStudioHdr->BoneFlexDriverCount(); }
+ inline const mstudioboneflexdriver_t *BoneFlexDriver( int i ) const { return m_pStudioHdr->BoneFlexDriver( i ); }
+
+ inline float VertAnimFixedPointScale() const { return m_pStudioHdr->VertAnimFixedPointScale(); }
+
public:
int IsSequenceLooping( int iSequence );
float GetSequenceCycleRate( int iSequence );
@@ -2971,6 +3044,9 @@ inline void Studio_SetRootLOD( studiohdr_t *pStudioHdr, int rootLOD )
rootLOD = pStudioHdr->numAllowedRootLODs - 1;
}
+ Assert( rootLOD >= 0 && rootLOD < MAX_NUM_LODS );
+ Clamp( rootLOD, 0, MAX_NUM_LODS - 1 );
+
// run the lod fixups that culls higher detail lods
// vertexes are external, fixups ensure relative offsets and counts are cognizant of shrinking data
// indexes are built in lodN..lod0 order so higher detail lod data can be truncated at load
diff --git a/mp/src/public/tier0/afxmem_override.cpp b/mp/src/public/tier0/afxmem_override.cpp
index 425cabd8..f5794b27 100644
--- a/mp/src/public/tier0/afxmem_override.cpp
+++ b/mp/src/public/tier0/afxmem_override.cpp
@@ -429,8 +429,7 @@ void* __cdecl operator new(size_t nSize, int nType, LPCSTR lpszFileName, int nLi
#endif
}
-#if 0
-#if _MSC_VER >= 1200
+#if _MSC_VER >= 1700
void __cdecl operator delete(void* p, int nType, LPCSTR /* lpszFileName */, int /* nLine */)
{
#if !defined(_AFX_NO_DEBUG_CRT) && defined(_DEBUG)
@@ -440,19 +439,16 @@ void __cdecl operator delete(void* p, int nType, LPCSTR /* lpszFileName */, int
#endif
}
#endif // _MSC_VER >= 1200
-#endif
-#if _MSC_VER >= 1210
+#if _MSC_VER >= 1700
void* __cdecl operator new[](size_t nSize, int nType, LPCSTR lpszFileName, int nLine)
{
return ::operator new(nSize, nType, lpszFileName, nLine);
}
-#if 0
void __cdecl operator delete[](void* p, int nType, LPCSTR lpszFileName, int nLine)
{
::operator delete(p, nType, lpszFileName, nLine);
}
-#endif
#endif // _MSC_VER >= 1210
#endif //_DEBUG
diff --git a/mp/src/public/tier0/dbg.h b/mp/src/public/tier0/dbg.h
index ac7930a4..5fe45a1c 100644
--- a/mp/src/public/tier0/dbg.h
+++ b/mp/src/public/tier0/dbg.h
@@ -247,8 +247,8 @@ DBG_INTERFACE struct SDL_Window * GetAssertDialogParent();
if (!(_exp)) \
{ \
_SpewInfo( SPEW_ASSERT, __TFILE__, __LINE__ ); \
- SpewRetval_t ret = _SpewMessage("%s", _msg); \
- CallAssertFailedNotifyFunc( __TFILE__, __LINE__, _msg ); \
+ SpewRetval_t ret = _SpewMessage("%s", static_cast<const char*>( _msg )); \
+ CallAssertFailedNotifyFunc( __TFILE__, __LINE__, _msg ); \
_executeExp; \
if ( ret == SPEW_DEBUGGER) \
{ \
@@ -343,6 +343,9 @@ DBG_INTERFACE struct SDL_Window * GetAssertDialogParent();
#define AssertEquals( _exp, _expectedValue ) AssertMsg2( (_exp) == (_expectedValue), _T("Expected %d but got %d!"), (_expectedValue), (_exp) )
#define AssertFloatEquals( _exp, _expectedValue, _tol ) AssertMsg2( fabs((_exp) - (_expectedValue)) <= (_tol), _T("Expected %f but got %f!"), (_expectedValue), (_exp) )
#define Verify( _exp ) Assert( _exp )
+#define VerifyMsg1( _exp, _msg, a1 ) AssertMsg1( _exp, _msg, a1 )
+#define VerifyMsg2( _exp, _msg, a1, a2 ) AssertMsg2( _exp, _msg, a1, a2 )
+#define VerifyMsg3( _exp, _msg, a1, a2, a3 ) AssertMsg3( _exp, _msg, a1, a2, a3 )
#define VerifyEquals( _exp, _expectedValue ) AssertEquals( _exp, _expectedValue )
#define DbgVerify( _exp ) Assert( _exp )
@@ -366,6 +369,9 @@ DBG_INTERFACE struct SDL_Window * GetAssertDialogParent();
#define AssertEquals( _exp, _expectedValue ) ((void)0)
#define AssertFloatEquals( _exp, _expectedValue, _tol ) ((void)0)
#define Verify( _exp ) (_exp)
+#define VerifyMsg1( _exp, _msg, a1 ) (_exp)
+#define VerifyMsg2( _exp, _msg, a1, a2 ) (_exp)
+#define VerifyMsg3( _exp, _msg, a1, a2, a3 ) (_exp)
#define VerifyEquals( _exp, _expectedValue ) (_exp)
#define DbgVerify( _exp ) (_exp)
diff --git a/mp/src/public/tier1/fmtstr.h b/mp/src/public/tier1/fmtstr.h
index 8c9ccf47..31ee23c7 100644
--- a/mp/src/public/tier1/fmtstr.h
+++ b/mp/src/public/tier1/fmtstr.h
@@ -125,7 +125,42 @@ public:
}
void AppendFormatV( const char *pchFormat, va_list args );
- void Append( const char *pchValue ) { AppendFormat( "%s", pchValue ); }
+
+ void Append( const char *pchValue )
+ {
+ // This function is close to the metal to cut down on the CPU cost
+ // of the previous incantation of Append which was implemented as
+ // AppendFormat( "%s", pchValue ). This implementation, though not
+ // as easy to read, instead does a strcpy from the existing end
+ // point of the CFmtStrN. This brings something like a 10-20x speedup
+ // in my rudimentary tests. It isn't using V_strncpy because that
+ // function doesn't return the number of characters copied, which
+ // we need to adjust m_nLength. Doing the V_strncpy with a V_strlen
+ // afterwards took twice as long as this implementations in tests,
+ // so V_strncpy's implementation was used to write this method.
+ char *pDest = m_szBuf + m_nLength;
+ const int maxLen = SIZE_BUF - m_nLength;
+ char *pLast = pDest + maxLen - 1;
+ while ( (pDest < pLast) && (*pchValue != 0) )
+ {
+ *pDest = *pchValue;
+ ++pDest; ++pchValue;
+ }
+ *pDest = 0;
+ m_nLength = pDest - m_szBuf;
+ }
+
+ //optimized version of append for just adding a single character
+ void Append( char ch )
+ {
+ if( m_nLength < SIZE_BUF - 1 )
+ {
+ m_szBuf[ m_nLength ] = ch;
+ m_nLength++;
+ m_szBuf[ m_nLength ] = '\0';
+ }
+ }
+
void AppendIndent( uint32 unCount, char chIndent = '\t' );
protected:
@@ -193,6 +228,84 @@ typedef CFmtStrQuietTruncationN<FMTSTR_STD_LEN> CFmtStrQuietTruncation;
typedef CFmtStrN<1024> CFmtStr1024;
typedef CFmtStrN<8192> CFmtStrMax;
+
+//-----------------------------------------------------------------------------
+// Purpose: Fast-path number-to-string helper (with optional quoting)
+// Derived off of the Steam CNumStr but with a few tweaks, such as
+// trimming off the in-our-cases-unnecessary strlen calls (by not
+// storing the length in the class).
+//-----------------------------------------------------------------------------
+
+class CNumStr
+{
+public:
+ CNumStr() { m_szBuf[0] = 0; }
+
+ explicit CNumStr( bool b ) { SetBool( b ); }
+
+ explicit CNumStr( int8 n8 ) { SetInt8( n8 ); }
+ explicit CNumStr( uint8 un8 ) { SetUint8( un8 ); }
+ explicit CNumStr( int16 n16 ) { SetInt16( n16 ); }
+ explicit CNumStr( uint16 un16 ) { SetUint16( un16 ); }
+ explicit CNumStr( int32 n32 ) { SetInt32( n32 ); }
+ explicit CNumStr( uint32 un32 ) { SetUint32( un32 ); }
+ explicit CNumStr( int64 n64 ) { SetInt64( n64 ); }
+ explicit CNumStr( uint64 un64 ) { SetUint64( un64 ); }
+
+#if defined(COMPILER_GCC) && defined(PLATFORM_64BITS)
+ explicit CNumStr( lint64 n64 ) { SetInt64( (int64)n64 ); }
+ explicit CNumStr( ulint64 un64 ) { SetUint64( (uint64)un64 ); }
+#endif
+
+ explicit CNumStr( double f ) { SetDouble( f ); }
+ explicit CNumStr( float f ) { SetFloat( f ); }
+
+ inline void SetBool( bool b ) { Q_memcpy( m_szBuf, b ? "1" : "0", 2 ); }
+
+#ifdef _WIN32
+ inline void SetInt8( int8 n8 ) { _itoa( (int32)n8, m_szBuf, 10 ); }
+ inline void SetUint8( uint8 un8 ) { _itoa( (int32)un8, m_szBuf, 10 ); }
+ inline void SetInt16( int16 n16 ) { _itoa( (int32)n16, m_szBuf, 10 ); }
+ inline void SetUint16( uint16 un16 ) { _itoa( (int32)un16, m_szBuf, 10 ); }
+ inline void SetInt32( int32 n32 ) { _itoa( n32, m_szBuf, 10 ); }
+ inline void SetUint32( uint32 un32 ) { _i64toa( (int64)un32, m_szBuf, 10 ); }
+ inline void SetInt64( int64 n64 ) { _i64toa( n64, m_szBuf, 10 ); }
+ inline void SetUint64( uint64 un64 ) { _ui64toa( un64, m_szBuf, 10 ); }
+#else
+ inline void SetInt8( int8 n8 ) { Q_snprintf( m_szBuf, sizeof(m_szBuf), "%d", (int32)n8 ); }
+ inline void SetUint8( uint8 un8 ) { Q_snprintf( m_szBuf, sizeof(m_szBuf), "%d", (int32)un8 ); }
+ inline void SetInt16( int16 n16 ) { Q_snprintf( m_szBuf, sizeof(m_szBuf), "%d", (int32)n16 ); }
+ inline void SetUint16( uint16 un16 ) { Q_snprintf( m_szBuf, sizeof(m_szBuf), "%d", (int32)un16 ); }
+ inline void SetInt32( int32 n32 ) { Q_snprintf( m_szBuf, sizeof(m_szBuf), "%d", n32 ); }
+ inline void SetUint32( uint32 un32 ) { Q_snprintf( m_szBuf, sizeof(m_szBuf), "%u", un32 ); }
+ inline void SetInt64( int64 n64 ) { Q_snprintf( m_szBuf, sizeof(m_szBuf), "%lld", n64 ); }
+ inline void SetUint64( uint64 un64 ) { Q_snprintf( m_szBuf, sizeof(m_szBuf), "%llu", un64 ); }
+#endif
+
+ inline void SetDouble( double f ) { Q_snprintf( m_szBuf, sizeof(m_szBuf), "%.18g", f ); }
+ inline void SetFloat( float f ) { Q_snprintf( m_szBuf, sizeof(m_szBuf), "%.18g", f ); }
+
+ inline void SetHexUint64( uint64 un64 ) { Q_binarytohex( (byte *)&un64, sizeof( un64 ), m_szBuf, sizeof( m_szBuf ) ); }
+
+ operator const char *() const { return m_szBuf; }
+ const char* String() const { return m_szBuf; }
+
+ void AddQuotes()
+ {
+ Assert( m_szBuf[0] != '"' );
+ const int nLength = Q_strlen( m_szBuf );
+ Q_memmove( m_szBuf + 1, m_szBuf, nLength );
+ m_szBuf[0] = '"';
+ m_szBuf[nLength + 1] = '"';
+ m_szBuf[nLength + 2] = 0;
+ }
+
+protected:
+ char m_szBuf[28]; // long enough to hold 18 digits of precision, a decimal, a - sign, e+### suffix, and quotes
+
+};
+
+
//=============================================================================
bool BGetLocalFormattedDateAndTime( time_t timeVal, char *pchDate, int cubDate, char *pchTime, int cubTime );
diff --git a/mp/src/public/togl/osx/cglmbuffer.h b/mp/src/public/togl/osx/cglmbuffer.h
index 0b161000..24a0b0fa 100644
--- a/mp/src/public/togl/osx/cglmbuffer.h
+++ b/mp/src/public/togl/osx/cglmbuffer.h
@@ -1,99 +1,99 @@
//========= Copyright Valve Corporation, All rights reserved. ============//
-//
-// cglmprogram.h
-// GLMgr buffers (index / vertex)
-// ... maybe add PBO later as well
-//===============================================================================
-
-#ifndef CGLMBUFFER_H
-#define CGLMBUFFER_H
-
-#pragma once
-
-// ext links
-
-// http://www.opengl.org/registry/specs/ARB/vertex_buffer_object.txt
-
-//===============================================================================
-
-// tokens not in the SDK headers
-
-//#ifndef GL_DEPTH_STENCIL_ATTACHMENT_EXT
-// #define GL_DEPTH_STENCIL_ATTACHMENT_EXT 0x84F9
-//#endif
-
-//===============================================================================
-
-// forward declarations
-
-class GLMContext;
-
-enum EGLMBufferType
-{
- kGLMVertexBuffer,
- kGLMIndexBuffer,
- kGLMUniformBuffer, // for bindable uniform
- kGLMPixelBuffer, // for PBO
-
- kGLMNumBufferTypes
-};
-
- // pass this in "options" to constructor to make a dynamic buffer
-#define GLMBufferOptionDynamic 0x00000001
-
-struct GLMBuffLockParams
-{
- uint m_offset;
- uint m_size;
- bool m_nonblocking;
- bool m_discard;
-};
-
-class CGLMBuffer
-{
-
-public:
- void Lock( GLMBuffLockParams *params, char **addressOut );
- void Unlock( void );
-
-//protected:
- friend class GLMContext; // only GLMContext can make CGLMBuffer objects
- friend class GLMTester;
- friend class IDirect3D9;
- friend class IDirect3DDevice9;
-
- CGLMBuffer ( GLMContext *ctx, EGLMBufferType type, uint size, uint options );
- ~CGLMBuffer ( );
-
- void SetModes ( bool asyncMap, bool explicitFlush, bool force = false );
- void FlushRange ( uint offset, uint size );
-
- GLMContext *m_ctx; // link back to parent context
- EGLMBufferType m_type;
- uint m_size;
- GLenum m_buffGLTarget; // GL_ARRAY_BUFFER_ARB / GL_ELEMENT_BUFFER_ARB
- GLuint m_name; // name of this program in the context
- uint m_revision; // bump anytime the size changes or buffer is orphaned
- bool m_enableAsyncMap; // mirror of the buffer state
- bool m_enableExplicitFlush; // mirror of the buffer state
-
- bool m_bound; // true if bound to context
- bool m_mapped; // is it currently mapped
- uint m_dirtyMinOffset; // when equal, range is empty
- uint m_dirtyMaxOffset;
-
- float *m_lastMappedAddress;
-
- // --------------------- pseudo-VBO support below here (explicitly for dynamic index buffers)
- bool m_pseudo; // true if the m_name is 0, and the backing is plain RAM
-
- // in pseudo mode, there is just one RAM buffer that acts as the backing.
- // expectation is that this mode would only be used for dynamic indices.
- // since indices have to be consumed (copied to command stream) prior to return from a drawing call,
- // there's no need to do any fencing or multibuffering. orphaning in particular becomes a no-op.
-
- char *m_pseudoBuf; // storage for pseudo buffer
-};
-
-
+//
+// cglmprogram.h
+// GLMgr buffers (index / vertex)
+// ... maybe add PBO later as well
+//===============================================================================
+
+#ifndef CGLMBUFFER_H
+#define CGLMBUFFER_H
+
+#pragma once
+
+// ext links
+
+// http://www.opengl.org/registry/specs/ARB/vertex_buffer_object.txt
+
+//===============================================================================
+
+// tokens not in the SDK headers
+
+//#ifndef GL_DEPTH_STENCIL_ATTACHMENT_EXT
+// #define GL_DEPTH_STENCIL_ATTACHMENT_EXT 0x84F9
+//#endif
+
+//===============================================================================
+
+// forward declarations
+
+class GLMContext;
+
+enum EGLMBufferType
+{
+ kGLMVertexBuffer,
+ kGLMIndexBuffer,
+ kGLMUniformBuffer, // for bindable uniform
+ kGLMPixelBuffer, // for PBO
+
+ kGLMNumBufferTypes
+};
+
+ // pass this in "options" to constructor to make a dynamic buffer
+#define GLMBufferOptionDynamic 0x00000001
+
+struct GLMBuffLockParams
+{
+ uint m_offset;
+ uint m_size;
+ bool m_nonblocking;
+ bool m_discard;
+};
+
+class CGLMBuffer
+{
+
+public:
+ void Lock( GLMBuffLockParams *params, char **addressOut );
+ void Unlock( void );
+
+//protected:
+ friend class GLMContext; // only GLMContext can make CGLMBuffer objects
+ friend class GLMTester;
+ friend class IDirect3D9;
+ friend class IDirect3DDevice9;
+
+ CGLMBuffer ( GLMContext *ctx, EGLMBufferType type, uint size, uint options );
+ ~CGLMBuffer ( );
+
+ void SetModes ( bool asyncMap, bool explicitFlush, bool force = false );
+ void FlushRange ( uint offset, uint size );
+
+ GLMContext *m_ctx; // link back to parent context
+ EGLMBufferType m_type;
+ uint m_size;
+ GLenum m_buffGLTarget; // GL_ARRAY_BUFFER_ARB / GL_ELEMENT_BUFFER_ARB
+ GLuint m_name; // name of this program in the context
+ uint m_revision; // bump anytime the size changes or buffer is orphaned
+ bool m_enableAsyncMap; // mirror of the buffer state
+ bool m_enableExplicitFlush; // mirror of the buffer state
+
+ bool m_bound; // true if bound to context
+ bool m_mapped; // is it currently mapped
+ uint m_dirtyMinOffset; // when equal, range is empty
+ uint m_dirtyMaxOffset;
+
+ float *m_lastMappedAddress;
+
+ // --------------------- pseudo-VBO support below here (explicitly for dynamic index buffers)
+ bool m_pseudo; // true if the m_name is 0, and the backing is plain RAM
+
+ // in pseudo mode, there is just one RAM buffer that acts as the backing.
+ // expectation is that this mode would only be used for dynamic indices.
+ // since indices have to be consumed (copied to command stream) prior to return from a drawing call,
+ // there's no need to do any fencing or multibuffering. orphaning in particular becomes a no-op.
+
+ char *m_pseudoBuf; // storage for pseudo buffer
+};
+
+
#endif \ No newline at end of file
diff --git a/mp/src/public/togl/osx/cglmfbo.h b/mp/src/public/togl/osx/cglmfbo.h
index ccf3e970..c94bac70 100644
--- a/mp/src/public/togl/osx/cglmfbo.h
+++ b/mp/src/public/togl/osx/cglmfbo.h
@@ -1,91 +1,91 @@
//========= Copyright Valve Corporation, All rights reserved. ============//
-//
-// cglmfbo.h
-// GLMgr FBO's (render targets)
-//
-//===============================================================================
-
-#ifndef CGLMFBO_H
-#define CGLMFBO_H
-
-#pragma once
-
-#include "togl/rendermechanism.h"
-
-// good FBO references / recaps
-// http://www.songho.ca/opengl/gl_fbo.html
-// http://www.gamedev.net/reference/articles/article2331.asp
-
-// ext links
-
-// http://www.opengl.org/registry/specs/EXT/framebuffer_object.txt
-// http://www.opengl.org/registry/specs/EXT/framebuffer_multisample.txt
-
-//===============================================================================
-
-// tokens not in the SDK headers
-
-#ifndef GL_DEPTH_STENCIL_ATTACHMENT_EXT
- #define GL_DEPTH_STENCIL_ATTACHMENT_EXT 0x84F9
-#endif
-
-//===============================================================================
-
-// forward declarations
-
-class GLMContext;
-
-// implicitly 16 maximum color attachments possible
-enum EGLMFBOAttachment {
- kAttColor0, kAttColor1, kAttColor2, kAttColor3,
- kAttColor4, kAttColor5, kAttColor6, kAttColor7,
- kAttColor8, kAttColor9, kAttColor10, kAttColor11,
- kAttColor12, kAttColor13, kAttColor14, kAttColor15,
- kAttDepth, kAttStencil, kAttDepthStencil,
- kAttCount
-};
-
-struct GLMFBOTexAttachParams
-{
- CGLMTex *m_tex;
- int m_face; // keep zero if not cube map
- int m_mip; // keep zero if notmip mapped
- int m_zslice; // keep zero if not a 3D tex
-};
-
-class CGLMFBO
-{
-
-public:
-
-protected:
- friend class GLMContext; // only GLMContext can make CGLMFBO objects
- friend class GLMTester;
- friend class CGLMTex;
-
- friend class IDirect3D9;
- friend class IDirect3DDevice9;
-
- CGLMFBO( GLMContext *ctx );
- ~CGLMFBO( );
-
- void TexAttach( GLMFBOTexAttachParams *params, EGLMFBOAttachment attachIndex, GLenum fboBindPoint = GL_FRAMEBUFFER_EXT );
- void TexDetach( EGLMFBOAttachment attachIndex, GLenum fboBindPoint = GL_FRAMEBUFFER_EXT );
- // you can also pass GL_READ_FRAMEBUFFER_EXT or GL_DRAW_FRAMEBUFFER_EXT to selectively bind the receiving FBO to one or the other.
-
- void TexScrub( CGLMTex *tex );
- // search and destroy any attachment for the named texture
-
- bool IsReady( void ); // aka FBO completeness check - ready to draw
-
- GLMContext *m_ctx; // link back to parent context
-
- GLuint m_name; // name of this FBO in the context
-
- GLMFBOTexAttachParams m_attach[ kAttCount ]; // indexed by EGLMFBOAttachment
-
- int m_sizeX,m_sizeY;
-};
-
-
-#endif
+//
+// cglmfbo.h
+// GLMgr FBO's (render targets)
+//
+//===============================================================================
+
+#ifndef CGLMFBO_H
+#define CGLMFBO_H
+
+#pragma once
+
+#include "togl/rendermechanism.h"
+
+// good FBO references / recaps
+// http://www.songho.ca/opengl/gl_fbo.html
+// http://www.gamedev.net/reference/articles/article2331.asp
+
+// ext links
+
+// http://www.opengl.org/registry/specs/EXT/framebuffer_object.txt
+// http://www.opengl.org/registry/specs/EXT/framebuffer_multisample.txt
+
+//===============================================================================
+
+// tokens not in the SDK headers
+
+#ifndef GL_DEPTH_STENCIL_ATTACHMENT_EXT
+ #define GL_DEPTH_STENCIL_ATTACHMENT_EXT 0x84F9
+#endif
+
+//===============================================================================
+
+// forward declarations
+
+class GLMContext;
+
+// implicitly 16 maximum color attachments possible
+enum EGLMFBOAttachment {
+ kAttColor0, kAttColor1, kAttColor2, kAttColor3,
+ kAttColor4, kAttColor5, kAttColor6, kAttColor7,
+ kAttColor8, kAttColor9, kAttColor10, kAttColor11,
+ kAttColor12, kAttColor13, kAttColor14, kAttColor15,
+ kAttDepth, kAttStencil, kAttDepthStencil,
+ kAttCount
+};
+
+struct GLMFBOTexAttachParams
+{
+ CGLMTex *m_tex;
+ int m_face; // keep zero if not cube map
+ int m_mip; // keep zero if notmip mapped
+ int m_zslice; // keep zero if not a 3D tex
+};
+
+class CGLMFBO
+{
+
+public:
+
+protected:
+ friend class GLMContext; // only GLMContext can make CGLMFBO objects
+ friend class GLMTester;
+ friend class CGLMTex;
+
+ friend class IDirect3D9;
+ friend class IDirect3DDevice9;
+
+ CGLMFBO( GLMContext *ctx );
+ ~CGLMFBO( );
+
+ void TexAttach( GLMFBOTexAttachParams *params, EGLMFBOAttachment attachIndex, GLenum fboBindPoint = GL_FRAMEBUFFER_EXT );
+ void TexDetach( EGLMFBOAttachment attachIndex, GLenum fboBindPoint = GL_FRAMEBUFFER_EXT );
+ // you can also pass GL_READ_FRAMEBUFFER_EXT or GL_DRAW_FRAMEBUFFER_EXT to selectively bind the receiving FBO to one or the other.
+
+ void TexScrub( CGLMTex *tex );
+ // search and destroy any attachment for the named texture
+
+ bool IsReady( void ); // aka FBO completeness check - ready to draw
+
+ GLMContext *m_ctx; // link back to parent context
+
+ GLuint m_name; // name of this FBO in the context
+
+ GLMFBOTexAttachParams m_attach[ kAttCount ]; // indexed by EGLMFBOAttachment
+
+ int m_sizeX,m_sizeY;
+};
+
+
+#endif
diff --git a/mp/src/public/togl/osx/cglmprogram.h b/mp/src/public/togl/osx/cglmprogram.h
index ee7f4de2..3b1b4d86 100644
--- a/mp/src/public/togl/osx/cglmprogram.h
+++ b/mp/src/public/togl/osx/cglmprogram.h
@@ -1,291 +1,291 @@
//========= Copyright Valve Corporation, All rights reserved. ============//
-//
-// cglmprogram.h
-// GLMgr programs (ARBVP/ARBfp)
-//
-//===============================================================================
-
-#ifndef CGLMPROGRAM_H
-#define CGLMPROGRAM_H
-
-#include <sys/stat.h>
-
-#pragma once
-
-// good ARB program references
-// http://petewarden.com/notes/archives/2005/05/fragment_progra_2.html
-// http://petewarden.com/notes/archives/2005/06/fragment_progra_3.html
-
-// ext links
-
-// http://www.opengl.org/registry/specs/ARB/vertex_program.txt
-// http://www.opengl.org/registry/specs/ARB/fragment_program.txt
-// http://www.opengl.org/registry/specs/EXT/gpu_program_parameters.txt
-
-
-//===============================================================================
-
-// tokens not in the SDK headers
-
-//#ifndef GL_DEPTH_STENCIL_ATTACHMENT_EXT
-// #define GL_DEPTH_STENCIL_ATTACHMENT_EXT 0x84F9
-//#endif
-
-//===============================================================================
-
-// forward declarations
-
-class GLMContext;
-class CGLMShaderPair;
-class CGLMShaderPairCache;
-
-// CGLMProgram can contain two flavors of the same program, one in assembler, one in GLSL.
-// these flavors are pretty different in terms of the API's that are used to activate them -
-// for example, assembler programs can just get bound to the context, whereas GLSL programs
-// have to be linked. To some extent we try to hide that detail inside GLM.
-
-// for now, make CGLMProgram a container, it does not set policy or hold a preference as to which
-// flavor you want to use. GLMContext has to handle that.
-
-enum EGLMProgramType
-{
- kGLMVertexProgram,
- kGLMFragmentProgram,
-
- kGLMNumProgramTypes
-};
-
-enum EGLMProgramLang
-{
- kGLMARB,
- kGLMGLSL,
-
- kGLMNumProgramLangs
-};
-
-struct GLMShaderDesc
-{
- union
- {
- GLuint arb; // ARB program object name
- GLhandleARB glsl; // GLSL shader object handle (void*)
- } m_object;
-
- // these can change if shader text is edited
- bool m_textPresent; // is this flavor(lang) of text present in the buffer?
- int m_textOffset; // where is it
- int m_textLength; // how big
-
- bool m_compiled; // has this text been through a compile attempt
- bool m_valid; // and if so, was the compile successful
-
- int m_slowMark; // has it been flagged during a non native draw batch before. increment every time it's slow.
-
- int m_highWater; // vount of vec4's in the major uniform array ("vc" on vs, "pc" on ps)
- // written by dxabstract.... gross!
-};
-
-GLenum GLMProgTypeToARBEnum( EGLMProgramType type ); // map vert/frag to ARB asm bind target
-GLenum GLMProgTypeToGLSLEnum( EGLMProgramType type ); // map vert/frag to ARB asm bind target
-
-class CGLMProgram
-{
-public:
- friend class CGLMShaderPairCache;
- friend class CGLMShaderPair;
- friend class GLMContext; // only GLMContext can make CGLMProgram objects
- friend class GLMTester;
- friend class IDirect3D9;
- friend class IDirect3DDevice9;
-
- //===============================
-
- // constructor is very light, it just makes one empty program object per flavor.
- CGLMProgram( GLMContext *ctx, EGLMProgramType type );
- ~CGLMProgram( );
-
- void SetProgramText ( char *text ); // import text to GLM object - invalidate any prev compiled program
-
- bool CompileActiveSources ( void ); // compile only the flavors that were provided.
- bool Compile ( EGLMProgramLang lang );
- bool CheckValidity ( EGLMProgramLang lang );
-
- void LogSlow ( EGLMProgramLang lang ); // detailed spew when called for first time; one liner or perhaps silence after that
-
- void GetLabelIndexCombo ( char *labelOut, int labelOutMaxChars, int *indexOut, int *comboOut );
- void GetComboIndexNameString ( char *stringOut, int stringOutMaxChars ); // mmmmmmmm-nnnnnnnn-filename
-
-#if GLMDEBUG
- bool PollForChanges( void ); // check mirror for changes.
- void ReloadStringFromEditable( void ); // populate m_string from editable item (react to change)
- bool SyncWithEditable( void );
-#endif
-
- //===============================
-
- // common stuff
-
- GLMContext *m_ctx; // link back to parent context
-
- EGLMProgramType m_type; // vertex or pixel
-
- uint m_serial; // serial number for hashing
-
- char *m_text; // copy of text passed into constructor. Can change if editable shaders is enabled.
- // note - it can contain multiple flavors, so use CGLMTextSectioner to scan it and locate them
-#if GLMDEBUG
- CGLMEditableTextItem *m_editable; // editable text item for debugging
-#endif
-
- GLMShaderDesc m_descs[ kGLMNumProgramLangs ];
-
- uint m_samplerMask; // (1<<n) mask of sampler active locs, if this is a fragment shader (dxabstract sets this field)
-};
-
-//===============================================================================
-
-struct GLMShaderPairInfo
-{
- int m_status; // -1 means req'd index was out of bounds (loop stop..) 0 means not present. 1 means present/active.
-
- char m_vsName[ 128 ];
- int m_vsStaticIndex;
- int m_vsDynamicIndex;
-
- char m_psName[ 128 ];
- int m_psStaticIndex;
- int m_psDynamicIndex;
-};
-
-
-class CGLMShaderPair // a container for a linked GLSL shader pair, and metadata obtained post-link
-{
-
-public:
-
- friend class CGLMProgram;
- friend class GLMContext;
- friend class CGLMShaderPairCache;
-
- //===============================
-
- // constructor just sets up a GLSL program object and leaves it empty.
- CGLMShaderPair( GLMContext *ctx );
- ~CGLMShaderPair( );
-
- bool SetProgramPair ( CGLMProgram *vp, CGLMProgram *fp );
- // true result means successful link and query
-
- bool RefreshProgramPair ( void );
- // re-link and re-query the uniforms
-
- //===============================
-
- // common stuff
-
- GLMContext *m_ctx; // link back to parent context
-
- CGLMProgram *m_vertexProg;
- CGLMProgram *m_fragmentProg;
-
- GLhandleARB m_program; // linked program object
-
- // need meta data for attribs / samplers / params
- // actually we only need it for samplers and params.
- // attributes are hardwired.
-
- // vertex stage uniforms
- GLint m_locVertexParams; // "vc" per dx9asmtogl2 convention
- GLint m_locVertexInteger0; // "i0"
- GLint m_locVertexBool0; // "b0"
- GLint m_locVertexBool1; // "b1"
- GLint m_locVertexBool2; // "b2"
- GLint m_locVertexBool3; // "b3"
-
- // fragment stage uniforms
- GLint m_locFragmentParams; // "pc" per dx9asmtogl2 convention
- GLint m_locFragmentFakeSRGBEnable; // "flSRGBWrite" - set to 1.0 to effect sRGB encoding on output
- float m_fakeSRGBEnableValue; // shadow to avoid redundant sets of the m_locFragmentFakeSRGBEnable uniform
- // init it to -1.0 at link or relink, so it will trip on any legit incoming value (0.0 or 1.0)
-
- GLint m_locSamplers[ 16 ]; // "sampler0 ... sampler1..."
-
- // other stuff
- bool m_valid; // true on successful link
- bool m_samplersFixed; // set on first draw (can't write the uniforms until the program is in use, and we don't want to mess with cur program inside cglmprogram)
- uint m_revision; // if this pair is relinked, bump this number.
-};
-
-//===============================================================================
-
-// N-row, M-way associative cache with LRU per row.
-// still needs some metric dump ability and some parameter tuning.
-// extra credit would be to make an auto-tuner.
-
-struct CGLMPairCacheEntry
-{
- long long m_lastMark; // a mark of zero means an empty entry
- CGLMProgram *m_vertexProg;
- CGLMProgram *m_fragmentProg;
- uint m_extraKeyBits;
- CGLMShaderPair *m_pair;
-};
-
-class CGLMShaderPairCache // cache for linked GLSL shader pairs
-{
-
-public:
-
-protected:
- friend class CGLMShaderPair;
- friend class CGLMProgram;
- friend class GLMContext;
-
- //===============================
-
- CGLMShaderPairCache( GLMContext *ctx );
- ~CGLMShaderPairCache( );
-
- CGLMShaderPair *SelectShaderPair ( CGLMProgram *vp, CGLMProgram *fp, uint extraKeyBits );
- void QueryShaderPair ( int index, GLMShaderPairInfo *infoOut );
-
- // shoot down linked pairs that use the program in the arg
- // return true if any had to be skipped due to conflict with currently bound pair
- bool PurgePairsWithShader( CGLMProgram *prog );
-
- // purge everything (when would GLM know how to do this ? at context destroy time, but any other times?)
- // return true if any had to be skipped due to conflict with currently bound pair
- bool Purge ( void );
-
- // stats
- void DumpStats ( void );
-
- //===============================
-
- uint HashRowIndex ( CGLMProgram *vp, CGLMProgram *fp, uint extraKeyBits );
- CGLMPairCacheEntry* HashRowPtr ( uint hashRowIndex );
- void HashRowProbe ( CGLMPairCacheEntry *row, CGLMProgram *vp, CGLMProgram *fp, uint extraKeyBits, int *hitwayOut, int *emptywayOut, int *oldestwayOut );
- //===============================
-
- // common stuff
-
- GLMContext *m_ctx; // link back to parent context
-
- long long m_mark;
-
- uint m_rowsLg2;
- uint m_rows;
-
- uint m_waysLg2;
- uint m_ways;
-
- uint m_entryCount;
-
- CGLMPairCacheEntry *m_entries; // array[ m_rows ][ m_ways ]
-
- uint *m_evictions; // array[ m_rows ];
- uint *m_hits; // array[ m_rows ];
-};
-
-
+//
+// cglmprogram.h
+// GLMgr programs (ARBVP/ARBfp)
+//
+//===============================================================================
+
+#ifndef CGLMPROGRAM_H
+#define CGLMPROGRAM_H
+
+#include <sys/stat.h>
+
+#pragma once
+
+// good ARB program references
+// http://petewarden.com/notes/archives/2005/05/fragment_progra_2.html
+// http://petewarden.com/notes/archives/2005/06/fragment_progra_3.html
+
+// ext links
+
+// http://www.opengl.org/registry/specs/ARB/vertex_program.txt
+// http://www.opengl.org/registry/specs/ARB/fragment_program.txt
+// http://www.opengl.org/registry/specs/EXT/gpu_program_parameters.txt
+
+
+//===============================================================================
+
+// tokens not in the SDK headers
+
+//#ifndef GL_DEPTH_STENCIL_ATTACHMENT_EXT
+// #define GL_DEPTH_STENCIL_ATTACHMENT_EXT 0x84F9
+//#endif
+
+//===============================================================================
+
+// forward declarations
+
+class GLMContext;
+class CGLMShaderPair;
+class CGLMShaderPairCache;
+
+// CGLMProgram can contain two flavors of the same program, one in assembler, one in GLSL.
+// these flavors are pretty different in terms of the API's that are used to activate them -
+// for example, assembler programs can just get bound to the context, whereas GLSL programs
+// have to be linked. To some extent we try to hide that detail inside GLM.
+
+// for now, make CGLMProgram a container, it does not set policy or hold a preference as to which
+// flavor you want to use. GLMContext has to handle that.
+
+enum EGLMProgramType
+{
+ kGLMVertexProgram,
+ kGLMFragmentProgram,
+
+ kGLMNumProgramTypes
+};
+
+enum EGLMProgramLang
+{
+ kGLMARB,
+ kGLMGLSL,
+
+ kGLMNumProgramLangs
+};
+
+struct GLMShaderDesc
+{
+ union
+ {
+ GLuint arb; // ARB program object name
+ GLhandleARB glsl; // GLSL shader object handle (void*)
+ } m_object;
+
+ // these can change if shader text is edited
+ bool m_textPresent; // is this flavor(lang) of text present in the buffer?
+ int m_textOffset; // where is it
+ int m_textLength; // how big
+
+ bool m_compiled; // has this text been through a compile attempt
+ bool m_valid; // and if so, was the compile successful
+
+ int m_slowMark; // has it been flagged during a non native draw batch before. increment every time it's slow.
+
+ int m_highWater; // vount of vec4's in the major uniform array ("vc" on vs, "pc" on ps)
+ // written by dxabstract.... gross!
+};
+
+GLenum GLMProgTypeToARBEnum( EGLMProgramType type ); // map vert/frag to ARB asm bind target
+GLenum GLMProgTypeToGLSLEnum( EGLMProgramType type ); // map vert/frag to ARB asm bind target
+
+class CGLMProgram
+{
+public:
+ friend class CGLMShaderPairCache;
+ friend class CGLMShaderPair;
+ friend class GLMContext; // only GLMContext can make CGLMProgram objects
+ friend class GLMTester;
+ friend class IDirect3D9;
+ friend class IDirect3DDevice9;
+
+ //===============================
+
+ // constructor is very light, it just makes one empty program object per flavor.
+ CGLMProgram( GLMContext *ctx, EGLMProgramType type );
+ ~CGLMProgram( );
+
+ void SetProgramText ( char *text ); // import text to GLM object - invalidate any prev compiled program
+
+ bool CompileActiveSources ( void ); // compile only the flavors that were provided.
+ bool Compile ( EGLMProgramLang lang );
+ bool CheckValidity ( EGLMProgramLang lang );
+
+ void LogSlow ( EGLMProgramLang lang ); // detailed spew when called for first time; one liner or perhaps silence after that
+
+ void GetLabelIndexCombo ( char *labelOut, int labelOutMaxChars, int *indexOut, int *comboOut );
+ void GetComboIndexNameString ( char *stringOut, int stringOutMaxChars ); // mmmmmmmm-nnnnnnnn-filename
+
+#if GLMDEBUG
+ bool PollForChanges( void ); // check mirror for changes.
+ void ReloadStringFromEditable( void ); // populate m_string from editable item (react to change)
+ bool SyncWithEditable( void );
+#endif
+
+ //===============================
+
+ // common stuff
+
+ GLMContext *m_ctx; // link back to parent context
+
+ EGLMProgramType m_type; // vertex or pixel
+
+ uint m_serial; // serial number for hashing
+
+ char *m_text; // copy of text passed into constructor. Can change if editable shaders is enabled.
+ // note - it can contain multiple flavors, so use CGLMTextSectioner to scan it and locate them
+#if GLMDEBUG
+ CGLMEditableTextItem *m_editable; // editable text item for debugging
+#endif
+
+ GLMShaderDesc m_descs[ kGLMNumProgramLangs ];
+
+ uint m_samplerMask; // (1<<n) mask of sampler active locs, if this is a fragment shader (dxabstract sets this field)
+};
+
+//===============================================================================
+
+struct GLMShaderPairInfo
+{
+ int m_status; // -1 means req'd index was out of bounds (loop stop..) 0 means not present. 1 means present/active.
+
+ char m_vsName[ 128 ];
+ int m_vsStaticIndex;
+ int m_vsDynamicIndex;
+
+ char m_psName[ 128 ];
+ int m_psStaticIndex;
+ int m_psDynamicIndex;
+};
+
+
+class CGLMShaderPair // a container for a linked GLSL shader pair, and metadata obtained post-link
+{
+
+public:
+
+ friend class CGLMProgram;
+ friend class GLMContext;
+ friend class CGLMShaderPairCache;
+
+ //===============================
+
+ // constructor just sets up a GLSL program object and leaves it empty.
+ CGLMShaderPair( GLMContext *ctx );
+ ~CGLMShaderPair( );
+
+ bool SetProgramPair ( CGLMProgram *vp, CGLMProgram *fp );
+ // true result means successful link and query
+
+ bool RefreshProgramPair ( void );
+ // re-link and re-query the uniforms
+
+ //===============================
+
+ // common stuff
+
+ GLMContext *m_ctx; // link back to parent context
+
+ CGLMProgram *m_vertexProg;
+ CGLMProgram *m_fragmentProg;
+
+ GLhandleARB m_program; // linked program object
+
+ // need meta data for attribs / samplers / params
+ // actually we only need it for samplers and params.
+ // attributes are hardwired.
+
+ // vertex stage uniforms
+ GLint m_locVertexParams; // "vc" per dx9asmtogl2 convention
+ GLint m_locVertexInteger0; // "i0"
+ GLint m_locVertexBool0; // "b0"
+ GLint m_locVertexBool1; // "b1"
+ GLint m_locVertexBool2; // "b2"
+ GLint m_locVertexBool3; // "b3"
+
+ // fragment stage uniforms
+ GLint m_locFragmentParams; // "pc" per dx9asmtogl2 convention
+ GLint m_locFragmentFakeSRGBEnable; // "flSRGBWrite" - set to 1.0 to effect sRGB encoding on output
+ float m_fakeSRGBEnableValue; // shadow to avoid redundant sets of the m_locFragmentFakeSRGBEnable uniform
+ // init it to -1.0 at link or relink, so it will trip on any legit incoming value (0.0 or 1.0)
+
+ GLint m_locSamplers[ 16 ]; // "sampler0 ... sampler1..."
+
+ // other stuff
+ bool m_valid; // true on successful link
+ bool m_samplersFixed; // set on first draw (can't write the uniforms until the program is in use, and we don't want to mess with cur program inside cglmprogram)
+ uint m_revision; // if this pair is relinked, bump this number.
+};
+
+//===============================================================================
+
+// N-row, M-way associative cache with LRU per row.
+// still needs some metric dump ability and some parameter tuning.
+// extra credit would be to make an auto-tuner.
+
+struct CGLMPairCacheEntry
+{
+ long long m_lastMark; // a mark of zero means an empty entry
+ CGLMProgram *m_vertexProg;
+ CGLMProgram *m_fragmentProg;
+ uint m_extraKeyBits;
+ CGLMShaderPair *m_pair;
+};
+
+class CGLMShaderPairCache // cache for linked GLSL shader pairs
+{
+
+public:
+
+protected:
+ friend class CGLMShaderPair;
+ friend class CGLMProgram;
+ friend class GLMContext;
+
+ //===============================
+
+ CGLMShaderPairCache( GLMContext *ctx );
+ ~CGLMShaderPairCache( );
+
+ CGLMShaderPair *SelectShaderPair ( CGLMProgram *vp, CGLMProgram *fp, uint extraKeyBits );
+ void QueryShaderPair ( int index, GLMShaderPairInfo *infoOut );
+
+ // shoot down linked pairs that use the program in the arg
+ // return true if any had to be skipped due to conflict with currently bound pair
+ bool PurgePairsWithShader( CGLMProgram *prog );
+
+ // purge everything (when would GLM know how to do this ? at context destroy time, but any other times?)
+ // return true if any had to be skipped due to conflict with currently bound pair
+ bool Purge ( void );
+
+ // stats
+ void DumpStats ( void );
+
+ //===============================
+
+ uint HashRowIndex ( CGLMProgram *vp, CGLMProgram *fp, uint extraKeyBits );
+ CGLMPairCacheEntry* HashRowPtr ( uint hashRowIndex );
+ void HashRowProbe ( CGLMPairCacheEntry *row, CGLMProgram *vp, CGLMProgram *fp, uint extraKeyBits, int *hitwayOut, int *emptywayOut, int *oldestwayOut );
+ //===============================
+
+ // common stuff
+
+ GLMContext *m_ctx; // link back to parent context
+
+ long long m_mark;
+
+ uint m_rowsLg2;
+ uint m_rows;
+
+ uint m_waysLg2;
+ uint m_ways;
+
+ uint m_entryCount;
+
+ CGLMPairCacheEntry *m_entries; // array[ m_rows ][ m_ways ]
+
+ uint *m_evictions; // array[ m_rows ];
+ uint *m_hits; // array[ m_rows ];
+};
+
+
#endif \ No newline at end of file
diff --git a/mp/src/public/togl/osx/cglmquery.h b/mp/src/public/togl/osx/cglmquery.h
index 1f5b1676..21e16893 100644
--- a/mp/src/public/togl/osx/cglmquery.h
+++ b/mp/src/public/togl/osx/cglmquery.h
@@ -1,85 +1,85 @@
//========= Copyright Valve Corporation, All rights reserved. ============//
-//
-// cglmquery.h
-// GLMgr queries
-//
-//===============================================================================
-
-#ifndef CGLMQUERY_H
-#define CGLMQUERY_H
-
-#pragma once
-
-//===============================================================================
-
-// forward declarations
-
-class GLMContext;
-class CGLMQuery;
-
-//===============================================================================
-
-enum EGLMQueryType
-{
- EOcclusion,
- EFence,
- EGLMQueryCount
-};
-
-struct GLMQueryParams
-{
- EGLMQueryType m_type;
-};
-
-class CGLMQuery
-{
- // leave everything public til it's running
-public:
- friend class GLMContext; // only GLMContext can make CGLMTex objects
- friend class IDirect3DDevice9;
- friend class IDirect3DQuery9;
-
- GLMContext *m_ctx; // link back to parent context
- GLMQueryParams m_params; // params created with
-
- GLuint m_name; // name of the query object per se - could be fence, could be query object ... NOT USED WITH GL_ARB_sync!
-#ifdef HAVE_GL_ARB_SYNC
- GLsync m_syncobj; // GL_ARB_sync object. NOT USED WITH GL_NV_fence or GL_APPLE_fence!
-#else
- GLuint m_syncobj;
-#endif
-
- bool m_started;
- bool m_stopped;
- bool m_done;
-
- bool m_nullQuery; // was gl_nullqueries true at Start time - if so, continue to act like a null query through Stop/IsDone/Complete time
- // restated - only Start should examine the convar.
-
- CGLMQuery( GLMContext *ctx, GLMQueryParams *params );
- ~CGLMQuery( );
-
- // for an occlusion query:
- // Start = BeginQuery query-start goes into stream
- // Stop = EndQuery query-end goes into stream - a fence is also set so we can probe for completion
- // IsDone = TestFence use the added fence to ask if query-end has passed (i.e. will Complete block?)
- // Complete = GetQueryObjectuivARB(uint id, enum pname, uint *params) - extract the sample count
-
- // for a fence query:
- // Start = SetFence fence goes into command stream
- // Stop = NOP fences are self finishing - no need to call Stop on a fence
- // IsDone = TestFence ask if fence passed
- // Complete = FinishFence
-
- void Start ( void );
- void Stop ( void );
- bool IsDone ( void );
- void Complete ( uint *result );
-
- // accessors for the started/stopped state
- bool IsStarted ( void );
- bool IsStopped ( void );
-};
-
-
-#endif
+//
+// cglmquery.h
+// GLMgr queries
+//
+//===============================================================================
+
+#ifndef CGLMQUERY_H
+#define CGLMQUERY_H
+
+#pragma once
+
+//===============================================================================
+
+// forward declarations
+
+class GLMContext;
+class CGLMQuery;
+
+//===============================================================================
+
+enum EGLMQueryType
+{
+ EOcclusion,
+ EFence,
+ EGLMQueryCount
+};
+
+struct GLMQueryParams
+{
+ EGLMQueryType m_type;
+};
+
+class CGLMQuery
+{
+ // leave everything public til it's running
+public:
+ friend class GLMContext; // only GLMContext can make CGLMTex objects
+ friend class IDirect3DDevice9;
+ friend class IDirect3DQuery9;
+
+ GLMContext *m_ctx; // link back to parent context
+ GLMQueryParams m_params; // params created with
+
+ GLuint m_name; // name of the query object per se - could be fence, could be query object ... NOT USED WITH GL_ARB_sync!
+#ifdef HAVE_GL_ARB_SYNC
+ GLsync m_syncobj; // GL_ARB_sync object. NOT USED WITH GL_NV_fence or GL_APPLE_fence!
+#else
+ GLuint m_syncobj;
+#endif
+
+ bool m_started;
+ bool m_stopped;
+ bool m_done;
+
+ bool m_nullQuery; // was gl_nullqueries true at Start time - if so, continue to act like a null query through Stop/IsDone/Complete time
+ // restated - only Start should examine the convar.
+
+ CGLMQuery( GLMContext *ctx, GLMQueryParams *params );
+ ~CGLMQuery( );
+
+ // for an occlusion query:
+ // Start = BeginQuery query-start goes into stream
+ // Stop = EndQuery query-end goes into stream - a fence is also set so we can probe for completion
+ // IsDone = TestFence use the added fence to ask if query-end has passed (i.e. will Complete block?)
+ // Complete = GetQueryObjectuivARB(uint id, enum pname, uint *params) - extract the sample count
+
+ // for a fence query:
+ // Start = SetFence fence goes into command stream
+ // Stop = NOP fences are self finishing - no need to call Stop on a fence
+ // IsDone = TestFence ask if fence passed
+ // Complete = FinishFence
+
+ void Start ( void );
+ void Stop ( void );
+ bool IsDone ( void );
+ void Complete ( uint *result );
+
+ // accessors for the started/stopped state
+ bool IsStarted ( void );
+ bool IsStopped ( void );
+};
+
+
+#endif
diff --git a/mp/src/public/togl/osx/cglmtex.h b/mp/src/public/togl/osx/cglmtex.h
index 813395c7..ce6b6596 100644
--- a/mp/src/public/togl/osx/cglmtex.h
+++ b/mp/src/public/togl/osx/cglmtex.h
@@ -1,273 +1,273 @@
//========= Copyright Valve Corporation, All rights reserved. ============//
-//
-// cglmtex.h
-// GLMgr textures
-//
-//===============================================================================
-
-#ifndef CGLMTEX_H
-#define CGLMTEX_H
-
-#pragma once
-
-#include "tier1/utlhash.h"
-#include "tier1/utlmap.h"
-
-//===============================================================================
-
-// forward declarations
-
-class GLMContext;
-class GLMTester;
-class CGLMTexLayoutTable;
-class CGLMTex;
-class CGLMFBO;
-
-class IDirect3DSurface9;
-
-//===============================================================================
-
-struct GLMTexFormatDesc
-{
- char *m_formatSummary; // for debug visibility
-
- D3DFORMAT m_d3dFormat; // what D3D knows it as; see public/bitmap/imageformat.h
-
- GLenum m_glIntFormat; // GL internal format
- GLenum m_glIntFormatSRGB; // internal format if SRGB flavor
- GLenum m_glDataFormat; // GL data format
- GLenum m_glDataType; // GL data type
-
- int m_chunkSize; // 1 or 4 - 4 is used for compressed textures
- int m_bytesPerSquareChunk; // how many bytes for the smallest quantum (m_chunkSize x m_chunkSize)
- // this description lets us calculate size cleanly without conditional logic for compression
-};
-const GLMTexFormatDesc *GetFormatDesc( D3DFORMAT format );
-
-//===============================================================================
-
-// utility function for generating slabs of texels. mostly for test.
-typedef struct
-{
- // in
- D3DFORMAT m_format;
- void *m_dest; // dest address
- int m_chunkCount; // square chunk count (single texels or compressed blocks)
- int m_byteCountLimit; // caller expectation of max number of bytes to write out
- float r,g,b,a; // color desired
-
- // out
- int m_bytesWritten;
-} GLMGenTexelParams;
-
-// return true if successful
-bool GLMGenTexels( GLMGenTexelParams *params );
-
-
-//===============================================================================
-
-struct GLMTexLayoutSlice
-{
- int m_xSize,m_ySize,m_zSize; //texel dimensions of this slice
- int m_storageOffset; //where in the storage slab does this slice live
- int m_storageSize; //how much storage does this slice occupy
-};
-
-enum EGLMTexFlags
-{
- kGLMTexMipped = 0x01,
- kGLMTexMippedAuto = 0x02,
- kGLMTexRenderable = 0x04,
- kGLMTexIsStencil = 0x08,
- kGLMTexIsDepth = 0x10,
- kGLMTexSRGB = 0x20,
- kGLMTexMultisampled = 0x40, // has an RBO backing it. Cannot combine with Mipped, MippedAuto. One slice maximum, only targeting GL_TEXTURE_2D.
- // actually not 100% positive on the mipmapping, the RBO itself can't be mipped, but the resulting texture could
- // have mipmaps generated.
-};
-
-//===============================================================================
-
-struct GLMTexLayoutKey
-{
- // input values: held const, these are the hash key for the form map
- GLenum m_texGLTarget; // flavor of texture: GL_TEXTURE_2D, GL_TEXTURE_3D, GLTEXTURE_CUBE_MAP
- D3DFORMAT m_texFormat; // D3D texel format
- unsigned long m_texFlags; // mipped, autogen mips, render target, ... ?
- unsigned long m_texSamples; // zero for a plain tex, 2/4/6/8 for "MSAA tex" (RBO backed)
- int m_xSize,m_ySize,m_zSize; // size of base mip
-};
-
-bool LessFunc_GLMTexLayoutKey( const GLMTexLayoutKey &a, const GLMTexLayoutKey &b );
-
-#define GLM_TEX_MAX_MIPS 14
-#define GLM_TEX_MAX_FACES 6
-#define GLM_TEX_MAX_SLICES (GLM_TEX_MAX_MIPS * GLM_TEX_MAX_FACES)
-
-struct GLMTexLayout
-{
- char *m_layoutSummary; // for debug visibility
-
- // const inputs used for hashing
- GLMTexLayoutKey m_key;
-
- // refcount
- int m_refCount;
-
- // derived values:
- GLMTexFormatDesc *m_format; // format specific info
- int m_mipCount; // derived by starying at base size and working down towards 1x1
- int m_faceCount; // 1 for 2d/3d, 6 for cubemap
- int m_sliceCount; // product of faces and mips
- int m_storageTotalSize; // size of storage slab required
-
- // slice array
- GLMTexLayoutSlice m_slices[0]; // dynamically allocated 2-d array [faces][mips]
-};
-
-
-class CGLMTexLayoutTable
-{
-public:
- CGLMTexLayoutTable();
-
- GLMTexLayout *NewLayoutRef( GLMTexLayoutKey *key ); // pass in a pointer to layout key - receive ptr to completed layout
- void DelLayoutRef( GLMTexLayout *layout ); // pass in pointer to completed layout. refcount is dropped.
-
- void DumpStats( void );
-protected:
- CUtlMap< GLMTexLayoutKey, GLMTexLayout* > m_layoutMap;
-};
-
-//===============================================================================
-
-// a sampler specifies desired state for drawing on a given sampler index
-// this is the combination of a texture choice and a set of sampler parameters
-// see http://msdn.microsoft.com/en-us/library/bb172602(VS.85).aspx
-
-
-struct GLMTexSamplingParams
-{
- GLenum m_addressModes[3]; // S, T, R
- GLfloat m_borderColor[4]; // R,G,B,A
-
- GLenum m_magFilter;
- GLenum m_minFilter;
-
- GLfloat m_mipmapBias;
- GLint m_minMipLevel;
- GLint m_maxMipLevel;
- GLint m_maxAniso;
- GLenum m_compareMode; // only used for depth and stencil type textures
- bool m_srgb; // srgb texture read...
-};
-
-struct GLMTexLockParams
-{
- // input params which identify the slice of interest
- CGLMTex *m_tex;
- int m_face;
- int m_mip;
-
- // identifies the region of the slice
- GLMRegion m_region;
-
- // tells GLM to force re-read of the texels back from GL
- // i.e. "I know I stepped on those texels with a draw or blit - the GLM copy is stale"
- bool m_readback;
-};
-
-struct GLMTexLockDesc
-{
- GLMTexLockParams m_req; // form of the lock request
-
- bool m_active; // set true at lock time. cleared at unlock time.
-
- int m_sliceIndex; // which slice in the layout
- int m_sliceBaseOffset; // where is that in the texture data
- int m_sliceRegionOffset; // offset to the start (lowest address corner) of the region requested
-};
-
-//===============================================================================
-
-#define GLM_SAMPLER_COUNT 16
-
-typedef CBitVec<GLM_SAMPLER_COUNT> CTexBindMask;
-
-enum EGLMTexSliceFlag
-{
- kSliceValid = 0x01, // slice has been teximage'd in whole at least once - set to 0 initially
- kSliceStorageValid = 0x02, // if backing store is available, this slice's data is a valid copy - set to 0 initially
- kSliceLocked = 0x04, // are one or more locks outstanding on this slice
- kSliceFullyDirty = 0x08, // does the slice need to be fully downloaded at unlock time (disregard dirty rects)
-};
-
-class CGLMTex
-{
-
-public:
-
- void Lock( GLMTexLockParams *params, char** addressOut, int* yStrideOut, int *zStrideOut );
- void Unlock( GLMTexLockParams *params );
-
-protected:
- friend class GLMContext; // only GLMContext can make CGLMTex objects
- friend class GLMTester;
- friend class CGLMFBO;
-
- friend class IDirect3DDevice9;
- friend class IDirect3DBaseTexture9;
- friend class IDirect3DTexture9;
- friend class IDirect3DSurface9;
- friend class IDirect3DCubeTexture9;
- friend class IDirect3DVolumeTexture9;
-
- CGLMTex( GLMContext *ctx, GLMTexLayout *layout, GLMTexSamplingParams *sampling, char *debugLabel = NULL );
- ~CGLMTex( );
-
- int CalcSliceIndex( int face, int mip );
- void CalcTexelDataOffsetAndStrides( int sliceIndex, int x, int y, int z, int *offsetOut, int *yStrideOut, int *zStrideOut );
-
- void ApplySamplingParams( GLMTexSamplingParams *params, bool noCheck=FALSE );
-
- void ReadTexels( GLMTexLockDesc *desc, bool readWholeSlice=true );
- void WriteTexels( GLMTexLockDesc *desc, bool writeWholeSlice=true, bool noDataWrite=false );
- // last param lets us send NULL data ptr (only legal with uncompressed formats, beware)
- // this helps out ResetSRGB.
-
- void ResetSRGB( bool srgb, bool noDataWrite );
- // re-specify texture format to match desired sRGB form
- // noWrite means send NULL for texel source addresses instead of actual data - ideal for RT's
-
- GLMTexLayout *m_layout; // layout of texture (shared across all tex with same layout)
- int m_minActiveMip;//index of lowest mip that has been written. used to drive setting of GL_TEXTURE_MAX_LEVEL.
- int m_maxActiveMip;//index of highest mip that has been written. used to drive setting of GL_TEXTURE_MAX_LEVEL.
-
- GLMTexSamplingParams m_sampling; // mirror of sampling params currently embodied in the texture
- // (consult this at draw time, in order to know if changes need to be made)
-
- GLMContext *m_ctx; // link back to parent context
-
- GLuint m_texName; // name of this texture in the context
- bool m_texClientStorage; // was CS selecetd for texture
- bool m_texPreloaded; // has it been kicked into VRAM with GLMContext::PreloadTex yet
-
- GLuint m_rboName; // name of MSAA RBO backing the tex if MSAA enabled (or zero)
- bool m_rboDirty; // has RBO been drawn on - i.e. needs to be blitted back to texture if texture is going to be sampled from
-
- CTexBindMask m_bindPoints; // true for each place in the parent ctx where currently
- // bound (indexed via EGLMTexCtxBindingIndex)
-
- int m_rtAttachCount; // how many RT's have this texture attached somewhere
-
- char *m_backing; // backing storage if available
-
- int m_lockCount; // lock reqs are stored in the GLMContext for tracking
-
- CUtlVector<unsigned char> m_sliceFlags;
-
- char *m_debugLabel; // strdup() of debugLabel passed in, or NULL
-};
-
-
-#endif
+//
+// cglmtex.h
+// GLMgr textures
+//
+//===============================================================================
+
+#ifndef CGLMTEX_H
+#define CGLMTEX_H
+
+#pragma once
+
+#include "tier1/utlhash.h"
+#include "tier1/utlmap.h"
+
+//===============================================================================
+
+// forward declarations
+
+class GLMContext;
+class GLMTester;
+class CGLMTexLayoutTable;
+class CGLMTex;
+class CGLMFBO;
+
+class IDirect3DSurface9;
+
+//===============================================================================
+
+struct GLMTexFormatDesc
+{
+ char *m_formatSummary; // for debug visibility
+
+ D3DFORMAT m_d3dFormat; // what D3D knows it as; see public/bitmap/imageformat.h
+
+ GLenum m_glIntFormat; // GL internal format
+ GLenum m_glIntFormatSRGB; // internal format if SRGB flavor
+ GLenum m_glDataFormat; // GL data format
+ GLenum m_glDataType; // GL data type
+
+ int m_chunkSize; // 1 or 4 - 4 is used for compressed textures
+ int m_bytesPerSquareChunk; // how many bytes for the smallest quantum (m_chunkSize x m_chunkSize)
+ // this description lets us calculate size cleanly without conditional logic for compression
+};
+const GLMTexFormatDesc *GetFormatDesc( D3DFORMAT format );
+
+//===============================================================================
+
+// utility function for generating slabs of texels. mostly for test.
+typedef struct
+{
+ // in
+ D3DFORMAT m_format;
+ void *m_dest; // dest address
+ int m_chunkCount; // square chunk count (single texels or compressed blocks)
+ int m_byteCountLimit; // caller expectation of max number of bytes to write out
+ float r,g,b,a; // color desired
+
+ // out
+ int m_bytesWritten;
+} GLMGenTexelParams;
+
+// return true if successful
+bool GLMGenTexels( GLMGenTexelParams *params );
+
+
+//===============================================================================
+
+struct GLMTexLayoutSlice
+{
+ int m_xSize,m_ySize,m_zSize; //texel dimensions of this slice
+ int m_storageOffset; //where in the storage slab does this slice live
+ int m_storageSize; //how much storage does this slice occupy
+};
+
+enum EGLMTexFlags
+{
+ kGLMTexMipped = 0x01,
+ kGLMTexMippedAuto = 0x02,
+ kGLMTexRenderable = 0x04,
+ kGLMTexIsStencil = 0x08,
+ kGLMTexIsDepth = 0x10,
+ kGLMTexSRGB = 0x20,
+ kGLMTexMultisampled = 0x40, // has an RBO backing it. Cannot combine with Mipped, MippedAuto. One slice maximum, only targeting GL_TEXTURE_2D.
+ // actually not 100% positive on the mipmapping, the RBO itself can't be mipped, but the resulting texture could
+ // have mipmaps generated.
+};
+
+//===============================================================================
+
+struct GLMTexLayoutKey
+{
+ // input values: held const, these are the hash key for the form map
+ GLenum m_texGLTarget; // flavor of texture: GL_TEXTURE_2D, GL_TEXTURE_3D, GLTEXTURE_CUBE_MAP
+ D3DFORMAT m_texFormat; // D3D texel format
+ unsigned long m_texFlags; // mipped, autogen mips, render target, ... ?
+ unsigned long m_texSamples; // zero for a plain tex, 2/4/6/8 for "MSAA tex" (RBO backed)
+ int m_xSize,m_ySize,m_zSize; // size of base mip
+};
+
+bool LessFunc_GLMTexLayoutKey( const GLMTexLayoutKey &a, const GLMTexLayoutKey &b );
+
+#define GLM_TEX_MAX_MIPS 14
+#define GLM_TEX_MAX_FACES 6
+#define GLM_TEX_MAX_SLICES (GLM_TEX_MAX_MIPS * GLM_TEX_MAX_FACES)
+
+struct GLMTexLayout
+{
+ char *m_layoutSummary; // for debug visibility
+
+ // const inputs used for hashing
+ GLMTexLayoutKey m_key;
+
+ // refcount
+ int m_refCount;
+
+ // derived values:
+ GLMTexFormatDesc *m_format; // format specific info
+ int m_mipCount; // derived by starying at base size and working down towards 1x1
+ int m_faceCount; // 1 for 2d/3d, 6 for cubemap
+ int m_sliceCount; // product of faces and mips
+ int m_storageTotalSize; // size of storage slab required
+
+ // slice array
+ GLMTexLayoutSlice m_slices[0]; // dynamically allocated 2-d array [faces][mips]
+};
+
+
+class CGLMTexLayoutTable
+{
+public:
+ CGLMTexLayoutTable();
+
+ GLMTexLayout *NewLayoutRef( GLMTexLayoutKey *key ); // pass in a pointer to layout key - receive ptr to completed layout
+ void DelLayoutRef( GLMTexLayout *layout ); // pass in pointer to completed layout. refcount is dropped.
+
+ void DumpStats( void );
+protected:
+ CUtlMap< GLMTexLayoutKey, GLMTexLayout* > m_layoutMap;
+};
+
+//===============================================================================
+
+// a sampler specifies desired state for drawing on a given sampler index
+// this is the combination of a texture choice and a set of sampler parameters
+// see http://msdn.microsoft.com/en-us/library/bb172602(VS.85).aspx
+
+
+struct GLMTexSamplingParams
+{
+ GLenum m_addressModes[3]; // S, T, R
+ GLfloat m_borderColor[4]; // R,G,B,A
+
+ GLenum m_magFilter;
+ GLenum m_minFilter;
+
+ GLfloat m_mipmapBias;
+ GLint m_minMipLevel;
+ GLint m_maxMipLevel;
+ GLint m_maxAniso;
+ GLenum m_compareMode; // only used for depth and stencil type textures
+ bool m_srgb; // srgb texture read...
+};
+
+struct GLMTexLockParams
+{
+ // input params which identify the slice of interest
+ CGLMTex *m_tex;
+ int m_face;
+ int m_mip;
+
+ // identifies the region of the slice
+ GLMRegion m_region;
+
+ // tells GLM to force re-read of the texels back from GL
+ // i.e. "I know I stepped on those texels with a draw or blit - the GLM copy is stale"
+ bool m_readback;
+};
+
+struct GLMTexLockDesc
+{
+ GLMTexLockParams m_req; // form of the lock request
+
+ bool m_active; // set true at lock time. cleared at unlock time.
+
+ int m_sliceIndex; // which slice in the layout
+ int m_sliceBaseOffset; // where is that in the texture data
+ int m_sliceRegionOffset; // offset to the start (lowest address corner) of the region requested
+};
+
+//===============================================================================
+
+#define GLM_SAMPLER_COUNT 16
+
+typedef CBitVec<GLM_SAMPLER_COUNT> CTexBindMask;
+
+enum EGLMTexSliceFlag
+{
+ kSliceValid = 0x01, // slice has been teximage'd in whole at least once - set to 0 initially
+ kSliceStorageValid = 0x02, // if backing store is available, this slice's data is a valid copy - set to 0 initially
+ kSliceLocked = 0x04, // are one or more locks outstanding on this slice
+ kSliceFullyDirty = 0x08, // does the slice need to be fully downloaded at unlock time (disregard dirty rects)
+};
+
+class CGLMTex
+{
+
+public:
+
+ void Lock( GLMTexLockParams *params, char** addressOut, int* yStrideOut, int *zStrideOut );
+ void Unlock( GLMTexLockParams *params );
+
+protected:
+ friend class GLMContext; // only GLMContext can make CGLMTex objects
+ friend class GLMTester;
+ friend class CGLMFBO;
+
+ friend class IDirect3DDevice9;
+ friend class IDirect3DBaseTexture9;
+ friend class IDirect3DTexture9;
+ friend class IDirect3DSurface9;
+ friend class IDirect3DCubeTexture9;
+ friend class IDirect3DVolumeTexture9;
+
+ CGLMTex( GLMContext *ctx, GLMTexLayout *layout, GLMTexSamplingParams *sampling, char *debugLabel = NULL );
+ ~CGLMTex( );
+
+ int CalcSliceIndex( int face, int mip );
+ void CalcTexelDataOffsetAndStrides( int sliceIndex, int x, int y, int z, int *offsetOut, int *yStrideOut, int *zStrideOut );
+
+ void ApplySamplingParams( GLMTexSamplingParams *params, bool noCheck=FALSE );
+
+ void ReadTexels( GLMTexLockDesc *desc, bool readWholeSlice=true );
+ void WriteTexels( GLMTexLockDesc *desc, bool writeWholeSlice=true, bool noDataWrite=false );
+ // last param lets us send NULL data ptr (only legal with uncompressed formats, beware)
+ // this helps out ResetSRGB.
+
+ void ResetSRGB( bool srgb, bool noDataWrite );
+ // re-specify texture format to match desired sRGB form
+ // noWrite means send NULL for texel source addresses instead of actual data - ideal for RT's
+
+ GLMTexLayout *m_layout; // layout of texture (shared across all tex with same layout)
+ int m_minActiveMip;//index of lowest mip that has been written. used to drive setting of GL_TEXTURE_MAX_LEVEL.
+ int m_maxActiveMip;//index of highest mip that has been written. used to drive setting of GL_TEXTURE_MAX_LEVEL.
+
+ GLMTexSamplingParams m_sampling; // mirror of sampling params currently embodied in the texture
+ // (consult this at draw time, in order to know if changes need to be made)
+
+ GLMContext *m_ctx; // link back to parent context
+
+ GLuint m_texName; // name of this texture in the context
+ bool m_texClientStorage; // was CS selecetd for texture
+ bool m_texPreloaded; // has it been kicked into VRAM with GLMContext::PreloadTex yet
+
+ GLuint m_rboName; // name of MSAA RBO backing the tex if MSAA enabled (or zero)
+ bool m_rboDirty; // has RBO been drawn on - i.e. needs to be blitted back to texture if texture is going to be sampled from
+
+ CTexBindMask m_bindPoints; // true for each place in the parent ctx where currently
+ // bound (indexed via EGLMTexCtxBindingIndex)
+
+ int m_rtAttachCount; // how many RT's have this texture attached somewhere
+
+ char *m_backing; // backing storage if available
+
+ int m_lockCount; // lock reqs are stored in the GLMContext for tracking
+
+ CUtlVector<unsigned char> m_sliceFlags;
+
+ char *m_debugLabel; // strdup() of debugLabel passed in, or NULL
+};
+
+
+#endif
diff --git a/mp/src/public/togl/osx/dxabstract.h b/mp/src/public/togl/osx/dxabstract.h
index 92f6bc32..50676e04 100644
--- a/mp/src/public/togl/osx/dxabstract.h
+++ b/mp/src/public/togl/osx/dxabstract.h
@@ -1,804 +1,804 @@
//========= Copyright Valve Corporation, All rights reserved. ============//
-//
-//
-//
-//==================================================================================================
-
-#ifndef DXABSTRACT_H
-#define DXABSTRACT_H
-#ifdef _WIN32
-#pragma once
-#endif
-
-#include "togl/rendermechanism.h"
-
-#include "materialsystem/ishader.h"
-
-// Uncomment this on Windows if you want to compile the Windows GL version.
-// #undef USE_ACTUAL_DX
-
-#ifdef USE_ACTUAL_DX
-
-#ifndef WIN32
-#error sorry man
-#endif
-#ifdef _X360
-#include "d3d9.h"
-#include "d3dx9.h"
-#else
-#include <windows.h>
-#include "../../dx9sdk/include/d3d9.h"
-#include "../../dx9sdk/include/d3dx9.h"
-#endif
-typedef HWND VD3DHWND;
-
-#else
-
-#ifdef WIN32
-#error Gl on win32?
-#endif
-
-#include "tier0/platform.h"
-
-#ifndef DX_TO_GL_ABSTRACTION
-#define DX_TO_GL_ABSTRACTION
-#endif
-
-#include "bitmap/imageformat.h"
-#include "togl/rendermechanism.h"
-
-#ifdef OSX
-extern "C" void Debugger(void);
-#endif
-
-// turn this on to get refcount logging from IUnknown
-#define IUNKNOWN_ALLOC_SPEW 0
-#define IUNKNOWN_ALLOC_SPEW_MARK_ALL 0
-
-
-// ------------------------------------------------------------------------------------------------------------------------------ //
-// DEFINES
-// ------------------------------------------------------------------------------------------------------------------------------ //
-
-typedef void* VD3DHWND;
-typedef void* VD3DHANDLE;
-
-
-TOGL_INTERFACE void toglGetClientRect( VD3DHWND hWnd, RECT *destRect );
-
-struct TOGL_CLASS IUnknown
-{
- int m_refcount[2];
- bool m_mark;
-
- IUnknown( void )
- {
- m_refcount[0] = 1;
- m_refcount[1] = 0;
- m_mark = (IUNKNOWN_ALLOC_SPEW_MARK_ALL != 0); // either all are marked, or only the ones that have SetMark(true) called on them
-
- #if IUNKNOWN_ALLOC_SPEW
- if (m_mark)
- {
- GLMPRINTF(("-A- IUnew (%08x) refc -> (%d,%d) ",this,m_refcount[0],m_refcount[1]));
- }
- #endif
- };
-
- virtual ~IUnknown( void )
- {
- #if IUNKNOWN_ALLOC_SPEW
- if (m_mark)
- {
- GLMPRINTF(("-A- IUdel (%08x) ",this ));
- }
- #endif
- };
-
- void AddRef( int which=0, char *comment = NULL )
- {
- Assert( which >= 0 );
- Assert( which < 2 );
- m_refcount[which]++;
-
- #if IUNKNOWN_ALLOC_SPEW
- if (m_mark)
- {
- GLMPRINTF(("-A- IUAddRef (%08x,%d) refc -> (%d,%d) [%s]",this,which,m_refcount[0],m_refcount[1],comment?comment:"...")) ;
- if (!comment)
- {
- GLMPRINTF(("")) ; // place to hang a breakpoint
- }
- }
- #endif
- };
-
- ULONG __stdcall Release( int which=0, char *comment = NULL )
- {
- Assert( which >= 0 );
- Assert( which < 2 );
-
- //int oldrefcs[2] = { m_refcount[0], m_refcount[1] };
- bool deleting = false;
-
- m_refcount[which]--;
- if ( (!m_refcount[0]) && (!m_refcount[1]) )
- {
- deleting = true;
- }
-
- #if IUNKNOWN_ALLOC_SPEW
- if (m_mark)
- {
- GLMPRINTF(("-A- IURelease (%08x,%d) refc -> (%d,%d) [%s] %s",this,which,m_refcount[0],m_refcount[1],comment?comment:"...",deleting?"->DELETING":""));
- if (!comment)
- {
- GLMPRINTF(("")) ; // place to hang a breakpoint
- }
- }
- #endif
-
- if (deleting)
- {
- if (m_mark)
- {
- GLMPRINTF(("")) ; // place to hang a breakpoint
- }
- delete this;
- return 0;
- }
- else
- {
- return m_refcount[0];
- }
- };
-
- void SetMark( bool markValue, char *comment=NULL )
- {
- #if IUNKNOWN_ALLOC_SPEW
- if (!m_mark && markValue) // leading edge detect
- {
- // print the same thing that the constructor would have printed if it had been marked from the beginning
- // i.e. it's anticipated that callers asking for marking will do so right at create time
- GLMPRINTF(("-A- IUSetMark (%08x) refc -> (%d,%d) (%s) ",this,m_refcount[0],m_refcount[1],comment?comment:"..."));
- }
- #endif
-
- m_mark = markValue;
- }
-};
-
-
-// ------------------------------------------------------------------------------------------------------------------------------ //
-// INTERFACES
-// ------------------------------------------------------------------------------------------------------------------------------ //
-
-struct TOGL_CLASS IDirect3DResource9 : public IUnknown
-{
- IDirect3DDevice9 *m_device; // parent device
- D3DRESOURCETYPE m_restype;
-
- DWORD SetPriority(DWORD PriorityNew);
-};
-
-struct TOGL_CLASS IDirect3DBaseTexture9 : public IDirect3DResource9 // "A Texture.."
-{
- D3DSURFACE_DESC m_descZero; // desc of top level.
- CGLMTex *m_tex; // a CGLMTex can represent all forms of tex
- int m_srgbFlipCount;
-
- virtual ~IDirect3DBaseTexture9();
- D3DRESOURCETYPE GetType();
- DWORD GetLevelCount();
- HRESULT GetLevelDesc(UINT Level,D3DSURFACE_DESC *pDesc);
-};
-
-struct TOGL_CLASS IDirect3DTexture9 : public IDirect3DBaseTexture9 // "Texture 2D"
-{
- IDirect3DSurface9 *m_surfZero; // surf of top level.
-
- virtual ~IDirect3DTexture9();
-
- HRESULT LockRect(UINT Level,D3DLOCKED_RECT* pLockedRect,CONST RECT* pRect,DWORD Flags);
- HRESULT UnlockRect(UINT Level);
- HRESULT GetSurfaceLevel(UINT Level,IDirect3DSurface9** ppSurfaceLevel);
-};
-
-struct TOGL_CLASS IDirect3DCubeTexture9 : public IDirect3DBaseTexture9 // "Texture Cube Map"
-{
- IDirect3DSurface9 *m_surfZero[6]; // surfs of top level.
-
- virtual ~IDirect3DCubeTexture9();
-
- HRESULT GetCubeMapSurface(D3DCUBEMAP_FACES FaceType,UINT Level,IDirect3DSurface9** ppCubeMapSurface);
- HRESULT GetLevelDesc(UINT Level,D3DSURFACE_DESC *pDesc);
-};
-
-struct TOGL_CLASS IDirect3DVolumeTexture9 : public IDirect3DBaseTexture9 // "Texture 3D"
-{
- IDirect3DSurface9 *m_surfZero; // surf of top level.
- D3DVOLUME_DESC m_volDescZero; // volume desc top level
-
- virtual ~IDirect3DVolumeTexture9();
-
- HRESULT LockBox(UINT Level,D3DLOCKED_BOX* pLockedVolume,CONST D3DBOX* pBox,DWORD Flags);
- HRESULT UnlockBox(UINT Level);
- HRESULT GetLevelDesc( UINT level, D3DVOLUME_DESC *pDesc );
-};
-
-
-// for the moment, a "D3D surface" is modeled as a GLM tex, a face, and a mip.
-// no Create method, these are filled in by the various create surface methods.
-
-struct TOGL_CLASS IDirect3DSurface9 : public IDirect3DResource9
-{
- virtual ~IDirect3DSurface9();
-
- HRESULT LockRect(D3DLOCKED_RECT* pLockedRect,CONST RECT* pRect,DWORD Flags);
- HRESULT UnlockRect();
- HRESULT GetDesc(D3DSURFACE_DESC *pDesc);
-
- D3DSURFACE_DESC m_desc;
- CGLMTex *m_tex;
- int m_face;
- int m_mip;
-};
-
-
-
-struct TOGL_CLASS IDirect3D9 : public IUnknown
-{
-public:
- virtual ~IDirect3D9();
-
- UINT GetAdapterCount(); //cheese: returns 1
-
- HRESULT GetDeviceCaps (UINT Adapter,D3DDEVTYPE DeviceType,D3DCAPS9* pCaps);
- HRESULT GetAdapterIdentifier (UINT Adapter,DWORD Flags,D3DADAPTER_IDENTIFIER9* pIdentifier);
- HRESULT CheckDeviceFormat (UINT Adapter,D3DDEVTYPE DeviceType,D3DFORMAT AdapterFormat,DWORD Usage,D3DRESOURCETYPE RType,D3DFORMAT CheckFormat);
- UINT GetAdapterModeCount (UINT Adapter,D3DFORMAT Format);
- HRESULT EnumAdapterModes (UINT Adapter,D3DFORMAT Format,UINT Mode,D3DDISPLAYMODE* pMode);
- HRESULT CheckDeviceType (UINT Adapter,D3DDEVTYPE DevType,D3DFORMAT AdapterFormat,D3DFORMAT BackBufferFormat,BOOL bWindowed);
- HRESULT GetAdapterDisplayMode (UINT Adapter,D3DDISPLAYMODE* pMode);
- HRESULT CheckDepthStencilMatch (UINT Adapter,D3DDEVTYPE DeviceType,D3DFORMAT AdapterFormat,D3DFORMAT RenderTargetFormat,D3DFORMAT DepthStencilFormat);
- HRESULT CheckDeviceMultiSampleType (UINT Adapter,D3DDEVTYPE DeviceType,D3DFORMAT SurfaceFormat,BOOL Windowed,D3DMULTISAMPLE_TYPE MultiSampleType,DWORD* pQualityLevels);
-
- HRESULT CreateDevice (UINT Adapter,D3DDEVTYPE DeviceType,VD3DHWND hFocusWindow,DWORD BehaviorFlags,D3DPRESENT_PARAMETERS* pPresentationParameters,IDirect3DDevice9** ppReturnedDeviceInterface);
-};
-
-struct TOGL_CLASS IDirect3DSwapChain9 : public IUnknown
-{
-};
-
-
-
- // typedef enum D3DDECLUSAGE
- // {
- // D3DDECLUSAGE_POSITION = 0,
- // D3DDECLUSAGE_BLENDWEIGHT = 1,
- // D3DDECLUSAGE_BLENDINDICES = 2,
- // D3DDECLUSAGE_NORMAL = 3,
- // D3DDECLUSAGE_PSIZE = 4,
- // D3DDECLUSAGE_TEXCOORD = 5,
- // D3DDECLUSAGE_TANGENT = 6,
- // D3DDECLUSAGE_BINORMAL = 7,
- // D3DDECLUSAGE_TESSFACTOR = 8,
- // D3DDECLUSAGE_POSITIONT = 9,
- // D3DDECLUSAGE_COLOR = 10,
- // D3DDECLUSAGE_FOG = 11,
- // D3DDECLUSAGE_DEPTH = 12,
- // D3DDECLUSAGE_SAMPLE = 13,
- // } D3DDECLUSAGE, *LPD3DDECLUSAGE;
- // Constants
- //
- // D3DDECLUSAGE_POSITION
- // Position data ranging from (-1,-1) to (1,1). Use D3DDECLUSAGE_POSITION with
- // a usage index of 0 to specify untransformed position for fixed function
- // vertex processing and the n-patch tessellator. Use D3DDECLUSAGE_POSITION
- // with a usage index of 1 to specify untransformed position in the fixed
- // function vertex shader for vertex tweening.
- //
- // D3DDECLUSAGE_BLENDWEIGHT
- // Blending weight data. Use D3DDECLUSAGE_BLENDWEIGHT with a usage index of 0
- // to specify the blend weights used in indexed and nonindexed vertex
- // blending.
- //
- // D3DDECLUSAGE_BLENDINDICES
- // Blending indices data. Use D3DDECLUSAGE_BLENDINDICES with a usage index of
- // 0 to specify matrix indices for indexed paletted skinning.
- //
- // D3DDECLUSAGE_NORMAL
- // Vertex normal data. Use D3DDECLUSAGE_NORMAL with a usage index of 0 to
- // specify vertex normals for fixed function vertex processing and the n-patch
- // tessellator. Use D3DDECLUSAGE_NORMAL with a usage index of 1 to specify
- // vertex normals for fixed function vertex processing for vertex tweening.
- //
- // D3DDECLUSAGE_PSIZE
- // Point size data. Use D3DDECLUSAGE_PSIZE with a usage index of 0 to specify
- // the point-size attribute used by the setup engine of the rasterizer to
- // expand a point into a quad for the point-sprite functionality.
- //
- // D3DDECLUSAGE_TEXCOORD
- // Texture coordinate data. Use D3DDECLUSAGE_TEXCOORD, n to specify texture
- // coordinates in fixed function vertex processing and in pixel shaders prior
- // to ps_3_0. These can be used to pass user defined data.
- //
- // D3DDECLUSAGE_TANGENT
- // Vertex tangent data.
- //
- // D3DDECLUSAGE_BINORMAL
- // Vertex binormal data.
- //
- // D3DDECLUSAGE_TESSFACTOR
- // Single positive floating point value. Use D3DDECLUSAGE_TESSFACTOR with a
- // usage index of 0 to specify a tessellation factor used in the tessellation
- // unit to control the rate of tessellation. For more information about the
- // data type, see D3DDECLTYPE_FLOAT1.
- //
- // D3DDECLUSAGE_POSITIONT
- // Vertex data contains transformed position data ranging from (0,0) to
- // (viewport width, viewport height). Use D3DDECLUSAGE_POSITIONT with a usage
- // index of 0 to specify transformed position. When a declaration containing
- // this is set, the pipeline does not perform vertex processing.
- //
- // D3DDECLUSAGE_COLOR
- // Vertex data contains diffuse or specular color. Use D3DDECLUSAGE_COLOR with
- // a usage index of 0 to specify the diffuse color in the fixed function
- // vertex shader and pixel shaders prior to ps_3_0. Use D3DDECLUSAGE_COLOR
- // with a usage index of 1 to specify the specular color in the fixed function
- // vertex shader and pixel shaders prior to ps_3_0.
- //
- // D3DDECLUSAGE_FOG
- // Vertex data contains fog data. Use D3DDECLUSAGE_FOG with a usage index of 0
- // to specify a fog blend value used after pixel shading finishes. This
- // applies to pixel shaders prior to version ps_3_0.
- //
- // D3DDECLUSAGE_DEPTH
- // Vertex data contains depth data.
- //
- // D3DDECLUSAGE_SAMPLE
- // Vertex data contains sampler data. Use D3DDECLUSAGE_SAMPLE with a usage
- // index of 0 to specify the displacement value to look up. It can be used
- // only with D3DDECLUSAGE_LOOKUPPRESAMPLED or D3DDECLUSAGE_LOOKUP.
-
- //note the form of the list terminator..
-
- // #define D3DDECL_END() {0xFF,0,D3DDECLTYPE_UNUSED,0,0,0}
- // typedef struct _D3DVERTEXELEMENT9
- // {
- // WORD Stream; // Stream index
- // WORD Offset; // Offset in the stream in bytes
- // BYTE Type; // Data type
- // BYTE Method; // Processing method
- // BYTE Usage; // Semantics
- // BYTE UsageIndex; // Semantic index
- // } D3DVERTEXELEMENT9, *LPD3DVERTEXELEMENT9;
-
-#define MAX_D3DVERTEXELEMENTS 16
-
-struct TOGL_CLASS IDirect3DVertexDeclaration9 : public IUnknown
-{
-//public:
- uint m_elemCount;
- D3DVERTEXELEMENT9_GL m_elements[ MAX_D3DVERTEXELEMENTS ];
-
- virtual ~IDirect3DVertexDeclaration9();
-};
-
-struct TOGL_CLASS IDirect3DQuery9 : public IDirect3DResource9 //was IUnknown
-{
-//public:
- D3DQUERYTYPE m_type; // D3DQUERYTYPE_OCCLUSION or D3DQUERYTYPE_EVENT
- GLMContext *m_ctx;
- CGLMQuery *m_query;
-
- virtual ~IDirect3DQuery9();
-
- HRESULT Issue(DWORD dwIssueFlags);
- HRESULT GetData(void* pData,DWORD dwSize,DWORD dwGetDataFlags);
-};
-
-struct TOGL_CLASS IDirect3DVertexBuffer9 : public IDirect3DResource9 //was IUnknown
-{
-//public:
- GLMContext *m_ctx;
- CGLMBuffer *m_vtxBuffer;
- D3DVERTEXBUFFER_DESC m_vtxDesc; // to satisfy GetDesc
-
- virtual ~IDirect3DVertexBuffer9();
- HRESULT Lock(UINT OffsetToLock,UINT SizeToLock,void** ppbData,DWORD Flags);
- HRESULT Unlock();
- HRESULT UnlockActualSize( uint nActualSize, const void *pActualData = NULL );
-
-};
-
-struct TOGL_CLASS IDirect3DIndexBuffer9 : public IDirect3DResource9 //was IUnknown
-{
-//public:
- GLMContext *m_ctx;
- CGLMBuffer *m_idxBuffer;
- D3DINDEXBUFFER_DESC m_idxDesc; // to satisfy GetDesc
-
- virtual ~IDirect3DIndexBuffer9();
-
- HRESULT Lock(UINT OffsetToLock,UINT SizeToLock,void** ppbData,DWORD Flags);
- HRESULT Unlock();
- HRESULT UnlockActualSize( uint nActualSize, const void *pActualData = NULL );
- HRESULT GetDesc(D3DINDEXBUFFER_DESC *pDesc);
-};
-
-struct TOGL_CLASS IDirect3DPixelShader9 : public IDirect3DResource9 //was IUnknown
-{
-//public:
- CGLMProgram *m_pixProgram;
- uint m_pixHighWater; // count of active constant slots referenced by shader.
- uint m_pixSamplerMask; // (1<<n) mask of samplers referemnced by this pixel shader
- // this can help FlushSamplers avoid SRGB flipping on textures not being referenced...
-
- virtual ~IDirect3DPixelShader9();
-};
-
-struct TOGL_CLASS IDirect3DVertexShader9 : public IDirect3DResource9 //was IUnknown
-{
-//public:
- CGLMProgram *m_vtxProgram;
- uint m_vtxHighWater; // count of active constant slots referenced by shader.
- unsigned char m_vtxAttribMap[16]; // high nibble is usage, low nibble is usageindex, array position is attrib number
-
- virtual ~IDirect3DVertexShader9();
-
-};
-
-struct TOGL_CLASS ID3DXMatrixStack : public IUnknown
-{
-//public:
- CUtlVector<D3DMATRIX> m_stack;
- int m_stackTop; // top of stack is at the highest index, this is that index. push increases, pop decreases.
-
- HRESULT Create( void );
-
- D3DXMATRIX* GetTop();
- void Push();
- void Pop();
- void LoadIdentity();
- void LoadMatrix( const D3DXMATRIX *pMat );
- void MultMatrix( const D3DXMATRIX *pMat );
- void MultMatrixLocal( const D3DXMATRIX *pMat );
- HRESULT ScaleLocal(FLOAT x, FLOAT y, FLOAT z);
-
- // Left multiply the current matrix with the computed rotation
- // matrix, counterclockwise about the given axis with the given angle.
- // (rotation is about the local origin of the object)
- HRESULT RotateAxisLocal(CONST D3DXVECTOR3* pV, FLOAT Angle);
-
- // Left multiply the current matrix with the computed translation
- // matrix. (transformation is about the local origin of the object)
- HRESULT TranslateLocal(FLOAT x, FLOAT y, FLOAT z);
-};
-typedef ID3DXMatrixStack* LPD3DXMATRIXSTACK;
-
-struct TOGL_CLASS IDirect3DDevice9 : public IUnknown
-{
-public:
- // members
-
- IDirect3DDevice9Params m_params; // mirror of the creation inputs
-
- // D3D flavor stuff
- IDirect3DSurface9 *m_rtSurfaces[16]; // current color RT surfaces. [0] is initially == m_defaultColorSurface
- IDirect3DSurface9 *m_dsSurface; // current DS RT surface. can be changed!
-
- IDirect3DSurface9 *m_defaultColorSurface; // default color surface.
- IDirect3DSurface9 *m_defaultDepthStencilSurface; // queried by GetDepthStencilSurface.
-
- IDirect3DVertexDeclaration9 *m_vertDecl; // Set by SetVertexDeclaration...
- D3DStreamDesc m_streams[ D3D_MAX_STREAMS ]; // Set by SetStreamSource..
- D3DIndexDesc m_indices; // Set by SetIndices..
-
- IDirect3DVertexShader9 *m_vertexShader; // Set by SetVertexShader...
- IDirect3DPixelShader9 *m_pixelShader; // Set by SetPixelShader...
-
- IDirect3DBaseTexture9 *m_textures[16]; // set by SetTexture... NULL if stage inactive
- D3DSamplerDesc m_samplers[16]; // set by SetSamplerState..
- // GLM flavor stuff
- GLMContext *m_ctx;
- CGLMFBO *m_drawableFBO; // this FBO should have all the attachments set to match m_rtSurfaces and m_dsSurface.
-
- // GL state
- struct
- {
- // render state buckets
- GLAlphaTestEnable_t m_AlphaTestEnable;
- GLAlphaTestFunc_t m_AlphaTestFunc;
-
- GLAlphaToCoverageEnable_t m_AlphaToCoverageEnable;
-
- GLDepthTestEnable_t m_DepthTestEnable;
- GLDepthMask_t m_DepthMask;
- GLDepthFunc_t m_DepthFunc;
-
- GLClipPlaneEnable_t m_ClipPlaneEnable[kGLMUserClipPlanes];
- GLClipPlaneEquation_t m_ClipPlaneEquation[kGLMUserClipPlanes];
-
- GLColorMaskSingle_t m_ColorMaskSingle;
- GLColorMaskMultiple_t m_ColorMaskMultiple;
-
- GLCullFaceEnable_t m_CullFaceEnable;
- GLCullFrontFace_t m_CullFrontFace;
- GLPolygonMode_t m_PolygonMode;
- GLDepthBias_t m_DepthBias;
- GLScissorEnable_t m_ScissorEnable;
- GLScissorBox_t m_ScissorBox;
- GLViewportBox_t m_ViewportBox;
- GLViewportDepthRange_t m_ViewportDepthRange;
-
- GLBlendEnable_t m_BlendEnable;
- GLBlendFactor_t m_BlendFactor;
- GLBlendEquation_t m_BlendEquation;
- GLBlendColor_t m_BlendColor;
- GLBlendEnableSRGB_t m_BlendEnableSRGB;
-
- GLStencilTestEnable_t m_StencilTestEnable;
- GLStencilFunc_t m_StencilFunc;
- GLStencilOp_t m_StencilOp;
- GLStencilWriteMask_t m_StencilWriteMask;
-
- GLClearColor_t m_ClearColor;
- GLClearDepth_t m_ClearDepth;
- GLClearStencil_t m_ClearStencil;
-
- bool m_FogEnable; // not really pushed to GL, just latched here
-
- // samplers
- GLMTexSamplingParams m_samplers[ 16 ];
-
- // bindings...hmmm...
-
- // dirty-bits
- uint m_stateDirtyMask; // covers the state blocks, indexed by 1<<n, n = EGLMStateBlockType
- uint m_samplerDirtyMask; // covers the samplers, indexed 1<<n, n = sampler index
- } gl;
-
- // methods
-
-public:
- virtual ~IDirect3DDevice9();
-
- // Create call invoked from IDirect3D9
- HRESULT Create( IDirect3DDevice9Params *params );
-
- //
- // Basics
- //
- HRESULT Reset(D3DPRESENT_PARAMETERS* pPresentationParameters);
- HRESULT SetViewport(CONST D3DVIEWPORT9* pViewport);
- HRESULT GetViewport(D3DVIEWPORT9* pViewport);
- HRESULT BeginScene();
- HRESULT Clear(DWORD Count,CONST D3DRECT* pRects,DWORD Flags,D3DCOLOR Color,float Z,DWORD Stencil);
- HRESULT EndScene();
- HRESULT Present(CONST RECT* pSourceRect,CONST RECT* pDestRect,VD3DHWND hDestWindowOverride,CONST RGNDATA* pDirtyRegion);
-
- // textures
- HRESULT CreateTexture(UINT Width,UINT Height,UINT Levels,DWORD Usage,D3DFORMAT Format,D3DPOOL Pool,IDirect3DTexture9** ppTexture,VD3DHANDLE* pSharedHandle, char *debugLabel=NULL);
- HRESULT CreateCubeTexture(UINT EdgeLength,UINT Levels,DWORD Usage,D3DFORMAT Format,D3DPOOL Pool,IDirect3DCubeTexture9** ppCubeTexture,VD3DHANDLE* pSharedHandle, char *debugLabel=NULL);
- HRESULT CreateVolumeTexture(UINT Width,UINT Height,UINT Depth,UINT Levels,DWORD Usage,D3DFORMAT Format,D3DPOOL Pool,IDirect3DVolumeTexture9** ppVolumeTexture,VD3DHANDLE* pSharedHandle, char *debugLabel=NULL);
-
- HRESULT SetTexture(DWORD Stage,IDirect3DBaseTexture9* pTexture);
- HRESULT GetTexture(DWORD Stage,IDirect3DBaseTexture9** ppTexture);
-
- // render targets, color and depthstencil, surfaces, blit
- HRESULT CreateRenderTarget(UINT Width,UINT Height,D3DFORMAT Format,D3DMULTISAMPLE_TYPE MultiSample,DWORD MultisampleQuality,BOOL Lockable,IDirect3DSurface9** ppSurface,VD3DHANDLE* pSharedHandle, char *debugLabel=NULL);
- HRESULT SetRenderTarget(DWORD RenderTargetIndex,IDirect3DSurface9* pRenderTarget);
- HRESULT GetRenderTarget(DWORD RenderTargetIndex,IDirect3DSurface9** ppRenderTarget);
-
- HRESULT CreateOffscreenPlainSurface(UINT Width,UINT Height,D3DFORMAT Format,D3DPOOL Pool,IDirect3DSurface9** ppSurface,VD3DHANDLE* pSharedHandle);
-
- HRESULT CreateDepthStencilSurface(UINT Width,UINT Height,D3DFORMAT Format,D3DMULTISAMPLE_TYPE MultiSample,DWORD MultisampleQuality,BOOL Discard,IDirect3DSurface9** ppSurface,VD3DHANDLE* pSharedHandle);
- HRESULT SetDepthStencilSurface(IDirect3DSurface9* pNewZStencil);
- HRESULT GetDepthStencilSurface(IDirect3DSurface9** ppZStencilSurface);
-
- HRESULT GetRenderTargetData(IDirect3DSurface9* pRenderTarget,IDirect3DSurface9* pDestSurface); // ? is anyone using this ?
- HRESULT GetFrontBufferData(UINT iSwapChain,IDirect3DSurface9* pDestSurface);
- HRESULT StretchRect(IDirect3DSurface9* pSourceSurface,CONST RECT* pSourceRect,IDirect3DSurface9* pDestSurface,CONST RECT* pDestRect,D3DTEXTUREFILTERTYPE Filter);
-
- // pixel shaders
- HRESULT CreatePixelShader(CONST DWORD* pFunction,IDirect3DPixelShader9** ppShader, const char *pShaderName, char *debugLabel = NULL);
- HRESULT SetPixelShader(IDirect3DPixelShader9* pShader);
- HRESULT SetPixelShaderConstantF(UINT StartRegister,CONST float* pConstantData,UINT Vector4fCount);
- HRESULT SetPixelShaderConstantB(UINT StartRegister,CONST BOOL* pConstantData,UINT BoolCount);
- HRESULT SetPixelShaderConstantI(UINT StartRegister,CONST int* pConstantData,UINT Vector4iCount);
-
- // vertex shaders
- HRESULT CreateVertexShader(CONST DWORD* pFunction,IDirect3DVertexShader9** ppShader, const char *pShaderName, char *debugLabel = NULL);
- HRESULT SetVertexShader(IDirect3DVertexShader9* pShader);
- HRESULT SetVertexShaderConstantF(UINT StartRegister,CONST float* pConstantData,UINT Vector4fCount);
- HRESULT SetVertexShaderConstantB(UINT StartRegister,CONST BOOL* pConstantData,UINT BoolCount);
- HRESULT SetVertexShaderConstantI(UINT StartRegister,CONST int* pConstantData,UINT Vector4iCount);
-
- // POSIX only - preheating for a specific vertex/pixel shader pair - trigger GLSL link inside GLM
- HRESULT LinkShaderPair( IDirect3DVertexShader9* vs, IDirect3DPixelShader9* ps );
- HRESULT QueryShaderPair( int index, GLMShaderPairInfo *infoOut );
-
- // vertex buffers
- HRESULT CreateVertexDeclaration(CONST D3DVERTEXELEMENT9* pVertexElements,IDirect3DVertexDeclaration9** ppDecl);
- HRESULT SetVertexDeclaration(IDirect3DVertexDeclaration9* pDecl);
-
- HRESULT SetFVF(DWORD FVF); // we might not be using these ?
- HRESULT GetFVF(DWORD* pFVF);
-
- HRESULT CreateVertexBuffer(UINT Length,DWORD Usage,DWORD FVF,D3DPOOL Pool,IDirect3DVertexBuffer9** ppVertexBuffer,VD3DHANDLE* pSharedHandle);
- HRESULT SetStreamSource(UINT StreamNumber,IDirect3DVertexBuffer9* pStreamData,UINT OffsetInBytes,UINT Stride);
-
- // index buffers
- HRESULT CreateIndexBuffer(UINT Length,DWORD Usage,D3DFORMAT Format,D3DPOOL Pool,IDirect3DIndexBuffer9** ppIndexBuffer,VD3DHANDLE* pSharedHandle);
- HRESULT SetIndices(IDirect3DIndexBuffer9* pIndexData);
-
- // response to retired objects (when refcount goes to zero and they self-delete..)
- void ReleasedTexture ( IDirect3DBaseTexture9 *baseTex ); // called from texture destructor - need to scrub samplers
- void ReleasedSurface ( IDirect3DSurface9 *surface ); // called from any surface destructor - need to scrub RT table if an RT
- void ReleasedPixelShader ( IDirect3DPixelShader9 *pixelShader ); // called from IDirect3DPixelShader9 destructor
- void ReleasedVertexShader ( IDirect3DVertexShader9 *vertexShader ); // called from IDirect3DVertexShader9 destructor
- void ReleasedVertexBuffer ( IDirect3DVertexBuffer9 *vertexBuffer ); // called from IDirect3DVertexBuffer9 destructor
- void ReleasedIndexBuffer ( IDirect3DIndexBuffer9 *indexBuffer ); // called from IDirect3DIndexBuffer9 destructor
- void ReleasedQuery ( IDirect3DQuery9 *query ); // called from IDirect3DQuery9 destructor
-
- // State management.
- HRESULT SetRenderStateInline(D3DRENDERSTATETYPE State,DWORD Value);
- HRESULT SetRenderStateConstInline(D3DRENDERSTATETYPE State,DWORD Value);
- HRESULT SetRenderState(D3DRENDERSTATETYPE State,DWORD Value);
- HRESULT SetSamplerState(DWORD Sampler,D3DSAMPLERSTATETYPE Type,DWORD Value);
-
-
- // Flushing changes to GL
- HRESULT FlushStates( uint mask );
- HRESULT FlushSamplers( uint mask ); // push SetRenderState and SetSamplerState changes
- HRESULT FlushIndexBindings( void ); // push index buffer (set index ptr)
- HRESULT FlushVertexBindings( uint baseVertexIndex ); // push vertex streams (set attrib ptrs)
- HRESULT FlushGLM( void );
-
- // Draw.
- HRESULT DrawPrimitive(D3DPRIMITIVETYPE PrimitiveType,UINT StartVertex,UINT PrimitiveCount);
- HRESULT DrawIndexedPrimitive(D3DPRIMITIVETYPE PrimitiveType,INT BaseVertexIndex,UINT MinVertexIndex,UINT NumVertices,UINT startIndex,UINT primCount);
- HRESULT DrawIndexedPrimitiveUP(D3DPRIMITIVETYPE PrimitiveType,UINT MinVertexIndex,UINT NumVertices,UINT PrimitiveCount,CONST void* pIndexData,D3DFORMAT IndexDataFormat,CONST void* pVertexStreamZeroData,UINT VertexStreamZeroStride);
-
- // misc
- BOOL ShowCursor(BOOL bShow);
- HRESULT ValidateDevice(DWORD* pNumPasses);
- HRESULT SetMaterial(CONST D3DMATERIAL9* pMaterial);
- HRESULT LightEnable(DWORD Index,BOOL Enable);
- HRESULT SetScissorRect(CONST RECT* pRect);
- HRESULT CreateQuery(D3DQUERYTYPE Type,IDirect3DQuery9** ppQuery);
- HRESULT GetDeviceCaps(D3DCAPS9* pCaps);
- HRESULT TestCooperativeLevel();
- HRESULT EvictManagedResources();
- HRESULT SetLight(DWORD Index,CONST D3DLIGHT9*);
- void SetGammaRamp(UINT iSwapChain,DWORD Flags,CONST D3DGAMMARAMP* pRamp);
-
- void SaveGLState();
- void RestoreGLState();
-
- // Talk to JasonM about this one. It's tricky in GL.
- HRESULT SetClipPlane(DWORD Index,CONST float* pPlane);
-
- //
- //
- // **** FIXED FUNCTION STUFF - None of this stuff needs support in GL.
- //
- //
- HRESULT SetTransform(D3DTRANSFORMSTATETYPE State,CONST D3DMATRIX* pMatrix);
- HRESULT SetTextureStageState(DWORD Stage,D3DTEXTURESTAGESTATETYPE Type,DWORD Value);
-
- void AcquireThreadOwnership( );
- void ReleaseThreadOwnership( );
- inline DWORD GetCurrentOwnerThreadId() const { return m_ctx->m_nCurOwnerThreadId; }
-
-};
-
-struct ID3DXInclude
-{
- virtual HRESULT Open(D3DXINCLUDE_TYPE IncludeType, LPCSTR pFileName, LPCVOID pParentData, LPCVOID *ppData, UINT *pBytes) = 0;
- virtual HRESULT Close(LPCVOID pData) = 0;
-};
-typedef ID3DXInclude* LPD3DXINCLUDE;
-
-
-struct TOGL_CLASS ID3DXBuffer : public IUnknown
-{
- void* GetBufferPointer();
- DWORD GetBufferSize();
-};
-
-typedef ID3DXBuffer* LPD3DXBUFFER;
-
-class TOGL_CLASS ID3DXConstantTable : public IUnknown
-{
-};
-typedef ID3DXConstantTable* LPD3DXCONSTANTTABLE;
-
-
-
-// ------------------------------------------------------------------------------------------------------------------------------ //
-// D3DX stuff.
-// ------------------------------------------------------------------------------------------------------------------------------ //
-
-TOGL_INTERFACE const char* D3DXGetPixelShaderProfile( IDirect3DDevice9 *pDevice );
-
-
-TOGL_INTERFACE D3DXMATRIX* D3DXMatrixMultiply( D3DXMATRIX *pOut, CONST D3DXMATRIX *pM1, CONST D3DXMATRIX *pM2 );
-TOGL_INTERFACE D3DXVECTOR3* D3DXVec3TransformCoord( D3DXVECTOR3 *pOut, CONST D3DXVECTOR3 *pV, CONST D3DXMATRIX *pM );
-
-TOGL_INTERFACE HRESULT D3DXCreateMatrixStack( DWORD Flags, LPD3DXMATRIXSTACK* ppStack);
-TOGL_INTERFACE void D3DXMatrixIdentity( D3DXMATRIX * );
-
-TOGL_INTERFACE D3DXINLINE D3DXVECTOR3* D3DXVec3Subtract( D3DXVECTOR3 *pOut, CONST D3DXVECTOR3 *pV1, CONST D3DXVECTOR3 *pV2 )
-{
- pOut->x = pV1->x - pV2->x;
- pOut->y = pV1->y - pV2->y;
- pOut->z = pV1->z - pV2->z;
- return pOut;
-}
-
-TOGL_INTERFACE D3DXINLINE D3DXVECTOR3* D3DXVec3Cross( D3DXVECTOR3 *pOut, CONST D3DXVECTOR3 *pV1, CONST D3DXVECTOR3 *pV2 )
-{
- D3DXVECTOR3 v;
-
- v.x = pV1->y * pV2->z - pV1->z * pV2->y;
- v.y = pV1->z * pV2->x - pV1->x * pV2->z;
- v.z = pV1->x * pV2->y - pV1->y * pV2->x;
-
- *pOut = v;
- return pOut;
-}
-
-TOGL_INTERFACE D3DXINLINE FLOAT D3DXVec3Dot( CONST D3DXVECTOR3 *pV1, CONST D3DXVECTOR3 *pV2 )
-{
- return pV1->x * pV2->x + pV1->y * pV2->y + pV1->z * pV2->z;
-}
-
-TOGL_INTERFACE D3DXMATRIX* D3DXMatrixInverse( D3DXMATRIX *pOut, FLOAT *pDeterminant, CONST D3DXMATRIX *pM );
-
-TOGL_INTERFACE D3DXMATRIX* D3DXMatrixTranspose( D3DXMATRIX *pOut, CONST D3DXMATRIX *pM );
-
-TOGL_INTERFACE D3DXPLANE* D3DXPlaneNormalize( D3DXPLANE *pOut, CONST D3DXPLANE *pP);
-
-TOGL_INTERFACE D3DXVECTOR4* D3DXVec4Transform( D3DXVECTOR4 *pOut, CONST D3DXVECTOR4 *pV, CONST D3DXMATRIX *pM );
-
-
-TOGL_INTERFACE D3DXVECTOR4* D3DXVec4Normalize( D3DXVECTOR4 *pOut, CONST D3DXVECTOR4 *pV );
-
-TOGL_INTERFACE D3DXMATRIX* D3DXMatrixTranslation( D3DXMATRIX *pOut, FLOAT x, FLOAT y, FLOAT z );
-
-// Build an ortho projection matrix. (right-handed)
-TOGL_INTERFACE D3DXMATRIX* D3DXMatrixOrthoOffCenterRH( D3DXMATRIX *pOut, FLOAT l, FLOAT r, FLOAT b, FLOAT t, FLOAT zn,FLOAT zf );
-
-TOGL_INTERFACE D3DXMATRIX* D3DXMatrixPerspectiveRH( D3DXMATRIX *pOut, FLOAT w, FLOAT h, FLOAT zn, FLOAT zf );
-
-TOGL_INTERFACE D3DXMATRIX* D3DXMatrixPerspectiveOffCenterRH( D3DXMATRIX *pOut, FLOAT l, FLOAT r, FLOAT b, FLOAT t, FLOAT zn, FLOAT zf );
-
-// Transform a plane by a matrix. The vector (a,b,c) must be normal.
-// M should be the inverse transpose of the transformation desired.
-TOGL_INTERFACE D3DXPLANE* D3DXPlaneTransform( D3DXPLANE *pOut, CONST D3DXPLANE *pP, CONST D3DXMATRIX *pM );
-
-TOGL_INTERFACE IDirect3D9 *Direct3DCreate9(UINT SDKVersion);
-
-TOGL_INTERFACE void D3DPERF_SetOptions( DWORD dwOptions );
-
-TOGL_INTERFACE HRESULT D3DXCompileShader(
- LPCSTR pSrcData,
- UINT SrcDataLen,
- CONST D3DXMACRO* pDefines,
- LPD3DXINCLUDE pInclude,
- LPCSTR pFunctionName,
- LPCSTR pProfile,
- DWORD Flags,
- LPD3DXBUFFER* ppShader,
- LPD3DXBUFFER* ppErrorMsgs,
- LPD3DXCONSTANTTABLE* ppConstantTable);
-
-
-#endif // USE_ACTUAL_DX
-
-// fake D3D usage constant for SRGB tex creation
-#define D3DUSAGE_TEXTURE_SRGB (0x80000000L)
-
-#endif // DXABSTRACT_H
+//
+//
+//
+//==================================================================================================
+
+#ifndef DXABSTRACT_H
+#define DXABSTRACT_H
+#ifdef _WIN32
+#pragma once
+#endif
+
+#include "togl/rendermechanism.h"
+
+#include "materialsystem/ishader.h"
+
+// Uncomment this on Windows if you want to compile the Windows GL version.
+// #undef USE_ACTUAL_DX
+
+#ifdef USE_ACTUAL_DX
+
+#ifndef WIN32
+#error sorry man
+#endif
+#ifdef _X360
+#include "d3d9.h"
+#include "d3dx9.h"
+#else
+#include <windows.h>
+#include "../../dx9sdk/include/d3d9.h"
+#include "../../dx9sdk/include/d3dx9.h"
+#endif
+typedef HWND VD3DHWND;
+
+#else
+
+#ifdef WIN32
+#error Gl on win32?
+#endif
+
+#include "tier0/platform.h"
+
+#ifndef DX_TO_GL_ABSTRACTION
+#define DX_TO_GL_ABSTRACTION
+#endif
+
+#include "bitmap/imageformat.h"
+#include "togl/rendermechanism.h"
+
+#ifdef OSX
+extern "C" void Debugger(void);
+#endif
+
+// turn this on to get refcount logging from IUnknown
+#define IUNKNOWN_ALLOC_SPEW 0
+#define IUNKNOWN_ALLOC_SPEW_MARK_ALL 0
+
+
+// ------------------------------------------------------------------------------------------------------------------------------ //
+// DEFINES
+// ------------------------------------------------------------------------------------------------------------------------------ //
+
+typedef void* VD3DHWND;
+typedef void* VD3DHANDLE;
+
+
+TOGL_INTERFACE void toglGetClientRect( VD3DHWND hWnd, RECT *destRect );
+
+struct TOGL_CLASS IUnknown
+{
+ int m_refcount[2];
+ bool m_mark;
+
+ IUnknown( void )
+ {
+ m_refcount[0] = 1;
+ m_refcount[1] = 0;
+ m_mark = (IUNKNOWN_ALLOC_SPEW_MARK_ALL != 0); // either all are marked, or only the ones that have SetMark(true) called on them
+
+ #if IUNKNOWN_ALLOC_SPEW
+ if (m_mark)
+ {
+ GLMPRINTF(("-A- IUnew (%08x) refc -> (%d,%d) ",this,m_refcount[0],m_refcount[1]));
+ }
+ #endif
+ };
+
+ virtual ~IUnknown( void )
+ {
+ #if IUNKNOWN_ALLOC_SPEW
+ if (m_mark)
+ {
+ GLMPRINTF(("-A- IUdel (%08x) ",this ));
+ }
+ #endif
+ };
+
+ void AddRef( int which=0, char *comment = NULL )
+ {
+ Assert( which >= 0 );
+ Assert( which < 2 );
+ m_refcount[which]++;
+
+ #if IUNKNOWN_ALLOC_SPEW
+ if (m_mark)
+ {
+ GLMPRINTF(("-A- IUAddRef (%08x,%d) refc -> (%d,%d) [%s]",this,which,m_refcount[0],m_refcount[1],comment?comment:"...")) ;
+ if (!comment)
+ {
+ GLMPRINTF(("")) ; // place to hang a breakpoint
+ }
+ }
+ #endif
+ };
+
+ ULONG __stdcall Release( int which=0, char *comment = NULL )
+ {
+ Assert( which >= 0 );
+ Assert( which < 2 );
+
+ //int oldrefcs[2] = { m_refcount[0], m_refcount[1] };
+ bool deleting = false;
+
+ m_refcount[which]--;
+ if ( (!m_refcount[0]) && (!m_refcount[1]) )
+ {
+ deleting = true;
+ }
+
+ #if IUNKNOWN_ALLOC_SPEW
+ if (m_mark)
+ {
+ GLMPRINTF(("-A- IURelease (%08x,%d) refc -> (%d,%d) [%s] %s",this,which,m_refcount[0],m_refcount[1],comment?comment:"...",deleting?"->DELETING":""));
+ if (!comment)
+ {
+ GLMPRINTF(("")) ; // place to hang a breakpoint
+ }
+ }
+ #endif
+
+ if (deleting)
+ {
+ if (m_mark)
+ {
+ GLMPRINTF(("")) ; // place to hang a breakpoint
+ }
+ delete this;
+ return 0;
+ }
+ else
+ {
+ return m_refcount[0];
+ }
+ };
+
+ void SetMark( bool markValue, char *comment=NULL )
+ {
+ #if IUNKNOWN_ALLOC_SPEW
+ if (!m_mark && markValue) // leading edge detect
+ {
+ // print the same thing that the constructor would have printed if it had been marked from the beginning
+ // i.e. it's anticipated that callers asking for marking will do so right at create time
+ GLMPRINTF(("-A- IUSetMark (%08x) refc -> (%d,%d) (%s) ",this,m_refcount[0],m_refcount[1],comment?comment:"..."));
+ }
+ #endif
+
+ m_mark = markValue;
+ }
+};
+
+
+// ------------------------------------------------------------------------------------------------------------------------------ //
+// INTERFACES
+// ------------------------------------------------------------------------------------------------------------------------------ //
+
+struct TOGL_CLASS IDirect3DResource9 : public IUnknown
+{
+ IDirect3DDevice9 *m_device; // parent device
+ D3DRESOURCETYPE m_restype;
+
+ DWORD SetPriority(DWORD PriorityNew);
+};
+
+struct TOGL_CLASS IDirect3DBaseTexture9 : public IDirect3DResource9 // "A Texture.."
+{
+ D3DSURFACE_DESC m_descZero; // desc of top level.
+ CGLMTex *m_tex; // a CGLMTex can represent all forms of tex
+ int m_srgbFlipCount;
+
+ virtual ~IDirect3DBaseTexture9();
+ D3DRESOURCETYPE GetType();
+ DWORD GetLevelCount();
+ HRESULT GetLevelDesc(UINT Level,D3DSURFACE_DESC *pDesc);
+};
+
+struct TOGL_CLASS IDirect3DTexture9 : public IDirect3DBaseTexture9 // "Texture 2D"
+{
+ IDirect3DSurface9 *m_surfZero; // surf of top level.
+
+ virtual ~IDirect3DTexture9();
+
+ HRESULT LockRect(UINT Level,D3DLOCKED_RECT* pLockedRect,CONST RECT* pRect,DWORD Flags);
+ HRESULT UnlockRect(UINT Level);
+ HRESULT GetSurfaceLevel(UINT Level,IDirect3DSurface9** ppSurfaceLevel);
+};
+
+struct TOGL_CLASS IDirect3DCubeTexture9 : public IDirect3DBaseTexture9 // "Texture Cube Map"
+{
+ IDirect3DSurface9 *m_surfZero[6]; // surfs of top level.
+
+ virtual ~IDirect3DCubeTexture9();
+
+ HRESULT GetCubeMapSurface(D3DCUBEMAP_FACES FaceType,UINT Level,IDirect3DSurface9** ppCubeMapSurface);
+ HRESULT GetLevelDesc(UINT Level,D3DSURFACE_DESC *pDesc);
+};
+
+struct TOGL_CLASS IDirect3DVolumeTexture9 : public IDirect3DBaseTexture9 // "Texture 3D"
+{
+ IDirect3DSurface9 *m_surfZero; // surf of top level.
+ D3DVOLUME_DESC m_volDescZero; // volume desc top level
+
+ virtual ~IDirect3DVolumeTexture9();
+
+ HRESULT LockBox(UINT Level,D3DLOCKED_BOX* pLockedVolume,CONST D3DBOX* pBox,DWORD Flags);
+ HRESULT UnlockBox(UINT Level);
+ HRESULT GetLevelDesc( UINT level, D3DVOLUME_DESC *pDesc );
+};
+
+
+// for the moment, a "D3D surface" is modeled as a GLM tex, a face, and a mip.
+// no Create method, these are filled in by the various create surface methods.
+
+struct TOGL_CLASS IDirect3DSurface9 : public IDirect3DResource9
+{
+ virtual ~IDirect3DSurface9();
+
+ HRESULT LockRect(D3DLOCKED_RECT* pLockedRect,CONST RECT* pRect,DWORD Flags);
+ HRESULT UnlockRect();
+ HRESULT GetDesc(D3DSURFACE_DESC *pDesc);
+
+ D3DSURFACE_DESC m_desc;
+ CGLMTex *m_tex;
+ int m_face;
+ int m_mip;
+};
+
+
+
+struct TOGL_CLASS IDirect3D9 : public IUnknown
+{
+public:
+ virtual ~IDirect3D9();
+
+ UINT GetAdapterCount(); //cheese: returns 1
+
+ HRESULT GetDeviceCaps (UINT Adapter,D3DDEVTYPE DeviceType,D3DCAPS9* pCaps);
+ HRESULT GetAdapterIdentifier (UINT Adapter,DWORD Flags,D3DADAPTER_IDENTIFIER9* pIdentifier);
+ HRESULT CheckDeviceFormat (UINT Adapter,D3DDEVTYPE DeviceType,D3DFORMAT AdapterFormat,DWORD Usage,D3DRESOURCETYPE RType,D3DFORMAT CheckFormat);
+ UINT GetAdapterModeCount (UINT Adapter,D3DFORMAT Format);
+ HRESULT EnumAdapterModes (UINT Adapter,D3DFORMAT Format,UINT Mode,D3DDISPLAYMODE* pMode);
+ HRESULT CheckDeviceType (UINT Adapter,D3DDEVTYPE DevType,D3DFORMAT AdapterFormat,D3DFORMAT BackBufferFormat,BOOL bWindowed);
+ HRESULT GetAdapterDisplayMode (UINT Adapter,D3DDISPLAYMODE* pMode);
+ HRESULT CheckDepthStencilMatch (UINT Adapter,D3DDEVTYPE DeviceType,D3DFORMAT AdapterFormat,D3DFORMAT RenderTargetFormat,D3DFORMAT DepthStencilFormat);
+ HRESULT CheckDeviceMultiSampleType (UINT Adapter,D3DDEVTYPE DeviceType,D3DFORMAT SurfaceFormat,BOOL Windowed,D3DMULTISAMPLE_TYPE MultiSampleType,DWORD* pQualityLevels);
+
+ HRESULT CreateDevice (UINT Adapter,D3DDEVTYPE DeviceType,VD3DHWND hFocusWindow,DWORD BehaviorFlags,D3DPRESENT_PARAMETERS* pPresentationParameters,IDirect3DDevice9** ppReturnedDeviceInterface);
+};
+
+struct TOGL_CLASS IDirect3DSwapChain9 : public IUnknown
+{
+};
+
+
+
+ // typedef enum D3DDECLUSAGE
+ // {
+ // D3DDECLUSAGE_POSITION = 0,
+ // D3DDECLUSAGE_BLENDWEIGHT = 1,
+ // D3DDECLUSAGE_BLENDINDICES = 2,
+ // D3DDECLUSAGE_NORMAL = 3,
+ // D3DDECLUSAGE_PSIZE = 4,
+ // D3DDECLUSAGE_TEXCOORD = 5,
+ // D3DDECLUSAGE_TANGENT = 6,
+ // D3DDECLUSAGE_BINORMAL = 7,
+ // D3DDECLUSAGE_TESSFACTOR = 8,
+ // D3DDECLUSAGE_POSITIONT = 9,
+ // D3DDECLUSAGE_COLOR = 10,
+ // D3DDECLUSAGE_FOG = 11,
+ // D3DDECLUSAGE_DEPTH = 12,
+ // D3DDECLUSAGE_SAMPLE = 13,
+ // } D3DDECLUSAGE, *LPD3DDECLUSAGE;
+ // Constants
+ //
+ // D3DDECLUSAGE_POSITION
+ // Position data ranging from (-1,-1) to (1,1). Use D3DDECLUSAGE_POSITION with
+ // a usage index of 0 to specify untransformed position for fixed function
+ // vertex processing and the n-patch tessellator. Use D3DDECLUSAGE_POSITION
+ // with a usage index of 1 to specify untransformed position in the fixed
+ // function vertex shader for vertex tweening.
+ //
+ // D3DDECLUSAGE_BLENDWEIGHT
+ // Blending weight data. Use D3DDECLUSAGE_BLENDWEIGHT with a usage index of 0
+ // to specify the blend weights used in indexed and nonindexed vertex
+ // blending.
+ //
+ // D3DDECLUSAGE_BLENDINDICES
+ // Blending indices data. Use D3DDECLUSAGE_BLENDINDICES with a usage index of
+ // 0 to specify matrix indices for indexed paletted skinning.
+ //
+ // D3DDECLUSAGE_NORMAL
+ // Vertex normal data. Use D3DDECLUSAGE_NORMAL with a usage index of 0 to
+ // specify vertex normals for fixed function vertex processing and the n-patch
+ // tessellator. Use D3DDECLUSAGE_NORMAL with a usage index of 1 to specify
+ // vertex normals for fixed function vertex processing for vertex tweening.
+ //
+ // D3DDECLUSAGE_PSIZE
+ // Point size data. Use D3DDECLUSAGE_PSIZE with a usage index of 0 to specify
+ // the point-size attribute used by the setup engine of the rasterizer to
+ // expand a point into a quad for the point-sprite functionality.
+ //
+ // D3DDECLUSAGE_TEXCOORD
+ // Texture coordinate data. Use D3DDECLUSAGE_TEXCOORD, n to specify texture
+ // coordinates in fixed function vertex processing and in pixel shaders prior
+ // to ps_3_0. These can be used to pass user defined data.
+ //
+ // D3DDECLUSAGE_TANGENT
+ // Vertex tangent data.
+ //
+ // D3DDECLUSAGE_BINORMAL
+ // Vertex binormal data.
+ //
+ // D3DDECLUSAGE_TESSFACTOR
+ // Single positive floating point value. Use D3DDECLUSAGE_TESSFACTOR with a
+ // usage index of 0 to specify a tessellation factor used in the tessellation
+ // unit to control the rate of tessellation. For more information about the
+ // data type, see D3DDECLTYPE_FLOAT1.
+ //
+ // D3DDECLUSAGE_POSITIONT
+ // Vertex data contains transformed position data ranging from (0,0) to
+ // (viewport width, viewport height). Use D3DDECLUSAGE_POSITIONT with a usage
+ // index of 0 to specify transformed position. When a declaration containing
+ // this is set, the pipeline does not perform vertex processing.
+ //
+ // D3DDECLUSAGE_COLOR
+ // Vertex data contains diffuse or specular color. Use D3DDECLUSAGE_COLOR with
+ // a usage index of 0 to specify the diffuse color in the fixed function
+ // vertex shader and pixel shaders prior to ps_3_0. Use D3DDECLUSAGE_COLOR
+ // with a usage index of 1 to specify the specular color in the fixed function
+ // vertex shader and pixel shaders prior to ps_3_0.
+ //
+ // D3DDECLUSAGE_FOG
+ // Vertex data contains fog data. Use D3DDECLUSAGE_FOG with a usage index of 0
+ // to specify a fog blend value used after pixel shading finishes. This
+ // applies to pixel shaders prior to version ps_3_0.
+ //
+ // D3DDECLUSAGE_DEPTH
+ // Vertex data contains depth data.
+ //
+ // D3DDECLUSAGE_SAMPLE
+ // Vertex data contains sampler data. Use D3DDECLUSAGE_SAMPLE with a usage
+ // index of 0 to specify the displacement value to look up. It can be used
+ // only with D3DDECLUSAGE_LOOKUPPRESAMPLED or D3DDECLUSAGE_LOOKUP.
+
+ //note the form of the list terminator..
+
+ // #define D3DDECL_END() {0xFF,0,D3DDECLTYPE_UNUSED,0,0,0}
+ // typedef struct _D3DVERTEXELEMENT9
+ // {
+ // WORD Stream; // Stream index
+ // WORD Offset; // Offset in the stream in bytes
+ // BYTE Type; // Data type
+ // BYTE Method; // Processing method
+ // BYTE Usage; // Semantics
+ // BYTE UsageIndex; // Semantic index
+ // } D3DVERTEXELEMENT9, *LPD3DVERTEXELEMENT9;
+
+#define MAX_D3DVERTEXELEMENTS 16
+
+struct TOGL_CLASS IDirect3DVertexDeclaration9 : public IUnknown
+{
+//public:
+ uint m_elemCount;
+ D3DVERTEXELEMENT9_GL m_elements[ MAX_D3DVERTEXELEMENTS ];
+
+ virtual ~IDirect3DVertexDeclaration9();
+};
+
+struct TOGL_CLASS IDirect3DQuery9 : public IDirect3DResource9 //was IUnknown
+{
+//public:
+ D3DQUERYTYPE m_type; // D3DQUERYTYPE_OCCLUSION or D3DQUERYTYPE_EVENT
+ GLMContext *m_ctx;
+ CGLMQuery *m_query;
+
+ virtual ~IDirect3DQuery9();
+
+ HRESULT Issue(DWORD dwIssueFlags);
+ HRESULT GetData(void* pData,DWORD dwSize,DWORD dwGetDataFlags);
+};
+
+struct TOGL_CLASS IDirect3DVertexBuffer9 : public IDirect3DResource9 //was IUnknown
+{
+//public:
+ GLMContext *m_ctx;
+ CGLMBuffer *m_vtxBuffer;
+ D3DVERTEXBUFFER_DESC m_vtxDesc; // to satisfy GetDesc
+
+ virtual ~IDirect3DVertexBuffer9();
+ HRESULT Lock(UINT OffsetToLock,UINT SizeToLock,void** ppbData,DWORD Flags);
+ HRESULT Unlock();
+ HRESULT UnlockActualSize( uint nActualSize, const void *pActualData = NULL );
+
+};
+
+struct TOGL_CLASS IDirect3DIndexBuffer9 : public IDirect3DResource9 //was IUnknown
+{
+//public:
+ GLMContext *m_ctx;
+ CGLMBuffer *m_idxBuffer;
+ D3DINDEXBUFFER_DESC m_idxDesc; // to satisfy GetDesc
+
+ virtual ~IDirect3DIndexBuffer9();
+
+ HRESULT Lock(UINT OffsetToLock,UINT SizeToLock,void** ppbData,DWORD Flags);
+ HRESULT Unlock();
+ HRESULT UnlockActualSize( uint nActualSize, const void *pActualData = NULL );
+ HRESULT GetDesc(D3DINDEXBUFFER_DESC *pDesc);
+};
+
+struct TOGL_CLASS IDirect3DPixelShader9 : public IDirect3DResource9 //was IUnknown
+{
+//public:
+ CGLMProgram *m_pixProgram;
+ uint m_pixHighWater; // count of active constant slots referenced by shader.
+ uint m_pixSamplerMask; // (1<<n) mask of samplers referemnced by this pixel shader
+ // this can help FlushSamplers avoid SRGB flipping on textures not being referenced...
+
+ virtual ~IDirect3DPixelShader9();
+};
+
+struct TOGL_CLASS IDirect3DVertexShader9 : public IDirect3DResource9 //was IUnknown
+{
+//public:
+ CGLMProgram *m_vtxProgram;
+ uint m_vtxHighWater; // count of active constant slots referenced by shader.
+ unsigned char m_vtxAttribMap[16]; // high nibble is usage, low nibble is usageindex, array position is attrib number
+
+ virtual ~IDirect3DVertexShader9();
+
+};
+
+struct TOGL_CLASS ID3DXMatrixStack : public IUnknown
+{
+//public:
+ CUtlVector<D3DMATRIX> m_stack;
+ int m_stackTop; // top of stack is at the highest index, this is that index. push increases, pop decreases.
+
+ HRESULT Create( void );
+
+ D3DXMATRIX* GetTop();
+ void Push();
+ void Pop();
+ void LoadIdentity();
+ void LoadMatrix( const D3DXMATRIX *pMat );
+ void MultMatrix( const D3DXMATRIX *pMat );
+ void MultMatrixLocal( const D3DXMATRIX *pMat );
+ HRESULT ScaleLocal(FLOAT x, FLOAT y, FLOAT z);
+
+ // Left multiply the current matrix with the computed rotation
+ // matrix, counterclockwise about the given axis with the given angle.
+ // (rotation is about the local origin of the object)
+ HRESULT RotateAxisLocal(CONST D3DXVECTOR3* pV, FLOAT Angle);
+
+ // Left multiply the current matrix with the computed translation
+ // matrix. (transformation is about the local origin of the object)
+ HRESULT TranslateLocal(FLOAT x, FLOAT y, FLOAT z);
+};
+typedef ID3DXMatrixStack* LPD3DXMATRIXSTACK;
+
+struct TOGL_CLASS IDirect3DDevice9 : public IUnknown
+{
+public:
+ // members
+
+ IDirect3DDevice9Params m_params; // mirror of the creation inputs
+
+ // D3D flavor stuff
+ IDirect3DSurface9 *m_rtSurfaces[16]; // current color RT surfaces. [0] is initially == m_defaultColorSurface
+ IDirect3DSurface9 *m_dsSurface; // current DS RT surface. can be changed!
+
+ IDirect3DSurface9 *m_defaultColorSurface; // default color surface.
+ IDirect3DSurface9 *m_defaultDepthStencilSurface; // queried by GetDepthStencilSurface.
+
+ IDirect3DVertexDeclaration9 *m_vertDecl; // Set by SetVertexDeclaration...
+ D3DStreamDesc m_streams[ D3D_MAX_STREAMS ]; // Set by SetStreamSource..
+ D3DIndexDesc m_indices; // Set by SetIndices..
+
+ IDirect3DVertexShader9 *m_vertexShader; // Set by SetVertexShader...
+ IDirect3DPixelShader9 *m_pixelShader; // Set by SetPixelShader...
+
+ IDirect3DBaseTexture9 *m_textures[16]; // set by SetTexture... NULL if stage inactive
+ D3DSamplerDesc m_samplers[16]; // set by SetSamplerState..
+ // GLM flavor stuff
+ GLMContext *m_ctx;
+ CGLMFBO *m_drawableFBO; // this FBO should have all the attachments set to match m_rtSurfaces and m_dsSurface.
+
+ // GL state
+ struct
+ {
+ // render state buckets
+ GLAlphaTestEnable_t m_AlphaTestEnable;
+ GLAlphaTestFunc_t m_AlphaTestFunc;
+
+ GLAlphaToCoverageEnable_t m_AlphaToCoverageEnable;
+
+ GLDepthTestEnable_t m_DepthTestEnable;
+ GLDepthMask_t m_DepthMask;
+ GLDepthFunc_t m_DepthFunc;
+
+ GLClipPlaneEnable_t m_ClipPlaneEnable[kGLMUserClipPlanes];
+ GLClipPlaneEquation_t m_ClipPlaneEquation[kGLMUserClipPlanes];
+
+ GLColorMaskSingle_t m_ColorMaskSingle;
+ GLColorMaskMultiple_t m_ColorMaskMultiple;
+
+ GLCullFaceEnable_t m_CullFaceEnable;
+ GLCullFrontFace_t m_CullFrontFace;
+ GLPolygonMode_t m_PolygonMode;
+ GLDepthBias_t m_DepthBias;
+ GLScissorEnable_t m_ScissorEnable;
+ GLScissorBox_t m_ScissorBox;
+ GLViewportBox_t m_ViewportBox;
+ GLViewportDepthRange_t m_ViewportDepthRange;
+
+ GLBlendEnable_t m_BlendEnable;
+ GLBlendFactor_t m_BlendFactor;
+ GLBlendEquation_t m_BlendEquation;
+ GLBlendColor_t m_BlendColor;
+ GLBlendEnableSRGB_t m_BlendEnableSRGB;
+
+ GLStencilTestEnable_t m_StencilTestEnable;
+ GLStencilFunc_t m_StencilFunc;
+ GLStencilOp_t m_StencilOp;
+ GLStencilWriteMask_t m_StencilWriteMask;
+
+ GLClearColor_t m_ClearColor;
+ GLClearDepth_t m_ClearDepth;
+ GLClearStencil_t m_ClearStencil;
+
+ bool m_FogEnable; // not really pushed to GL, just latched here
+
+ // samplers
+ GLMTexSamplingParams m_samplers[ 16 ];
+
+ // bindings...hmmm...
+
+ // dirty-bits
+ uint m_stateDirtyMask; // covers the state blocks, indexed by 1<<n, n = EGLMStateBlockType
+ uint m_samplerDirtyMask; // covers the samplers, indexed 1<<n, n = sampler index
+ } gl;
+
+ // methods
+
+public:
+ virtual ~IDirect3DDevice9();
+
+ // Create call invoked from IDirect3D9
+ HRESULT Create( IDirect3DDevice9Params *params );
+
+ //
+ // Basics
+ //
+ HRESULT Reset(D3DPRESENT_PARAMETERS* pPresentationParameters);
+ HRESULT SetViewport(CONST D3DVIEWPORT9* pViewport);
+ HRESULT GetViewport(D3DVIEWPORT9* pViewport);
+ HRESULT BeginScene();
+ HRESULT Clear(DWORD Count,CONST D3DRECT* pRects,DWORD Flags,D3DCOLOR Color,float Z,DWORD Stencil);
+ HRESULT EndScene();
+ HRESULT Present(CONST RECT* pSourceRect,CONST RECT* pDestRect,VD3DHWND hDestWindowOverride,CONST RGNDATA* pDirtyRegion);
+
+ // textures
+ HRESULT CreateTexture(UINT Width,UINT Height,UINT Levels,DWORD Usage,D3DFORMAT Format,D3DPOOL Pool,IDirect3DTexture9** ppTexture,VD3DHANDLE* pSharedHandle, char *debugLabel=NULL);
+ HRESULT CreateCubeTexture(UINT EdgeLength,UINT Levels,DWORD Usage,D3DFORMAT Format,D3DPOOL Pool,IDirect3DCubeTexture9** ppCubeTexture,VD3DHANDLE* pSharedHandle, char *debugLabel=NULL);
+ HRESULT CreateVolumeTexture(UINT Width,UINT Height,UINT Depth,UINT Levels,DWORD Usage,D3DFORMAT Format,D3DPOOL Pool,IDirect3DVolumeTexture9** ppVolumeTexture,VD3DHANDLE* pSharedHandle, char *debugLabel=NULL);
+
+ HRESULT SetTexture(DWORD Stage,IDirect3DBaseTexture9* pTexture);
+ HRESULT GetTexture(DWORD Stage,IDirect3DBaseTexture9** ppTexture);
+
+ // render targets, color and depthstencil, surfaces, blit
+ HRESULT CreateRenderTarget(UINT Width,UINT Height,D3DFORMAT Format,D3DMULTISAMPLE_TYPE MultiSample,DWORD MultisampleQuality,BOOL Lockable,IDirect3DSurface9** ppSurface,VD3DHANDLE* pSharedHandle, char *debugLabel=NULL);
+ HRESULT SetRenderTarget(DWORD RenderTargetIndex,IDirect3DSurface9* pRenderTarget);
+ HRESULT GetRenderTarget(DWORD RenderTargetIndex,IDirect3DSurface9** ppRenderTarget);
+
+ HRESULT CreateOffscreenPlainSurface(UINT Width,UINT Height,D3DFORMAT Format,D3DPOOL Pool,IDirect3DSurface9** ppSurface,VD3DHANDLE* pSharedHandle);
+
+ HRESULT CreateDepthStencilSurface(UINT Width,UINT Height,D3DFORMAT Format,D3DMULTISAMPLE_TYPE MultiSample,DWORD MultisampleQuality,BOOL Discard,IDirect3DSurface9** ppSurface,VD3DHANDLE* pSharedHandle);
+ HRESULT SetDepthStencilSurface(IDirect3DSurface9* pNewZStencil);
+ HRESULT GetDepthStencilSurface(IDirect3DSurface9** ppZStencilSurface);
+
+ HRESULT GetRenderTargetData(IDirect3DSurface9* pRenderTarget,IDirect3DSurface9* pDestSurface); // ? is anyone using this ?
+ HRESULT GetFrontBufferData(UINT iSwapChain,IDirect3DSurface9* pDestSurface);
+ HRESULT StretchRect(IDirect3DSurface9* pSourceSurface,CONST RECT* pSourceRect,IDirect3DSurface9* pDestSurface,CONST RECT* pDestRect,D3DTEXTUREFILTERTYPE Filter);
+
+ // pixel shaders
+ HRESULT CreatePixelShader(CONST DWORD* pFunction,IDirect3DPixelShader9** ppShader, const char *pShaderName, char *debugLabel = NULL);
+ HRESULT SetPixelShader(IDirect3DPixelShader9* pShader);
+ HRESULT SetPixelShaderConstantF(UINT StartRegister,CONST float* pConstantData,UINT Vector4fCount);
+ HRESULT SetPixelShaderConstantB(UINT StartRegister,CONST BOOL* pConstantData,UINT BoolCount);
+ HRESULT SetPixelShaderConstantI(UINT StartRegister,CONST int* pConstantData,UINT Vector4iCount);
+
+ // vertex shaders
+ HRESULT CreateVertexShader(CONST DWORD* pFunction,IDirect3DVertexShader9** ppShader, const char *pShaderName, char *debugLabel = NULL);
+ HRESULT SetVertexShader(IDirect3DVertexShader9* pShader);
+ HRESULT SetVertexShaderConstantF(UINT StartRegister,CONST float* pConstantData,UINT Vector4fCount);
+ HRESULT SetVertexShaderConstantB(UINT StartRegister,CONST BOOL* pConstantData,UINT BoolCount);
+ HRESULT SetVertexShaderConstantI(UINT StartRegister,CONST int* pConstantData,UINT Vector4iCount);
+
+ // POSIX only - preheating for a specific vertex/pixel shader pair - trigger GLSL link inside GLM
+ HRESULT LinkShaderPair( IDirect3DVertexShader9* vs, IDirect3DPixelShader9* ps );
+ HRESULT QueryShaderPair( int index, GLMShaderPairInfo *infoOut );
+
+ // vertex buffers
+ HRESULT CreateVertexDeclaration(CONST D3DVERTEXELEMENT9* pVertexElements,IDirect3DVertexDeclaration9** ppDecl);
+ HRESULT SetVertexDeclaration(IDirect3DVertexDeclaration9* pDecl);
+
+ HRESULT SetFVF(DWORD FVF); // we might not be using these ?
+ HRESULT GetFVF(DWORD* pFVF);
+
+ HRESULT CreateVertexBuffer(UINT Length,DWORD Usage,DWORD FVF,D3DPOOL Pool,IDirect3DVertexBuffer9** ppVertexBuffer,VD3DHANDLE* pSharedHandle);
+ HRESULT SetStreamSource(UINT StreamNumber,IDirect3DVertexBuffer9* pStreamData,UINT OffsetInBytes,UINT Stride);
+
+ // index buffers
+ HRESULT CreateIndexBuffer(UINT Length,DWORD Usage,D3DFORMAT Format,D3DPOOL Pool,IDirect3DIndexBuffer9** ppIndexBuffer,VD3DHANDLE* pSharedHandle);
+ HRESULT SetIndices(IDirect3DIndexBuffer9* pIndexData);
+
+ // response to retired objects (when refcount goes to zero and they self-delete..)
+ void ReleasedTexture ( IDirect3DBaseTexture9 *baseTex ); // called from texture destructor - need to scrub samplers
+ void ReleasedSurface ( IDirect3DSurface9 *surface ); // called from any surface destructor - need to scrub RT table if an RT
+ void ReleasedPixelShader ( IDirect3DPixelShader9 *pixelShader ); // called from IDirect3DPixelShader9 destructor
+ void ReleasedVertexShader ( IDirect3DVertexShader9 *vertexShader ); // called from IDirect3DVertexShader9 destructor
+ void ReleasedVertexBuffer ( IDirect3DVertexBuffer9 *vertexBuffer ); // called from IDirect3DVertexBuffer9 destructor
+ void ReleasedIndexBuffer ( IDirect3DIndexBuffer9 *indexBuffer ); // called from IDirect3DIndexBuffer9 destructor
+ void ReleasedQuery ( IDirect3DQuery9 *query ); // called from IDirect3DQuery9 destructor
+
+ // State management.
+ HRESULT SetRenderStateInline(D3DRENDERSTATETYPE State,DWORD Value);
+ HRESULT SetRenderStateConstInline(D3DRENDERSTATETYPE State,DWORD Value);
+ HRESULT SetRenderState(D3DRENDERSTATETYPE State,DWORD Value);
+ HRESULT SetSamplerState(DWORD Sampler,D3DSAMPLERSTATETYPE Type,DWORD Value);
+
+
+ // Flushing changes to GL
+ HRESULT FlushStates( uint mask );
+ HRESULT FlushSamplers( uint mask ); // push SetRenderState and SetSamplerState changes
+ HRESULT FlushIndexBindings( void ); // push index buffer (set index ptr)
+ HRESULT FlushVertexBindings( uint baseVertexIndex ); // push vertex streams (set attrib ptrs)
+ HRESULT FlushGLM( void );
+
+ // Draw.
+ HRESULT DrawPrimitive(D3DPRIMITIVETYPE PrimitiveType,UINT StartVertex,UINT PrimitiveCount);
+ HRESULT DrawIndexedPrimitive(D3DPRIMITIVETYPE PrimitiveType,INT BaseVertexIndex,UINT MinVertexIndex,UINT NumVertices,UINT startIndex,UINT primCount);
+ HRESULT DrawIndexedPrimitiveUP(D3DPRIMITIVETYPE PrimitiveType,UINT MinVertexIndex,UINT NumVertices,UINT PrimitiveCount,CONST void* pIndexData,D3DFORMAT IndexDataFormat,CONST void* pVertexStreamZeroData,UINT VertexStreamZeroStride);
+
+ // misc
+ BOOL ShowCursor(BOOL bShow);
+ HRESULT ValidateDevice(DWORD* pNumPasses);
+ HRESULT SetMaterial(CONST D3DMATERIAL9* pMaterial);
+ HRESULT LightEnable(DWORD Index,BOOL Enable);
+ HRESULT SetScissorRect(CONST RECT* pRect);
+ HRESULT CreateQuery(D3DQUERYTYPE Type,IDirect3DQuery9** ppQuery);
+ HRESULT GetDeviceCaps(D3DCAPS9* pCaps);
+ HRESULT TestCooperativeLevel();
+ HRESULT EvictManagedResources();
+ HRESULT SetLight(DWORD Index,CONST D3DLIGHT9*);
+ void SetGammaRamp(UINT iSwapChain,DWORD Flags,CONST D3DGAMMARAMP* pRamp);
+
+ void SaveGLState();
+ void RestoreGLState();
+
+ // Talk to JasonM about this one. It's tricky in GL.
+ HRESULT SetClipPlane(DWORD Index,CONST float* pPlane);
+
+ //
+ //
+ // **** FIXED FUNCTION STUFF - None of this stuff needs support in GL.
+ //
+ //
+ HRESULT SetTransform(D3DTRANSFORMSTATETYPE State,CONST D3DMATRIX* pMatrix);
+ HRESULT SetTextureStageState(DWORD Stage,D3DTEXTURESTAGESTATETYPE Type,DWORD Value);
+
+ void AcquireThreadOwnership( );
+ void ReleaseThreadOwnership( );
+ inline DWORD GetCurrentOwnerThreadId() const { return m_ctx->m_nCurOwnerThreadId; }
+
+};
+
+struct ID3DXInclude
+{
+ virtual HRESULT Open(D3DXINCLUDE_TYPE IncludeType, LPCSTR pFileName, LPCVOID pParentData, LPCVOID *ppData, UINT *pBytes) = 0;
+ virtual HRESULT Close(LPCVOID pData) = 0;
+};
+typedef ID3DXInclude* LPD3DXINCLUDE;
+
+
+struct TOGL_CLASS ID3DXBuffer : public IUnknown
+{
+ void* GetBufferPointer();
+ DWORD GetBufferSize();
+};
+
+typedef ID3DXBuffer* LPD3DXBUFFER;
+
+class TOGL_CLASS ID3DXConstantTable : public IUnknown
+{
+};
+typedef ID3DXConstantTable* LPD3DXCONSTANTTABLE;
+
+
+
+// ------------------------------------------------------------------------------------------------------------------------------ //
+// D3DX stuff.
+// ------------------------------------------------------------------------------------------------------------------------------ //
+
+TOGL_INTERFACE const char* D3DXGetPixelShaderProfile( IDirect3DDevice9 *pDevice );
+
+
+TOGL_INTERFACE D3DXMATRIX* D3DXMatrixMultiply( D3DXMATRIX *pOut, CONST D3DXMATRIX *pM1, CONST D3DXMATRIX *pM2 );
+TOGL_INTERFACE D3DXVECTOR3* D3DXVec3TransformCoord( D3DXVECTOR3 *pOut, CONST D3DXVECTOR3 *pV, CONST D3DXMATRIX *pM );
+
+TOGL_INTERFACE HRESULT D3DXCreateMatrixStack( DWORD Flags, LPD3DXMATRIXSTACK* ppStack);
+TOGL_INTERFACE void D3DXMatrixIdentity( D3DXMATRIX * );
+
+TOGL_INTERFACE D3DXINLINE D3DXVECTOR3* D3DXVec3Subtract( D3DXVECTOR3 *pOut, CONST D3DXVECTOR3 *pV1, CONST D3DXVECTOR3 *pV2 )
+{
+ pOut->x = pV1->x - pV2->x;
+ pOut->y = pV1->y - pV2->y;
+ pOut->z = pV1->z - pV2->z;
+ return pOut;
+}
+
+TOGL_INTERFACE D3DXINLINE D3DXVECTOR3* D3DXVec3Cross( D3DXVECTOR3 *pOut, CONST D3DXVECTOR3 *pV1, CONST D3DXVECTOR3 *pV2 )
+{
+ D3DXVECTOR3 v;
+
+ v.x = pV1->y * pV2->z - pV1->z * pV2->y;
+ v.y = pV1->z * pV2->x - pV1->x * pV2->z;
+ v.z = pV1->x * pV2->y - pV1->y * pV2->x;
+
+ *pOut = v;
+ return pOut;
+}
+
+TOGL_INTERFACE D3DXINLINE FLOAT D3DXVec3Dot( CONST D3DXVECTOR3 *pV1, CONST D3DXVECTOR3 *pV2 )
+{
+ return pV1->x * pV2->x + pV1->y * pV2->y + pV1->z * pV2->z;
+}
+
+TOGL_INTERFACE D3DXMATRIX* D3DXMatrixInverse( D3DXMATRIX *pOut, FLOAT *pDeterminant, CONST D3DXMATRIX *pM );
+
+TOGL_INTERFACE D3DXMATRIX* D3DXMatrixTranspose( D3DXMATRIX *pOut, CONST D3DXMATRIX *pM );
+
+TOGL_INTERFACE D3DXPLANE* D3DXPlaneNormalize( D3DXPLANE *pOut, CONST D3DXPLANE *pP);
+
+TOGL_INTERFACE D3DXVECTOR4* D3DXVec4Transform( D3DXVECTOR4 *pOut, CONST D3DXVECTOR4 *pV, CONST D3DXMATRIX *pM );
+
+
+TOGL_INTERFACE D3DXVECTOR4* D3DXVec4Normalize( D3DXVECTOR4 *pOut, CONST D3DXVECTOR4 *pV );
+
+TOGL_INTERFACE D3DXMATRIX* D3DXMatrixTranslation( D3DXMATRIX *pOut, FLOAT x, FLOAT y, FLOAT z );
+
+// Build an ortho projection matrix. (right-handed)
+TOGL_INTERFACE D3DXMATRIX* D3DXMatrixOrthoOffCenterRH( D3DXMATRIX *pOut, FLOAT l, FLOAT r, FLOAT b, FLOAT t, FLOAT zn,FLOAT zf );
+
+TOGL_INTERFACE D3DXMATRIX* D3DXMatrixPerspectiveRH( D3DXMATRIX *pOut, FLOAT w, FLOAT h, FLOAT zn, FLOAT zf );
+
+TOGL_INTERFACE D3DXMATRIX* D3DXMatrixPerspectiveOffCenterRH( D3DXMATRIX *pOut, FLOAT l, FLOAT r, FLOAT b, FLOAT t, FLOAT zn, FLOAT zf );
+
+// Transform a plane by a matrix. The vector (a,b,c) must be normal.
+// M should be the inverse transpose of the transformation desired.
+TOGL_INTERFACE D3DXPLANE* D3DXPlaneTransform( D3DXPLANE *pOut, CONST D3DXPLANE *pP, CONST D3DXMATRIX *pM );
+
+TOGL_INTERFACE IDirect3D9 *Direct3DCreate9(UINT SDKVersion);
+
+TOGL_INTERFACE void D3DPERF_SetOptions( DWORD dwOptions );
+
+TOGL_INTERFACE HRESULT D3DXCompileShader(
+ LPCSTR pSrcData,
+ UINT SrcDataLen,
+ CONST D3DXMACRO* pDefines,
+ LPD3DXINCLUDE pInclude,
+ LPCSTR pFunctionName,
+ LPCSTR pProfile,
+ DWORD Flags,
+ LPD3DXBUFFER* ppShader,
+ LPD3DXBUFFER* ppErrorMsgs,
+ LPD3DXCONSTANTTABLE* ppConstantTable);
+
+
+#endif // USE_ACTUAL_DX
+
+// fake D3D usage constant for SRGB tex creation
+#define D3DUSAGE_TEXTURE_SRGB (0x80000000L)
+
+#endif // DXABSTRACT_H
diff --git a/mp/src/public/togl/osx/glfuncs.h b/mp/src/public/togl/osx/glfuncs.h
index 78184bef..b0be737c 100644
--- a/mp/src/public/togl/osx/glfuncs.h
+++ b/mp/src/public/togl/osx/glfuncs.h
@@ -1,184 +1,184 @@
//========= Copyright Valve Corporation, All rights reserved. ============//
-// !!! FIXME: Some of these aren't base OpenGL...pick out the extensions.
-// !!! FIXME: Also, look up these -1, -1 versions numbers.
-GL_FUNC(OpenGL,true,GLenum,glGetError,(void),())
-GL_FUNC_VOID(OpenGL,true,glActiveTexture,(GLenum a),(a))
-GL_FUNC_VOID(OpenGL,true,glAlphaFunc,(GLenum a,GLclampf b),(a,b))
-GL_FUNC_VOID(OpenGL,true,glAttachObjectARB,(GLhandleARB a,GLhandleARB b),(a,b))
-GL_FUNC_VOID(OpenGL,true,glBegin,(GLenum a),(a))
-GL_FUNC_VOID(OpenGL,true,glBindAttribLocationARB,(GLhandleARB a,GLuint b,const GLcharARB *c),(a,b,c))
-GL_FUNC_VOID(OpenGL,true,glBindBufferARB,(GLenum a,GLuint b),(a,b))
-GL_FUNC_VOID(OpenGL,true,glBindProgramARB,(GLenum a,GLuint b),(a,b))
-GL_FUNC_VOID(OpenGL,true,glBindTexture,(GLenum a,GLuint b),(a,b))
-GL_FUNC_VOID(OpenGL,true,glBlendColor,(GLclampf a,GLclampf b,GLclampf c,GLclampf d),(a,b,c,d))
-GL_FUNC_VOID(OpenGL,true,glBlendEquation,(GLenum a),(a))
-GL_FUNC_VOID(OpenGL,true,glBlendFunc,(GLenum a,GLenum b),(a,b))
-GL_FUNC_VOID(OpenGL,true,glBufferDataARB,(GLenum a,GLsizeiptrARB b,const GLvoid *c,GLenum d),(a,b,c,d))
-GL_FUNC_VOID(OpenGL,true,glClear,(GLbitfield a),(a))
-GL_FUNC_VOID(OpenGL,true,glClearColor,(GLclampf a,GLclampf b,GLclampf c,GLclampf d),(a,b,c,d))
-GL_FUNC_VOID(OpenGL,true,glClearDepth,(GLclampd a),(a))
-GL_FUNC_VOID(OpenGL,true,glClearStencil,(GLint a),(a))
-GL_FUNC_VOID(OpenGL,true,glClipPlane,(GLenum a,const GLdouble *b),(a,b))
-GL_FUNC_VOID(OpenGL,true,glColorMask,(GLboolean a,GLboolean b,GLboolean c,GLboolean d),(a,b,c,d))
-GL_FUNC_VOID(OpenGL,true,glCompileShaderARB,(GLhandleARB a),(a))
-GL_FUNC_VOID(OpenGL,true,glCompressedTexImage2D,(GLenum a,GLint b,GLenum c,GLsizei d,GLsizei e,GLint f,GLsizei g,const GLvoid *h),(a,b,c,d,e,f,g,h))
-GL_FUNC_VOID(OpenGL,true,glCompressedTexImage3D,(GLenum a,GLint b,GLenum c,GLsizei d,GLsizei e,GLsizei f,GLint g,GLsizei h,const GLvoid *i),(a,b,c,d,e,f,g,h,i))
-GL_FUNC(OpenGL,true,GLhandleARB,glCreateProgramObjectARB,(void),())
-GL_FUNC(OpenGL,true,GLhandleARB,glCreateShaderObjectARB,(GLenum a),(a))
-GL_FUNC_VOID(OpenGL,true,glDeleteBuffersARB,(GLsizei a,const GLuint *b),(a,b))
-GL_FUNC_VOID(OpenGL,true,glDeleteObjectARB,(GLhandleARB a),(a))
-GL_FUNC_VOID(OpenGL,true,glDeleteProgramsARB,(GLsizei a,const GLuint *b),(a,b))
-GL_FUNC_VOID(OpenGL,true,glDeleteQueriesARB,(GLsizei a,const GLuint *b),(a,b))
-GL_FUNC_VOID(OpenGL,true,glDeleteShader,(GLuint a),(a))
-GL_FUNC_VOID(OpenGL,true,glDeleteTextures,(GLsizei a,const GLuint *b),(a,b))
-GL_FUNC_VOID(OpenGL,true,glDepthFunc,(GLenum a),(a))
-GL_FUNC_VOID(OpenGL,true,glDepthMask,(GLboolean a),(a))
-GL_FUNC_VOID(OpenGL,true,glDepthRange,(GLclampd a,GLclampd b),(a,b))
-GL_FUNC_VOID(OpenGL,true,glDetachObjectARB,(GLhandleARB a,GLhandleARB b),(a,b))
-GL_FUNC_VOID(OpenGL,true,glDisable,(GLenum a),(a))
-GL_FUNC_VOID(OpenGL,true,glDisableVertexAttribArray,(GLuint a),(a))
-GL_FUNC_VOID(OpenGL,true,glDrawArrays,(GLenum a,GLint b,GLsizei c),(a,b,c))
-GL_FUNC_VOID(OpenGL,true,glDrawBuffer,(GLenum a),(a))
-GL_FUNC_VOID(OpenGL,true,glDrawRangeElements,(GLenum a,GLuint b,GLuint c,GLsizei d,GLenum e,const GLvoid *f),(a,b,c,d,e,f))
-GL_FUNC_VOID(OpenGL,true,glEnable,(GLenum a),(a))
-GL_FUNC_VOID(OpenGL,true,glEnableVertexAttribArray,(GLuint a),(a))
-GL_FUNC_VOID(OpenGL,true,glEnd,(void),())
-GL_FUNC_VOID(OpenGL,true,glFinish,(void),())
-GL_FUNC_VOID(OpenGL,true,glFlush,(void),())
-GL_FUNC_VOID(OpenGL,true,glFrontFace,(GLenum a),(a))
-GL_FUNC_VOID(OpenGL,true,glGenBuffersARB,(GLsizei a,GLuint *b),(a,b))
-GL_FUNC_VOID(OpenGL,true,glGenProgramsARB,(GLsizei a,GLuint *b),(a,b))
-GL_FUNC_VOID(OpenGL,true,glGenQueriesARB,(GLsizei a,GLuint *b),(a,b))
-GL_FUNC_VOID(OpenGL,true,glGenTextures,(GLsizei a,GLuint *b),(a,b))
-GL_FUNC_VOID(OpenGL,true,glGetBooleanv,(GLenum a,GLboolean *b),(a,b))
-GL_FUNC_VOID(OpenGL,true,glGetCompressedTexImage,(GLenum a,GLint b,GLvoid *c),(a,b,c))
-GL_FUNC_VOID(OpenGL,true,glGetDoublev,(GLenum a,GLdouble *b),(a,b))
-GL_FUNC_VOID(OpenGL,true,glGetFloatv,(GLenum a,GLfloat *b),(a,b))
-GL_FUNC_VOID(OpenGL,true,glGetInfoLogARB,(GLhandleARB a,GLsizei b,GLsizei *c,GLcharARB *d),(a,b,c,d))
-GL_FUNC_VOID(OpenGL,true,glGetIntegerv,(GLenum a,GLint *b),(a,b))
-GL_FUNC_VOID(OpenGL,true,glGetObjectParameterivARB,(GLhandleARB a,GLenum b,GLint *c),(a,b,c))
-GL_FUNC_VOID(OpenGL,true,glGetProgramivARB,(GLenum a,GLenum b,GLint *c),(a,b,c))
-GL_FUNC(OpenGL,true,const GLubyte *,glGetString,(GLenum a),(a))
-GL_FUNC_VOID(OpenGL,true,glGetTexImage,(GLenum a,GLint b,GLenum c,GLenum d,GLvoid *e),(a,b,c,d,e))
-GL_FUNC(OpenGL,true,GLint,glGetUniformLocationARB,(GLhandleARB a,const GLcharARB *b),(a,b))
-GL_FUNC(OpenGL,true,GLboolean,glIsEnabled,(GLenum a),(a))
-GL_FUNC(OpenGL,true,GLboolean,glIsTexture,(GLuint a),(a))
-GL_FUNC_VOID(OpenGL,true,glLinkProgramARB,(GLhandleARB a),(a))
-GL_FUNC(OpenGL,true,GLvoid*,glMapBufferARB,(GLenum a,GLenum b),(a,b))
-GL_FUNC_VOID(OpenGL,true,glOrtho,(GLdouble a,GLdouble b,GLdouble c,GLdouble d,GLdouble e,GLdouble f),(a,b,c,d,e,f))
-GL_FUNC_VOID(OpenGL,true,glPixelStorei,(GLenum a,GLint b),(a,b))
-GL_FUNC_VOID(OpenGL,true,glPolygonMode,(GLenum a,GLenum b),(a,b))
-GL_FUNC_VOID(OpenGL,true,glPolygonOffset,(GLfloat a,GLfloat b),(a,b))
-GL_FUNC_VOID(OpenGL,true,glPopAttrib,(void),())
-GL_FUNC_VOID(OpenGL,true,glProgramStringARB,(GLenum a,GLenum b,GLsizei c,const GLvoid *d),(a,b,c,d))
-GL_FUNC_VOID(OpenGL,true,glPushAttrib,(GLbitfield a),(a))
-GL_FUNC_VOID(OpenGL,true,glReadBuffer,(GLenum a),(a))
-GL_FUNC_VOID(OpenGL,true,glScissor,(GLint a,GLint b,GLsizei c,GLsizei d),(a,b,c,d))
-GL_FUNC_VOID(OpenGL,true,glShaderSourceARB,(GLhandleARB a,GLsizei b,const GLcharARB **c,const GLint *d),(a,b,c,d))
-GL_FUNC_VOID(OpenGL,true,glStencilFunc,(GLenum a,GLint b,GLuint c),(a,b,c))
-GL_FUNC_VOID(OpenGL,true,glStencilMask,(GLuint a),(a))
-GL_FUNC_VOID(OpenGL,true,glStencilOp,(GLenum a,GLenum b,GLenum c),(a,b,c))
-GL_FUNC_VOID(OpenGL,true,glTexCoord2f,(GLfloat a,GLfloat b),(a,b))
-GL_FUNC_VOID(OpenGL,true,glTexImage2D,(GLenum a,GLint b,GLint c,GLsizei d,GLsizei e,GLint f,GLenum g,GLenum h,const GLvoid *i),(a,b,c,d,e,f,g,h,i))
-GL_FUNC_VOID(OpenGL,true,glTexImage3D,(GLenum a,GLint b,GLint c,GLsizei d,GLsizei e,GLsizei f,GLint g,GLenum h,GLenum i,const GLvoid *j),(a,b,c,d,e,f,g,h,i,j))
-GL_FUNC_VOID(OpenGL,true,glTexParameterfv,(GLenum a,GLenum b,const GLfloat *c),(a,b,c))
-GL_FUNC_VOID(OpenGL,true,glTexParameteri,(GLenum a,GLenum b,GLint c),(a,b,c))
-GL_FUNC_VOID(OpenGL,true,glTexSubImage2D,(GLenum a,GLint b,GLint c,GLint d,GLsizei e,GLsizei f,GLenum g,GLenum h,const GLvoid *i),(a,b,c,d,e,f,g,h,i))
-GL_FUNC_VOID(OpenGL,true,glUniform1f,(GLint a,GLfloat b),(a,b))
-GL_FUNC_VOID(OpenGL,true,glUniform1i,(GLint a,GLint b),(a,b))
-GL_FUNC_VOID(OpenGL,true,glUniform1iARB,(GLint a,GLint b),(a,b))
-GL_FUNC_VOID(OpenGL,true,glUniform4fv,(GLint a,GLsizei b,const GLfloat *c),(a,b,c))
-GL_FUNC(OpenGL,true,GLboolean,glUnmapBuffer,(GLenum a),(a))
-GL_FUNC_VOID(OpenGL,true,glUseProgram,(GLuint a),(a))
-GL_FUNC_VOID(OpenGL,true,glVertex3f,(GLfloat a,GLfloat b,GLfloat c),(a,b,c))
-GL_FUNC_VOID(OpenGL,true,glVertexAttribPointer,(GLuint a,GLint b,GLenum c,GLboolean d,GLsizei e,const GLvoid *f),(a,b,c,d,e,f))
-GL_FUNC_VOID(OpenGL,true,glViewport,(GLint a,GLint b,GLsizei c,GLsizei d),(a,b,c,d))
-GL_FUNC_VOID(OpenGL,true,glEnableClientState,(GLenum a),(a))
-GL_FUNC_VOID(OpenGL,true,glDisableClientState,(GLenum a),(a))
-GL_FUNC_VOID(OpenGL,true,glClientActiveTexture,(GLenum a),(a))
-GL_FUNC_VOID(OpenGL,true,glVertexPointer,(GLint a,GLenum b,GLsizei c,const GLvoid *d),(a,b,c,d))
-GL_FUNC_VOID(OpenGL,true,glTexCoordPointer,(GLint a,GLenum b,GLsizei c,const GLvoid *d),(a,b,c,d))
-GL_FUNC_VOID(OpenGL,true,glProgramEnvParameters4fvEXT,(GLenum a,GLuint b,GLsizei c,const GLfloat *d),(a,b,c,d))
-GL_FUNC_VOID(OpenGL,true,glColor4sv,(const GLshort *a),(a))
-GL_FUNC_VOID(OpenGL,true,glStencilOpSeparate,(GLenum a,GLenum b,GLenum c,GLenum d),(a,b,c,d))
-GL_FUNC_VOID(OpenGL,true,glStencilFuncSeparate,(GLenum a,GLenum b,GLint c,GLuint d),(a,b,c,d))
-GL_FUNC_VOID(OpenGL,true,glGetTexLevelParameteriv,(GLenum a,GLint b,GLenum c,GLint *d),(a,b,c,d))
-GL_FUNC_VOID(OpenGL,true,glColor4f,(GLfloat a,GLfloat b,GLfloat c,GLfloat d),(a,b,c,d))
-GL_EXT(GL_EXT_framebuffer_object,-1,-1)
-GL_FUNC_VOID(GL_EXT_framebuffer_object,false,glBindFramebufferEXT,(GLenum a,GLuint b),(a,b))
-GL_FUNC_VOID(GL_EXT_framebuffer_object,false,glBindRenderbufferEXT,(GLenum a,GLuint b),(a,b))
-GL_FUNC(GL_EXT_framebuffer_object,false,GLenum,glCheckFramebufferStatusEXT,(GLenum a),(a))
-GL_FUNC_VOID(GL_EXT_framebuffer_object,false,glDeleteRenderbuffersEXT,(GLsizei a,const GLuint *b),(a,b))
-GL_FUNC_VOID(GL_EXT_framebuffer_object,false,glFramebufferRenderbufferEXT,(GLenum a,GLenum b,GLenum c,GLuint d),(a,b,c,d))
-GL_FUNC_VOID(GL_EXT_framebuffer_object,false,glFramebufferTexture2DEXT,(GLenum a,GLenum b,GLenum c,GLuint d,GLint e),(a,b,c,d,e))
-GL_FUNC_VOID(GL_EXT_framebuffer_object,false,glFramebufferTexture3DEXT,(GLenum a,GLenum b,GLenum c,GLuint d,GLint e,GLint f),(a,b,c,d,e,f))
-GL_FUNC_VOID(GL_EXT_framebuffer_object,false,glGenFramebuffersEXT,(GLsizei a,GLuint *b),(a,b))
-GL_FUNC_VOID(GL_EXT_framebuffer_object,false,glGenRenderbuffersEXT,(GLsizei a,GLuint *b),(a,b))
-GL_FUNC_VOID(GL_EXT_framebuffer_object,false,glDeleteFramebuffersEXT,(GLsizei a,const GLuint *b),(a,b))
-GL_EXT(GL_EXT_framebuffer_blit,-1,-1)
-GL_FUNC_VOID(GL_EXT_framebuffer_blit,false,glBlitFramebufferEXT,(GLint a,GLint b,GLint c,GLint d,GLint e,GLint f,GLint g,GLint h,GLbitfield i,GLenum j),(a,b,c,d,e,f,g,h,i,j))
-GL_EXT(GL_EXT_framebuffer_multisample,-1,-1)
-GL_FUNC_VOID(GL_EXT_framebuffer_multisample,false,glRenderbufferStorageMultisampleEXT,(GLenum a,GLsizei b,GLenum c,GLsizei d,GLsizei e),(a,b,c,d,e))
-GL_EXT(GL_APPLE_fence,-1,-1)
-GL_FUNC(GL_APPLE_fence,false,GLboolean,glTestFenceAPPLE,(GLuint a),(a))
-GL_FUNC_VOID(GL_APPLE_fence,false,glSetFenceAPPLE,(GLuint a),(a))
-GL_FUNC_VOID(GL_APPLE_fence,false,glFinishFenceAPPLE,(GLuint a),(a))
-GL_FUNC_VOID(GL_APPLE_fence,false,glDeleteFencesAPPLE,(GLsizei a,const GLuint *b),(a,b))
-GL_FUNC_VOID(GL_APPLE_fence,false,glGenFencesAPPLE,(GLsizei a,GLuint *b),(a,b))
-GL_EXT(GL_NV_fence,-1,-1)
-GL_FUNC(GL_NV_fence,false,GLboolean,glTestFenceNV,(GLuint a),(a))
-GL_FUNC_VOID(GL_NV_fence,false,glSetFenceNV,(GLuint a,GLenum b),(a,b))
-GL_FUNC_VOID(GL_NV_fence,false,glFinishFenceNV,(GLuint a),(a))
-GL_FUNC_VOID(GL_NV_fence,false,glDeleteFencesNV,(GLsizei a,const GLuint *b),(a,b))
-GL_FUNC_VOID(GL_NV_fence,false,glGenFencesNV,(GLsizei a,GLuint *b),(a,b))
-GL_EXT(GL_ARB_sync,3,2)
-#ifdef HAVE_GL_ARB_SYNC
-GL_FUNC_VOID(GL_ARB_sync,false,glGetSynciv,(GLsync a, GLenum b, GLsizei c, GLsizei *d, GLint *e),(a,b,c,d,e))
-GL_FUNC(GL_ARB_sync,false,GLenum,glClientWaitSync,(GLsync a, GLbitfield b, GLuint64 c),(a,b,c))
-GL_FUNC_VOID(GL_ARB_sync,false,glWaitSync,(GLsync a, GLbitfield b, GLuint64 c),(a,b,c))
-GL_FUNC_VOID(GL_ARB_sync,false,glDeleteSync,(GLsync a),(a))
-GL_FUNC(GL_ARB_sync,false,GLsync,glFenceSync,(GLenum a, GLbitfield b),(a,b))
-#endif
-GL_EXT(GL_EXT_draw_buffers2,-1,-1)
-GL_FUNC_VOID(GL_EXT_draw_buffers2,false,glColorMaskIndexedEXT,(GLuint a,GLboolean b,GLboolean c,GLboolean d,GLboolean e),(a,b,c,d,e))
-GL_FUNC_VOID(GL_EXT_draw_buffers2,false,glEnableIndexedEXT,(GLenum a,GLuint b),(a,b))
-GL_FUNC_VOID(GL_EXT_draw_buffers2,false,glDisableIndexedEXT,(GLenum a,GLuint b),(a,b))
-GL_FUNC_VOID(GL_EXT_draw_buffers2,false,glGetBooleanIndexedvEXT,(GLenum a,GLuint b,GLboolean *c),(a,b,c))
-GL_EXT(GL_EXT_bindable_uniform,-1,-1)
-GL_FUNC_VOID(GL_EXT_bindable_uniform,false,glUniformBufferEXT,(GLuint a,GLint b,GLuint c),(a,b,c))
-GL_EXT(GL_APPLE_flush_buffer_range,-1,-1)
-GL_FUNC_VOID(GL_APPLE_flush_buffer_range,false,glBufferParameteriAPPLE,(GLenum a,GLenum b,GLint c),(a,b,c))
-GL_FUNC_VOID(GL_APPLE_flush_buffer_range,false,glFlushMappedBufferRangeAPPLE,(GLenum a,GLintptr b,GLsizeiptr c),(a,b,c))
-GL_EXT(GL_ARB_map_buffer_range,-1,-1)
-GL_FUNC(GL_ARB_map_buffer_range,false,void*,glMapBufferRange,(GLenum a,GLintptr b,GLsizeiptr c,GLbitfield d),(a,b,c,d))
-GL_FUNC_VOID(GL_ARB_map_buffer_range,false,glFlushMappedBufferRange,(GLenum a,GLintptr b,GLsizeiptr c),(a,b,c))
-GL_EXT(GL_ARB_occlusion_query,-1,-1)
-GL_FUNC_VOID(GL_ARB_occlusion_query,false,glBeginQueryARB,(GLenum a,GLuint b),(a,b))
-GL_FUNC_VOID(GL_ARB_occlusion_query,false,glEndQueryARB,(GLenum a),(a))
-GL_FUNC_VOID(GL_ARB_occlusion_query,false,glGetQueryObjectivARB,(GLuint a,GLenum b,GLint *c),(a,b,c))
-GL_FUNC_VOID(GL_ARB_occlusion_query,false,glGetQueryObjectuivARB,(GLuint a,GLenum b,GLuint *c),(a,b,c))
-GL_EXT(GL_APPLE_texture_range,-1,-1)
-GL_FUNC_VOID(GL_APPLE_texture_range,false,glTextureRangeAPPLE,(GLenum a,GLsizei b,void *c),(a,b,c))
-GL_FUNC_VOID(GL_APPLE_texture_range,false,glGetTexParameterPointervAPPLE,(GLenum a,GLenum b,void* *c),(a,b,c))
-GL_EXT(GL_APPLE_client_storage,-1,-1)
-GL_EXT(GL_ARB_uniform_buffer,-1,-1)
-GL_EXT(GL_ARB_vertex_array_bgra,-1,-1)
-GL_EXT(GL_EXT_vertex_array_bgra,-1,-1)
-GL_EXT(GL_ARB_framebuffer_object,3,0)
-GL_FUNC_VOID(GL_ARB_framebuffer_object,false,glBindFramebuffer,(GLenum a,GLuint b),(a,b))
-GL_FUNC_VOID(GL_ARB_framebuffer_object,false,glBindRenderbuffer,(GLenum a,GLuint b),(a,b))
-GL_FUNC(GL_ARB_framebuffer_object,false,GLenum,glCheckFramebufferStatus,(GLenum a),(a))
-GL_FUNC_VOID(GL_ARB_framebuffer_object,false,glDeleteRenderbuffers,(GLsizei a,const GLuint *b),(a,b))
-GL_FUNC_VOID(GL_ARB_framebuffer_object,false,glFramebufferRenderbuffer,(GLenum a,GLenum b,GLenum c,GLuint d),(a,b,c,d))
-GL_FUNC_VOID(GL_ARB_framebuffer_object,false,glFramebufferTexture2D,(GLenum a,GLenum b,GLenum c,GLuint d,GLint e),(a,b,c,d,e))
-GL_FUNC_VOID(GL_ARB_framebuffer_object,false,glFramebufferTexture3D,(GLenum a,GLenum b,GLenum c,GLuint d,GLint e,GLint f),(a,b,c,d,e,f))
-GL_FUNC_VOID(GL_ARB_framebuffer_object,false,glGenFramebuffers,(GLsizei a,GLuint *b),(a,b))
-GL_FUNC_VOID(GL_ARB_framebuffer_object,false,glGenRenderbuffers,(GLsizei a,GLuint *b),(a,b))
-GL_FUNC_VOID(GL_ARB_framebuffer_object,false,glDeleteFramebuffers,(GLsizei a,const GLuint *b),(a,b))
-GL_FUNC_VOID(GL_ARB_framebuffer_object,false,glBlitFramebuffer,(GLint a,GLint b,GLint c,GLint d,GLint e,GLint f,GLint g,GLint h,GLbitfield i,GLenum j),(a,b,c,d,e,f,g,h,i,j))
-GL_FUNC_VOID(GL_ARB_framebuffer_object,false,glRenderbufferStorageMultisample,(GLenum a,GLsizei b,GLenum c,GLsizei d,GLsizei e),(a,b,c,d,e))
-GL_EXT(GL_GREMEDY_string_marker,-1,-1)
-GL_FUNC_VOID(GL_GREMEDY_string_marker,false,glStringMarkerGREMEDY,(GLsizei a,const void *b),(a,b))
-GL_FUNC_VOID(OpenGL,true,glPushClientAttrib,(GLbitfield a),(a))
-GL_FUNC_VOID(OpenGL,true,glPopClientAttrib,(void),())
-
+// !!! FIXME: Some of these aren't base OpenGL...pick out the extensions.
+// !!! FIXME: Also, look up these -1, -1 versions numbers.
+GL_FUNC(OpenGL,true,GLenum,glGetError,(void),())
+GL_FUNC_VOID(OpenGL,true,glActiveTexture,(GLenum a),(a))
+GL_FUNC_VOID(OpenGL,true,glAlphaFunc,(GLenum a,GLclampf b),(a,b))
+GL_FUNC_VOID(OpenGL,true,glAttachObjectARB,(GLhandleARB a,GLhandleARB b),(a,b))
+GL_FUNC_VOID(OpenGL,true,glBegin,(GLenum a),(a))
+GL_FUNC_VOID(OpenGL,true,glBindAttribLocationARB,(GLhandleARB a,GLuint b,const GLcharARB *c),(a,b,c))
+GL_FUNC_VOID(OpenGL,true,glBindBufferARB,(GLenum a,GLuint b),(a,b))
+GL_FUNC_VOID(OpenGL,true,glBindProgramARB,(GLenum a,GLuint b),(a,b))
+GL_FUNC_VOID(OpenGL,true,glBindTexture,(GLenum a,GLuint b),(a,b))
+GL_FUNC_VOID(OpenGL,true,glBlendColor,(GLclampf a,GLclampf b,GLclampf c,GLclampf d),(a,b,c,d))
+GL_FUNC_VOID(OpenGL,true,glBlendEquation,(GLenum a),(a))
+GL_FUNC_VOID(OpenGL,true,glBlendFunc,(GLenum a,GLenum b),(a,b))
+GL_FUNC_VOID(OpenGL,true,glBufferDataARB,(GLenum a,GLsizeiptrARB b,const GLvoid *c,GLenum d),(a,b,c,d))
+GL_FUNC_VOID(OpenGL,true,glClear,(GLbitfield a),(a))
+GL_FUNC_VOID(OpenGL,true,glClearColor,(GLclampf a,GLclampf b,GLclampf c,GLclampf d),(a,b,c,d))
+GL_FUNC_VOID(OpenGL,true,glClearDepth,(GLclampd a),(a))
+GL_FUNC_VOID(OpenGL,true,glClearStencil,(GLint a),(a))
+GL_FUNC_VOID(OpenGL,true,glClipPlane,(GLenum a,const GLdouble *b),(a,b))
+GL_FUNC_VOID(OpenGL,true,glColorMask,(GLboolean a,GLboolean b,GLboolean c,GLboolean d),(a,b,c,d))
+GL_FUNC_VOID(OpenGL,true,glCompileShaderARB,(GLhandleARB a),(a))
+GL_FUNC_VOID(OpenGL,true,glCompressedTexImage2D,(GLenum a,GLint b,GLenum c,GLsizei d,GLsizei e,GLint f,GLsizei g,const GLvoid *h),(a,b,c,d,e,f,g,h))
+GL_FUNC_VOID(OpenGL,true,glCompressedTexImage3D,(GLenum a,GLint b,GLenum c,GLsizei d,GLsizei e,GLsizei f,GLint g,GLsizei h,const GLvoid *i),(a,b,c,d,e,f,g,h,i))
+GL_FUNC(OpenGL,true,GLhandleARB,glCreateProgramObjectARB,(void),())
+GL_FUNC(OpenGL,true,GLhandleARB,glCreateShaderObjectARB,(GLenum a),(a))
+GL_FUNC_VOID(OpenGL,true,glDeleteBuffersARB,(GLsizei a,const GLuint *b),(a,b))
+GL_FUNC_VOID(OpenGL,true,glDeleteObjectARB,(GLhandleARB a),(a))
+GL_FUNC_VOID(OpenGL,true,glDeleteProgramsARB,(GLsizei a,const GLuint *b),(a,b))
+GL_FUNC_VOID(OpenGL,true,glDeleteQueriesARB,(GLsizei a,const GLuint *b),(a,b))
+GL_FUNC_VOID(OpenGL,true,glDeleteShader,(GLuint a),(a))
+GL_FUNC_VOID(OpenGL,true,glDeleteTextures,(GLsizei a,const GLuint *b),(a,b))
+GL_FUNC_VOID(OpenGL,true,glDepthFunc,(GLenum a),(a))
+GL_FUNC_VOID(OpenGL,true,glDepthMask,(GLboolean a),(a))
+GL_FUNC_VOID(OpenGL,true,glDepthRange,(GLclampd a,GLclampd b),(a,b))
+GL_FUNC_VOID(OpenGL,true,glDetachObjectARB,(GLhandleARB a,GLhandleARB b),(a,b))
+GL_FUNC_VOID(OpenGL,true,glDisable,(GLenum a),(a))
+GL_FUNC_VOID(OpenGL,true,glDisableVertexAttribArray,(GLuint a),(a))
+GL_FUNC_VOID(OpenGL,true,glDrawArrays,(GLenum a,GLint b,GLsizei c),(a,b,c))
+GL_FUNC_VOID(OpenGL,true,glDrawBuffer,(GLenum a),(a))
+GL_FUNC_VOID(OpenGL,true,glDrawRangeElements,(GLenum a,GLuint b,GLuint c,GLsizei d,GLenum e,const GLvoid *f),(a,b,c,d,e,f))
+GL_FUNC_VOID(OpenGL,true,glEnable,(GLenum a),(a))
+GL_FUNC_VOID(OpenGL,true,glEnableVertexAttribArray,(GLuint a),(a))
+GL_FUNC_VOID(OpenGL,true,glEnd,(void),())
+GL_FUNC_VOID(OpenGL,true,glFinish,(void),())
+GL_FUNC_VOID(OpenGL,true,glFlush,(void),())
+GL_FUNC_VOID(OpenGL,true,glFrontFace,(GLenum a),(a))
+GL_FUNC_VOID(OpenGL,true,glGenBuffersARB,(GLsizei a,GLuint *b),(a,b))
+GL_FUNC_VOID(OpenGL,true,glGenProgramsARB,(GLsizei a,GLuint *b),(a,b))
+GL_FUNC_VOID(OpenGL,true,glGenQueriesARB,(GLsizei a,GLuint *b),(a,b))
+GL_FUNC_VOID(OpenGL,true,glGenTextures,(GLsizei a,GLuint *b),(a,b))
+GL_FUNC_VOID(OpenGL,true,glGetBooleanv,(GLenum a,GLboolean *b),(a,b))
+GL_FUNC_VOID(OpenGL,true,glGetCompressedTexImage,(GLenum a,GLint b,GLvoid *c),(a,b,c))
+GL_FUNC_VOID(OpenGL,true,glGetDoublev,(GLenum a,GLdouble *b),(a,b))
+GL_FUNC_VOID(OpenGL,true,glGetFloatv,(GLenum a,GLfloat *b),(a,b))
+GL_FUNC_VOID(OpenGL,true,glGetInfoLogARB,(GLhandleARB a,GLsizei b,GLsizei *c,GLcharARB *d),(a,b,c,d))
+GL_FUNC_VOID(OpenGL,true,glGetIntegerv,(GLenum a,GLint *b),(a,b))
+GL_FUNC_VOID(OpenGL,true,glGetObjectParameterivARB,(GLhandleARB a,GLenum b,GLint *c),(a,b,c))
+GL_FUNC_VOID(OpenGL,true,glGetProgramivARB,(GLenum a,GLenum b,GLint *c),(a,b,c))
+GL_FUNC(OpenGL,true,const GLubyte *,glGetString,(GLenum a),(a))
+GL_FUNC_VOID(OpenGL,true,glGetTexImage,(GLenum a,GLint b,GLenum c,GLenum d,GLvoid *e),(a,b,c,d,e))
+GL_FUNC(OpenGL,true,GLint,glGetUniformLocationARB,(GLhandleARB a,const GLcharARB *b),(a,b))
+GL_FUNC(OpenGL,true,GLboolean,glIsEnabled,(GLenum a),(a))
+GL_FUNC(OpenGL,true,GLboolean,glIsTexture,(GLuint a),(a))
+GL_FUNC_VOID(OpenGL,true,glLinkProgramARB,(GLhandleARB a),(a))
+GL_FUNC(OpenGL,true,GLvoid*,glMapBufferARB,(GLenum a,GLenum b),(a,b))
+GL_FUNC_VOID(OpenGL,true,glOrtho,(GLdouble a,GLdouble b,GLdouble c,GLdouble d,GLdouble e,GLdouble f),(a,b,c,d,e,f))
+GL_FUNC_VOID(OpenGL,true,glPixelStorei,(GLenum a,GLint b),(a,b))
+GL_FUNC_VOID(OpenGL,true,glPolygonMode,(GLenum a,GLenum b),(a,b))
+GL_FUNC_VOID(OpenGL,true,glPolygonOffset,(GLfloat a,GLfloat b),(a,b))
+GL_FUNC_VOID(OpenGL,true,glPopAttrib,(void),())
+GL_FUNC_VOID(OpenGL,true,glProgramStringARB,(GLenum a,GLenum b,GLsizei c,const GLvoid *d),(a,b,c,d))
+GL_FUNC_VOID(OpenGL,true,glPushAttrib,(GLbitfield a),(a))
+GL_FUNC_VOID(OpenGL,true,glReadBuffer,(GLenum a),(a))
+GL_FUNC_VOID(OpenGL,true,glScissor,(GLint a,GLint b,GLsizei c,GLsizei d),(a,b,c,d))
+GL_FUNC_VOID(OpenGL,true,glShaderSourceARB,(GLhandleARB a,GLsizei b,const GLcharARB **c,const GLint *d),(a,b,c,d))
+GL_FUNC_VOID(OpenGL,true,glStencilFunc,(GLenum a,GLint b,GLuint c),(a,b,c))
+GL_FUNC_VOID(OpenGL,true,glStencilMask,(GLuint a),(a))
+GL_FUNC_VOID(OpenGL,true,glStencilOp,(GLenum a,GLenum b,GLenum c),(a,b,c))
+GL_FUNC_VOID(OpenGL,true,glTexCoord2f,(GLfloat a,GLfloat b),(a,b))
+GL_FUNC_VOID(OpenGL,true,glTexImage2D,(GLenum a,GLint b,GLint c,GLsizei d,GLsizei e,GLint f,GLenum g,GLenum h,const GLvoid *i),(a,b,c,d,e,f,g,h,i))
+GL_FUNC_VOID(OpenGL,true,glTexImage3D,(GLenum a,GLint b,GLint c,GLsizei d,GLsizei e,GLsizei f,GLint g,GLenum h,GLenum i,const GLvoid *j),(a,b,c,d,e,f,g,h,i,j))
+GL_FUNC_VOID(OpenGL,true,glTexParameterfv,(GLenum a,GLenum b,const GLfloat *c),(a,b,c))
+GL_FUNC_VOID(OpenGL,true,glTexParameteri,(GLenum a,GLenum b,GLint c),(a,b,c))
+GL_FUNC_VOID(OpenGL,true,glTexSubImage2D,(GLenum a,GLint b,GLint c,GLint d,GLsizei e,GLsizei f,GLenum g,GLenum h,const GLvoid *i),(a,b,c,d,e,f,g,h,i))
+GL_FUNC_VOID(OpenGL,true,glUniform1f,(GLint a,GLfloat b),(a,b))
+GL_FUNC_VOID(OpenGL,true,glUniform1i,(GLint a,GLint b),(a,b))
+GL_FUNC_VOID(OpenGL,true,glUniform1iARB,(GLint a,GLint b),(a,b))
+GL_FUNC_VOID(OpenGL,true,glUniform4fv,(GLint a,GLsizei b,const GLfloat *c),(a,b,c))
+GL_FUNC(OpenGL,true,GLboolean,glUnmapBuffer,(GLenum a),(a))
+GL_FUNC_VOID(OpenGL,true,glUseProgram,(GLuint a),(a))
+GL_FUNC_VOID(OpenGL,true,glVertex3f,(GLfloat a,GLfloat b,GLfloat c),(a,b,c))
+GL_FUNC_VOID(OpenGL,true,glVertexAttribPointer,(GLuint a,GLint b,GLenum c,GLboolean d,GLsizei e,const GLvoid *f),(a,b,c,d,e,f))
+GL_FUNC_VOID(OpenGL,true,glViewport,(GLint a,GLint b,GLsizei c,GLsizei d),(a,b,c,d))
+GL_FUNC_VOID(OpenGL,true,glEnableClientState,(GLenum a),(a))
+GL_FUNC_VOID(OpenGL,true,glDisableClientState,(GLenum a),(a))
+GL_FUNC_VOID(OpenGL,true,glClientActiveTexture,(GLenum a),(a))
+GL_FUNC_VOID(OpenGL,true,glVertexPointer,(GLint a,GLenum b,GLsizei c,const GLvoid *d),(a,b,c,d))
+GL_FUNC_VOID(OpenGL,true,glTexCoordPointer,(GLint a,GLenum b,GLsizei c,const GLvoid *d),(a,b,c,d))
+GL_FUNC_VOID(OpenGL,true,glProgramEnvParameters4fvEXT,(GLenum a,GLuint b,GLsizei c,const GLfloat *d),(a,b,c,d))
+GL_FUNC_VOID(OpenGL,true,glColor4sv,(const GLshort *a),(a))
+GL_FUNC_VOID(OpenGL,true,glStencilOpSeparate,(GLenum a,GLenum b,GLenum c,GLenum d),(a,b,c,d))
+GL_FUNC_VOID(OpenGL,true,glStencilFuncSeparate,(GLenum a,GLenum b,GLint c,GLuint d),(a,b,c,d))
+GL_FUNC_VOID(OpenGL,true,glGetTexLevelParameteriv,(GLenum a,GLint b,GLenum c,GLint *d),(a,b,c,d))
+GL_FUNC_VOID(OpenGL,true,glColor4f,(GLfloat a,GLfloat b,GLfloat c,GLfloat d),(a,b,c,d))
+GL_EXT(GL_EXT_framebuffer_object,-1,-1)
+GL_FUNC_VOID(GL_EXT_framebuffer_object,false,glBindFramebufferEXT,(GLenum a,GLuint b),(a,b))
+GL_FUNC_VOID(GL_EXT_framebuffer_object,false,glBindRenderbufferEXT,(GLenum a,GLuint b),(a,b))
+GL_FUNC(GL_EXT_framebuffer_object,false,GLenum,glCheckFramebufferStatusEXT,(GLenum a),(a))
+GL_FUNC_VOID(GL_EXT_framebuffer_object,false,glDeleteRenderbuffersEXT,(GLsizei a,const GLuint *b),(a,b))
+GL_FUNC_VOID(GL_EXT_framebuffer_object,false,glFramebufferRenderbufferEXT,(GLenum a,GLenum b,GLenum c,GLuint d),(a,b,c,d))
+GL_FUNC_VOID(GL_EXT_framebuffer_object,false,glFramebufferTexture2DEXT,(GLenum a,GLenum b,GLenum c,GLuint d,GLint e),(a,b,c,d,e))
+GL_FUNC_VOID(GL_EXT_framebuffer_object,false,glFramebufferTexture3DEXT,(GLenum a,GLenum b,GLenum c,GLuint d,GLint e,GLint f),(a,b,c,d,e,f))
+GL_FUNC_VOID(GL_EXT_framebuffer_object,false,glGenFramebuffersEXT,(GLsizei a,GLuint *b),(a,b))
+GL_FUNC_VOID(GL_EXT_framebuffer_object,false,glGenRenderbuffersEXT,(GLsizei a,GLuint *b),(a,b))
+GL_FUNC_VOID(GL_EXT_framebuffer_object,false,glDeleteFramebuffersEXT,(GLsizei a,const GLuint *b),(a,b))
+GL_EXT(GL_EXT_framebuffer_blit,-1,-1)
+GL_FUNC_VOID(GL_EXT_framebuffer_blit,false,glBlitFramebufferEXT,(GLint a,GLint b,GLint c,GLint d,GLint e,GLint f,GLint g,GLint h,GLbitfield i,GLenum j),(a,b,c,d,e,f,g,h,i,j))
+GL_EXT(GL_EXT_framebuffer_multisample,-1,-1)
+GL_FUNC_VOID(GL_EXT_framebuffer_multisample,false,glRenderbufferStorageMultisampleEXT,(GLenum a,GLsizei b,GLenum c,GLsizei d,GLsizei e),(a,b,c,d,e))
+GL_EXT(GL_APPLE_fence,-1,-1)
+GL_FUNC(GL_APPLE_fence,false,GLboolean,glTestFenceAPPLE,(GLuint a),(a))
+GL_FUNC_VOID(GL_APPLE_fence,false,glSetFenceAPPLE,(GLuint a),(a))
+GL_FUNC_VOID(GL_APPLE_fence,false,glFinishFenceAPPLE,(GLuint a),(a))
+GL_FUNC_VOID(GL_APPLE_fence,false,glDeleteFencesAPPLE,(GLsizei a,const GLuint *b),(a,b))
+GL_FUNC_VOID(GL_APPLE_fence,false,glGenFencesAPPLE,(GLsizei a,GLuint *b),(a,b))
+GL_EXT(GL_NV_fence,-1,-1)
+GL_FUNC(GL_NV_fence,false,GLboolean,glTestFenceNV,(GLuint a),(a))
+GL_FUNC_VOID(GL_NV_fence,false,glSetFenceNV,(GLuint a,GLenum b),(a,b))
+GL_FUNC_VOID(GL_NV_fence,false,glFinishFenceNV,(GLuint a),(a))
+GL_FUNC_VOID(GL_NV_fence,false,glDeleteFencesNV,(GLsizei a,const GLuint *b),(a,b))
+GL_FUNC_VOID(GL_NV_fence,false,glGenFencesNV,(GLsizei a,GLuint *b),(a,b))
+GL_EXT(GL_ARB_sync,3,2)
+#ifdef HAVE_GL_ARB_SYNC
+GL_FUNC_VOID(GL_ARB_sync,false,glGetSynciv,(GLsync a, GLenum b, GLsizei c, GLsizei *d, GLint *e),(a,b,c,d,e))
+GL_FUNC(GL_ARB_sync,false,GLenum,glClientWaitSync,(GLsync a, GLbitfield b, GLuint64 c),(a,b,c))
+GL_FUNC_VOID(GL_ARB_sync,false,glWaitSync,(GLsync a, GLbitfield b, GLuint64 c),(a,b,c))
+GL_FUNC_VOID(GL_ARB_sync,false,glDeleteSync,(GLsync a),(a))
+GL_FUNC(GL_ARB_sync,false,GLsync,glFenceSync,(GLenum a, GLbitfield b),(a,b))
+#endif
+GL_EXT(GL_EXT_draw_buffers2,-1,-1)
+GL_FUNC_VOID(GL_EXT_draw_buffers2,false,glColorMaskIndexedEXT,(GLuint a,GLboolean b,GLboolean c,GLboolean d,GLboolean e),(a,b,c,d,e))
+GL_FUNC_VOID(GL_EXT_draw_buffers2,false,glEnableIndexedEXT,(GLenum a,GLuint b),(a,b))
+GL_FUNC_VOID(GL_EXT_draw_buffers2,false,glDisableIndexedEXT,(GLenum a,GLuint b),(a,b))
+GL_FUNC_VOID(GL_EXT_draw_buffers2,false,glGetBooleanIndexedvEXT,(GLenum a,GLuint b,GLboolean *c),(a,b,c))
+GL_EXT(GL_EXT_bindable_uniform,-1,-1)
+GL_FUNC_VOID(GL_EXT_bindable_uniform,false,glUniformBufferEXT,(GLuint a,GLint b,GLuint c),(a,b,c))
+GL_EXT(GL_APPLE_flush_buffer_range,-1,-1)
+GL_FUNC_VOID(GL_APPLE_flush_buffer_range,false,glBufferParameteriAPPLE,(GLenum a,GLenum b,GLint c),(a,b,c))
+GL_FUNC_VOID(GL_APPLE_flush_buffer_range,false,glFlushMappedBufferRangeAPPLE,(GLenum a,GLintptr b,GLsizeiptr c),(a,b,c))
+GL_EXT(GL_ARB_map_buffer_range,-1,-1)
+GL_FUNC(GL_ARB_map_buffer_range,false,void*,glMapBufferRange,(GLenum a,GLintptr b,GLsizeiptr c,GLbitfield d),(a,b,c,d))
+GL_FUNC_VOID(GL_ARB_map_buffer_range,false,glFlushMappedBufferRange,(GLenum a,GLintptr b,GLsizeiptr c),(a,b,c))
+GL_EXT(GL_ARB_occlusion_query,-1,-1)
+GL_FUNC_VOID(GL_ARB_occlusion_query,false,glBeginQueryARB,(GLenum a,GLuint b),(a,b))
+GL_FUNC_VOID(GL_ARB_occlusion_query,false,glEndQueryARB,(GLenum a),(a))
+GL_FUNC_VOID(GL_ARB_occlusion_query,false,glGetQueryObjectivARB,(GLuint a,GLenum b,GLint *c),(a,b,c))
+GL_FUNC_VOID(GL_ARB_occlusion_query,false,glGetQueryObjectuivARB,(GLuint a,GLenum b,GLuint *c),(a,b,c))
+GL_EXT(GL_APPLE_texture_range,-1,-1)
+GL_FUNC_VOID(GL_APPLE_texture_range,false,glTextureRangeAPPLE,(GLenum a,GLsizei b,void *c),(a,b,c))
+GL_FUNC_VOID(GL_APPLE_texture_range,false,glGetTexParameterPointervAPPLE,(GLenum a,GLenum b,void* *c),(a,b,c))
+GL_EXT(GL_APPLE_client_storage,-1,-1)
+GL_EXT(GL_ARB_uniform_buffer,-1,-1)
+GL_EXT(GL_ARB_vertex_array_bgra,-1,-1)
+GL_EXT(GL_EXT_vertex_array_bgra,-1,-1)
+GL_EXT(GL_ARB_framebuffer_object,3,0)
+GL_FUNC_VOID(GL_ARB_framebuffer_object,false,glBindFramebuffer,(GLenum a,GLuint b),(a,b))
+GL_FUNC_VOID(GL_ARB_framebuffer_object,false,glBindRenderbuffer,(GLenum a,GLuint b),(a,b))
+GL_FUNC(GL_ARB_framebuffer_object,false,GLenum,glCheckFramebufferStatus,(GLenum a),(a))
+GL_FUNC_VOID(GL_ARB_framebuffer_object,false,glDeleteRenderbuffers,(GLsizei a,const GLuint *b),(a,b))
+GL_FUNC_VOID(GL_ARB_framebuffer_object,false,glFramebufferRenderbuffer,(GLenum a,GLenum b,GLenum c,GLuint d),(a,b,c,d))
+GL_FUNC_VOID(GL_ARB_framebuffer_object,false,glFramebufferTexture2D,(GLenum a,GLenum b,GLenum c,GLuint d,GLint e),(a,b,c,d,e))
+GL_FUNC_VOID(GL_ARB_framebuffer_object,false,glFramebufferTexture3D,(GLenum a,GLenum b,GLenum c,GLuint d,GLint e,GLint f),(a,b,c,d,e,f))
+GL_FUNC_VOID(GL_ARB_framebuffer_object,false,glGenFramebuffers,(GLsizei a,GLuint *b),(a,b))
+GL_FUNC_VOID(GL_ARB_framebuffer_object,false,glGenRenderbuffers,(GLsizei a,GLuint *b),(a,b))
+GL_FUNC_VOID(GL_ARB_framebuffer_object,false,glDeleteFramebuffers,(GLsizei a,const GLuint *b),(a,b))
+GL_FUNC_VOID(GL_ARB_framebuffer_object,false,glBlitFramebuffer,(GLint a,GLint b,GLint c,GLint d,GLint e,GLint f,GLint g,GLint h,GLbitfield i,GLenum j),(a,b,c,d,e,f,g,h,i,j))
+GL_FUNC_VOID(GL_ARB_framebuffer_object,false,glRenderbufferStorageMultisample,(GLenum a,GLsizei b,GLenum c,GLsizei d,GLsizei e),(a,b,c,d,e))
+GL_EXT(GL_GREMEDY_string_marker,-1,-1)
+GL_FUNC_VOID(GL_GREMEDY_string_marker,false,glStringMarkerGREMEDY,(GLsizei a,const void *b),(a,b))
+GL_FUNC_VOID(OpenGL,true,glPushClientAttrib,(GLbitfield a),(a))
+GL_FUNC_VOID(OpenGL,true,glPopClientAttrib,(void),())
+
diff --git a/mp/src/public/togl/osx/glmdisplay.h b/mp/src/public/togl/osx/glmdisplay.h
index cf3a3b90..c0d9e10b 100644
--- a/mp/src/public/togl/osx/glmdisplay.h
+++ b/mp/src/public/togl/osx/glmdisplay.h
@@ -1,177 +1,177 @@
//========= Copyright Valve Corporation, All rights reserved. ============//
-//
-// glmdisplay.h
-// display related stuff - used by both GLMgr and the CocoaMgr
-//
-//===============================================================================
-
-#ifndef GLMDISPLAY_H
-#define GLMDISPLAY_H
-
-#pragma once
-
-#ifdef OSX
-#include <OpenGL/OpenGL.h>
-#include <OpenGL/gl.h>
-#include <OpenGL/glext.h>
-#include <OpenGL/CGLTypes.h>
-#include <OpenGL/CGLRenderers.h>
-#include <OpenGL/CGLCurrent.h>
-
-typedef uint32_t CGDirectDisplayID;
-typedef uint32_t CGOpenGLDisplayMask;
-typedef double CGRefreshRate;
-
-//#include <ApplicationServices/ApplicationServices.h>
-#elif defined(LINUX)
-#include "tier0/platform.h"
-#include <GL/gl.h>
-#include <GL/glext.h>
-#else
-#error
-#endif
-
-typedef void _PseudoNSGLContext; // aka NSOpenGLContext
-typedef _PseudoNSGLContext *PseudoNSGLContextPtr;
-
-struct GLMDisplayModeInfoFields
-{
- uint m_modePixelWidth;
- uint m_modePixelHeight;
- uint m_modeRefreshHz;
- // are we even going to talk about bit depth... not yet
-};
-
-struct GLMDisplayInfoFields
-{
-#ifdef OSX
- CGDirectDisplayID m_cgDisplayID;
- CGOpenGLDisplayMask m_glDisplayMask; // result of CGDisplayIDToOpenGLDisplayMask on the cg_displayID.
-#endif
- uint m_displayPixelWidth;
- uint m_displayPixelHeight;
-};
-
-struct GLMRendererInfoFields
-{
- /*properties of interest and their desired values.
-
- kCGLRPFullScreen = 54, true
- kCGLRPAccelerated = 73, true
- kCGLRPWindow = 80, true
-
- kCGLRPRendererID = 70, informational
- kCGLRPDisplayMask = 84, informational
- kCGLRPBufferModes = 100, informational
- kCGLRPColorModes = 103, informational
- kCGLRPAccumModes = 104, informational
- kCGLRPDepthModes = 105, informational
- kCGLRPStencilModes = 106, informational
- kCGLRPMaxAuxBuffers = 107, informational
- kCGLRPMaxSampleBuffers = 108, informational
- kCGLRPMaxSamples = 109, informational
- kCGLRPSampleModes = 110, informational
- kCGLRPSampleAlpha = 111, informational
- kCGLRPVideoMemory = 120, informational
- kCGLRPTextureMemory = 121, informational
- kCGLRPRendererCount = 128 number of renderers in the CGLRendererInfoObj under examination
-
- kCGLRPOffScreen = 53, D/C
- kCGLRPRobust = 75, FALSE or D/C - aka we're asking for no-fallback
- kCGLRPBackingStore = 76, D/C
- kCGLRPMPSafe = 78, D/C
- kCGLRPMultiScreen = 81, D/C
- kCGLRPCompliant = 83, D/C
- */
-
-
- //--------------------------- info we have from CGL renderer queries, IOKit, Gestalt
- //--------------------------- these are set up in the displayDB by CocoaMgr
- GLint m_fullscreen;
- GLint m_accelerated;
- GLint m_windowed;
-
- GLint m_rendererID;
- GLint m_displayMask;
- GLint m_bufferModes;
- GLint m_colorModes;
- GLint m_accumModes;
- GLint m_depthModes;
- GLint m_stencilModes;
-
- GLint m_maxAuxBuffers;
- GLint m_maxSampleBuffers;
- GLint m_maxSamples;
- GLint m_sampleModes;
- GLint m_sampleAlpha;
-
- GLint m_vidMemory;
- GLint m_texMemory;
-
- uint m_pciVendorID;
- uint m_pciDeviceID;
- char m_pciModelString[64];
- char m_driverInfoString[64];
-
- //--------------------------- OS version related - set up by CocoaMgr
-
- // OS version found
- uint m_osComboVersion; // 0x00XXYYZZ : XX major, YY minor, ZZ minor minor : 10.6.3 --> 0x000A0603. 10.5.8 --> 0x000A0508.
-
- //--------------------------- shorthands - also set up by CocoaMgr - driven by vendorid / deviceid
-
- bool m_ati;
- bool m_atiR5xx;
- bool m_atiR6xx;
- bool m_atiR7xx;
- bool m_atiR8xx;
- bool m_atiNewer;
-
- bool m_intel;
- bool m_intel95x;
- bool m_intel3100;
- bool m_intelNewer;
-
- bool m_nv;
- bool m_nvG7x;
- bool m_nvG8x;
- bool m_nvNewer;
-
- //--------------------------- context query results - left blank in the display DB - but valid in a GLMContext (call ctx->Caps() to get a const ref)
-
- // booleans
- bool m_hasGammaWrites; // aka glGetBooleanv(GL_FRAMEBUFFER_SRGB_CAPABLE_EXT) / glEnable(GL_FRAMEBUFFER_SRGB_EXT)
- bool m_hasMixedAttachmentSizes; // aka ARB_fbo in 10.6.3 - test for min OS vers, then exported ext string
- bool m_hasBGRA; // aka GL_BGRA vertex attribs in 10.6.3 - - test for min OS vers, then exported ext string
- bool m_hasNewFullscreenMode; // aka 10.6.x "big window" fullscreen mode
- bool m_hasNativeClipVertexMode; // aka GLSL gl_ClipVertex does not fall back to SW- OS version and folklore-based
- bool m_hasOcclusionQuery; // occlusion query: do you speak it ?!
- bool m_hasFramebufferBlit; // framebuffer blit: know what I'm sayin?!
- bool m_hasPerfPackage1; // means new MTGL, fast OQ, fast uniform upload, NV can resolve flipped (late summer 2010 post 10.6.4 update)
-
- // counts
- int m_maxAniso; // aniso limit - context query
-
- // other exts
- bool m_hasBindableUniforms;
- bool m_hasUniformBuffers;
-
- // runtime options that aren't negotiable once set
- bool m_hasDualShaders; // must supply CLI arg "-glmdualshaders" or we go GLSL only
-
- //--------------------------- " can'ts " - specific problems that need to be worked around
-
- bool m_cantBlitReliably; // Intel chipsets have problems blitting sRGB sometimes
- bool m_cantAttachSRGB; // NV G8x on 10.5.8 can't have srgb tex on FBO color - separate issue from hasGammaWrites
- bool m_cantResolveFlipped; // happens on NV in 10.6.4 and prior - console variable "gl_can_resolve_flipped" can overrule
- bool m_cantResolveScaled; // happens everywhere per GL spec but may be relaxed some day - console variable "gl_can_resolve_scaled" can overrule
- bool m_costlyGammaFlips; // this means that sRGB sampling state affects shader code gen, resulting in state-dependent code regen
-
-
- //--------------------------- " bads " - known bad drivers
- bool m_badDriver1064NV; // this is the bad NVIDIA driver on 10.6.4 - stutter, tex corruption, black screen issues
-};
-
-
-
-#endif
+//
+// glmdisplay.h
+// display related stuff - used by both GLMgr and the CocoaMgr
+//
+//===============================================================================
+
+#ifndef GLMDISPLAY_H
+#define GLMDISPLAY_H
+
+#pragma once
+
+#ifdef OSX
+#include <OpenGL/OpenGL.h>
+#include <OpenGL/gl.h>
+#include <OpenGL/glext.h>
+#include <OpenGL/CGLTypes.h>
+#include <OpenGL/CGLRenderers.h>
+#include <OpenGL/CGLCurrent.h>
+
+typedef uint32_t CGDirectDisplayID;
+typedef uint32_t CGOpenGLDisplayMask;
+typedef double CGRefreshRate;
+
+//#include <ApplicationServices/ApplicationServices.h>
+#elif defined(LINUX)
+#include "tier0/platform.h"
+#include <GL/gl.h>
+#include <GL/glext.h>
+#else
+#error
+#endif
+
+typedef void _PseudoNSGLContext; // aka NSOpenGLContext
+typedef _PseudoNSGLContext *PseudoNSGLContextPtr;
+
+struct GLMDisplayModeInfoFields
+{
+ uint m_modePixelWidth;
+ uint m_modePixelHeight;
+ uint m_modeRefreshHz;
+ // are we even going to talk about bit depth... not yet
+};
+
+struct GLMDisplayInfoFields
+{
+#ifdef OSX
+ CGDirectDisplayID m_cgDisplayID;
+ CGOpenGLDisplayMask m_glDisplayMask; // result of CGDisplayIDToOpenGLDisplayMask on the cg_displayID.
+#endif
+ uint m_displayPixelWidth;
+ uint m_displayPixelHeight;
+};
+
+struct GLMRendererInfoFields
+{
+ /*properties of interest and their desired values.
+
+ kCGLRPFullScreen = 54, true
+ kCGLRPAccelerated = 73, true
+ kCGLRPWindow = 80, true
+
+ kCGLRPRendererID = 70, informational
+ kCGLRPDisplayMask = 84, informational
+ kCGLRPBufferModes = 100, informational
+ kCGLRPColorModes = 103, informational
+ kCGLRPAccumModes = 104, informational
+ kCGLRPDepthModes = 105, informational
+ kCGLRPStencilModes = 106, informational
+ kCGLRPMaxAuxBuffers = 107, informational
+ kCGLRPMaxSampleBuffers = 108, informational
+ kCGLRPMaxSamples = 109, informational
+ kCGLRPSampleModes = 110, informational
+ kCGLRPSampleAlpha = 111, informational
+ kCGLRPVideoMemory = 120, informational
+ kCGLRPTextureMemory = 121, informational
+ kCGLRPRendererCount = 128 number of renderers in the CGLRendererInfoObj under examination
+
+ kCGLRPOffScreen = 53, D/C
+ kCGLRPRobust = 75, FALSE or D/C - aka we're asking for no-fallback
+ kCGLRPBackingStore = 76, D/C
+ kCGLRPMPSafe = 78, D/C
+ kCGLRPMultiScreen = 81, D/C
+ kCGLRPCompliant = 83, D/C
+ */
+
+
+ //--------------------------- info we have from CGL renderer queries, IOKit, Gestalt
+ //--------------------------- these are set up in the displayDB by CocoaMgr
+ GLint m_fullscreen;
+ GLint m_accelerated;
+ GLint m_windowed;
+
+ GLint m_rendererID;
+ GLint m_displayMask;
+ GLint m_bufferModes;
+ GLint m_colorModes;
+ GLint m_accumModes;
+ GLint m_depthModes;
+ GLint m_stencilModes;
+
+ GLint m_maxAuxBuffers;
+ GLint m_maxSampleBuffers;
+ GLint m_maxSamples;
+ GLint m_sampleModes;
+ GLint m_sampleAlpha;
+
+ GLint m_vidMemory;
+ GLint m_texMemory;
+
+ uint m_pciVendorID;
+ uint m_pciDeviceID;
+ char m_pciModelString[64];
+ char m_driverInfoString[64];
+
+ //--------------------------- OS version related - set up by CocoaMgr
+
+ // OS version found
+ uint m_osComboVersion; // 0x00XXYYZZ : XX major, YY minor, ZZ minor minor : 10.6.3 --> 0x000A0603. 10.5.8 --> 0x000A0508.
+
+ //--------------------------- shorthands - also set up by CocoaMgr - driven by vendorid / deviceid
+
+ bool m_ati;
+ bool m_atiR5xx;
+ bool m_atiR6xx;
+ bool m_atiR7xx;
+ bool m_atiR8xx;
+ bool m_atiNewer;
+
+ bool m_intel;
+ bool m_intel95x;
+ bool m_intel3100;
+ bool m_intelNewer;
+
+ bool m_nv;
+ bool m_nvG7x;
+ bool m_nvG8x;
+ bool m_nvNewer;
+
+ //--------------------------- context query results - left blank in the display DB - but valid in a GLMContext (call ctx->Caps() to get a const ref)
+
+ // booleans
+ bool m_hasGammaWrites; // aka glGetBooleanv(GL_FRAMEBUFFER_SRGB_CAPABLE_EXT) / glEnable(GL_FRAMEBUFFER_SRGB_EXT)
+ bool m_hasMixedAttachmentSizes; // aka ARB_fbo in 10.6.3 - test for min OS vers, then exported ext string
+ bool m_hasBGRA; // aka GL_BGRA vertex attribs in 10.6.3 - - test for min OS vers, then exported ext string
+ bool m_hasNewFullscreenMode; // aka 10.6.x "big window" fullscreen mode
+ bool m_hasNativeClipVertexMode; // aka GLSL gl_ClipVertex does not fall back to SW- OS version and folklore-based
+ bool m_hasOcclusionQuery; // occlusion query: do you speak it ?!
+ bool m_hasFramebufferBlit; // framebuffer blit: know what I'm sayin?!
+ bool m_hasPerfPackage1; // means new MTGL, fast OQ, fast uniform upload, NV can resolve flipped (late summer 2010 post 10.6.4 update)
+
+ // counts
+ int m_maxAniso; // aniso limit - context query
+
+ // other exts
+ bool m_hasBindableUniforms;
+ bool m_hasUniformBuffers;
+
+ // runtime options that aren't negotiable once set
+ bool m_hasDualShaders; // must supply CLI arg "-glmdualshaders" or we go GLSL only
+
+ //--------------------------- " can'ts " - specific problems that need to be worked around
+
+ bool m_cantBlitReliably; // Intel chipsets have problems blitting sRGB sometimes
+ bool m_cantAttachSRGB; // NV G8x on 10.5.8 can't have srgb tex on FBO color - separate issue from hasGammaWrites
+ bool m_cantResolveFlipped; // happens on NV in 10.6.4 and prior - console variable "gl_can_resolve_flipped" can overrule
+ bool m_cantResolveScaled; // happens everywhere per GL spec but may be relaxed some day - console variable "gl_can_resolve_scaled" can overrule
+ bool m_costlyGammaFlips; // this means that sRGB sampling state affects shader code gen, resulting in state-dependent code regen
+
+
+ //--------------------------- " bads " - known bad drivers
+ bool m_badDriver1064NV; // this is the bad NVIDIA driver on 10.6.4 - stutter, tex corruption, black screen issues
+};
+
+
+
+#endif
diff --git a/mp/src/public/togl/osx/glmgr.h b/mp/src/public/togl/osx/glmgr.h
index cdf64206..24f9a00d 100644
--- a/mp/src/public/togl/osx/glmgr.h
+++ b/mp/src/public/togl/osx/glmgr.h
@@ -1,1088 +1,1088 @@
//========= Copyright Valve Corporation, All rights reserved. ============//
-//
-// glmgr.h
-// singleton class, common basis for managing GL contexts
-// responsible for tracking adapters and contexts
-//
-//===============================================================================
-
-#ifndef GLMGR_H
-#define GLMGR_H
-
-#pragma once
-
-#undef HAVE_GL_ARB_SYNC
-#ifdef LINUX
-#define HAVE_GL_ARB_SYNC 1
-#endif
-
-#include "glentrypoints.h"
-#include "glmdebug.h"
-#include "glmdisplay.h"
-#include "glmgrext.h"
-#include "glmgrbasics.h"
-#include "cglmtex.h"
-#include "cglmfbo.h"
-#include "cglmprogram.h"
-#include "cglmbuffer.h"
-#include "cglmquery.h"
-
-#include "tier0/vprof_telemetry.h"
-#include "materialsystem/ishader.h"
-#include "dxabstract_types.h"
-
-
-#ifdef LINUX
-#define Debugger DebuggerBreak
-#undef CurrentTime
-
-// prevent some conflicts in SDL headers...
-#undef M_PI
-#include <stdint.h>
-#ifndef _STDINT_H_
-#define _STDINT_H_ 1
-#endif
-
-#include "SDL/SDL.h"
-#endif
-
-//===============================================================================
-// glue to call out to Obj-C land (these are in glmgrcocoa.mm)
-#ifdef OSX
-PseudoNSGLContextPtr GetCurrentNSGLContext( );
-CGLContextObj GetCGLContextFromNSGL( PseudoNSGLContextPtr nsglCtx );
-#endif
-
-#include "tier0/dynfunction.h"
-
-//===============================================================================
-
-// parrot the D3D present parameters, more or less... "adapter" translates into "active display index" per the m_activeDisplayCount below.
-class GLMDisplayParams
-{
- public:
-
- // presumption, these indices are in sync with the current display DB that GLMgr has handy
- //int m_rendererIndex; // index of renderer (-1 if root context)
- //int m_displayIndex; // index of display in renderer - for FS
- //int m_modeIndex; // index of mode in display - for FS
-
- void *m_focusWindow; // (VD3DHWND aka WindowRef) - what window does this context display into
-
- bool m_fsEnable; // fullscreen on or not
- bool m_vsyncEnable; // vsync on or not
-
- // height and width have to match the display mode info if full screen.
-
- uint m_backBufferWidth; // pixel width (aka screen h-resolution if full screen)
- uint m_backBufferHeight; // pixel height (aka screen v-resolution if full screen)
- D3DFORMAT m_backBufferFormat; // pixel format
- uint m_multiSampleCount; // 0 means no MSAA, 2 means 2x MSAA, etc
- // uint m_multiSampleQuality; // no MSAA quality control yet
-
- bool m_enableAutoDepthStencil; // generally set to 'TRUE' per CShaderDeviceDx8::SetPresentParameters
- D3DFORMAT m_autoDepthStencilFormat;
-
- uint m_fsRefreshHz; // if full screen, this refresh rate (likely 0 for LCD's)
-
- //uint m_rootRendererID; // only used if m_rendererIndex is -1.
- //uint m_rootDisplayMask; // only used if m_rendererIndex is -1.
-
- bool m_mtgl; // enable multi threaded GL driver
-};
-
-//===============================================================================
-
-class GLMgr
-{
-public:
-
- //===========================================================================
- // class methods - singleton
- static void NewGLMgr( void ); // instantiate singleton..
- static GLMgr *aGLMgr( void ); // return singleton..
- static void DelGLMgr( void ); // tear down singleton..
-
- //===========================================================================
- // plain methods
-
- #if 0 // turned all these off while new approach is coded
- void RefreshDisplayDB( void ); // blow away old display DB, make a new one
- GLMDisplayDB *GetDisplayDB( void ); // get a ptr to the one GLMgr keeps. only valid til next refresh.
-
- // eligible renderers will be ranked by desirability starting at index 0 within the db
- // within each renderer, eligible displays will be ranked some kind of desirability (area? dist from menu bar?)
- // within each display, eligible modes will be ranked by descending areas
-
- // calls supplying indices are implicitly making reference to the current DB
- bool CaptureDisplay( int rendIndex, int displayIndex, bool captureAll ); // capture one display or all displays
- void ReleaseDisplays( void ); // release all captures
-
- int GetDisplayMode( int rendIndex, int displayIndex ); // retrieve current display res (returns modeIndex)
- void SetDisplayMode( GLMDisplayParams *params ); // set the display res (only useful for FS)
- #endif
-
- GLMContext *NewContext( GLMDisplayParams *params ); // this will have to change
- void DelContext( GLMContext *context );
-
- // with usage of CGLMacro.h we could dispense with the "current context" thing
- // and just declare a member variable of GLMContext, allowing each glXXX call to be routed directly
- // to the correct context
- void SetCurrentContext( GLMContext *context ); // make current in calling thread only
- GLMContext *GetCurrentContext( void );
-
-protected:
- friend class GLMContext;
-
- GLMgr();
- ~GLMgr();
-};
-
-
-//===========================================================================//
-
-// helper function to do enable or disable in one step
-inline void glSetEnable( GLenum which, bool enable )
-{
- if (enable)
- gGL->glEnable(which);
- else
- gGL->glDisable(which);
-}
-
-// helper function for int vs enum clarity
-inline void glGetEnumv( GLenum which, GLenum *dst )
-{
- gGL->glGetIntegerv( which, (int*)dst );
-}
-
-//===========================================================================//
-//
-// types to support the GLMContext
-//
-//===========================================================================//
-
-// Each state set/get path we are providing caching for, needs its own struct and a comparison operator.
-// we also provide an enum of how many such types there are, handy for building dirty masks etc.
-
-// shorthand macros
-#define EQ(fff) ( (src.fff) == (fff) )
-
-//rasterizer
-struct GLAlphaTestEnable_t { GLint enable; bool operator==(const GLAlphaTestEnable_t& src) const { return EQ(enable); } };
-struct GLAlphaTestFunc_t { GLenum func; GLclampf ref; bool operator==(const GLAlphaTestFunc_t& src) const { return EQ(func) && EQ(ref); } };
-struct GLCullFaceEnable_t { GLint enable; bool operator==(const GLCullFaceEnable_t& src) const { return EQ(enable); } };
-struct GLCullFrontFace_t { GLenum value; bool operator==(const GLCullFrontFace_t& src) const { return EQ(value); } };
-struct GLPolygonMode_t { GLenum values[2]; bool operator==(const GLPolygonMode_t& src) const { return EQ(values[0]) && EQ(values[1]); } };
-struct GLDepthBias_t { GLfloat factor; GLfloat units; bool operator==(const GLDepthBias_t& src) const { return EQ(factor) && EQ(units); } };
-struct GLScissorEnable_t { GLint enable; bool operator==(const GLScissorEnable_t& src) const { return EQ(enable); } };
-struct GLScissorBox_t { GLint x,y; GLsizei width, height; bool operator==(const GLScissorBox_t& src) const { return EQ(x) && EQ(y) && EQ(width) && EQ(height); } };
-struct GLAlphaToCoverageEnable_t{ GLint enable; bool operator==(const GLAlphaToCoverageEnable_t& src) const { return EQ(enable); } };
-struct GLViewportBox_t { GLint x,y; GLsizei width, height; bool operator==(const GLViewportBox_t& src) const { return EQ(x) && EQ(y) && EQ(width) && EQ(height); } };
-struct GLViewportDepthRange_t { GLdouble near,far; bool operator==(const GLViewportDepthRange_t& src) const { return EQ(near) && EQ(far); } };
-struct GLClipPlaneEnable_t { GLint enable; bool operator==(const GLClipPlaneEnable_t& src) const { return EQ(enable); } };
-struct GLClipPlaneEquation_t { GLfloat x,y,z,w; bool operator==(const GLClipPlaneEquation_t& src) const { return EQ(x) && EQ(y) && EQ(z) && EQ(w); } };
-
-//blend
-struct GLColorMaskSingle_t { char r,g,b,a; bool operator==(const GLColorMaskSingle_t& src) const { return EQ(r) && EQ(g) && EQ(b) && EQ(a); } };
-struct GLColorMaskMultiple_t { char r,g,b,a; bool operator==(const GLColorMaskMultiple_t& src) const { return EQ(r) && EQ(g) && EQ(b) && EQ(a); } };
-struct GLBlendEnable_t { GLint enable; bool operator==(const GLBlendEnable_t& src) const { return EQ(enable); } };
-struct GLBlendFactor_t { GLenum srcfactor,dstfactor; bool operator==(const GLBlendFactor_t& src) const { return EQ(srcfactor) && EQ(dstfactor); } };
-struct GLBlendEquation_t { GLenum equation; bool operator==(const GLBlendEquation_t& src) const { return EQ(equation); } };
-struct GLBlendColor_t { GLfloat r,g,b,a; bool operator==(const GLBlendColor_t& src) const { return EQ(r) && EQ(g) && EQ(b) && EQ(a); } };
-struct GLBlendEnableSRGB_t { GLint enable; bool operator==(const GLBlendEnableSRGB_t& src) const { return EQ(enable); } };
-
-//depth
-struct GLDepthTestEnable_t { GLint enable; bool operator==(const GLDepthTestEnable_t& src) const { return EQ(enable); } };
-struct GLDepthFunc_t { GLenum func; bool operator==(const GLDepthFunc_t& src) const { return EQ(func); } };
-struct GLDepthMask_t { char mask; bool operator==(const GLDepthMask_t& src) const { return EQ(mask); } };
-
-//stencil
-struct GLStencilTestEnable_t { GLint enable; bool operator==(const GLStencilTestEnable_t& src) const { return EQ(enable); } };
-struct GLStencilFunc_t { GLenum frontfunc, backfunc; GLint ref; GLuint mask; bool operator==(const GLStencilFunc_t& src) const { return EQ(frontfunc) && EQ(backfunc) && EQ(ref) && EQ(mask); } };
-struct GLStencilOp_t { GLenum sfail; GLenum dpfail; GLenum dppass; bool operator==(const GLStencilOp_t& src) const { return EQ(sfail) && EQ(dpfail) && EQ(dppass); } };
-struct GLStencilWriteMask_t { GLint mask; bool operator==(const GLStencilWriteMask_t& src) const { return EQ(mask); } };
-
-//clearing
-struct GLClearColor_t { GLfloat r,g,b,a; bool operator==(const GLClearColor_t& src) const { return EQ(r) && EQ(g) && EQ(b) && EQ(a); } };
-struct GLClearDepth_t { GLdouble d; bool operator==(const GLClearDepth_t& src) const { return EQ(d); } };
-struct GLClearStencil_t { GLint s; bool operator==(const GLClearStencil_t& src) const { return EQ(s); } };
-
-#undef EQ
-
-enum EGLMStateBlockType
-{
- kGLAlphaTestEnable,
- kGLAlphaTestFunc,
-
- kGLCullFaceEnable,
- kGLCullFrontFace,
-
- kGLPolygonMode,
-
- kGLDepthBias,
-
- kGLScissorEnable,
- kGLScissorBox,
-
- kGLViewportBox,
- kGLViewportDepthRange,
-
- kGLClipPlaneEnable,
- kGLClipPlaneEquation,
-
- kGLColorMaskSingle,
- kGLColorMaskMultiple,
-
- kGLBlendEnable,
- kGLBlendFactor,
- kGLBlendEquation,
- kGLBlendColor,
- kGLBlendEnableSRGB,
-
- kGLDepthTestEnable,
- kGLDepthFunc,
- kGLDepthMask,
-
- kGLStencilTestEnable,
- kGLStencilFunc,
- kGLStencilOp,
- kGLStencilWriteMask,
-
- kGLClearColor,
- kGLClearDepth,
- kGLClearStencil,
-
- kGLAlphaToCoverageEnable,
-
- kGLMStateBlockLimit
-};
-
-//===========================================================================//
-
-// templated functions representing GL R/W bottlenecks
-// one set of set/get/getdefault is instantiated for each of the GL*** types above.
-
-// use these from the non array state objects
-template<typename T> void GLContextSet( T *src );
-template<typename T> void GLContextGet( T *dst );
-template<typename T> void GLContextGetDefault( T *dst );
-
-// use these from the array state objects
-template<typename T> void GLContextSetIndexed( T *src, int index );
-template<typename T> void GLContextGetIndexed( T *dst, int index );
-template<typename T> void GLContextGetDefaultIndexed( T *dst, int index );
-
-//===========================================================================//
-
-// caching state object template. One of these is instantiated in the context per unique struct type above
-template<typename T> class GLState
-{
- public:
-
- GLState<T>()
- {
- dirty = false;
- memset( &data, 0, sizeof(data) );
- };
-
- // write: client src into cache
- // common case is both false. dirty is calculated, context write is deferred.
- void Write( T *src, bool noCompare=false, bool noDefer=false )
- {
- if (noCompare)
- {
- dirty = true;
- }
- else
- {
- // only == is implemented, so test for equal and negate
- // note, you only set dirty if mismatch, you never clear it until flush
- if ( !(data == *src) )
- {
- dirty = true;
- }
- }
-
- data = *src;
-
- if (noDefer)
- {
- Flush( true ); // dirty becomes false
- }
- };
-
- // write cache->context if dirty or forced.
- void Flush( bool noDefer=false )
- {
- if (dirty || noDefer)
- {
- GLContextSet( &data );
- GLMCheckError();
- // good place for some error checking here
- dirty = false;
- }
- };
-
- // default: write default value to cache, optionally write through
- void Default( bool noDefer=false )
- {
- GLContextGetDefault( &data ); // read default values directly to our cache copy
- dirty = true;
- Flush(noDefer);
- };
-
- // read: sel = 0 for cache, 1 for context
- void Read( T *dst, int sel )
- {
- if (sel==0)
- {
- *dst = data;
- }
- else
- {
- GLContextGet( dst );
- GLMCheckError();
- }
- };
-
- // check: verify that context equals cache, return true if mismatched or if illegal values seen
- bool Check ( void )
- {
- T temp;
- bool result;
-
- GLContextGet( &temp );
- GLMCheckError();
- result = !(temp == data);
- return result;
- };
-
- protected:
- T data;
- bool dirty;
-};
-
-// caching state object template - with multiple values behind it that are indexed
-template<typename T, int COUNT> class GLStateArray
-{
- public:
-
- GLStateArray<T,COUNT>()
- {
- memset( &dirty, 0, sizeof(dirty) );
- memset( &data, 0, sizeof(data) );
- };
-
- // write: client src into cache
- // common case is both false. dirty is calculated, context write is deferred.
- void WriteIndex( T *src, int index, bool noCompare=false, bool noDefer=false )
- {
- if (noCompare)
- {
- dirty[index] = true;
- }
- else
- {
- // only == is implemented, so test for equal and negate
- // note, you only set dirty if mismatch, you never clear it until flush
- if (! (data[index] == *src) )
- {
- dirty[index] = true;
- }
- }
-
- data[index] = *src;
-
- if (noDefer)
- {
- FlushIndex( index, true ); // dirty becomes false
- }
- };
-
- // write cache->context if dirty or forced.
- void FlushIndex( int index, bool noDefer=false )
- {
- if (dirty[index] || noDefer)
- {
- GLContextSetIndexed( &data[index], index );
- GLMCheckError();
- dirty[index] = false;
- }
- };
-
- // write all slots in the array
- void Flush( bool noDefer=false )
- {
- for( int i=0; i<COUNT; i++)
- {
- FlushIndex( i, noDefer );
- }
- }
-
- // default: write default value to cache, optionally write through
- void DefaultIndex( int index, bool noDefer=false )
- {
- GLContextGetDefaultIndexed( &data[index], index ); // read default values directly to our cache copy
- dirty[index] = true;
- Flush(noDefer);
- };
-
- void Default( void )
- {
- for( int i=0; i<COUNT; i++)
- {
- DefaultIndex( i );
- }
- }
-
- // read: sel = 0 for cache, 1 for context
- void ReadIndex( T *dst, int index, int sel )
- {
- if (sel==0)
- {
- *dst = data[index];
- }
- else
- {
- GLContextGetIndexed( dst, index );
- GLMCheckError();
- }
- };
-
- // check: verify that context equals cache, return true if mismatched or if illegal values seen
- bool CheckIndex( int index )
- {
- T temp;
- bool result;
-
- GLContextGetIndexed( &temp, index );
- GLMCheckError();
- result = !(temp == data[index]);
-
- return result;
- };
-
- bool Check( void )
- {
- T temp;
- bool result = false;
-
- for( int i=0; i<COUNT; i++)
- {
- result |= CheckIndex( i );
- }
-
- return result;
- };
-
- protected:
- T data [COUNT];
- bool dirty [COUNT];
-};
-
-
-//===========================================================================//
-
-struct GLMTexSampler
-{
- GLMTexSamplingParams m_samp;
- CGLMTex *m_drawTex; // tex which must be bound at time of draw
- CGLMTex *m_boundTex; // tex which is actually bound now (if does not match, a rebind is needed to draw)
-};
-
-#ifdef NEVER
-//===========================================================================//
-
-enum GLMVertexAttributeIndex
-{
- kGLMGenericAttr00 = 0,
- kGLMGenericAttr01,
- kGLMGenericAttr02,
- kGLMGenericAttr03,
- kGLMGenericAttr04,
- kGLMGenericAttr05,
- kGLMGenericAttr06,
- kGLMGenericAttr07,
- kGLMGenericAttr08,
- kGLMGenericAttr09,
- kGLMGenericAttr10,
- kGLMGenericAttr11,
- kGLMGenericAttr12,
- kGLMGenericAttr13,
- kGLMGenericAttr14,
- kGLMGenericAttr15,
-
- kGLMVertexAttributeIndexMax // ideally < 32
-};
-
-struct GLMVertexAttributeDesc // all the info you need to do vertex setup for one attribute
-{
- CGLMBuffer *m_buffer; // NULL allowed in which case m_offset is the full 32-bit pointer.. so you can draw from plain RAM if desired
- GLuint m_datasize; // comp count of the attribute (1-4)
- GLenum m_datatype; // data type of the attribute (GL_FLOAT, GL_UNSIGNED_BYTE, etc)
- GLuint m_stride;
- GLuint m_offset; // net offset to attribute 'zero' within the buffer.
- GLboolean m_normalized; // apply to any fixed point data that needs normalizing, esp color bytes
-
- // may need a seed value at some point to be able to disambiguate re-lifed buffers holding same pointer
- // simpler alternative is to do shoot-down inside the vertex/index buffer free calls.
- // I'd rather not have to have each attribute fiddling a ref count on the buffer to which it refers..
-
-#define EQ(fff) ( (src.fff) == (fff) )
- // test in decreasing order of likelihood of difference, but do not include the buffer revision as caller is not supplying it..
- bool operator==(const GLMVertexAttributeDesc& src) const { return EQ(m_buffer) && EQ(m_offset) && EQ(m_stride) && EQ(m_datatype) && EQ(m_normalized) && EQ(m_datasize); }
-#undef EQ
-
- uint m_bufferRevision; // only set in GLM context's copy, to disambiguate references that are same offset / same buffer but cross an orphan event
-};
-
-// GLMContext will maintain one of these structures inside the context to represent the current state.
-// Client can supply a new one when it wants to change the setup.
-//FIXME GLMContext can do the work to migrate from old setup to new setup as efficiently as possible (but it doesn't yet)
-#endif
-
-struct GLMVertexSetup
-{
- uint m_attrMask; // which attrs are enabled (1<<n) mask where n is a GLMVertexAttributeIndex.
-
- GLMVertexAttributeDesc m_attrs[ kGLMVertexAttributeIndexMax ];
-
- // copied in from dxabstract, not strictly needed for operation, helps debugging
- unsigned char m_vtxAttribMap[16];
-
- /* high nibble is usage per _D3DDECLUSAGE
- typedef enum _D3DDECLUSAGE
- {
- D3DDECLUSAGE_POSITION = 0,
- D3DDECLUSAGE_BLENDWEIGHT = 1,
- D3DDECLUSAGE_BLENDINDICES = 2,
- D3DDECLUSAGE_NORMAL = 3,
- D3DDECLUSAGE_PSIZE = 4,
- D3DDECLUSAGE_TEXCOORD = 5,
- D3DDECLUSAGE_TANGENT = 6,
- D3DDECLUSAGE_BINORMAL = 7,
- D3DDECLUSAGE_TESSFACTOR = 8,
- D3DDECLUSAGE_PLUGH = 9, // mystery value
- D3DDECLUSAGE_COLOR = 10,
- D3DDECLUSAGE_FOG = 11,
- D3DDECLUSAGE_DEPTH = 12,
- D3DDECLUSAGE_SAMPLE = 13,
- } D3DDECLUSAGE;
-
- low nibble is usageindex (i.e. POSITION0, POSITION1, etc)
- array position is attrib number.
- */
-};
-
-//===========================================================================//
-
-//FIXME magic numbers here
-
-#define kGLMProgramParamFloat4Limit 256
-#define kGLMProgramParamBoolLimit 16
-#define kGLMProgramParamInt4Limit 16
-
-#define kGLMVertexProgramParamFloat4Limit 256
-#define kGLMFragmentProgramParamFloat4Limit 32
-
-struct GLMProgramParamsF
-{
- float m_values[kGLMProgramParamFloat4Limit][4]; // float4's 256 of them
- uint m_dirtySlotCount; // index of slot past highest dirty (assume 0 for base of range)
-};
-
-struct GLMProgramParamsB
-{
- int m_values[kGLMProgramParamBoolLimit]; // bools, 4 of them
- uint m_dirtySlotCount;
-};
-
-struct GLMProgramParamsI
-{
- int m_values[kGLMProgramParamInt4Limit][4]; // int4s, 16 of them
- uint m_dirtySlotCount;
-};
-
-enum EGLMParamWriteMode
-{
- eParamWriteAllSlots, // glUniform4fv of the maximum size (not recommended if shader is down-sizing the decl)
- eParamWriteShaderSlots, // glUniform4fv of the active slot count ("highwater")
- eParamWriteShaderSlotsOptional, // glUniform4fv of the active slot count ("highwater") - but only if at least one has been written - it's optional
- eParamWriteDirtySlotRange // glUniform4fv of the 0-N range where N is highest dirty slot
-};
-
-enum EGLMAttribWriteMode
-{
- eAttribWriteAll,
- eAttribWriteDirty
-};
-
-//===========================================================================//
-
-#if GLMDEBUG
-enum EGLMDebugCallSite
-{
- eBeginFrame, // inside begin frame func - frame number has been inc'd, batch number should be -1
- eClear, // inside clear func
- eDrawElements, // inside repeat loop, prior to draw call - batch numberhas been inc'd
- eEndFrame, // end frame
- ePresent // before showing pixels
-};
-
-// caller should zero one of these out and fill in the m_caller before invoking the hook
-struct GLMDebugHookInfo
-{
- // info from the caller to the debug hook
- EGLMDebugCallSite m_caller;
-
-
- // state the hook uses to keep track of progress within a single run of the caller
- int m_iteration; // which call to the hook is this. if it's zero, it precedes any action in the caller.
-
-
- // bools used to communicate between caller and hook
- bool m_loop; // hook tells caller to loop around again (don't exit)
- bool m_holding; // current mood of hook, are we holding on this batch (i.e. rerun)
-
- // specific info for a draw call
- GLenum m_drawMode;
- GLuint m_drawStart;
- GLuint m_drawEnd;
- GLsizei m_drawCount;
- GLenum m_drawType;
- const GLvoid *m_drawIndices;
-};
-#endif
-
-//===========================================================================//
-
-#define kGLMUserClipPlanes 2
-#define kGLMScratchFBOCount 4
-
-class GLMContext
-{
- public:
- // set/check current context (perq for many other calls)
- void MakeCurrent( bool bRenderThread = false );
- void ReleaseCurrent( bool bRenderThread = false );
-
- // CheckCurrent has been removed (it no longer compiled). To minimize churn I'm leaving
- // the inline NOP version.
- // DO NOT change this to non-inlined. It's called all over the place from very hot codepaths.
- FORCEINLINE void CheckCurrent( void ) { }
-
- void PopulateCaps( void ); // fill out later portions of renderer info record which need context queries
- void DumpCaps( void ); // printf all the caps info (you can call this in release too)
- const GLMRendererInfoFields& Caps( void ); // peek at the caps record
-
- // state cache/mirror
- void SetDefaultStates( void );
- void FlushStates( bool noDefer = false );
- void VerifyStates( void );
-
- // textures
- // Lock and Unlock reqs go directly to the tex object
- CGLMTex *NewTex( GLMTexLayoutKey *key, char *debugLabel=NULL );
- void DelTex( CGLMTex *tex );
-
- // options for Blit (replacement for ResolveTex and BlitTex)
- // pass NULL for dstTex if you want to target GL_BACK with the blit. You get y-flip with that, don't change the dstrect yourself.
- void Blit2( CGLMTex *srcTex, GLMRect *srcRect, int srcFace, int srcMip, CGLMTex *dstTex, GLMRect *dstRect, int dstFace, int dstMip, uint filter );
-
- // tex blit (via FBO blit)
- void BlitTex( CGLMTex *srcTex, GLMRect *srcRect, int srcFace, int srcMip, CGLMTex *dstTex, GLMRect *dstRect, int dstFace, int dstMip, uint filter, bool useBlitFB = true );
-
- // MSAA resolve - we do this in GLMContext because it has to do a bunch of FBO/blit gymnastics
- void ResolveTex( CGLMTex *tex, bool forceDirty=false );
-
- // texture pre-load (residency forcing) - normally done one-time but you can force it
- void PreloadTex( CGLMTex *tex, bool force=false );
-
- // samplers
- void SetSamplerTex( int sampler, CGLMTex *tex );
- void SetSamplerParams( int sampler, GLMTexSamplingParams *params );
-
- // render targets (FBO's)
- CGLMFBO *NewFBO( void );
- void DelFBO( CGLMFBO *fbo );
- void SetDrawingFBO( CGLMFBO *fbo ); // as with samplers, the notion of the target FBO is latched til draw time and then checked
-
- // programs
- CGLMProgram *NewProgram( EGLMProgramType type, char *progString );
- void DelProgram( CGLMProgram *prog );
- void NullProgram( void ); // de-ac all shader state
-
- void SetDrawingProgram( EGLMProgramType type, CGLMProgram *prog ); // set NULL for no program
- void SetDrawingLang( EGLMProgramLang lang, bool immediate=false ); // choose ARB or GLSL. immediate=false defers lang change to top of frame
-
- void LinkShaderPair( CGLMProgram *vp, CGLMProgram *fp ); // ensure this combo has been linked and is in the GLSL pair cache
- void ClearShaderPairCache( void ); // call this to shoot down all the linked pairs
- void QueryShaderPair( int index, GLMShaderPairInfo *infoOut ); // this lets you query the shader pair cache for saving its state
-
- // buffers
- // Lock and Unlock reqs go directly to the buffer object
- CGLMBuffer *NewBuffer( EGLMBufferType type, uint size, uint options );
- void DelBuffer( CGLMBuffer *buff );
-
- void SetIndexBuffer( CGLMBuffer *buff );
- void SetVertexAttributes( GLMVertexSetup *setup );
- // note, no API is exposed for setting a single attribute source.
- // come prepared with a complete block of attributes to use.
-
- // Queries
- CGLMQuery *NewQuery( GLMQueryParams *params );
- void DelQuery( CGLMQuery *query );
-
- // "slot" means a vec4-sized thing
- // these write into .env parameter space
- void SetProgramParametersF( EGLMProgramType type, uint baseSlot, float *slotData, uint slotCount ); // take vec4f's
- void SetProgramParametersB( EGLMProgramType type, uint baseSlot, int *slotData, uint boolCount ); // take "BOOL" aka int
- void SetProgramParametersI( EGLMProgramType type, uint baseSlot, int *slotData, uint slotCount ); // take int4s
-
- // state sync
- void FlushDrawStates( bool shadersOn=true ); // pushes all drawing state - samplers, tex, programs, etc.
-
- // drawing
- void DrawRangeElements( GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices );
- void CheckNative( void );
-
- // clearing
- void Clear( bool color, unsigned long colorValue, bool depth, float depthValue, bool stencil, unsigned int stencilValue, GLScissorBox_t *rect = NULL );
-
- // display
- //void SetVSyncEnable( bool vsyncOn );
- //void SetFullScreen( bool fsOn, int screenIndex ); // will be latched for next BeginFrame
- //void ActivateFullScreen( bool fsOn, int screenIndex ); // will be called by BeginFrame
- bool SetDisplayParams( GLMDisplayParams *params ); // either the first time setup, or a change to new setup
-
- void Present( CGLMTex *tex ); // somewhat hardwired for the time being
-
- // mode switch / reset
- void Reset( void ); // not a lot of args for now..
-
- // writers for the state block inputs
-
- void WriteAlphaTestEnable ( GLAlphaTestEnable_t *src );
- void WriteAlphaTestFunc ( GLAlphaTestFunc_t *src );
- void WriteCullFaceEnable ( GLCullFaceEnable_t *src );
- void WriteCullFrontFace ( GLCullFrontFace_t *src );
- void WritePolygonMode ( GLPolygonMode_t *src );
- void WriteDepthBias ( GLDepthBias_t *src );
- void WriteClipPlaneEnable ( GLClipPlaneEnable_t *src, int which );
- void WriteClipPlaneEquation ( GLClipPlaneEquation_t *src, int which );
- void WriteScissorEnable ( GLScissorEnable_t *src );
- void WriteScissorBox ( GLScissorBox_t *src );
- void WriteAlphaToCoverageEnable ( GLAlphaToCoverageEnable_t *src );
- void WriteViewportBox ( GLViewportBox_t *src );
- void WriteViewportDepthRange ( GLViewportDepthRange_t *src );
- void WriteColorMaskSingle ( GLColorMaskSingle_t *src );
- void WriteColorMaskMultiple ( GLColorMaskMultiple_t *src, int which );
- void WriteBlendEnable ( GLBlendEnable_t *src );
- void WriteBlendFactor ( GLBlendFactor_t *src );
- void WriteBlendEquation ( GLBlendEquation_t *src );
- void WriteBlendColor ( GLBlendColor_t *src );
- void WriteBlendEnableSRGB ( GLBlendEnableSRGB_t *src );
- void WriteDepthTestEnable ( GLDepthTestEnable_t *src );
- void WriteDepthFunc ( GLDepthFunc_t *src );
- void WriteDepthMask ( GLDepthMask_t *src );
- void WriteStencilTestEnable ( GLStencilTestEnable_t *src );
- void WriteStencilFunc ( GLStencilFunc_t *src );
- void WriteStencilOp ( GLStencilOp_t *src, int which );
- void WriteStencilWriteMask ( GLStencilWriteMask_t *src );
- void WriteClearColor ( GLClearColor_t *src );
- void WriteClearDepth ( GLClearDepth_t *src );
- void WriteClearStencil ( GLClearStencil_t *src );
-
-
- // debug stuff
- void BeginFrame( void );
- void EndFrame( void );
-
- // new interactive debug stuff
-#if GLMDEBUG
- void DebugDump( GLMDebugHookInfo *info, uint options, uint vertDumpMode );
- void DebugHook( GLMDebugHookInfo *info );
- void DebugPresent( void );
- void DebugClear( void );
-#endif
-
- FORCEINLINE DWORD GetCurrentOwnerThreadId() const { return m_nCurOwnerThreadId; }
-
- protected:
- friend class GLMgr; // only GLMgr can make GLMContext objects
- friend class GLMRendererInfo; // only GLMgr can make GLMContext objects
- friend class CGLMTex; // tex needs to be able to do binds
- friend class CGLMFBO; // fbo needs to be able to do binds
- friend class CGLMProgram;
- friend class CGLMShaderPair;
- friend class CGLMShaderPairCache;
- friend class CGLMBuffer;
- friend class GLMTester; // tester class needs access back into GLMContext
-
- friend class IDirect3D9;
- friend class IDirect3DDevice9;
-
- // methods------------------------------------------
-
- // old GLMContext( GLint displayMask, GLint rendererID, PseudoNSGLContextPtr nsglShareCtx );
- GLMContext( GLMDisplayParams *params );
- ~GLMContext();
-
- // textures
- void SelectTMU( int tmu ); // wrapper for glActiveTexture()
- int BindTexToTMU( CGLMTex *tex, int tmu, bool noCheck=false );
-
- // render targets / FBO's
- void BindFBOToCtx( CGLMFBO *fbo, GLenum bindPoint = GL_FRAMEBUFFER_EXT ); // you can also choose GL_READ_FRAMEBUFFER_EXT / GL_DRAW_FRAMEBUFFER_EXT
-
- // programs
- //void BindProgramToCtx( EGLMProgramType type, CGLMProgram *prog ); // will set program mode enable appropriately
-
- // buffers
- void BindBufferToCtx( EGLMBufferType type, CGLMBuffer *buff, bool force = false ); // does not twiddle any enables.
-
- // debug font
- void GenDebugFontTex( void );
- void DrawDebugText( float x, float y, float z, float drawCharWidth, float drawCharHeight, char *string );
-
- // members------------------------------------------
-
- // context
- DWORD m_nCurOwnerThreadId;
-
- GLMRendererInfoFields m_caps;
-
- bool m_displayParamsValid; // is there a param block copied in yet
- GLMDisplayParams m_displayParams; // last known display config, either via constructor, or by SetDisplayParams...
-
-#if defined(USE_SDL)
- int m_pixelFormatAttribs[100]; // more than enough
- void * m_ctx;
-#endif
-
- // texture form table
- CGLMTexLayoutTable *m_texLayoutTable;
-
- // context state mirrors
-
- GLState<GLAlphaTestEnable_t> m_AlphaTestEnable;
-
- GLState<GLAlphaTestFunc_t> m_AlphaTestFunc;
-
- GLState<GLCullFaceEnable_t> m_CullFaceEnable;
- GLState<GLCullFrontFace_t> m_CullFrontFace;
- GLState<GLPolygonMode_t> m_PolygonMode;
-
- GLState<GLDepthBias_t> m_DepthBias;
-
- GLStateArray<GLClipPlaneEnable_t,kGLMUserClipPlanes> m_ClipPlaneEnable;
- GLStateArray<GLClipPlaneEquation_t,kGLMUserClipPlanes> m_ClipPlaneEquation; // dxabstract puts them directly into param slot 253(0) and 254(1)
-
- GLState<GLScissorEnable_t> m_ScissorEnable;
- GLState<GLScissorBox_t> m_ScissorBox;
-
- GLState<GLAlphaToCoverageEnable_t> m_AlphaToCoverageEnable;
-
- GLState<GLViewportBox_t> m_ViewportBox;
- GLState<GLViewportDepthRange_t> m_ViewportDepthRange;
-
- GLState<GLColorMaskSingle_t> m_ColorMaskSingle;
- GLStateArray<GLColorMaskMultiple_t,8> m_ColorMaskMultiple; // need an official constant for the color buffers limit
-
- GLState<GLBlendEnable_t> m_BlendEnable;
- GLState<GLBlendFactor_t> m_BlendFactor;
- GLState<GLBlendEquation_t> m_BlendEquation;
- GLState<GLBlendColor_t> m_BlendColor;
- GLState<GLBlendEnableSRGB_t> m_BlendEnableSRGB; // write to this one to transmit intent to write SRGB encoded pixels to drawing FB
- bool m_FakeBlendEnableSRGB; // writes to above will be shunted here if fake SRGB is in effect.
-
- GLState<GLDepthTestEnable_t> m_DepthTestEnable;
- GLState<GLDepthFunc_t> m_DepthFunc;
- GLState<GLDepthMask_t> m_DepthMask;
-
- GLState<GLStencilTestEnable_t> m_StencilTestEnable; // global stencil test enable
- GLState<GLStencilFunc_t> m_StencilFunc; // holds front and back stencil funcs
- GLStateArray<GLStencilOp_t,2> m_StencilOp; // indexed: 0=front 1=back
- GLState<GLStencilWriteMask_t> m_StencilWriteMask;
-
- GLState<GLClearColor_t> m_ClearColor;
- GLState<GLClearDepth_t> m_ClearDepth;
- GLState<GLClearStencil_t> m_ClearStencil;
-
- // texture bindings and sampler setup
- int m_activeTexture; // mirror for glActiveTexture
- GLMTexSampler m_samplers[GLM_SAMPLER_COUNT];
-
- // texture lock tracking - CGLMTex objects share usage of this
- CUtlVector< GLMTexLockDesc > m_texLocks;
-
- // render target binding - check before draw
- // similar to tex sampler mechanism, we track "bound" from "chosen for drawing" separately,
- // so binding for creation/setup need not disrupt any notion of what will be used at draw time
-
- CGLMFBO *m_boundDrawFBO; // FBO on GL_DRAW_FRAMEBUFFER bind point
- CGLMFBO *m_boundReadFBO; // FBO on GL_READ_FRAMEBUFFER bind point
- // ^ both are set if you bind to GL_FRAMEBUFFER_EXT
-
- CGLMFBO *m_drawingFBO; // what FBO should be bound at draw time (to both read/draw bp's).
-
- CGLMFBO *m_blitReadFBO;
- CGLMFBO *m_blitDrawFBO; // scratch FBO's for framebuffer blit
-
- CGLMFBO *m_scratchFBO[ kGLMScratchFBOCount ]; // general purpose FBO's for internal use
-
- CUtlVector< CGLMFBO* > m_fboTable; // each live FBO goes in the table
-
- // program bindings
- EGLMProgramLang m_drawingLangAtFrameStart; // selector for start of frame (spills into m_drawingLang)
- EGLMProgramLang m_drawingLang; // selector for which language we desire to draw with on the next batch
- CGLMProgram *m_drawingProgram[ kGLMNumProgramTypes ];
-
- GLMProgramParamsF m_programParamsF[ kGLMNumProgramTypes ];
- GLMProgramParamsB m_programParamsB[ kGLMNumProgramTypes ]; // two banks, but only the vertex one is used
- GLMProgramParamsI m_programParamsI[ kGLMNumProgramTypes ]; // two banks, but only the vertex one is used
- EGLMParamWriteMode m_paramWriteMode;
-
- CGLMProgram *m_nullFragmentProgram; // write opaque black. Activate when caller asks for null FP
-
- CGLMProgram *m_preloadTexVertexProgram; // programs to help preload textures (dummies)
- CGLMProgram *m_preload2DTexFragmentProgram;
- CGLMProgram *m_preload3DTexFragmentProgram;
- CGLMProgram *m_preloadCubeTexFragmentProgram;
-
- CGLMProgram *m_boundProgram[ kGLMNumProgramTypes ];
-
- CGLMShaderPairCache *m_pairCache; // GLSL only
- CGLMShaderPair *m_boundPair; // GLSL only
- uint m_boundPairRevision; // GLSL only
- GLhandleARB m_boundPairProgram; // GLSL only
-
- // buffer bindings
- CGLMBuffer *m_lastKnownBufferBinds[ kGLMNumBufferTypes ]; // tracked per bind point for dupe-bind-absorb
- GLMVertexAttributeDesc m_lastKnownVertexAttribs[ kGLMVertexAttributeIndexMax ]; // tracked per attrib for dupe-set-absorb
- uint m_lastKnownVertexAttribMask; // tracked for dupe-enable-absorb
-
- CGLMBuffer *m_drawIndexBuffer; // ... ? do we need dupe tracking for index buffer setup? ?
-
- GLMVertexSetup m_drawVertexSetup;
-
- EGLMAttribWriteMode m_attribWriteMode;
-
- bool m_slowCheckEnable; // turn this on or no native checking is done ("-glmassertslow" or "-glmsspewslow")
- bool m_slowAssertEnable; // turn this on to assert on a non-native batch "-glmassertslow"
- bool m_slowSpewEnable; // turn this on to log non-native batches to stdout "-glmspewslow"
-
- // debug font texture
- CGLMTex *m_debugFontTex; // might be NULL unless you call GenDebugFontTex
- CGLMBuffer *m_debugFontIndices; // up to 1024 indices (256 chars times 4)
- CGLMBuffer *m_debugFontVertices; // up to 1024 verts
-
- // batch/frame debugging support
- int m_debugFrameIndex; // init to -1. Increment at BeginFrame
- int m_debugBatchIndex; // init to -1. Increment at any draw call
-
-#if GLMDEBUG
- // interactive (DebugHook) debug support
-
- // using these you can implement frame advance, batch single step, and batch rewind (let it run til next frame and hold on prev batch #)
- int m_holdFrameBegin; // -1 if no hold req'd, otherwise # of frame to hold at (at beginframe time)
- int m_holdFrameEnd; // -1 if no hold req'd, otherwise # of frame to hold at (at endframe time)
-
- int m_holdBatch,m_holdBatchFrame; // -1 if no hold, else # of batch&frame to hold at (both must be set)
- // these can be expired/cleared to -1 if the frame passes without a hit
- // may be desirable to re-pause in that event, as user was expecting a hold to occur
-
- bool m_debugDelayEnable; // allow sleep delay
- uint m_debugDelay; // sleep time per hook call in microseconds (for usleep())
-
- // pre-draw global toggles / options
- bool m_autoClearColor,m_autoClearDepth,m_autoClearStencil;
- float m_autoClearColorValues[4];
-
- // debug knobs
- int m_selKnobIndex;
- float m_selKnobMinValue,m_selKnobMaxValue,m_selKnobIncrement;
-#endif
-
-};
-
-struct GLMTestParams
-{
- GLMContext *m_ctx;
- int *m_testList; // -1 termed
-
- bool m_glErrToDebugger;
- bool m_glErrToConsole;
-
- bool m_intlErrToDebugger;
- bool m_intlErrToConsole;
-
- int m_frameCount; // how many frames to test.
-};
-
-class GLMTester
-{
- public:
-
- GLMTester(GLMTestParams *params);
- ~GLMTester();
-
-
- // optionally callable by test routines to get basic drawables wired up
- void StdSetup( void );
- void StdCleanup( void );
-
- // callable by test routines to clear the frame or present it
- void Clear( void );
- void Present( int seed );
-
- // error reporting
- void CheckGLError( char *comment ); // obey m_params setting for console / debugger response
- void InternalError( int errcode, char *comment ); // if errcode!=0, obey m_params setting for console / debugger response
-
- void RunTests();
-
- void RunOneTest( int testindex );
-
- // test routines themselves
- void Test0();
- void Test1();
- void Test2();
- void Test3();
-
- GLMTestParams m_params; // copy of caller's params, do not mutate...
-
- // std-setup stuff
- int m_drawWidth, m_drawHeight;
- CGLMFBO *m_drawFBO;
- CGLMTex *m_drawColorTex;
- CGLMTex *m_drawDepthTex;
-};
-
-class CShowPixelsParams
-{
-public:
- GLuint m_srcTexName;
- int m_width,m_height;
- bool m_vsyncEnable;
- bool m_fsEnable; // want receiving view to be full screen. for now, just target the main screen. extend later.
- bool m_useBlit; // use FBO blit - sending context says it is available.
- bool m_noBlit; // the back buffer has already been populated by the caller (perhaps via direct MSAA resolve from multisampled RT tex)
- bool m_onlySyncView; // react to full/windowed state change only, do not present bits
-};
-
-
-#define kMaxCrawlFrames 100
-#define kMaxCrawlText (kMaxCrawlFrames * 256)
-class CStackCrawlParams
-{
- public:
- uint m_frameLimit; // input: max frames to retrieve
- uint m_frameCount; // output: frames found
- void *m_crawl[kMaxCrawlFrames]; // call site addresses
- char *m_crawlNames[kMaxCrawlFrames]; // pointers into text following, one per decoded name
- char m_crawlText[kMaxCrawlText];
-};
-
-#endif
+//
+// glmgr.h
+// singleton class, common basis for managing GL contexts
+// responsible for tracking adapters and contexts
+//
+//===============================================================================
+
+#ifndef GLMGR_H
+#define GLMGR_H
+
+#pragma once
+
+#undef HAVE_GL_ARB_SYNC
+#ifdef LINUX
+#define HAVE_GL_ARB_SYNC 1
+#endif
+
+#include "glentrypoints.h"
+#include "glmdebug.h"
+#include "glmdisplay.h"
+#include "glmgrext.h"
+#include "glmgrbasics.h"
+#include "cglmtex.h"
+#include "cglmfbo.h"
+#include "cglmprogram.h"
+#include "cglmbuffer.h"
+#include "cglmquery.h"
+
+#include "tier0/vprof_telemetry.h"
+#include "materialsystem/ishader.h"
+#include "dxabstract_types.h"
+
+
+#ifdef LINUX
+#define Debugger DebuggerBreak
+#undef CurrentTime
+
+// prevent some conflicts in SDL headers...
+#undef M_PI
+#include <stdint.h>
+#ifndef _STDINT_H_
+#define _STDINT_H_ 1
+#endif
+
+#include "SDL/SDL.h"
+#endif
+
+//===============================================================================
+// glue to call out to Obj-C land (these are in glmgrcocoa.mm)
+#ifdef OSX
+PseudoNSGLContextPtr GetCurrentNSGLContext( );
+CGLContextObj GetCGLContextFromNSGL( PseudoNSGLContextPtr nsglCtx );
+#endif
+
+#include "tier0/dynfunction.h"
+
+//===============================================================================
+
+// parrot the D3D present parameters, more or less... "adapter" translates into "active display index" per the m_activeDisplayCount below.
+class GLMDisplayParams
+{
+ public:
+
+ // presumption, these indices are in sync with the current display DB that GLMgr has handy
+ //int m_rendererIndex; // index of renderer (-1 if root context)
+ //int m_displayIndex; // index of display in renderer - for FS
+ //int m_modeIndex; // index of mode in display - for FS
+
+ void *m_focusWindow; // (VD3DHWND aka WindowRef) - what window does this context display into
+
+ bool m_fsEnable; // fullscreen on or not
+ bool m_vsyncEnable; // vsync on or not
+
+ // height and width have to match the display mode info if full screen.
+
+ uint m_backBufferWidth; // pixel width (aka screen h-resolution if full screen)
+ uint m_backBufferHeight; // pixel height (aka screen v-resolution if full screen)
+ D3DFORMAT m_backBufferFormat; // pixel format
+ uint m_multiSampleCount; // 0 means no MSAA, 2 means 2x MSAA, etc
+ // uint m_multiSampleQuality; // no MSAA quality control yet
+
+ bool m_enableAutoDepthStencil; // generally set to 'TRUE' per CShaderDeviceDx8::SetPresentParameters
+ D3DFORMAT m_autoDepthStencilFormat;
+
+ uint m_fsRefreshHz; // if full screen, this refresh rate (likely 0 for LCD's)
+
+ //uint m_rootRendererID; // only used if m_rendererIndex is -1.
+ //uint m_rootDisplayMask; // only used if m_rendererIndex is -1.
+
+ bool m_mtgl; // enable multi threaded GL driver
+};
+
+//===============================================================================
+
+class GLMgr
+{
+public:
+
+ //===========================================================================
+ // class methods - singleton
+ static void NewGLMgr( void ); // instantiate singleton..
+ static GLMgr *aGLMgr( void ); // return singleton..
+ static void DelGLMgr( void ); // tear down singleton..
+
+ //===========================================================================
+ // plain methods
+
+ #if 0 // turned all these off while new approach is coded
+ void RefreshDisplayDB( void ); // blow away old display DB, make a new one
+ GLMDisplayDB *GetDisplayDB( void ); // get a ptr to the one GLMgr keeps. only valid til next refresh.
+
+ // eligible renderers will be ranked by desirability starting at index 0 within the db
+ // within each renderer, eligible displays will be ranked some kind of desirability (area? dist from menu bar?)
+ // within each display, eligible modes will be ranked by descending areas
+
+ // calls supplying indices are implicitly making reference to the current DB
+ bool CaptureDisplay( int rendIndex, int displayIndex, bool captureAll ); // capture one display or all displays
+ void ReleaseDisplays( void ); // release all captures
+
+ int GetDisplayMode( int rendIndex, int displayIndex ); // retrieve current display res (returns modeIndex)
+ void SetDisplayMode( GLMDisplayParams *params ); // set the display res (only useful for FS)
+ #endif
+
+ GLMContext *NewContext( GLMDisplayParams *params ); // this will have to change
+ void DelContext( GLMContext *context );
+
+ // with usage of CGLMacro.h we could dispense with the "current context" thing
+ // and just declare a member variable of GLMContext, allowing each glXXX call to be routed directly
+ // to the correct context
+ void SetCurrentContext( GLMContext *context ); // make current in calling thread only
+ GLMContext *GetCurrentContext( void );
+
+protected:
+ friend class GLMContext;
+
+ GLMgr();
+ ~GLMgr();
+};
+
+
+//===========================================================================//
+
+// helper function to do enable or disable in one step
+inline void glSetEnable( GLenum which, bool enable )
+{
+ if (enable)
+ gGL->glEnable(which);
+ else
+ gGL->glDisable(which);
+}
+
+// helper function for int vs enum clarity
+inline void glGetEnumv( GLenum which, GLenum *dst )
+{
+ gGL->glGetIntegerv( which, (int*)dst );
+}
+
+//===========================================================================//
+//
+// types to support the GLMContext
+//
+//===========================================================================//
+
+// Each state set/get path we are providing caching for, needs its own struct and a comparison operator.
+// we also provide an enum of how many such types there are, handy for building dirty masks etc.
+
+// shorthand macros
+#define EQ(fff) ( (src.fff) == (fff) )
+
+//rasterizer
+struct GLAlphaTestEnable_t { GLint enable; bool operator==(const GLAlphaTestEnable_t& src) const { return EQ(enable); } };
+struct GLAlphaTestFunc_t { GLenum func; GLclampf ref; bool operator==(const GLAlphaTestFunc_t& src) const { return EQ(func) && EQ(ref); } };
+struct GLCullFaceEnable_t { GLint enable; bool operator==(const GLCullFaceEnable_t& src) const { return EQ(enable); } };
+struct GLCullFrontFace_t { GLenum value; bool operator==(const GLCullFrontFace_t& src) const { return EQ(value); } };
+struct GLPolygonMode_t { GLenum values[2]; bool operator==(const GLPolygonMode_t& src) const { return EQ(values[0]) && EQ(values[1]); } };
+struct GLDepthBias_t { GLfloat factor; GLfloat units; bool operator==(const GLDepthBias_t& src) const { return EQ(factor) && EQ(units); } };
+struct GLScissorEnable_t { GLint enable; bool operator==(const GLScissorEnable_t& src) const { return EQ(enable); } };
+struct GLScissorBox_t { GLint x,y; GLsizei width, height; bool operator==(const GLScissorBox_t& src) const { return EQ(x) && EQ(y) && EQ(width) && EQ(height); } };
+struct GLAlphaToCoverageEnable_t{ GLint enable; bool operator==(const GLAlphaToCoverageEnable_t& src) const { return EQ(enable); } };
+struct GLViewportBox_t { GLint x,y; GLsizei width, height; bool operator==(const GLViewportBox_t& src) const { return EQ(x) && EQ(y) && EQ(width) && EQ(height); } };
+struct GLViewportDepthRange_t { GLdouble near,far; bool operator==(const GLViewportDepthRange_t& src) const { return EQ(near) && EQ(far); } };
+struct GLClipPlaneEnable_t { GLint enable; bool operator==(const GLClipPlaneEnable_t& src) const { return EQ(enable); } };
+struct GLClipPlaneEquation_t { GLfloat x,y,z,w; bool operator==(const GLClipPlaneEquation_t& src) const { return EQ(x) && EQ(y) && EQ(z) && EQ(w); } };
+
+//blend
+struct GLColorMaskSingle_t { char r,g,b,a; bool operator==(const GLColorMaskSingle_t& src) const { return EQ(r) && EQ(g) && EQ(b) && EQ(a); } };
+struct GLColorMaskMultiple_t { char r,g,b,a; bool operator==(const GLColorMaskMultiple_t& src) const { return EQ(r) && EQ(g) && EQ(b) && EQ(a); } };
+struct GLBlendEnable_t { GLint enable; bool operator==(const GLBlendEnable_t& src) const { return EQ(enable); } };
+struct GLBlendFactor_t { GLenum srcfactor,dstfactor; bool operator==(const GLBlendFactor_t& src) const { return EQ(srcfactor) && EQ(dstfactor); } };
+struct GLBlendEquation_t { GLenum equation; bool operator==(const GLBlendEquation_t& src) const { return EQ(equation); } };
+struct GLBlendColor_t { GLfloat r,g,b,a; bool operator==(const GLBlendColor_t& src) const { return EQ(r) && EQ(g) && EQ(b) && EQ(a); } };
+struct GLBlendEnableSRGB_t { GLint enable; bool operator==(const GLBlendEnableSRGB_t& src) const { return EQ(enable); } };
+
+//depth
+struct GLDepthTestEnable_t { GLint enable; bool operator==(const GLDepthTestEnable_t& src) const { return EQ(enable); } };
+struct GLDepthFunc_t { GLenum func; bool operator==(const GLDepthFunc_t& src) const { return EQ(func); } };
+struct GLDepthMask_t { char mask; bool operator==(const GLDepthMask_t& src) const { return EQ(mask); } };
+
+//stencil
+struct GLStencilTestEnable_t { GLint enable; bool operator==(const GLStencilTestEnable_t& src) const { return EQ(enable); } };
+struct GLStencilFunc_t { GLenum frontfunc, backfunc; GLint ref; GLuint mask; bool operator==(const GLStencilFunc_t& src) const { return EQ(frontfunc) && EQ(backfunc) && EQ(ref) && EQ(mask); } };
+struct GLStencilOp_t { GLenum sfail; GLenum dpfail; GLenum dppass; bool operator==(const GLStencilOp_t& src) const { return EQ(sfail) && EQ(dpfail) && EQ(dppass); } };
+struct GLStencilWriteMask_t { GLint mask; bool operator==(const GLStencilWriteMask_t& src) const { return EQ(mask); } };
+
+//clearing
+struct GLClearColor_t { GLfloat r,g,b,a; bool operator==(const GLClearColor_t& src) const { return EQ(r) && EQ(g) && EQ(b) && EQ(a); } };
+struct GLClearDepth_t { GLdouble d; bool operator==(const GLClearDepth_t& src) const { return EQ(d); } };
+struct GLClearStencil_t { GLint s; bool operator==(const GLClearStencil_t& src) const { return EQ(s); } };
+
+#undef EQ
+
+enum EGLMStateBlockType
+{
+ kGLAlphaTestEnable,
+ kGLAlphaTestFunc,
+
+ kGLCullFaceEnable,
+ kGLCullFrontFace,
+
+ kGLPolygonMode,
+
+ kGLDepthBias,
+
+ kGLScissorEnable,
+ kGLScissorBox,
+
+ kGLViewportBox,
+ kGLViewportDepthRange,
+
+ kGLClipPlaneEnable,
+ kGLClipPlaneEquation,
+
+ kGLColorMaskSingle,
+ kGLColorMaskMultiple,
+
+ kGLBlendEnable,
+ kGLBlendFactor,
+ kGLBlendEquation,
+ kGLBlendColor,
+ kGLBlendEnableSRGB,
+
+ kGLDepthTestEnable,
+ kGLDepthFunc,
+ kGLDepthMask,
+
+ kGLStencilTestEnable,
+ kGLStencilFunc,
+ kGLStencilOp,
+ kGLStencilWriteMask,
+
+ kGLClearColor,
+ kGLClearDepth,
+ kGLClearStencil,
+
+ kGLAlphaToCoverageEnable,
+
+ kGLMStateBlockLimit
+};
+
+//===========================================================================//
+
+// templated functions representing GL R/W bottlenecks
+// one set of set/get/getdefault is instantiated for each of the GL*** types above.
+
+// use these from the non array state objects
+template<typename T> void GLContextSet( T *src );
+template<typename T> void GLContextGet( T *dst );
+template<typename T> void GLContextGetDefault( T *dst );
+
+// use these from the array state objects
+template<typename T> void GLContextSetIndexed( T *src, int index );
+template<typename T> void GLContextGetIndexed( T *dst, int index );
+template<typename T> void GLContextGetDefaultIndexed( T *dst, int index );
+
+//===========================================================================//
+
+// caching state object template. One of these is instantiated in the context per unique struct type above
+template<typename T> class GLState
+{
+ public:
+
+ GLState<T>()
+ {
+ dirty = false;
+ memset( &data, 0, sizeof(data) );
+ };
+
+ // write: client src into cache
+ // common case is both false. dirty is calculated, context write is deferred.
+ void Write( T *src, bool noCompare=false, bool noDefer=false )
+ {
+ if (noCompare)
+ {
+ dirty = true;
+ }
+ else
+ {
+ // only == is implemented, so test for equal and negate
+ // note, you only set dirty if mismatch, you never clear it until flush
+ if ( !(data == *src) )
+ {
+ dirty = true;
+ }
+ }
+
+ data = *src;
+
+ if (noDefer)
+ {
+ Flush( true ); // dirty becomes false
+ }
+ };
+
+ // write cache->context if dirty or forced.
+ void Flush( bool noDefer=false )
+ {
+ if (dirty || noDefer)
+ {
+ GLContextSet( &data );
+ GLMCheckError();
+ // good place for some error checking here
+ dirty = false;
+ }
+ };
+
+ // default: write default value to cache, optionally write through
+ void Default( bool noDefer=false )
+ {
+ GLContextGetDefault( &data ); // read default values directly to our cache copy
+ dirty = true;
+ Flush(noDefer);
+ };
+
+ // read: sel = 0 for cache, 1 for context
+ void Read( T *dst, int sel )
+ {
+ if (sel==0)
+ {
+ *dst = data;
+ }
+ else
+ {
+ GLContextGet( dst );
+ GLMCheckError();
+ }
+ };
+
+ // check: verify that context equals cache, return true if mismatched or if illegal values seen
+ bool Check ( void )
+ {
+ T temp;
+ bool result;
+
+ GLContextGet( &temp );
+ GLMCheckError();
+ result = !(temp == data);
+ return result;
+ };
+
+ protected:
+ T data;
+ bool dirty;
+};
+
+// caching state object template - with multiple values behind it that are indexed
+template<typename T, int COUNT> class GLStateArray
+{
+ public:
+
+ GLStateArray<T,COUNT>()
+ {
+ memset( &dirty, 0, sizeof(dirty) );
+ memset( &data, 0, sizeof(data) );
+ };
+
+ // write: client src into cache
+ // common case is both false. dirty is calculated, context write is deferred.
+ void WriteIndex( T *src, int index, bool noCompare=false, bool noDefer=false )
+ {
+ if (noCompare)
+ {
+ dirty[index] = true;
+ }
+ else
+ {
+ // only == is implemented, so test for equal and negate
+ // note, you only set dirty if mismatch, you never clear it until flush
+ if (! (data[index] == *src) )
+ {
+ dirty[index] = true;
+ }
+ }
+
+ data[index] = *src;
+
+ if (noDefer)
+ {
+ FlushIndex( index, true ); // dirty becomes false
+ }
+ };
+
+ // write cache->context if dirty or forced.
+ void FlushIndex( int index, bool noDefer=false )
+ {
+ if (dirty[index] || noDefer)
+ {
+ GLContextSetIndexed( &data[index], index );
+ GLMCheckError();
+ dirty[index] = false;
+ }
+ };
+
+ // write all slots in the array
+ void Flush( bool noDefer=false )
+ {
+ for( int i=0; i<COUNT; i++)
+ {
+ FlushIndex( i, noDefer );
+ }
+ }
+
+ // default: write default value to cache, optionally write through
+ void DefaultIndex( int index, bool noDefer=false )
+ {
+ GLContextGetDefaultIndexed( &data[index], index ); // read default values directly to our cache copy
+ dirty[index] = true;
+ Flush(noDefer);
+ };
+
+ void Default( void )
+ {
+ for( int i=0; i<COUNT; i++)
+ {
+ DefaultIndex( i );
+ }
+ }
+
+ // read: sel = 0 for cache, 1 for context
+ void ReadIndex( T *dst, int index, int sel )
+ {
+ if (sel==0)
+ {
+ *dst = data[index];
+ }
+ else
+ {
+ GLContextGetIndexed( dst, index );
+ GLMCheckError();
+ }
+ };
+
+ // check: verify that context equals cache, return true if mismatched or if illegal values seen
+ bool CheckIndex( int index )
+ {
+ T temp;
+ bool result;
+
+ GLContextGetIndexed( &temp, index );
+ GLMCheckError();
+ result = !(temp == data[index]);
+
+ return result;
+ };
+
+ bool Check( void )
+ {
+ T temp;
+ bool result = false;
+
+ for( int i=0; i<COUNT; i++)
+ {
+ result |= CheckIndex( i );
+ }
+
+ return result;
+ };
+
+ protected:
+ T data [COUNT];
+ bool dirty [COUNT];
+};
+
+
+//===========================================================================//
+
+struct GLMTexSampler
+{
+ GLMTexSamplingParams m_samp;
+ CGLMTex *m_drawTex; // tex which must be bound at time of draw
+ CGLMTex *m_boundTex; // tex which is actually bound now (if does not match, a rebind is needed to draw)
+};
+
+#ifdef NEVER
+//===========================================================================//
+
+enum GLMVertexAttributeIndex
+{
+ kGLMGenericAttr00 = 0,
+ kGLMGenericAttr01,
+ kGLMGenericAttr02,
+ kGLMGenericAttr03,
+ kGLMGenericAttr04,
+ kGLMGenericAttr05,
+ kGLMGenericAttr06,
+ kGLMGenericAttr07,
+ kGLMGenericAttr08,
+ kGLMGenericAttr09,
+ kGLMGenericAttr10,
+ kGLMGenericAttr11,
+ kGLMGenericAttr12,
+ kGLMGenericAttr13,
+ kGLMGenericAttr14,
+ kGLMGenericAttr15,
+
+ kGLMVertexAttributeIndexMax // ideally < 32
+};
+
+struct GLMVertexAttributeDesc // all the info you need to do vertex setup for one attribute
+{
+ CGLMBuffer *m_buffer; // NULL allowed in which case m_offset is the full 32-bit pointer.. so you can draw from plain RAM if desired
+ GLuint m_datasize; // comp count of the attribute (1-4)
+ GLenum m_datatype; // data type of the attribute (GL_FLOAT, GL_UNSIGNED_BYTE, etc)
+ GLuint m_stride;
+ GLuint m_offset; // net offset to attribute 'zero' within the buffer.
+ GLboolean m_normalized; // apply to any fixed point data that needs normalizing, esp color bytes
+
+ // may need a seed value at some point to be able to disambiguate re-lifed buffers holding same pointer
+ // simpler alternative is to do shoot-down inside the vertex/index buffer free calls.
+ // I'd rather not have to have each attribute fiddling a ref count on the buffer to which it refers..
+
+#define EQ(fff) ( (src.fff) == (fff) )
+ // test in decreasing order of likelihood of difference, but do not include the buffer revision as caller is not supplying it..
+ bool operator==(const GLMVertexAttributeDesc& src) const { return EQ(m_buffer) && EQ(m_offset) && EQ(m_stride) && EQ(m_datatype) && EQ(m_normalized) && EQ(m_datasize); }
+#undef EQ
+
+ uint m_bufferRevision; // only set in GLM context's copy, to disambiguate references that are same offset / same buffer but cross an orphan event
+};
+
+// GLMContext will maintain one of these structures inside the context to represent the current state.
+// Client can supply a new one when it wants to change the setup.
+//FIXME GLMContext can do the work to migrate from old setup to new setup as efficiently as possible (but it doesn't yet)
+#endif
+
+struct GLMVertexSetup
+{
+ uint m_attrMask; // which attrs are enabled (1<<n) mask where n is a GLMVertexAttributeIndex.
+
+ GLMVertexAttributeDesc m_attrs[ kGLMVertexAttributeIndexMax ];
+
+ // copied in from dxabstract, not strictly needed for operation, helps debugging
+ unsigned char m_vtxAttribMap[16];
+
+ /* high nibble is usage per _D3DDECLUSAGE
+ typedef enum _D3DDECLUSAGE
+ {
+ D3DDECLUSAGE_POSITION = 0,
+ D3DDECLUSAGE_BLENDWEIGHT = 1,
+ D3DDECLUSAGE_BLENDINDICES = 2,
+ D3DDECLUSAGE_NORMAL = 3,
+ D3DDECLUSAGE_PSIZE = 4,
+ D3DDECLUSAGE_TEXCOORD = 5,
+ D3DDECLUSAGE_TANGENT = 6,
+ D3DDECLUSAGE_BINORMAL = 7,
+ D3DDECLUSAGE_TESSFACTOR = 8,
+ D3DDECLUSAGE_PLUGH = 9, // mystery value
+ D3DDECLUSAGE_COLOR = 10,
+ D3DDECLUSAGE_FOG = 11,
+ D3DDECLUSAGE_DEPTH = 12,
+ D3DDECLUSAGE_SAMPLE = 13,
+ } D3DDECLUSAGE;
+
+ low nibble is usageindex (i.e. POSITION0, POSITION1, etc)
+ array position is attrib number.
+ */
+};
+
+//===========================================================================//
+
+//FIXME magic numbers here
+
+#define kGLMProgramParamFloat4Limit 256
+#define kGLMProgramParamBoolLimit 16
+#define kGLMProgramParamInt4Limit 16
+
+#define kGLMVertexProgramParamFloat4Limit 256
+#define kGLMFragmentProgramParamFloat4Limit 32
+
+struct GLMProgramParamsF
+{
+ float m_values[kGLMProgramParamFloat4Limit][4]; // float4's 256 of them
+ uint m_dirtySlotCount; // index of slot past highest dirty (assume 0 for base of range)
+};
+
+struct GLMProgramParamsB
+{
+ int m_values[kGLMProgramParamBoolLimit]; // bools, 4 of them
+ uint m_dirtySlotCount;
+};
+
+struct GLMProgramParamsI
+{
+ int m_values[kGLMProgramParamInt4Limit][4]; // int4s, 16 of them
+ uint m_dirtySlotCount;
+};
+
+enum EGLMParamWriteMode
+{
+ eParamWriteAllSlots, // glUniform4fv of the maximum size (not recommended if shader is down-sizing the decl)
+ eParamWriteShaderSlots, // glUniform4fv of the active slot count ("highwater")
+ eParamWriteShaderSlotsOptional, // glUniform4fv of the active slot count ("highwater") - but only if at least one has been written - it's optional
+ eParamWriteDirtySlotRange // glUniform4fv of the 0-N range where N is highest dirty slot
+};
+
+enum EGLMAttribWriteMode
+{
+ eAttribWriteAll,
+ eAttribWriteDirty
+};
+
+//===========================================================================//
+
+#if GLMDEBUG
+enum EGLMDebugCallSite
+{
+ eBeginFrame, // inside begin frame func - frame number has been inc'd, batch number should be -1
+ eClear, // inside clear func
+ eDrawElements, // inside repeat loop, prior to draw call - batch numberhas been inc'd
+ eEndFrame, // end frame
+ ePresent // before showing pixels
+};
+
+// caller should zero one of these out and fill in the m_caller before invoking the hook
+struct GLMDebugHookInfo
+{
+ // info from the caller to the debug hook
+ EGLMDebugCallSite m_caller;
+
+
+ // state the hook uses to keep track of progress within a single run of the caller
+ int m_iteration; // which call to the hook is this. if it's zero, it precedes any action in the caller.
+
+
+ // bools used to communicate between caller and hook
+ bool m_loop; // hook tells caller to loop around again (don't exit)
+ bool m_holding; // current mood of hook, are we holding on this batch (i.e. rerun)
+
+ // specific info for a draw call
+ GLenum m_drawMode;
+ GLuint m_drawStart;
+ GLuint m_drawEnd;
+ GLsizei m_drawCount;
+ GLenum m_drawType;
+ const GLvoid *m_drawIndices;
+};
+#endif
+
+//===========================================================================//
+
+#define kGLMUserClipPlanes 2
+#define kGLMScratchFBOCount 4
+
+class GLMContext
+{
+ public:
+ // set/check current context (perq for many other calls)
+ void MakeCurrent( bool bRenderThread = false );
+ void ReleaseCurrent( bool bRenderThread = false );
+
+ // CheckCurrent has been removed (it no longer compiled). To minimize churn I'm leaving
+ // the inline NOP version.
+ // DO NOT change this to non-inlined. It's called all over the place from very hot codepaths.
+ FORCEINLINE void CheckCurrent( void ) { }
+
+ void PopulateCaps( void ); // fill out later portions of renderer info record which need context queries
+ void DumpCaps( void ); // printf all the caps info (you can call this in release too)
+ const GLMRendererInfoFields& Caps( void ); // peek at the caps record
+
+ // state cache/mirror
+ void SetDefaultStates( void );
+ void FlushStates( bool noDefer = false );
+ void VerifyStates( void );
+
+ // textures
+ // Lock and Unlock reqs go directly to the tex object
+ CGLMTex *NewTex( GLMTexLayoutKey *key, char *debugLabel=NULL );
+ void DelTex( CGLMTex *tex );
+
+ // options for Blit (replacement for ResolveTex and BlitTex)
+ // pass NULL for dstTex if you want to target GL_BACK with the blit. You get y-flip with that, don't change the dstrect yourself.
+ void Blit2( CGLMTex *srcTex, GLMRect *srcRect, int srcFace, int srcMip, CGLMTex *dstTex, GLMRect *dstRect, int dstFace, int dstMip, uint filter );
+
+ // tex blit (via FBO blit)
+ void BlitTex( CGLMTex *srcTex, GLMRect *srcRect, int srcFace, int srcMip, CGLMTex *dstTex, GLMRect *dstRect, int dstFace, int dstMip, uint filter, bool useBlitFB = true );
+
+ // MSAA resolve - we do this in GLMContext because it has to do a bunch of FBO/blit gymnastics
+ void ResolveTex( CGLMTex *tex, bool forceDirty=false );
+
+ // texture pre-load (residency forcing) - normally done one-time but you can force it
+ void PreloadTex( CGLMTex *tex, bool force=false );
+
+ // samplers
+ void SetSamplerTex( int sampler, CGLMTex *tex );
+ void SetSamplerParams( int sampler, GLMTexSamplingParams *params );
+
+ // render targets (FBO's)
+ CGLMFBO *NewFBO( void );
+ void DelFBO( CGLMFBO *fbo );
+ void SetDrawingFBO( CGLMFBO *fbo ); // as with samplers, the notion of the target FBO is latched til draw time and then checked
+
+ // programs
+ CGLMProgram *NewProgram( EGLMProgramType type, char *progString );
+ void DelProgram( CGLMProgram *prog );
+ void NullProgram( void ); // de-ac all shader state
+
+ void SetDrawingProgram( EGLMProgramType type, CGLMProgram *prog ); // set NULL for no program
+ void SetDrawingLang( EGLMProgramLang lang, bool immediate=false ); // choose ARB or GLSL. immediate=false defers lang change to top of frame
+
+ void LinkShaderPair( CGLMProgram *vp, CGLMProgram *fp ); // ensure this combo has been linked and is in the GLSL pair cache
+ void ClearShaderPairCache( void ); // call this to shoot down all the linked pairs
+ void QueryShaderPair( int index, GLMShaderPairInfo *infoOut ); // this lets you query the shader pair cache for saving its state
+
+ // buffers
+ // Lock and Unlock reqs go directly to the buffer object
+ CGLMBuffer *NewBuffer( EGLMBufferType type, uint size, uint options );
+ void DelBuffer( CGLMBuffer *buff );
+
+ void SetIndexBuffer( CGLMBuffer *buff );
+ void SetVertexAttributes( GLMVertexSetup *setup );
+ // note, no API is exposed for setting a single attribute source.
+ // come prepared with a complete block of attributes to use.
+
+ // Queries
+ CGLMQuery *NewQuery( GLMQueryParams *params );
+ void DelQuery( CGLMQuery *query );
+
+ // "slot" means a vec4-sized thing
+ // these write into .env parameter space
+ void SetProgramParametersF( EGLMProgramType type, uint baseSlot, float *slotData, uint slotCount ); // take vec4f's
+ void SetProgramParametersB( EGLMProgramType type, uint baseSlot, int *slotData, uint boolCount ); // take "BOOL" aka int
+ void SetProgramParametersI( EGLMProgramType type, uint baseSlot, int *slotData, uint slotCount ); // take int4s
+
+ // state sync
+ void FlushDrawStates( bool shadersOn=true ); // pushes all drawing state - samplers, tex, programs, etc.
+
+ // drawing
+ void DrawRangeElements( GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices );
+ void CheckNative( void );
+
+ // clearing
+ void Clear( bool color, unsigned long colorValue, bool depth, float depthValue, bool stencil, unsigned int stencilValue, GLScissorBox_t *rect = NULL );
+
+ // display
+ //void SetVSyncEnable( bool vsyncOn );
+ //void SetFullScreen( bool fsOn, int screenIndex ); // will be latched for next BeginFrame
+ //void ActivateFullScreen( bool fsOn, int screenIndex ); // will be called by BeginFrame
+ bool SetDisplayParams( GLMDisplayParams *params ); // either the first time setup, or a change to new setup
+
+ void Present( CGLMTex *tex ); // somewhat hardwired for the time being
+
+ // mode switch / reset
+ void Reset( void ); // not a lot of args for now..
+
+ // writers for the state block inputs
+
+ void WriteAlphaTestEnable ( GLAlphaTestEnable_t *src );
+ void WriteAlphaTestFunc ( GLAlphaTestFunc_t *src );
+ void WriteCullFaceEnable ( GLCullFaceEnable_t *src );
+ void WriteCullFrontFace ( GLCullFrontFace_t *src );
+ void WritePolygonMode ( GLPolygonMode_t *src );
+ void WriteDepthBias ( GLDepthBias_t *src );
+ void WriteClipPlaneEnable ( GLClipPlaneEnable_t *src, int which );
+ void WriteClipPlaneEquation ( GLClipPlaneEquation_t *src, int which );
+ void WriteScissorEnable ( GLScissorEnable_t *src );
+ void WriteScissorBox ( GLScissorBox_t *src );
+ void WriteAlphaToCoverageEnable ( GLAlphaToCoverageEnable_t *src );
+ void WriteViewportBox ( GLViewportBox_t *src );
+ void WriteViewportDepthRange ( GLViewportDepthRange_t *src );
+ void WriteColorMaskSingle ( GLColorMaskSingle_t *src );
+ void WriteColorMaskMultiple ( GLColorMaskMultiple_t *src, int which );
+ void WriteBlendEnable ( GLBlendEnable_t *src );
+ void WriteBlendFactor ( GLBlendFactor_t *src );
+ void WriteBlendEquation ( GLBlendEquation_t *src );
+ void WriteBlendColor ( GLBlendColor_t *src );
+ void WriteBlendEnableSRGB ( GLBlendEnableSRGB_t *src );
+ void WriteDepthTestEnable ( GLDepthTestEnable_t *src );
+ void WriteDepthFunc ( GLDepthFunc_t *src );
+ void WriteDepthMask ( GLDepthMask_t *src );
+ void WriteStencilTestEnable ( GLStencilTestEnable_t *src );
+ void WriteStencilFunc ( GLStencilFunc_t *src );
+ void WriteStencilOp ( GLStencilOp_t *src, int which );
+ void WriteStencilWriteMask ( GLStencilWriteMask_t *src );
+ void WriteClearColor ( GLClearColor_t *src );
+ void WriteClearDepth ( GLClearDepth_t *src );
+ void WriteClearStencil ( GLClearStencil_t *src );
+
+
+ // debug stuff
+ void BeginFrame( void );
+ void EndFrame( void );
+
+ // new interactive debug stuff
+#if GLMDEBUG
+ void DebugDump( GLMDebugHookInfo *info, uint options, uint vertDumpMode );
+ void DebugHook( GLMDebugHookInfo *info );
+ void DebugPresent( void );
+ void DebugClear( void );
+#endif
+
+ FORCEINLINE DWORD GetCurrentOwnerThreadId() const { return m_nCurOwnerThreadId; }
+
+ protected:
+ friend class GLMgr; // only GLMgr can make GLMContext objects
+ friend class GLMRendererInfo; // only GLMgr can make GLMContext objects
+ friend class CGLMTex; // tex needs to be able to do binds
+ friend class CGLMFBO; // fbo needs to be able to do binds
+ friend class CGLMProgram;
+ friend class CGLMShaderPair;
+ friend class CGLMShaderPairCache;
+ friend class CGLMBuffer;
+ friend class GLMTester; // tester class needs access back into GLMContext
+
+ friend class IDirect3D9;
+ friend class IDirect3DDevice9;
+
+ // methods------------------------------------------
+
+ // old GLMContext( GLint displayMask, GLint rendererID, PseudoNSGLContextPtr nsglShareCtx );
+ GLMContext( GLMDisplayParams *params );
+ ~GLMContext();
+
+ // textures
+ void SelectTMU( int tmu ); // wrapper for glActiveTexture()
+ int BindTexToTMU( CGLMTex *tex, int tmu, bool noCheck=false );
+
+ // render targets / FBO's
+ void BindFBOToCtx( CGLMFBO *fbo, GLenum bindPoint = GL_FRAMEBUFFER_EXT ); // you can also choose GL_READ_FRAMEBUFFER_EXT / GL_DRAW_FRAMEBUFFER_EXT
+
+ // programs
+ //void BindProgramToCtx( EGLMProgramType type, CGLMProgram *prog ); // will set program mode enable appropriately
+
+ // buffers
+ void BindBufferToCtx( EGLMBufferType type, CGLMBuffer *buff, bool force = false ); // does not twiddle any enables.
+
+ // debug font
+ void GenDebugFontTex( void );
+ void DrawDebugText( float x, float y, float z, float drawCharWidth, float drawCharHeight, char *string );
+
+ // members------------------------------------------
+
+ // context
+ DWORD m_nCurOwnerThreadId;
+
+ GLMRendererInfoFields m_caps;
+
+ bool m_displayParamsValid; // is there a param block copied in yet
+ GLMDisplayParams m_displayParams; // last known display config, either via constructor, or by SetDisplayParams...
+
+#if defined(USE_SDL)
+ int m_pixelFormatAttribs[100]; // more than enough
+ void * m_ctx;
+#endif
+
+ // texture form table
+ CGLMTexLayoutTable *m_texLayoutTable;
+
+ // context state mirrors
+
+ GLState<GLAlphaTestEnable_t> m_AlphaTestEnable;
+
+ GLState<GLAlphaTestFunc_t> m_AlphaTestFunc;
+
+ GLState<GLCullFaceEnable_t> m_CullFaceEnable;
+ GLState<GLCullFrontFace_t> m_CullFrontFace;
+ GLState<GLPolygonMode_t> m_PolygonMode;
+
+ GLState<GLDepthBias_t> m_DepthBias;
+
+ GLStateArray<GLClipPlaneEnable_t,kGLMUserClipPlanes> m_ClipPlaneEnable;
+ GLStateArray<GLClipPlaneEquation_t,kGLMUserClipPlanes> m_ClipPlaneEquation; // dxabstract puts them directly into param slot 253(0) and 254(1)
+
+ GLState<GLScissorEnable_t> m_ScissorEnable;
+ GLState<GLScissorBox_t> m_ScissorBox;
+
+ GLState<GLAlphaToCoverageEnable_t> m_AlphaToCoverageEnable;
+
+ GLState<GLViewportBox_t> m_ViewportBox;
+ GLState<GLViewportDepthRange_t> m_ViewportDepthRange;
+
+ GLState<GLColorMaskSingle_t> m_ColorMaskSingle;
+ GLStateArray<GLColorMaskMultiple_t,8> m_ColorMaskMultiple; // need an official constant for the color buffers limit
+
+ GLState<GLBlendEnable_t> m_BlendEnable;
+ GLState<GLBlendFactor_t> m_BlendFactor;
+ GLState<GLBlendEquation_t> m_BlendEquation;
+ GLState<GLBlendColor_t> m_BlendColor;
+ GLState<GLBlendEnableSRGB_t> m_BlendEnableSRGB; // write to this one to transmit intent to write SRGB encoded pixels to drawing FB
+ bool m_FakeBlendEnableSRGB; // writes to above will be shunted here if fake SRGB is in effect.
+
+ GLState<GLDepthTestEnable_t> m_DepthTestEnable;
+ GLState<GLDepthFunc_t> m_DepthFunc;
+ GLState<GLDepthMask_t> m_DepthMask;
+
+ GLState<GLStencilTestEnable_t> m_StencilTestEnable; // global stencil test enable
+ GLState<GLStencilFunc_t> m_StencilFunc; // holds front and back stencil funcs
+ GLStateArray<GLStencilOp_t,2> m_StencilOp; // indexed: 0=front 1=back
+ GLState<GLStencilWriteMask_t> m_StencilWriteMask;
+
+ GLState<GLClearColor_t> m_ClearColor;
+ GLState<GLClearDepth_t> m_ClearDepth;
+ GLState<GLClearStencil_t> m_ClearStencil;
+
+ // texture bindings and sampler setup
+ int m_activeTexture; // mirror for glActiveTexture
+ GLMTexSampler m_samplers[GLM_SAMPLER_COUNT];
+
+ // texture lock tracking - CGLMTex objects share usage of this
+ CUtlVector< GLMTexLockDesc > m_texLocks;
+
+ // render target binding - check before draw
+ // similar to tex sampler mechanism, we track "bound" from "chosen for drawing" separately,
+ // so binding for creation/setup need not disrupt any notion of what will be used at draw time
+
+ CGLMFBO *m_boundDrawFBO; // FBO on GL_DRAW_FRAMEBUFFER bind point
+ CGLMFBO *m_boundReadFBO; // FBO on GL_READ_FRAMEBUFFER bind point
+ // ^ both are set if you bind to GL_FRAMEBUFFER_EXT
+
+ CGLMFBO *m_drawingFBO; // what FBO should be bound at draw time (to both read/draw bp's).
+
+ CGLMFBO *m_blitReadFBO;
+ CGLMFBO *m_blitDrawFBO; // scratch FBO's for framebuffer blit
+
+ CGLMFBO *m_scratchFBO[ kGLMScratchFBOCount ]; // general purpose FBO's for internal use
+
+ CUtlVector< CGLMFBO* > m_fboTable; // each live FBO goes in the table
+
+ // program bindings
+ EGLMProgramLang m_drawingLangAtFrameStart; // selector for start of frame (spills into m_drawingLang)
+ EGLMProgramLang m_drawingLang; // selector for which language we desire to draw with on the next batch
+ CGLMProgram *m_drawingProgram[ kGLMNumProgramTypes ];
+
+ GLMProgramParamsF m_programParamsF[ kGLMNumProgramTypes ];
+ GLMProgramParamsB m_programParamsB[ kGLMNumProgramTypes ]; // two banks, but only the vertex one is used
+ GLMProgramParamsI m_programParamsI[ kGLMNumProgramTypes ]; // two banks, but only the vertex one is used
+ EGLMParamWriteMode m_paramWriteMode;
+
+ CGLMProgram *m_nullFragmentProgram; // write opaque black. Activate when caller asks for null FP
+
+ CGLMProgram *m_preloadTexVertexProgram; // programs to help preload textures (dummies)
+ CGLMProgram *m_preload2DTexFragmentProgram;
+ CGLMProgram *m_preload3DTexFragmentProgram;
+ CGLMProgram *m_preloadCubeTexFragmentProgram;
+
+ CGLMProgram *m_boundProgram[ kGLMNumProgramTypes ];
+
+ CGLMShaderPairCache *m_pairCache; // GLSL only
+ CGLMShaderPair *m_boundPair; // GLSL only
+ uint m_boundPairRevision; // GLSL only
+ GLhandleARB m_boundPairProgram; // GLSL only
+
+ // buffer bindings
+ CGLMBuffer *m_lastKnownBufferBinds[ kGLMNumBufferTypes ]; // tracked per bind point for dupe-bind-absorb
+ GLMVertexAttributeDesc m_lastKnownVertexAttribs[ kGLMVertexAttributeIndexMax ]; // tracked per attrib for dupe-set-absorb
+ uint m_lastKnownVertexAttribMask; // tracked for dupe-enable-absorb
+
+ CGLMBuffer *m_drawIndexBuffer; // ... ? do we need dupe tracking for index buffer setup? ?
+
+ GLMVertexSetup m_drawVertexSetup;
+
+ EGLMAttribWriteMode m_attribWriteMode;
+
+ bool m_slowCheckEnable; // turn this on or no native checking is done ("-glmassertslow" or "-glmsspewslow")
+ bool m_slowAssertEnable; // turn this on to assert on a non-native batch "-glmassertslow"
+ bool m_slowSpewEnable; // turn this on to log non-native batches to stdout "-glmspewslow"
+
+ // debug font texture
+ CGLMTex *m_debugFontTex; // might be NULL unless you call GenDebugFontTex
+ CGLMBuffer *m_debugFontIndices; // up to 1024 indices (256 chars times 4)
+ CGLMBuffer *m_debugFontVertices; // up to 1024 verts
+
+ // batch/frame debugging support
+ int m_debugFrameIndex; // init to -1. Increment at BeginFrame
+ int m_debugBatchIndex; // init to -1. Increment at any draw call
+
+#if GLMDEBUG
+ // interactive (DebugHook) debug support
+
+ // using these you can implement frame advance, batch single step, and batch rewind (let it run til next frame and hold on prev batch #)
+ int m_holdFrameBegin; // -1 if no hold req'd, otherwise # of frame to hold at (at beginframe time)
+ int m_holdFrameEnd; // -1 if no hold req'd, otherwise # of frame to hold at (at endframe time)
+
+ int m_holdBatch,m_holdBatchFrame; // -1 if no hold, else # of batch&frame to hold at (both must be set)
+ // these can be expired/cleared to -1 if the frame passes without a hit
+ // may be desirable to re-pause in that event, as user was expecting a hold to occur
+
+ bool m_debugDelayEnable; // allow sleep delay
+ uint m_debugDelay; // sleep time per hook call in microseconds (for usleep())
+
+ // pre-draw global toggles / options
+ bool m_autoClearColor,m_autoClearDepth,m_autoClearStencil;
+ float m_autoClearColorValues[4];
+
+ // debug knobs
+ int m_selKnobIndex;
+ float m_selKnobMinValue,m_selKnobMaxValue,m_selKnobIncrement;
+#endif
+
+};
+
+struct GLMTestParams
+{
+ GLMContext *m_ctx;
+ int *m_testList; // -1 termed
+
+ bool m_glErrToDebugger;
+ bool m_glErrToConsole;
+
+ bool m_intlErrToDebugger;
+ bool m_intlErrToConsole;
+
+ int m_frameCount; // how many frames to test.
+};
+
+class GLMTester
+{
+ public:
+
+ GLMTester(GLMTestParams *params);
+ ~GLMTester();
+
+
+ // optionally callable by test routines to get basic drawables wired up
+ void StdSetup( void );
+ void StdCleanup( void );
+
+ // callable by test routines to clear the frame or present it
+ void Clear( void );
+ void Present( int seed );
+
+ // error reporting
+ void CheckGLError( char *comment ); // obey m_params setting for console / debugger response
+ void InternalError( int errcode, char *comment ); // if errcode!=0, obey m_params setting for console / debugger response
+
+ void RunTests();
+
+ void RunOneTest( int testindex );
+
+ // test routines themselves
+ void Test0();
+ void Test1();
+ void Test2();
+ void Test3();
+
+ GLMTestParams m_params; // copy of caller's params, do not mutate...
+
+ // std-setup stuff
+ int m_drawWidth, m_drawHeight;
+ CGLMFBO *m_drawFBO;
+ CGLMTex *m_drawColorTex;
+ CGLMTex *m_drawDepthTex;
+};
+
+class CShowPixelsParams
+{
+public:
+ GLuint m_srcTexName;
+ int m_width,m_height;
+ bool m_vsyncEnable;
+ bool m_fsEnable; // want receiving view to be full screen. for now, just target the main screen. extend later.
+ bool m_useBlit; // use FBO blit - sending context says it is available.
+ bool m_noBlit; // the back buffer has already been populated by the caller (perhaps via direct MSAA resolve from multisampled RT tex)
+ bool m_onlySyncView; // react to full/windowed state change only, do not present bits
+};
+
+
+#define kMaxCrawlFrames 100
+#define kMaxCrawlText (kMaxCrawlFrames * 256)
+class CStackCrawlParams
+{
+ public:
+ uint m_frameLimit; // input: max frames to retrieve
+ uint m_frameCount; // output: frames found
+ void *m_crawl[kMaxCrawlFrames]; // call site addresses
+ char *m_crawlNames[kMaxCrawlFrames]; // pointers into text following, one per decoded name
+ char m_crawlText[kMaxCrawlText];
+};
+
+#endif
diff --git a/mp/src/public/togl/osx/glmgrbasics.h b/mp/src/public/togl/osx/glmgrbasics.h
index 78e41464..d446b512 100644
--- a/mp/src/public/togl/osx/glmgrbasics.h
+++ b/mp/src/public/togl/osx/glmgrbasics.h
@@ -1,299 +1,299 @@
//========= Copyright Valve Corporation, All rights reserved. ============//
-//
-// glmgrbasics.h
-// types, common headers, forward declarations, utilities
-//
-//===============================================================================
-
-#ifndef GLMBASICS_H
-#define GLMBASICS_H
-
-#pragma once
-
-#ifdef OSX
-#include <OpenGL/OpenGL.h>
-#include <OpenGL/gl.h>
-#include <OpenGL/glext.h>
-#include <OpenGL/CGLTypes.h>
-#include <OpenGL/CGLRenderers.h>
-#include <OpenGL/CGLCurrent.h>
-#include <OpenGL/CGLProfiler.h>
-//#include <ApplicationServices/ApplicationServices.h>
-#elif defined(LINUX)
-#include <GL/gl.h>
-#include <GL/glext.h>
-#else
-#error
-#endif
-
-#include "tier0/platform.h"
-
-#include "bitmap/imageformat.h"
-#include "bitvec.h"
-#include "tier1/checksum_md5.h"
-#include "tier1/utlvector.h"
-#include "tier1/convar.h"
-
-#include <sys/stat.h>
-
-#include "dxabstract_types.h"
-
-// types
-struct GLMRect;
-typedef void *PseudoGLContextPtr;
-
-
- // 3-d integer box (used for texture lock/unlock etc)
-struct GLMRegion
-{
- int xmin,xmax;
- int ymin,ymax;
- int zmin,zmax;
-};
-
-struct GLMRect // follows GL convention - if coming from the D3D rect you will need to fiddle the Y's
-{
- int xmin; // left
- int ymin; // bottom
- int xmax; // right
- int ymax; // top
-};
-
-// macros
-
-//#define GLMassert(x) assert(x)
-
-// forward decls
-class GLMgr; // singleton
-class GLMContext; // GL context
-class CGLMContextTester; // testing class
-class CGLMTex;
-class CGLMFBO;
-class CGLMProgram;
-class CGLMBuffer;
-
-
-// utilities
-
-typedef enum
-{
- // D3D codes
- eD3D_DEVTYPE,
- eD3D_FORMAT,
- eD3D_RTYPE,
- eD3D_USAGE,
- eD3D_RSTATE, // render state
- eD3D_SIO, // D3D shader bytecode
- eD3D_VTXDECLUSAGE,
-
- // CGL codes
- eCGL_RENDID,
-
- // OpenGL error codes
- eGL_ERROR,
-
- // OpenGL enums
- eGL_ENUM,
- eGL_RENDERER
-
-} GLMThing_t;
-
-const char* GLMDecode( GLMThing_t type, unsigned long value ); // decode a numeric const
-const char* GLMDecodeMask( GLMThing_t type, unsigned long value ); // decode a bitmask
-
-void GLMStop( void ); // aka Debugger()
-void GLMCheckError( bool noStop = false, bool noLog= false );
-void GLMEnableTrace( bool on );
-
-// expose these in release now
-// Mimic PIX events so we can decorate debug spew
-void GLMBeginPIXEvent( const char *str );
-void GLMEndPIXEvent( void );
-
-//===============================================================================
-// knob twiddling
-float GLMKnob( char *knobname, float *setvalue ); // Pass NULL to not-set the knob value
-float GLMKnobToggle( char *knobname );
-
-//===============================================================================
-// other stuff
-
-// helpers for CGLSetOption - no op if no profiler
-void GLMProfilerClearTrace( void );
-void GLMProfilerEnableTrace( bool enable );
-
-// helpers for CGLSetParameter - no op if no profiler
-void GLMProfilerDumpState( void );
-
-
-//===============================================================================
-// classes
-
-// helper class making function tracking easier to wire up
-#if GLMDEBUG
-class GLMFuncLogger
-{
- public:
-
- // simple function log
- GLMFuncLogger( const char *funcName )
- {
- m_funcName = funcName;
- m_earlyOut = false;
-
- GLMPrintf( ">%s", m_funcName );
- };
-
- // more advanced version lets you pass args (i.e. called parameters or anything else of interest)
- // no macro for this one, since no easy way to pass through the args as well as the funcname
- GLMFuncLogger( const char *funcName, char *fmt, ... )
- {
- m_funcName = funcName;
- m_earlyOut = false;
-
- // this acts like GLMPrintf here
- // all the indent policy is down in GLMPrintfVA
- // which means we need to inject a ">" at the front of the format string to make this work... sigh.
-
- char modifiedFmt[2000];
- modifiedFmt[0] = '>';
- strcpy( modifiedFmt+1, fmt );
-
- va_list vargs;
- va_start(vargs, fmt);
- GLMPrintfVA( modifiedFmt, vargs );
- va_end( vargs );
- }
-
- ~GLMFuncLogger( )
- {
- if (m_earlyOut)
- {
- GLMPrintf( "<%s (early out)", m_funcName );
- }
- else
- {
- GLMPrintf( "<%s", m_funcName );
- }
- };
-
- void EarlyOut( void )
- {
- m_earlyOut = true;
- };
-
- const char *m_funcName; // set at construction time
- bool m_earlyOut;
-};
-
-// handy macro to go with the function tracking class
-#define GLM_FUNC GLMFuncLogger _logger_ ( __FUNCTION__ )
-#else
-#define GLM_FUNC
-#endif
-
-
-// class to keep an in-memory mirror of a file which may be getting edited during run
-class CGLMFileMirror
-{
-public:
- CGLMFileMirror( char *fullpath ); // just associates mirror with file. if file exists it will be read.
- //if non existent it will be created with size zero
- ~CGLMFileMirror( );
-
- bool HasData( void ); // see if data avail
- void GetData( char **dataPtr, uint *dataSizePtr ); // read it out
- void SetData( char *data, uint dataSize ); // put data in (and write it to disk)
- bool PollForChanges( void ); // check disk copy. If different, read it back in and return true.
-
- void UpdateStatInfo( void ); // make sure stat info is current for our file
- void ReadFile( void );
- void WriteFile( void );
-
- void OpenInEditor( bool foreground=false ); // pass TRUE if you would like the editor to pop to foreground
-
- /// how about a "wait for change" method..
-
- char *m_path; // fullpath to file
- bool m_exists;
- struct stat m_stat; // stat results for the file (last time checked)
-
- char *m_data; // content of file
- uint m_size; // length of content
-
-};
-
-// class based on the file mirror, that makes it easy to edit them outside the app.
-
-// it receives an initial block of text from the engine, and hashes it. ("orig")
-// it munges it by duplicating all the text after the "!!" line, and appending it in commented form. ("munged")
-// a mirror file is activated, using a filename based on the hash from the orig text.
-// if there is already content on disk matching that filename, use that content *unless* the 'blitz' parameter is set.
-// (i.e. engine is instructing this subsystem to wipe out any old/modified variants of the text)
-
-
-class CGLMEditableTextItem
-{
-public:
- CGLMEditableTextItem( char *text, uint size, bool forceOverwrite, char *prefix, char *suffix = NULL ); // create a text blob from text source, optional filename suffix
- ~CGLMEditableTextItem( );
-
- bool HasData( void );
- bool PollForChanges( void ); // return true if stale i.e. you need to get a new edition
- void GetCurrentText( char **textOut, uint *sizeOut ); // query for read access to the active blob (could be the original, could be external edited copy)
- void OpenInEditor( bool foreground=false ); // call user attention to this text
-
- // internal methods
- void GenHashOfOrigText( void );
- void GenBaseNameAndFullPath( char *prefix, char *suffix );
- void GenMungedText( bool fromMirror );
-
- // members
- // orig
- uint m_origSize;
- char *m_origText; // what was submitted
- unsigned char m_origDigest[MD5_DIGEST_LENGTH]; // digest of what was submitted
-
- // munged
- uint m_mungedSize;
- char *m_mungedText; // re-processed edition, initial content submission to the file mirror
-
- // mirror
- char *m_mirrorBaseName; // generated from the hash of the orig text, plus the label / prefix
- char *m_mirrorFullPath; // base name
- CGLMFileMirror *m_mirror; // file mirror itself. holds "official" copy for GetCurrentText to return.
-};
-
-
-// debug font
-extern unsigned char g_glmDebugFontMap[16384];
-
-// class for cracking multi-part text blobs
-// sections are demarcated by beginning-of-line markers submitted in a table by the caller
-
-struct GLMTextSection
-{
- int m_markerIndex; // based on table of markers passed in to constructor
- uint m_textOffset; // where is the text - offset
- int m_textLength; // how big is the section
-};
-
-class CGLMTextSectioner
-{
-public:
- CGLMTextSectioner( char *text, int textSize, char **markers ); // constructor finds all the sections
- ~CGLMTextSectioner( );
-
- int Count( void ); // how many sections found
- void GetSection( int index, uint *offsetOut, uint *lengthOut, int *markerIndexOut );
- // find section, size, what marker
- // note that more than one section can be marked similarly.
- // so policy isn't made here, you walk the sections and decide what to do if there are dupes.
-
- //members
-
- //section table
- CUtlVector< GLMTextSection > m_sectionTable;
-};
-
-#endif
+//
+// glmgrbasics.h
+// types, common headers, forward declarations, utilities
+//
+//===============================================================================
+
+#ifndef GLMBASICS_H
+#define GLMBASICS_H
+
+#pragma once
+
+#ifdef OSX
+#include <OpenGL/OpenGL.h>
+#include <OpenGL/gl.h>
+#include <OpenGL/glext.h>
+#include <OpenGL/CGLTypes.h>
+#include <OpenGL/CGLRenderers.h>
+#include <OpenGL/CGLCurrent.h>
+#include <OpenGL/CGLProfiler.h>
+//#include <ApplicationServices/ApplicationServices.h>
+#elif defined(LINUX)
+#include <GL/gl.h>
+#include <GL/glext.h>
+#else
+#error
+#endif
+
+#include "tier0/platform.h"
+
+#include "bitmap/imageformat.h"
+#include "bitvec.h"
+#include "tier1/checksum_md5.h"
+#include "tier1/utlvector.h"
+#include "tier1/convar.h"
+
+#include <sys/stat.h>
+
+#include "dxabstract_types.h"
+
+// types
+struct GLMRect;
+typedef void *PseudoGLContextPtr;
+
+
+ // 3-d integer box (used for texture lock/unlock etc)
+struct GLMRegion
+{
+ int xmin,xmax;
+ int ymin,ymax;
+ int zmin,zmax;
+};
+
+struct GLMRect // follows GL convention - if coming from the D3D rect you will need to fiddle the Y's
+{
+ int xmin; // left
+ int ymin; // bottom
+ int xmax; // right
+ int ymax; // top
+};
+
+// macros
+
+//#define GLMassert(x) assert(x)
+
+// forward decls
+class GLMgr; // singleton
+class GLMContext; // GL context
+class CGLMContextTester; // testing class
+class CGLMTex;
+class CGLMFBO;
+class CGLMProgram;
+class CGLMBuffer;
+
+
+// utilities
+
+typedef enum
+{
+ // D3D codes
+ eD3D_DEVTYPE,
+ eD3D_FORMAT,
+ eD3D_RTYPE,
+ eD3D_USAGE,
+ eD3D_RSTATE, // render state
+ eD3D_SIO, // D3D shader bytecode
+ eD3D_VTXDECLUSAGE,
+
+ // CGL codes
+ eCGL_RENDID,
+
+ // OpenGL error codes
+ eGL_ERROR,
+
+ // OpenGL enums
+ eGL_ENUM,
+ eGL_RENDERER
+
+} GLMThing_t;
+
+const char* GLMDecode( GLMThing_t type, unsigned long value ); // decode a numeric const
+const char* GLMDecodeMask( GLMThing_t type, unsigned long value ); // decode a bitmask
+
+void GLMStop( void ); // aka Debugger()
+void GLMCheckError( bool noStop = false, bool noLog= false );
+void GLMEnableTrace( bool on );
+
+// expose these in release now
+// Mimic PIX events so we can decorate debug spew
+void GLMBeginPIXEvent( const char *str );
+void GLMEndPIXEvent( void );
+
+//===============================================================================
+// knob twiddling
+float GLMKnob( char *knobname, float *setvalue ); // Pass NULL to not-set the knob value
+float GLMKnobToggle( char *knobname );
+
+//===============================================================================
+// other stuff
+
+// helpers for CGLSetOption - no op if no profiler
+void GLMProfilerClearTrace( void );
+void GLMProfilerEnableTrace( bool enable );
+
+// helpers for CGLSetParameter - no op if no profiler
+void GLMProfilerDumpState( void );
+
+
+//===============================================================================
+// classes
+
+// helper class making function tracking easier to wire up
+#if GLMDEBUG
+class GLMFuncLogger
+{
+ public:
+
+ // simple function log
+ GLMFuncLogger( const char *funcName )
+ {
+ m_funcName = funcName;
+ m_earlyOut = false;
+
+ GLMPrintf( ">%s", m_funcName );
+ };
+
+ // more advanced version lets you pass args (i.e. called parameters or anything else of interest)
+ // no macro for this one, since no easy way to pass through the args as well as the funcname
+ GLMFuncLogger( const char *funcName, char *fmt, ... )
+ {
+ m_funcName = funcName;
+ m_earlyOut = false;
+
+ // this acts like GLMPrintf here
+ // all the indent policy is down in GLMPrintfVA
+ // which means we need to inject a ">" at the front of the format string to make this work... sigh.
+
+ char modifiedFmt[2000];
+ modifiedFmt[0] = '>';
+ strcpy( modifiedFmt+1, fmt );
+
+ va_list vargs;
+ va_start(vargs, fmt);
+ GLMPrintfVA( modifiedFmt, vargs );
+ va_end( vargs );
+ }
+
+ ~GLMFuncLogger( )
+ {
+ if (m_earlyOut)
+ {
+ GLMPrintf( "<%s (early out)", m_funcName );
+ }
+ else
+ {
+ GLMPrintf( "<%s", m_funcName );
+ }
+ };
+
+ void EarlyOut( void )
+ {
+ m_earlyOut = true;
+ };
+
+ const char *m_funcName; // set at construction time
+ bool m_earlyOut;
+};
+
+// handy macro to go with the function tracking class
+#define GLM_FUNC GLMFuncLogger _logger_ ( __FUNCTION__ )
+#else
+#define GLM_FUNC
+#endif
+
+
+// class to keep an in-memory mirror of a file which may be getting edited during run
+class CGLMFileMirror
+{
+public:
+ CGLMFileMirror( char *fullpath ); // just associates mirror with file. if file exists it will be read.
+ //if non existent it will be created with size zero
+ ~CGLMFileMirror( );
+
+ bool HasData( void ); // see if data avail
+ void GetData( char **dataPtr, uint *dataSizePtr ); // read it out
+ void SetData( char *data, uint dataSize ); // put data in (and write it to disk)
+ bool PollForChanges( void ); // check disk copy. If different, read it back in and return true.
+
+ void UpdateStatInfo( void ); // make sure stat info is current for our file
+ void ReadFile( void );
+ void WriteFile( void );
+
+ void OpenInEditor( bool foreground=false ); // pass TRUE if you would like the editor to pop to foreground
+
+ /// how about a "wait for change" method..
+
+ char *m_path; // fullpath to file
+ bool m_exists;
+ struct stat m_stat; // stat results for the file (last time checked)
+
+ char *m_data; // content of file
+ uint m_size; // length of content
+
+};
+
+// class based on the file mirror, that makes it easy to edit them outside the app.
+
+// it receives an initial block of text from the engine, and hashes it. ("orig")
+// it munges it by duplicating all the text after the "!!" line, and appending it in commented form. ("munged")
+// a mirror file is activated, using a filename based on the hash from the orig text.
+// if there is already content on disk matching that filename, use that content *unless* the 'blitz' parameter is set.
+// (i.e. engine is instructing this subsystem to wipe out any old/modified variants of the text)
+
+
+class CGLMEditableTextItem
+{
+public:
+ CGLMEditableTextItem( char *text, uint size, bool forceOverwrite, char *prefix, char *suffix = NULL ); // create a text blob from text source, optional filename suffix
+ ~CGLMEditableTextItem( );
+
+ bool HasData( void );
+ bool PollForChanges( void ); // return true if stale i.e. you need to get a new edition
+ void GetCurrentText( char **textOut, uint *sizeOut ); // query for read access to the active blob (could be the original, could be external edited copy)
+ void OpenInEditor( bool foreground=false ); // call user attention to this text
+
+ // internal methods
+ void GenHashOfOrigText( void );
+ void GenBaseNameAndFullPath( char *prefix, char *suffix );
+ void GenMungedText( bool fromMirror );
+
+ // members
+ // orig
+ uint m_origSize;
+ char *m_origText; // what was submitted
+ unsigned char m_origDigest[MD5_DIGEST_LENGTH]; // digest of what was submitted
+
+ // munged
+ uint m_mungedSize;
+ char *m_mungedText; // re-processed edition, initial content submission to the file mirror
+
+ // mirror
+ char *m_mirrorBaseName; // generated from the hash of the orig text, plus the label / prefix
+ char *m_mirrorFullPath; // base name
+ CGLMFileMirror *m_mirror; // file mirror itself. holds "official" copy for GetCurrentText to return.
+};
+
+
+// debug font
+extern unsigned char g_glmDebugFontMap[16384];
+
+// class for cracking multi-part text blobs
+// sections are demarcated by beginning-of-line markers submitted in a table by the caller
+
+struct GLMTextSection
+{
+ int m_markerIndex; // based on table of markers passed in to constructor
+ uint m_textOffset; // where is the text - offset
+ int m_textLength; // how big is the section
+};
+
+class CGLMTextSectioner
+{
+public:
+ CGLMTextSectioner( char *text, int textSize, char **markers ); // constructor finds all the sections
+ ~CGLMTextSectioner( );
+
+ int Count( void ); // how many sections found
+ void GetSection( int index, uint *offsetOut, uint *lengthOut, int *markerIndexOut );
+ // find section, size, what marker
+ // note that more than one section can be marked similarly.
+ // so policy isn't made here, you walk the sections and decide what to do if there are dupes.
+
+ //members
+
+ //section table
+ CUtlVector< GLMTextSection > m_sectionTable;
+};
+
+#endif
diff --git a/mp/src/public/togl/osx/glmgrext.h b/mp/src/public/togl/osx/glmgrext.h
index 02939bb6..ace2c666 100644
--- a/mp/src/public/togl/osx/glmgrext.h
+++ b/mp/src/public/togl/osx/glmgrext.h
@@ -1,93 +1,93 @@
//========= Copyright Valve Corporation, All rights reserved. ============//
-//
-// glmgrext.h
-// helper file for extension testing and runtime importing of entry points
-//
-//===============================================================================
-
-#pragma once
-
-#ifdef OSX
-#include <OpenGL/gl.h>
-#include <OpenGL/glext.h>
-#elif defined(LINUX)
-#include <GL/gl.h>
-#include <GL/glext.h>
-#else
-#error
-#endif
-
-#ifndef GL_EXT_framebuffer_sRGB
- #define GL_FRAMEBUFFER_SRGB_EXT 0x8DB9
- #define GL_FRAMEBUFFER_SRGB_CAPABLE_EXT 0x8DBA
-#endif
-
-#ifndef ARB_texture_rg
- #define GL_COMPRESSED_RED 0x8225
- #define GL_COMPRESSED_RG 0x8226
- #define GL_RG 0x8227
- #define GL_RG_INTEGER 0x8228
- #define GL_R8 0x8229
- #define GL_R16 0x822A
- #define GL_RG8 0x822B
- #define GL_RG16 0x822C
- #define GL_R16F 0x822D
- #define GL_R32F 0x822E
- #define GL_RG16F 0x822F
- #define GL_RG32F 0x8230
- #define GL_R8I 0x8231
- #define GL_R8UI 0x8232
- #define GL_R16I 0x8233
- #define GL_R16UI 0x8234
- #define GL_R32I 0x8235
- #define GL_R32UI 0x8236
- #define GL_RG8I 0x8237
- #define GL_RG8UI 0x8238
- #define GL_RG16I 0x8239
- #define GL_RG16UI 0x823A
- #define GL_RG32I 0x823B
- #define GL_RG32UI 0x823C
-#endif
-
-#ifndef GL_EXT_bindable_uniform
- #define GL_UNIFORM_BUFFER_EXT 0x8DEE
-#endif
-
-// unpublished extension enums (thus the "X")
-
-// from EXT_framebuffer_multisample_blit_scaled..
-#define XGL_SCALED_RESOLVE_FASTEST_EXT 0x90BA
-#define XGL_SCALED_RESOLVE_NICEST_EXT 0x90BB
-
-#ifndef GL_TEXTURE_MINIMIZE_STORAGE_APPLE
-#define GL_TEXTURE_MINIMIZE_STORAGE_APPLE 0x85B6
-#endif
-
-#ifndef GL_ALL_COMPLETED_NV
-#define GL_ALL_COMPLETED_NV 0x84F2
-#endif
-
-#ifndef GL_MAP_READ_BIT
-#define GL_MAP_READ_BIT 0x0001
-#endif
-
-#ifndef GL_MAP_WRITE_BIT
-#define GL_MAP_WRITE_BIT 0x0002
-#endif
-
-#ifndef GL_MAP_INVALIDATE_RANGE_BIT
-#define GL_MAP_INVALIDATE_RANGE_BIT 0x0004
-#endif
-
-#ifndef GL_MAP_INVALIDATE_BUFFER_BIT
-#define GL_MAP_INVALIDATE_BUFFER_BIT 0x0008
-#endif
-
-#ifndef GL_MAP_FLUSH_EXPLICIT_BIT
-#define GL_MAP_FLUSH_EXPLICIT_BIT 0x0010
-#endif
-
-#ifndef GL_MAP_UNSYNCHRONIZED_BIT
-#define GL_MAP_UNSYNCHRONIZED_BIT 0x0020
-#endif
-
+//
+// glmgrext.h
+// helper file for extension testing and runtime importing of entry points
+//
+//===============================================================================
+
+#pragma once
+
+#ifdef OSX
+#include <OpenGL/gl.h>
+#include <OpenGL/glext.h>
+#elif defined(LINUX)
+#include <GL/gl.h>
+#include <GL/glext.h>
+#else
+#error
+#endif
+
+#ifndef GL_EXT_framebuffer_sRGB
+ #define GL_FRAMEBUFFER_SRGB_EXT 0x8DB9
+ #define GL_FRAMEBUFFER_SRGB_CAPABLE_EXT 0x8DBA
+#endif
+
+#ifndef ARB_texture_rg
+ #define GL_COMPRESSED_RED 0x8225
+ #define GL_COMPRESSED_RG 0x8226
+ #define GL_RG 0x8227
+ #define GL_RG_INTEGER 0x8228
+ #define GL_R8 0x8229
+ #define GL_R16 0x822A
+ #define GL_RG8 0x822B
+ #define GL_RG16 0x822C
+ #define GL_R16F 0x822D
+ #define GL_R32F 0x822E
+ #define GL_RG16F 0x822F
+ #define GL_RG32F 0x8230
+ #define GL_R8I 0x8231
+ #define GL_R8UI 0x8232
+ #define GL_R16I 0x8233
+ #define GL_R16UI 0x8234
+ #define GL_R32I 0x8235
+ #define GL_R32UI 0x8236
+ #define GL_RG8I 0x8237
+ #define GL_RG8UI 0x8238
+ #define GL_RG16I 0x8239
+ #define GL_RG16UI 0x823A
+ #define GL_RG32I 0x823B
+ #define GL_RG32UI 0x823C
+#endif
+
+#ifndef GL_EXT_bindable_uniform
+ #define GL_UNIFORM_BUFFER_EXT 0x8DEE
+#endif
+
+// unpublished extension enums (thus the "X")
+
+// from EXT_framebuffer_multisample_blit_scaled..
+#define XGL_SCALED_RESOLVE_FASTEST_EXT 0x90BA
+#define XGL_SCALED_RESOLVE_NICEST_EXT 0x90BB
+
+#ifndef GL_TEXTURE_MINIMIZE_STORAGE_APPLE
+#define GL_TEXTURE_MINIMIZE_STORAGE_APPLE 0x85B6
+#endif
+
+#ifndef GL_ALL_COMPLETED_NV
+#define GL_ALL_COMPLETED_NV 0x84F2
+#endif
+
+#ifndef GL_MAP_READ_BIT
+#define GL_MAP_READ_BIT 0x0001
+#endif
+
+#ifndef GL_MAP_WRITE_BIT
+#define GL_MAP_WRITE_BIT 0x0002
+#endif
+
+#ifndef GL_MAP_INVALIDATE_RANGE_BIT
+#define GL_MAP_INVALIDATE_RANGE_BIT 0x0004
+#endif
+
+#ifndef GL_MAP_INVALIDATE_BUFFER_BIT
+#define GL_MAP_INVALIDATE_BUFFER_BIT 0x0008
+#endif
+
+#ifndef GL_MAP_FLUSH_EXPLICIT_BIT
+#define GL_MAP_FLUSH_EXPLICIT_BIT 0x0010
+#endif
+
+#ifndef GL_MAP_UNSYNCHRONIZED_BIT
+#define GL_MAP_UNSYNCHRONIZED_BIT 0x0020
+#endif
+
diff --git a/mp/src/public/vgui/ISurface.h b/mp/src/public/vgui/ISurface.h
index b1e39bd4..0ccc8157 100644
--- a/mp/src/public/vgui/ISurface.h
+++ b/mp/src/public/vgui/ISurface.h
@@ -32,6 +32,7 @@
#endif
class Color;
+class ITexture;
namespace vgui
{
@@ -386,7 +387,7 @@ public:
virtual IHTMLChromeController *AccessChromeHTMLController() = 0;
// the origin of the viewport on the framebuffer (Which might not be 0,0 for stereo)
- virtual void SetFullscreenViewport( int x, int y, int w, int h ) = 0;
+ virtual void SetFullscreenViewportAndRenderTarget( int x, int y, int w, int h, ITexture *pRenderTarget ) = 0;
virtual void GetFullscreenViewport( int & x, int & y, int & w, int & h ) = 0;
virtual void PushFullscreenViewport() = 0;
virtual void PopFullscreenViewport() = 0;
@@ -394,6 +395,12 @@ public:
// handles support for software cursors
virtual void SetSoftwareCursor( bool bUseSoftwareCursor ) = 0;
virtual void PaintSoftwareCursor() = 0;
+
+
+ // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+ // !! WARNING! YOU MUST NOT ADD YOUR NEW METHOD HERE OR YOU WILL BREAK MODS !!
+ // !! Add your new stuff to the bottom of IMatSystemSurface instead. !!
+ // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
};
}
diff --git a/mp/src/public/windows_default.manifest b/mp/src/public/windows_default.manifest
index 19973c57..31ec6d82 100644
--- a/mp/src/public/windows_default.manifest
+++ b/mp/src/public/windows_default.manifest
@@ -8,6 +8,8 @@
<supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
<!--The ID below indicates application support for Windows 8 -->
<supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/>
+ <!--The ID below indicates application support for Windows 8.1 -->
+ <supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>
</application>
</compatibility>
</assembly>