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
This commit is contained in:
@@ -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;
|
||||
};
|
||||
|
||||
|
||||
|
||||
@@ -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 );
|
||||
}
|
||||
|
||||
|
||||
@@ -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 );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -1187,7 +1187,7 @@ inline Vector &AllocTempVector()
|
||||
}
|
||||
ThreadPause();
|
||||
}
|
||||
return s_vecTemp[nIndex & 0xffff];
|
||||
return s_vecTemp[nIndex];
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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 ];
|
||||
};
|
||||
|
||||
@@ -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 );
|
||||
|
||||
@@ -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();
|
||||
|
||||
|
||||
@@ -271,6 +271,7 @@ public:
|
||||
#ifdef DX_TO_GL_ABSTRACTION
|
||||
virtual void DoStartupShaderPreloading( void ) = 0;
|
||||
#endif
|
||||
virtual char *GetDisplayDeviceName() = 0;
|
||||
|
||||
};
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
+55
-55
@@ -21,21 +21,19 @@
|
||||
//-----------------------------------------------------------------------------
|
||||
// forward declarations
|
||||
//-----------------------------------------------------------------------------
|
||||
class ITexture;
|
||||
class IMaterialSystem;
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// important enumeration
|
||||
//-----------------------------------------------------------------------------
|
||||
struct VRTrackerState_t
|
||||
|
||||
struct VRRect_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;
|
||||
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;
|
||||
|
||||
// ----------------------------------------------------------------------
|
||||
// Information about the user
|
||||
// ----------------------------------------------------------------------
|
||||
|
||||
// returns the intrapupilar distance of the user in mm
|
||||
virtual float GetUserIPDMM() = 0;
|
||||
|
||||
// sets the intrapupilar distance of the user in mm
|
||||
virtual void SetUserIPDMM( float fIPDMM ) = 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 tracker
|
||||
// ----------------------------------------------------------------------
|
||||
|
||||
// returns the state of the tracking system
|
||||
virtual VRTrackerState_t GetTrackerState() = 0;
|
||||
virtual bool WillDriftInYaw() = 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;
|
||||
|
||||
// ----------------------------------------------------------------------
|
||||
// Enter/leave VR mode
|
||||
// ----------------------------------------------------------------------
|
||||
virtual bool Activate() = 0;
|
||||
virtual void Deactivate() = 0;
|
||||
|
||||
|
||||
};
|
||||
|
||||
|
||||
+130
-54
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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 );
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
|
||||
+272
-272
@@ -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
|
||||
|
||||
+803
-803
File diff suppressed because it is too large
Load Diff
+183
-183
@@ -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),())
|
||||
|
||||
|
||||
+176
-176
@@ -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
|
||||
|
||||
+1087
-1087
File diff suppressed because it is too large
Load Diff
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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. !!
|
||||
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user