Fix some accidental new-line stomping.

This commit is contained in:
Jørgen P. Tjernø 2013-12-03 10:34:08 -08:00
parent 45cc6eccbc
commit 27d9df18d1
24 changed files with 7164 additions and 7164 deletions

View File

@ -1,99 +1,99 @@
//========= Copyright Valve Corporation, All rights reserved. ============// //========= Copyright Valve Corporation, All rights reserved. ============//
// //
// cglmprogram.h // cglmprogram.h
// GLMgr buffers (index / vertex) // GLMgr buffers (index / vertex)
// ... maybe add PBO later as well // ... maybe add PBO later as well
//=============================================================================== //===============================================================================
#ifndef CGLMBUFFER_H #ifndef CGLMBUFFER_H
#define CGLMBUFFER_H #define CGLMBUFFER_H
#pragma once #pragma once
// ext links // ext links
// http://www.opengl.org/registry/specs/ARB/vertex_buffer_object.txt // http://www.opengl.org/registry/specs/ARB/vertex_buffer_object.txt
//=============================================================================== //===============================================================================
// tokens not in the SDK headers // tokens not in the SDK headers
//#ifndef GL_DEPTH_STENCIL_ATTACHMENT_EXT //#ifndef GL_DEPTH_STENCIL_ATTACHMENT_EXT
// #define GL_DEPTH_STENCIL_ATTACHMENT_EXT 0x84F9 // #define GL_DEPTH_STENCIL_ATTACHMENT_EXT 0x84F9
//#endif //#endif
//=============================================================================== //===============================================================================
// forward declarations // forward declarations
class GLMContext; class GLMContext;
enum EGLMBufferType enum EGLMBufferType
{ {
kGLMVertexBuffer, kGLMVertexBuffer,
kGLMIndexBuffer, kGLMIndexBuffer,
kGLMUniformBuffer, // for bindable uniform kGLMUniformBuffer, // for bindable uniform
kGLMPixelBuffer, // for PBO kGLMPixelBuffer, // for PBO
kGLMNumBufferTypes kGLMNumBufferTypes
}; };
// pass this in "options" to constructor to make a dynamic buffer // pass this in "options" to constructor to make a dynamic buffer
#define GLMBufferOptionDynamic 0x00000001 #define GLMBufferOptionDynamic 0x00000001
struct GLMBuffLockParams struct GLMBuffLockParams
{ {
uint m_offset; uint m_offset;
uint m_size; uint m_size;
bool m_nonblocking; bool m_nonblocking;
bool m_discard; bool m_discard;
}; };
class CGLMBuffer class CGLMBuffer
{ {
public: public:
void Lock( GLMBuffLockParams *params, char **addressOut ); void Lock( GLMBuffLockParams *params, char **addressOut );
void Unlock( void ); void Unlock( void );
//protected: //protected:
friend class GLMContext; // only GLMContext can make CGLMBuffer objects friend class GLMContext; // only GLMContext can make CGLMBuffer objects
friend class GLMTester; friend class GLMTester;
friend class IDirect3D9; friend class IDirect3D9;
friend class IDirect3DDevice9; friend class IDirect3DDevice9;
CGLMBuffer ( GLMContext *ctx, EGLMBufferType type, uint size, uint options ); CGLMBuffer ( GLMContext *ctx, EGLMBufferType type, uint size, uint options );
~CGLMBuffer ( ); ~CGLMBuffer ( );
void SetModes ( bool asyncMap, bool explicitFlush, bool force = false ); void SetModes ( bool asyncMap, bool explicitFlush, bool force = false );
void FlushRange ( uint offset, uint size ); void FlushRange ( uint offset, uint size );
GLMContext *m_ctx; // link back to parent context GLMContext *m_ctx; // link back to parent context
EGLMBufferType m_type; EGLMBufferType m_type;
uint m_size; uint m_size;
GLenum m_buffGLTarget; // GL_ARRAY_BUFFER_ARB / GL_ELEMENT_BUFFER_ARB GLenum m_buffGLTarget; // GL_ARRAY_BUFFER_ARB / GL_ELEMENT_BUFFER_ARB
GLuint m_name; // name of this program in the context GLuint m_name; // name of this program in the context
uint m_revision; // bump anytime the size changes or buffer is orphaned uint m_revision; // bump anytime the size changes or buffer is orphaned
bool m_enableAsyncMap; // mirror of the buffer state bool m_enableAsyncMap; // mirror of the buffer state
bool m_enableExplicitFlush; // mirror of the buffer state bool m_enableExplicitFlush; // mirror of the buffer state
bool m_bound; // true if bound to context bool m_bound; // true if bound to context
bool m_mapped; // is it currently mapped bool m_mapped; // is it currently mapped
uint m_dirtyMinOffset; // when equal, range is empty uint m_dirtyMinOffset; // when equal, range is empty
uint m_dirtyMaxOffset; uint m_dirtyMaxOffset;
float *m_lastMappedAddress; float *m_lastMappedAddress;
// --------------------- pseudo-VBO support below here (explicitly for dynamic index buffers) // --------------------- 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 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. // 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. // 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, // 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. // there's no need to do any fencing or multibuffering. orphaning in particular becomes a no-op.
char *m_pseudoBuf; // storage for pseudo buffer char *m_pseudoBuf; // storage for pseudo buffer
}; };
#endif #endif

View File

@ -1,91 +1,91 @@
//========= Copyright Valve Corporation, All rights reserved. ============// //========= Copyright Valve Corporation, All rights reserved. ============//
// //
// cglmfbo.h // cglmfbo.h
// GLMgr FBO's (render targets) // GLMgr FBO's (render targets)
// //
//=============================================================================== //===============================================================================
#ifndef CGLMFBO_H #ifndef CGLMFBO_H
#define CGLMFBO_H #define CGLMFBO_H
#pragma once #pragma once
#include "togl/rendermechanism.h" #include "togl/rendermechanism.h"
// good FBO references / recaps // good FBO references / recaps
// http://www.songho.ca/opengl/gl_fbo.html // http://www.songho.ca/opengl/gl_fbo.html
// http://www.gamedev.net/reference/articles/article2331.asp // http://www.gamedev.net/reference/articles/article2331.asp
// ext links // ext links
// http://www.opengl.org/registry/specs/EXT/framebuffer_object.txt // http://www.opengl.org/registry/specs/EXT/framebuffer_object.txt
// http://www.opengl.org/registry/specs/EXT/framebuffer_multisample.txt // http://www.opengl.org/registry/specs/EXT/framebuffer_multisample.txt
//=============================================================================== //===============================================================================
// tokens not in the SDK headers // tokens not in the SDK headers
#ifndef GL_DEPTH_STENCIL_ATTACHMENT_EXT #ifndef GL_DEPTH_STENCIL_ATTACHMENT_EXT
#define GL_DEPTH_STENCIL_ATTACHMENT_EXT 0x84F9 #define GL_DEPTH_STENCIL_ATTACHMENT_EXT 0x84F9
#endif #endif
//=============================================================================== //===============================================================================
// forward declarations // forward declarations
class GLMContext; class GLMContext;
// implicitly 16 maximum color attachments possible // implicitly 16 maximum color attachments possible
enum EGLMFBOAttachment { enum EGLMFBOAttachment {
kAttColor0, kAttColor1, kAttColor2, kAttColor3, kAttColor0, kAttColor1, kAttColor2, kAttColor3,
kAttColor4, kAttColor5, kAttColor6, kAttColor7, kAttColor4, kAttColor5, kAttColor6, kAttColor7,
kAttColor8, kAttColor9, kAttColor10, kAttColor11, kAttColor8, kAttColor9, kAttColor10, kAttColor11,
kAttColor12, kAttColor13, kAttColor14, kAttColor15, kAttColor12, kAttColor13, kAttColor14, kAttColor15,
kAttDepth, kAttStencil, kAttDepthStencil, kAttDepth, kAttStencil, kAttDepthStencil,
kAttCount kAttCount
}; };
struct GLMFBOTexAttachParams struct GLMFBOTexAttachParams
{ {
CGLMTex *m_tex; CGLMTex *m_tex;
int m_face; // keep zero if not cube map int m_face; // keep zero if not cube map
int m_mip; // keep zero if notmip mapped int m_mip; // keep zero if notmip mapped
int m_zslice; // keep zero if not a 3D tex int m_zslice; // keep zero if not a 3D tex
}; };
class CGLMFBO class CGLMFBO
{ {
public: public:
protected: protected:
friend class GLMContext; // only GLMContext can make CGLMFBO objects friend class GLMContext; // only GLMContext can make CGLMFBO objects
friend class GLMTester; friend class GLMTester;
friend class CGLMTex; friend class CGLMTex;
friend class IDirect3D9; friend class IDirect3D9;
friend class IDirect3DDevice9; friend class IDirect3DDevice9;
CGLMFBO( GLMContext *ctx ); CGLMFBO( GLMContext *ctx );
~CGLMFBO( ); ~CGLMFBO( );
void TexAttach( GLMFBOTexAttachParams *params, EGLMFBOAttachment attachIndex, GLenum fboBindPoint = GL_FRAMEBUFFER_EXT ); void TexAttach( GLMFBOTexAttachParams *params, EGLMFBOAttachment attachIndex, GLenum fboBindPoint = GL_FRAMEBUFFER_EXT );
void TexDetach( 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. // 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 ); void TexScrub( CGLMTex *tex );
// search and destroy any attachment for the named texture // search and destroy any attachment for the named texture
bool IsReady( void ); // aka FBO completeness check - ready to draw bool IsReady( void ); // aka FBO completeness check - ready to draw
GLMContext *m_ctx; // link back to parent context GLMContext *m_ctx; // link back to parent context
GLuint m_name; // name of this FBO in the context GLuint m_name; // name of this FBO in the context
GLMFBOTexAttachParams m_attach[ kAttCount ]; // indexed by EGLMFBOAttachment GLMFBOTexAttachParams m_attach[ kAttCount ]; // indexed by EGLMFBOAttachment
int m_sizeX,m_sizeY; int m_sizeX,m_sizeY;
}; };
#endif #endif

View File

@ -1,291 +1,291 @@
//========= Copyright Valve Corporation, All rights reserved. ============// //========= Copyright Valve Corporation, All rights reserved. ============//
// //
// cglmprogram.h // cglmprogram.h
// GLMgr programs (ARBVP/ARBfp) // GLMgr programs (ARBVP/ARBfp)
// //
//=============================================================================== //===============================================================================
#ifndef CGLMPROGRAM_H #ifndef CGLMPROGRAM_H
#define CGLMPROGRAM_H #define CGLMPROGRAM_H
#include <sys/stat.h> #include <sys/stat.h>
#pragma once #pragma once
// good ARB program references // good ARB program references
// http://petewarden.com/notes/archives/2005/05/fragment_progra_2.html // http://petewarden.com/notes/archives/2005/05/fragment_progra_2.html
// http://petewarden.com/notes/archives/2005/06/fragment_progra_3.html // http://petewarden.com/notes/archives/2005/06/fragment_progra_3.html
// ext links // ext links
// http://www.opengl.org/registry/specs/ARB/vertex_program.txt // 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/ARB/fragment_program.txt
// http://www.opengl.org/registry/specs/EXT/gpu_program_parameters.txt // http://www.opengl.org/registry/specs/EXT/gpu_program_parameters.txt
//=============================================================================== //===============================================================================
// tokens not in the SDK headers // tokens not in the SDK headers
//#ifndef GL_DEPTH_STENCIL_ATTACHMENT_EXT //#ifndef GL_DEPTH_STENCIL_ATTACHMENT_EXT
// #define GL_DEPTH_STENCIL_ATTACHMENT_EXT 0x84F9 // #define GL_DEPTH_STENCIL_ATTACHMENT_EXT 0x84F9
//#endif //#endif
//=============================================================================== //===============================================================================
// forward declarations // forward declarations
class GLMContext; class GLMContext;
class CGLMShaderPair; class CGLMShaderPair;
class CGLMShaderPairCache; class CGLMShaderPairCache;
// CGLMProgram can contain two flavors of the same program, one in assembler, one in GLSL. // 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 - // 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 // 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. // 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 // 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. // flavor you want to use. GLMContext has to handle that.
enum EGLMProgramType enum EGLMProgramType
{ {
kGLMVertexProgram, kGLMVertexProgram,
kGLMFragmentProgram, kGLMFragmentProgram,
kGLMNumProgramTypes kGLMNumProgramTypes
}; };
enum EGLMProgramLang enum EGLMProgramLang
{ {
kGLMARB, kGLMARB,
kGLMGLSL, kGLMGLSL,
kGLMNumProgramLangs kGLMNumProgramLangs
}; };
struct GLMShaderDesc struct GLMShaderDesc
{ {
union union
{ {
GLuint arb; // ARB program object name GLuint arb; // ARB program object name
GLhandleARB glsl; // GLSL shader object handle (void*) GLhandleARB glsl; // GLSL shader object handle (void*)
} m_object; } m_object;
// these can change if shader text is edited // these can change if shader text is edited
bool m_textPresent; // is this flavor(lang) of text present in the buffer? bool m_textPresent; // is this flavor(lang) of text present in the buffer?
int m_textOffset; // where is it int m_textOffset; // where is it
int m_textLength; // how big int m_textLength; // how big
bool m_compiled; // has this text been through a compile attempt bool m_compiled; // has this text been through a compile attempt
bool m_valid; // and if so, was the compile successful 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_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) int m_highWater; // vount of vec4's in the major uniform array ("vc" on vs, "pc" on ps)
// written by dxabstract.... gross! // written by dxabstract.... gross!
}; };
GLenum GLMProgTypeToARBEnum( EGLMProgramType type ); // map vert/frag to ARB asm bind target GLenum GLMProgTypeToARBEnum( EGLMProgramType type ); // map vert/frag to ARB asm bind target
GLenum GLMProgTypeToGLSLEnum( EGLMProgramType type ); // map vert/frag to ARB asm bind target GLenum GLMProgTypeToGLSLEnum( EGLMProgramType type ); // map vert/frag to ARB asm bind target
class CGLMProgram class CGLMProgram
{ {
public: public:
friend class CGLMShaderPairCache; friend class CGLMShaderPairCache;
friend class CGLMShaderPair; friend class CGLMShaderPair;
friend class GLMContext; // only GLMContext can make CGLMProgram objects friend class GLMContext; // only GLMContext can make CGLMProgram objects
friend class GLMTester; friend class GLMTester;
friend class IDirect3D9; friend class IDirect3D9;
friend class IDirect3DDevice9; friend class IDirect3DDevice9;
//=============================== //===============================
// constructor is very light, it just makes one empty program object per flavor. // constructor is very light, it just makes one empty program object per flavor.
CGLMProgram( GLMContext *ctx, EGLMProgramType type ); CGLMProgram( GLMContext *ctx, EGLMProgramType type );
~CGLMProgram( ); ~CGLMProgram( );
void SetProgramText ( char *text ); // import text to GLM object - invalidate any prev compiled program 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 CompileActiveSources ( void ); // compile only the flavors that were provided.
bool Compile ( EGLMProgramLang lang ); bool Compile ( EGLMProgramLang lang );
bool CheckValidity ( 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 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 GetLabelIndexCombo ( char *labelOut, int labelOutMaxChars, int *indexOut, int *comboOut );
void GetComboIndexNameString ( char *stringOut, int stringOutMaxChars ); // mmmmmmmm-nnnnnnnn-filename void GetComboIndexNameString ( char *stringOut, int stringOutMaxChars ); // mmmmmmmm-nnnnnnnn-filename
#if GLMDEBUG #if GLMDEBUG
bool PollForChanges( void ); // check mirror for changes. bool PollForChanges( void ); // check mirror for changes.
void ReloadStringFromEditable( void ); // populate m_string from editable item (react to change) void ReloadStringFromEditable( void ); // populate m_string from editable item (react to change)
bool SyncWithEditable( void ); bool SyncWithEditable( void );
#endif #endif
//=============================== //===============================
// common stuff // common stuff
GLMContext *m_ctx; // link back to parent context GLMContext *m_ctx; // link back to parent context
EGLMProgramType m_type; // vertex or pixel EGLMProgramType m_type; // vertex or pixel
uint m_serial; // serial number for hashing uint m_serial; // serial number for hashing
char *m_text; // copy of text passed into constructor. Can change if editable shaders is enabled. 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 // note - it can contain multiple flavors, so use CGLMTextSectioner to scan it and locate them
#if GLMDEBUG #if GLMDEBUG
CGLMEditableTextItem *m_editable; // editable text item for debugging CGLMEditableTextItem *m_editable; // editable text item for debugging
#endif #endif
GLMShaderDesc m_descs[ kGLMNumProgramLangs ]; GLMShaderDesc m_descs[ kGLMNumProgramLangs ];
uint m_samplerMask; // (1<<n) mask of sampler active locs, if this is a fragment shader (dxabstract sets this field) uint m_samplerMask; // (1<<n) mask of sampler active locs, if this is a fragment shader (dxabstract sets this field)
}; };
//=============================================================================== //===============================================================================
struct GLMShaderPairInfo struct GLMShaderPairInfo
{ {
int m_status; // -1 means req'd index was out of bounds (loop stop..) 0 means not present. 1 means present/active. 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 ]; char m_vsName[ 128 ];
int m_vsStaticIndex; int m_vsStaticIndex;
int m_vsDynamicIndex; int m_vsDynamicIndex;
char m_psName[ 128 ]; char m_psName[ 128 ];
int m_psStaticIndex; int m_psStaticIndex;
int m_psDynamicIndex; int m_psDynamicIndex;
}; };
class CGLMShaderPair // a container for a linked GLSL shader pair, and metadata obtained post-link class CGLMShaderPair // a container for a linked GLSL shader pair, and metadata obtained post-link
{ {
public: public:
friend class CGLMProgram; friend class CGLMProgram;
friend class GLMContext; friend class GLMContext;
friend class CGLMShaderPairCache; friend class CGLMShaderPairCache;
//=============================== //===============================
// constructor just sets up a GLSL program object and leaves it empty. // constructor just sets up a GLSL program object and leaves it empty.
CGLMShaderPair( GLMContext *ctx ); CGLMShaderPair( GLMContext *ctx );
~CGLMShaderPair( ); ~CGLMShaderPair( );
bool SetProgramPair ( CGLMProgram *vp, CGLMProgram *fp ); bool SetProgramPair ( CGLMProgram *vp, CGLMProgram *fp );
// true result means successful link and query // true result means successful link and query
bool RefreshProgramPair ( void ); bool RefreshProgramPair ( void );
// re-link and re-query the uniforms // re-link and re-query the uniforms
//=============================== //===============================
// common stuff // common stuff
GLMContext *m_ctx; // link back to parent context GLMContext *m_ctx; // link back to parent context
CGLMProgram *m_vertexProg; CGLMProgram *m_vertexProg;
CGLMProgram *m_fragmentProg; CGLMProgram *m_fragmentProg;
GLhandleARB m_program; // linked program object GLhandleARB m_program; // linked program object
// need meta data for attribs / samplers / params // need meta data for attribs / samplers / params
// actually we only need it for samplers and params. // actually we only need it for samplers and params.
// attributes are hardwired. // attributes are hardwired.
// vertex stage uniforms // vertex stage uniforms
GLint m_locVertexParams; // "vc" per dx9asmtogl2 convention GLint m_locVertexParams; // "vc" per dx9asmtogl2 convention
GLint m_locVertexInteger0; // "i0" GLint m_locVertexInteger0; // "i0"
GLint m_locVertexBool0; // "b0" GLint m_locVertexBool0; // "b0"
GLint m_locVertexBool1; // "b1" GLint m_locVertexBool1; // "b1"
GLint m_locVertexBool2; // "b2" GLint m_locVertexBool2; // "b2"
GLint m_locVertexBool3; // "b3" GLint m_locVertexBool3; // "b3"
// fragment stage uniforms // fragment stage uniforms
GLint m_locFragmentParams; // "pc" per dx9asmtogl2 convention GLint m_locFragmentParams; // "pc" per dx9asmtogl2 convention
GLint m_locFragmentFakeSRGBEnable; // "flSRGBWrite" - set to 1.0 to effect sRGB encoding on output 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 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) // 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..." GLint m_locSamplers[ 16 ]; // "sampler0 ... sampler1..."
// other stuff // other stuff
bool m_valid; // true on successful link 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) 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. uint m_revision; // if this pair is relinked, bump this number.
}; };
//=============================================================================== //===============================================================================
// N-row, M-way associative cache with LRU per row. // N-row, M-way associative cache with LRU per row.
// still needs some metric dump ability and some parameter tuning. // still needs some metric dump ability and some parameter tuning.
// extra credit would be to make an auto-tuner. // extra credit would be to make an auto-tuner.
struct CGLMPairCacheEntry struct CGLMPairCacheEntry
{ {
long long m_lastMark; // a mark of zero means an empty entry long long m_lastMark; // a mark of zero means an empty entry
CGLMProgram *m_vertexProg; CGLMProgram *m_vertexProg;
CGLMProgram *m_fragmentProg; CGLMProgram *m_fragmentProg;
uint m_extraKeyBits; uint m_extraKeyBits;
CGLMShaderPair *m_pair; CGLMShaderPair *m_pair;
}; };
class CGLMShaderPairCache // cache for linked GLSL shader pairs class CGLMShaderPairCache // cache for linked GLSL shader pairs
{ {
public: public:
protected: protected:
friend class CGLMShaderPair; friend class CGLMShaderPair;
friend class CGLMProgram; friend class CGLMProgram;
friend class GLMContext; friend class GLMContext;
//=============================== //===============================
CGLMShaderPairCache( GLMContext *ctx ); CGLMShaderPairCache( GLMContext *ctx );
~CGLMShaderPairCache( ); ~CGLMShaderPairCache( );
CGLMShaderPair *SelectShaderPair ( CGLMProgram *vp, CGLMProgram *fp, uint extraKeyBits ); CGLMShaderPair *SelectShaderPair ( CGLMProgram *vp, CGLMProgram *fp, uint extraKeyBits );
void QueryShaderPair ( int index, GLMShaderPairInfo *infoOut ); void QueryShaderPair ( int index, GLMShaderPairInfo *infoOut );
// shoot down linked pairs that use the program in the arg // 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 // return true if any had to be skipped due to conflict with currently bound pair
bool PurgePairsWithShader( CGLMProgram *prog ); bool PurgePairsWithShader( CGLMProgram *prog );
// purge everything (when would GLM know how to do this ? at context destroy time, but any other times?) // 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 // return true if any had to be skipped due to conflict with currently bound pair
bool Purge ( void ); bool Purge ( void );
// stats // stats
void DumpStats ( void ); void DumpStats ( void );
//=============================== //===============================
uint HashRowIndex ( CGLMProgram *vp, CGLMProgram *fp, uint extraKeyBits ); uint HashRowIndex ( CGLMProgram *vp, CGLMProgram *fp, uint extraKeyBits );
CGLMPairCacheEntry* HashRowPtr ( uint hashRowIndex ); CGLMPairCacheEntry* HashRowPtr ( uint hashRowIndex );
void HashRowProbe ( CGLMPairCacheEntry *row, CGLMProgram *vp, CGLMProgram *fp, uint extraKeyBits, int *hitwayOut, int *emptywayOut, int *oldestwayOut ); void HashRowProbe ( CGLMPairCacheEntry *row, CGLMProgram *vp, CGLMProgram *fp, uint extraKeyBits, int *hitwayOut, int *emptywayOut, int *oldestwayOut );
//=============================== //===============================
// common stuff // common stuff
GLMContext *m_ctx; // link back to parent context GLMContext *m_ctx; // link back to parent context
long long m_mark; long long m_mark;
uint m_rowsLg2; uint m_rowsLg2;
uint m_rows; uint m_rows;
uint m_waysLg2; uint m_waysLg2;
uint m_ways; uint m_ways;
uint m_entryCount; uint m_entryCount;
CGLMPairCacheEntry *m_entries; // array[ m_rows ][ m_ways ] CGLMPairCacheEntry *m_entries; // array[ m_rows ][ m_ways ]
uint *m_evictions; // array[ m_rows ]; uint *m_evictions; // array[ m_rows ];
uint *m_hits; // array[ m_rows ]; uint *m_hits; // array[ m_rows ];
}; };
#endif #endif

View File

@ -1,85 +1,85 @@
//========= Copyright Valve Corporation, All rights reserved. ============// //========= Copyright Valve Corporation, All rights reserved. ============//
// //
// cglmquery.h // cglmquery.h
// GLMgr queries // GLMgr queries
// //
//=============================================================================== //===============================================================================
#ifndef CGLMQUERY_H #ifndef CGLMQUERY_H
#define CGLMQUERY_H #define CGLMQUERY_H
#pragma once #pragma once
//=============================================================================== //===============================================================================
// forward declarations // forward declarations
class GLMContext; class GLMContext;
class CGLMQuery; class CGLMQuery;
//=============================================================================== //===============================================================================
enum EGLMQueryType enum EGLMQueryType
{ {
EOcclusion, EOcclusion,
EFence, EFence,
EGLMQueryCount EGLMQueryCount
}; };
struct GLMQueryParams struct GLMQueryParams
{ {
EGLMQueryType m_type; EGLMQueryType m_type;
}; };
class CGLMQuery class CGLMQuery
{ {
// leave everything public til it's running // leave everything public til it's running
public: public:
friend class GLMContext; // only GLMContext can make CGLMTex objects friend class GLMContext; // only GLMContext can make CGLMTex objects
friend class IDirect3DDevice9; friend class IDirect3DDevice9;
friend class IDirect3DQuery9; friend class IDirect3DQuery9;
GLMContext *m_ctx; // link back to parent context GLMContext *m_ctx; // link back to parent context
GLMQueryParams m_params; // params created with 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! 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 #ifdef HAVE_GL_ARB_SYNC
GLsync m_syncobj; // GL_ARB_sync object. NOT USED WITH GL_NV_fence or GL_APPLE_fence! GLsync m_syncobj; // GL_ARB_sync object. NOT USED WITH GL_NV_fence or GL_APPLE_fence!
#else #else
GLuint m_syncobj; GLuint m_syncobj;
#endif #endif
bool m_started; bool m_started;
bool m_stopped; bool m_stopped;
bool m_done; 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 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. // restated - only Start should examine the convar.
CGLMQuery( GLMContext *ctx, GLMQueryParams *params ); CGLMQuery( GLMContext *ctx, GLMQueryParams *params );
~CGLMQuery( ); ~CGLMQuery( );
// for an occlusion query: // for an occlusion query:
// Start = BeginQuery query-start goes into stream // 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 // 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?) // 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 // Complete = GetQueryObjectuivARB(uint id, enum pname, uint *params) - extract the sample count
// for a fence query: // for a fence query:
// Start = SetFence fence goes into command stream // Start = SetFence fence goes into command stream
// Stop = NOP fences are self finishing - no need to call Stop on a fence // Stop = NOP fences are self finishing - no need to call Stop on a fence
// IsDone = TestFence ask if fence passed // IsDone = TestFence ask if fence passed
// Complete = FinishFence // Complete = FinishFence
void Start ( void ); void Start ( void );
void Stop ( void ); void Stop ( void );
bool IsDone ( void ); bool IsDone ( void );
void Complete ( uint *result ); void Complete ( uint *result );
// accessors for the started/stopped state // accessors for the started/stopped state
bool IsStarted ( void ); bool IsStarted ( void );
bool IsStopped ( void ); bool IsStopped ( void );
}; };
#endif #endif

View File

@ -1,273 +1,273 @@
//========= Copyright Valve Corporation, All rights reserved. ============// //========= Copyright Valve Corporation, All rights reserved. ============//
// //
// cglmtex.h // cglmtex.h
// GLMgr textures // GLMgr textures
// //
//=============================================================================== //===============================================================================
#ifndef CGLMTEX_H #ifndef CGLMTEX_H
#define CGLMTEX_H #define CGLMTEX_H
#pragma once #pragma once
#include "tier1/utlhash.h" #include "tier1/utlhash.h"
#include "tier1/utlmap.h" #include "tier1/utlmap.h"
//=============================================================================== //===============================================================================
// forward declarations // forward declarations
class GLMContext; class GLMContext;
class GLMTester; class GLMTester;
class CGLMTexLayoutTable; class CGLMTexLayoutTable;
class CGLMTex; class CGLMTex;
class CGLMFBO; class CGLMFBO;
class IDirect3DSurface9; class IDirect3DSurface9;
//=============================================================================== //===============================================================================
struct GLMTexFormatDesc struct GLMTexFormatDesc
{ {
char *m_formatSummary; // for debug visibility char *m_formatSummary; // for debug visibility
D3DFORMAT m_d3dFormat; // what D3D knows it as; see public/bitmap/imageformat.h D3DFORMAT m_d3dFormat; // what D3D knows it as; see public/bitmap/imageformat.h
GLenum m_glIntFormat; // GL internal format GLenum m_glIntFormat; // GL internal format
GLenum m_glIntFormatSRGB; // internal format if SRGB flavor GLenum m_glIntFormatSRGB; // internal format if SRGB flavor
GLenum m_glDataFormat; // GL data format GLenum m_glDataFormat; // GL data format
GLenum m_glDataType; // GL data type GLenum m_glDataType; // GL data type
int m_chunkSize; // 1 or 4 - 4 is used for compressed textures 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) 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 // this description lets us calculate size cleanly without conditional logic for compression
}; };
const GLMTexFormatDesc *GetFormatDesc( D3DFORMAT format ); const GLMTexFormatDesc *GetFormatDesc( D3DFORMAT format );
//=============================================================================== //===============================================================================
// utility function for generating slabs of texels. mostly for test. // utility function for generating slabs of texels. mostly for test.
typedef struct typedef struct
{ {
// in // in
D3DFORMAT m_format; D3DFORMAT m_format;
void *m_dest; // dest address void *m_dest; // dest address
int m_chunkCount; // square chunk count (single texels or compressed blocks) int m_chunkCount; // square chunk count (single texels or compressed blocks)
int m_byteCountLimit; // caller expectation of max number of bytes to write out int m_byteCountLimit; // caller expectation of max number of bytes to write out
float r,g,b,a; // color desired float r,g,b,a; // color desired
// out // out
int m_bytesWritten; int m_bytesWritten;
} GLMGenTexelParams; } GLMGenTexelParams;
// return true if successful // return true if successful
bool GLMGenTexels( GLMGenTexelParams *params ); bool GLMGenTexels( GLMGenTexelParams *params );
//=============================================================================== //===============================================================================
struct GLMTexLayoutSlice struct GLMTexLayoutSlice
{ {
int m_xSize,m_ySize,m_zSize; //texel dimensions of this slice 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_storageOffset; //where in the storage slab does this slice live
int m_storageSize; //how much storage does this slice occupy int m_storageSize; //how much storage does this slice occupy
}; };
enum EGLMTexFlags enum EGLMTexFlags
{ {
kGLMTexMipped = 0x01, kGLMTexMipped = 0x01,
kGLMTexMippedAuto = 0x02, kGLMTexMippedAuto = 0x02,
kGLMTexRenderable = 0x04, kGLMTexRenderable = 0x04,
kGLMTexIsStencil = 0x08, kGLMTexIsStencil = 0x08,
kGLMTexIsDepth = 0x10, kGLMTexIsDepth = 0x10,
kGLMTexSRGB = 0x20, kGLMTexSRGB = 0x20,
kGLMTexMultisampled = 0x40, // has an RBO backing it. Cannot combine with Mipped, MippedAuto. One slice maximum, only targeting GL_TEXTURE_2D. 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 // actually not 100% positive on the mipmapping, the RBO itself can't be mipped, but the resulting texture could
// have mipmaps generated. // have mipmaps generated.
}; };
//=============================================================================== //===============================================================================
struct GLMTexLayoutKey struct GLMTexLayoutKey
{ {
// input values: held const, these are the hash key for the form map // 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 GLenum m_texGLTarget; // flavor of texture: GL_TEXTURE_2D, GL_TEXTURE_3D, GLTEXTURE_CUBE_MAP
D3DFORMAT m_texFormat; // D3D texel format D3DFORMAT m_texFormat; // D3D texel format
unsigned long m_texFlags; // mipped, autogen mips, render target, ... ? 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) 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 int m_xSize,m_ySize,m_zSize; // size of base mip
}; };
bool LessFunc_GLMTexLayoutKey( const GLMTexLayoutKey &a, const GLMTexLayoutKey &b ); bool LessFunc_GLMTexLayoutKey( const GLMTexLayoutKey &a, const GLMTexLayoutKey &b );
#define GLM_TEX_MAX_MIPS 14 #define GLM_TEX_MAX_MIPS 14
#define GLM_TEX_MAX_FACES 6 #define GLM_TEX_MAX_FACES 6
#define GLM_TEX_MAX_SLICES (GLM_TEX_MAX_MIPS * GLM_TEX_MAX_FACES) #define GLM_TEX_MAX_SLICES (GLM_TEX_MAX_MIPS * GLM_TEX_MAX_FACES)
struct GLMTexLayout struct GLMTexLayout
{ {
char *m_layoutSummary; // for debug visibility char *m_layoutSummary; // for debug visibility
// const inputs used for hashing // const inputs used for hashing
GLMTexLayoutKey m_key; GLMTexLayoutKey m_key;
// refcount // refcount
int m_refCount; int m_refCount;
// derived values: // derived values:
GLMTexFormatDesc *m_format; // format specific info GLMTexFormatDesc *m_format; // format specific info
int m_mipCount; // derived by starying at base size and working down towards 1x1 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_faceCount; // 1 for 2d/3d, 6 for cubemap
int m_sliceCount; // product of faces and mips int m_sliceCount; // product of faces and mips
int m_storageTotalSize; // size of storage slab required int m_storageTotalSize; // size of storage slab required
// slice array // slice array
GLMTexLayoutSlice m_slices[0]; // dynamically allocated 2-d array [faces][mips] GLMTexLayoutSlice m_slices[0]; // dynamically allocated 2-d array [faces][mips]
}; };
class CGLMTexLayoutTable class CGLMTexLayoutTable
{ {
public: public:
CGLMTexLayoutTable(); CGLMTexLayoutTable();
GLMTexLayout *NewLayoutRef( GLMTexLayoutKey *key ); // pass in a pointer to layout key - receive ptr to completed layout 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 DelLayoutRef( GLMTexLayout *layout ); // pass in pointer to completed layout. refcount is dropped.
void DumpStats( void ); void DumpStats( void );
protected: protected:
CUtlMap< GLMTexLayoutKey, GLMTexLayout* > m_layoutMap; CUtlMap< GLMTexLayoutKey, GLMTexLayout* > m_layoutMap;
}; };
//=============================================================================== //===============================================================================
// a sampler specifies desired state for drawing on a given sampler index // 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 // 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 // see http://msdn.microsoft.com/en-us/library/bb172602(VS.85).aspx
struct GLMTexSamplingParams struct GLMTexSamplingParams
{ {
GLenum m_addressModes[3]; // S, T, R GLenum m_addressModes[3]; // S, T, R
GLfloat m_borderColor[4]; // R,G,B,A GLfloat m_borderColor[4]; // R,G,B,A
GLenum m_magFilter; GLenum m_magFilter;
GLenum m_minFilter; GLenum m_minFilter;
GLfloat m_mipmapBias; GLfloat m_mipmapBias;
GLint m_minMipLevel; GLint m_minMipLevel;
GLint m_maxMipLevel; GLint m_maxMipLevel;
GLint m_maxAniso; GLint m_maxAniso;
GLenum m_compareMode; // only used for depth and stencil type textures GLenum m_compareMode; // only used for depth and stencil type textures
bool m_srgb; // srgb texture read... bool m_srgb; // srgb texture read...
}; };
struct GLMTexLockParams struct GLMTexLockParams
{ {
// input params which identify the slice of interest // input params which identify the slice of interest
CGLMTex *m_tex; CGLMTex *m_tex;
int m_face; int m_face;
int m_mip; int m_mip;
// identifies the region of the slice // identifies the region of the slice
GLMRegion m_region; GLMRegion m_region;
// tells GLM to force re-read of the texels back from GL // 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" // i.e. "I know I stepped on those texels with a draw or blit - the GLM copy is stale"
bool m_readback; bool m_readback;
}; };
struct GLMTexLockDesc struct GLMTexLockDesc
{ {
GLMTexLockParams m_req; // form of the lock request GLMTexLockParams m_req; // form of the lock request
bool m_active; // set true at lock time. cleared at unlock time. bool m_active; // set true at lock time. cleared at unlock time.
int m_sliceIndex; // which slice in the layout int m_sliceIndex; // which slice in the layout
int m_sliceBaseOffset; // where is that in the texture data int m_sliceBaseOffset; // where is that in the texture data
int m_sliceRegionOffset; // offset to the start (lowest address corner) of the region requested int m_sliceRegionOffset; // offset to the start (lowest address corner) of the region requested
}; };
//=============================================================================== //===============================================================================
#define GLM_SAMPLER_COUNT 16 #define GLM_SAMPLER_COUNT 16
typedef CBitVec<GLM_SAMPLER_COUNT> CTexBindMask; typedef CBitVec<GLM_SAMPLER_COUNT> CTexBindMask;
enum EGLMTexSliceFlag enum EGLMTexSliceFlag
{ {
kSliceValid = 0x01, // slice has been teximage'd in whole at least once - set to 0 initially 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 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 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) kSliceFullyDirty = 0x08, // does the slice need to be fully downloaded at unlock time (disregard dirty rects)
}; };
class CGLMTex class CGLMTex
{ {
public: public:
void Lock( GLMTexLockParams *params, char** addressOut, int* yStrideOut, int *zStrideOut ); void Lock( GLMTexLockParams *params, char** addressOut, int* yStrideOut, int *zStrideOut );
void Unlock( GLMTexLockParams *params ); void Unlock( GLMTexLockParams *params );
protected: protected:
friend class GLMContext; // only GLMContext can make CGLMTex objects friend class GLMContext; // only GLMContext can make CGLMTex objects
friend class GLMTester; friend class GLMTester;
friend class CGLMFBO; friend class CGLMFBO;
friend class IDirect3DDevice9; friend class IDirect3DDevice9;
friend class IDirect3DBaseTexture9; friend class IDirect3DBaseTexture9;
friend class IDirect3DTexture9; friend class IDirect3DTexture9;
friend class IDirect3DSurface9; friend class IDirect3DSurface9;
friend class IDirect3DCubeTexture9; friend class IDirect3DCubeTexture9;
friend class IDirect3DVolumeTexture9; friend class IDirect3DVolumeTexture9;
CGLMTex( GLMContext *ctx, GLMTexLayout *layout, GLMTexSamplingParams *sampling, char *debugLabel = NULL ); CGLMTex( GLMContext *ctx, GLMTexLayout *layout, GLMTexSamplingParams *sampling, char *debugLabel = NULL );
~CGLMTex( ); ~CGLMTex( );
int CalcSliceIndex( int face, int mip ); int CalcSliceIndex( int face, int mip );
void CalcTexelDataOffsetAndStrides( int sliceIndex, int x, int y, int z, int *offsetOut, int *yStrideOut, int *zStrideOut ); void CalcTexelDataOffsetAndStrides( int sliceIndex, int x, int y, int z, int *offsetOut, int *yStrideOut, int *zStrideOut );
void ApplySamplingParams( GLMTexSamplingParams *params, bool noCheck=FALSE ); void ApplySamplingParams( GLMTexSamplingParams *params, bool noCheck=FALSE );
void ReadTexels( GLMTexLockDesc *desc, bool readWholeSlice=true ); void ReadTexels( GLMTexLockDesc *desc, bool readWholeSlice=true );
void WriteTexels( GLMTexLockDesc *desc, bool writeWholeSlice=true, bool noDataWrite=false ); void WriteTexels( GLMTexLockDesc *desc, bool writeWholeSlice=true, bool noDataWrite=false );
// last param lets us send NULL data ptr (only legal with uncompressed formats, beware) // last param lets us send NULL data ptr (only legal with uncompressed formats, beware)
// this helps out ResetSRGB. // this helps out ResetSRGB.
void ResetSRGB( bool srgb, bool noDataWrite ); void ResetSRGB( bool srgb, bool noDataWrite );
// re-specify texture format to match desired sRGB form // 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 // 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) 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_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. 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 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) // (consult this at draw time, in order to know if changes need to be made)
GLMContext *m_ctx; // link back to parent context GLMContext *m_ctx; // link back to parent context
GLuint m_texName; // name of this texture in the context GLuint m_texName; // name of this texture in the context
bool m_texClientStorage; // was CS selecetd for texture bool m_texClientStorage; // was CS selecetd for texture
bool m_texPreloaded; // has it been kicked into VRAM with GLMContext::PreloadTex yet 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) 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 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 CTexBindMask m_bindPoints; // true for each place in the parent ctx where currently
// bound (indexed via EGLMTexCtxBindingIndex) // bound (indexed via EGLMTexCtxBindingIndex)
int m_rtAttachCount; // how many RT's have this texture attached somewhere int m_rtAttachCount; // how many RT's have this texture attached somewhere
char *m_backing; // backing storage if available char *m_backing; // backing storage if available
int m_lockCount; // lock reqs are stored in the GLMContext for tracking int m_lockCount; // lock reqs are stored in the GLMContext for tracking
CUtlVector<unsigned char> m_sliceFlags; CUtlVector<unsigned char> m_sliceFlags;
char *m_debugLabel; // strdup() of debugLabel passed in, or NULL char *m_debugLabel; // strdup() of debugLabel passed in, or NULL
}; };
#endif #endif

File diff suppressed because it is too large Load Diff

View File

@ -1,184 +1,184 @@
//========= Copyright Valve Corporation, All rights reserved. ============// //========= Copyright Valve Corporation, All rights reserved. ============//
// !!! FIXME: Some of these aren't base OpenGL...pick out the extensions. // !!! FIXME: Some of these aren't base OpenGL...pick out the extensions.
// !!! FIXME: Also, look up these -1, -1 versions numbers. // !!! FIXME: Also, look up these -1, -1 versions numbers.
GL_FUNC(OpenGL,true,GLenum,glGetError,(void),()) GL_FUNC(OpenGL,true,GLenum,glGetError,(void),())
GL_FUNC_VOID(OpenGL,true,glActiveTexture,(GLenum a),(a)) 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,glAlphaFunc,(GLenum a,GLclampf b),(a,b))
GL_FUNC_VOID(OpenGL,true,glAttachObjectARB,(GLhandleARB a,GLhandleARB 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,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,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,glBindBufferARB,(GLenum a,GLuint b),(a,b))
GL_FUNC_VOID(OpenGL,true,glBindProgramARB,(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,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,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,glBlendEquation,(GLenum a),(a))
GL_FUNC_VOID(OpenGL,true,glBlendFunc,(GLenum a,GLenum b),(a,b)) 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,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,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,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,glClearDepth,(GLclampd a),(a))
GL_FUNC_VOID(OpenGL,true,glClearStencil,(GLint 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,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,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,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,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_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,glCreateProgramObjectARB,(void),())
GL_FUNC(OpenGL,true,GLhandleARB,glCreateShaderObjectARB,(GLenum a),(a)) 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,glDeleteBuffersARB,(GLsizei a,const GLuint *b),(a,b))
GL_FUNC_VOID(OpenGL,true,glDeleteObjectARB,(GLhandleARB a),(a)) 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,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,glDeleteQueriesARB,(GLsizei a,const GLuint *b),(a,b))
GL_FUNC_VOID(OpenGL,true,glDeleteShader,(GLuint a),(a)) 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,glDeleteTextures,(GLsizei a,const GLuint *b),(a,b))
GL_FUNC_VOID(OpenGL,true,glDepthFunc,(GLenum a),(a)) GL_FUNC_VOID(OpenGL,true,glDepthFunc,(GLenum a),(a))
GL_FUNC_VOID(OpenGL,true,glDepthMask,(GLboolean 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,glDepthRange,(GLclampd a,GLclampd b),(a,b))
GL_FUNC_VOID(OpenGL,true,glDetachObjectARB,(GLhandleARB a,GLhandleARB 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,glDisable,(GLenum a),(a))
GL_FUNC_VOID(OpenGL,true,glDisableVertexAttribArray,(GLuint 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,glDrawArrays,(GLenum a,GLint b,GLsizei c),(a,b,c))
GL_FUNC_VOID(OpenGL,true,glDrawBuffer,(GLenum a),(a)) 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,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,glEnable,(GLenum a),(a))
GL_FUNC_VOID(OpenGL,true,glEnableVertexAttribArray,(GLuint a),(a)) GL_FUNC_VOID(OpenGL,true,glEnableVertexAttribArray,(GLuint a),(a))
GL_FUNC_VOID(OpenGL,true,glEnd,(void),()) GL_FUNC_VOID(OpenGL,true,glEnd,(void),())
GL_FUNC_VOID(OpenGL,true,glFinish,(void),()) GL_FUNC_VOID(OpenGL,true,glFinish,(void),())
GL_FUNC_VOID(OpenGL,true,glFlush,(void),()) GL_FUNC_VOID(OpenGL,true,glFlush,(void),())
GL_FUNC_VOID(OpenGL,true,glFrontFace,(GLenum a),(a)) 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,glGenBuffersARB,(GLsizei a,GLuint *b),(a,b))
GL_FUNC_VOID(OpenGL,true,glGenProgramsARB,(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,glGenQueriesARB,(GLsizei a,GLuint *b),(a,b))
GL_FUNC_VOID(OpenGL,true,glGenTextures,(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,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,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,glGetDoublev,(GLenum a,GLdouble *b),(a,b))
GL_FUNC_VOID(OpenGL,true,glGetFloatv,(GLenum a,GLfloat *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,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,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,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_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(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_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,GLint,glGetUniformLocationARB,(GLhandleARB a,const GLcharARB *b),(a,b))
GL_FUNC(OpenGL,true,GLboolean,glIsEnabled,(GLenum a),(a)) GL_FUNC(OpenGL,true,GLboolean,glIsEnabled,(GLenum a),(a))
GL_FUNC(OpenGL,true,GLboolean,glIsTexture,(GLuint a),(a)) GL_FUNC(OpenGL,true,GLboolean,glIsTexture,(GLuint a),(a))
GL_FUNC_VOID(OpenGL,true,glLinkProgramARB,(GLhandleARB 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(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,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,glPixelStorei,(GLenum a,GLint b),(a,b))
GL_FUNC_VOID(OpenGL,true,glPolygonMode,(GLenum a,GLenum 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,glPolygonOffset,(GLfloat a,GLfloat b),(a,b))
GL_FUNC_VOID(OpenGL,true,glPopAttrib,(void),()) 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,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,glPushAttrib,(GLbitfield a),(a))
GL_FUNC_VOID(OpenGL,true,glReadBuffer,(GLenum 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,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,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,glStencilFunc,(GLenum a,GLint b,GLuint c),(a,b,c))
GL_FUNC_VOID(OpenGL,true,glStencilMask,(GLuint a),(a)) 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,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,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,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,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,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,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,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,glUniform1f,(GLint a,GLfloat b),(a,b))
GL_FUNC_VOID(OpenGL,true,glUniform1i,(GLint a,GLint 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,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_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(OpenGL,true,GLboolean,glUnmapBuffer,(GLenum a),(a))
GL_FUNC_VOID(OpenGL,true,glUseProgram,(GLuint 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,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,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,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,glEnableClientState,(GLenum a),(a))
GL_FUNC_VOID(OpenGL,true,glDisableClientState,(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,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,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,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,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,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,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,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,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_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_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,glBindFramebufferEXT,(GLenum a,GLuint b),(a,b))
GL_FUNC_VOID(GL_EXT_framebuffer_object,false,glBindRenderbufferEXT,(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(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,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,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,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,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,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,glGenRenderbuffersEXT,(GLsizei a,GLuint *b),(a,b))
GL_FUNC_VOID(GL_EXT_framebuffer_object,false,glDeleteFramebuffersEXT,(GLsizei a,const 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_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_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_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_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_EXT(GL_APPLE_fence,-1,-1)
GL_FUNC(GL_APPLE_fence,false,GLboolean,glTestFenceAPPLE,(GLuint a),(a)) 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,glSetFenceAPPLE,(GLuint a),(a))
GL_FUNC_VOID(GL_APPLE_fence,false,glFinishFenceAPPLE,(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,glDeleteFencesAPPLE,(GLsizei a,const GLuint *b),(a,b))
GL_FUNC_VOID(GL_APPLE_fence,false,glGenFencesAPPLE,(GLsizei a,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_EXT(GL_NV_fence,-1,-1)
GL_FUNC(GL_NV_fence,false,GLboolean,glTestFenceNV,(GLuint a),(a)) 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,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,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,glDeleteFencesNV,(GLsizei a,const GLuint *b),(a,b))
GL_FUNC_VOID(GL_NV_fence,false,glGenFencesNV,(GLsizei a,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) GL_EXT(GL_ARB_sync,3,2)
#ifdef HAVE_GL_ARB_SYNC #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_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(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,glWaitSync,(GLsync a, GLbitfield b, GLuint64 c),(a,b,c))
GL_FUNC_VOID(GL_ARB_sync,false,glDeleteSync,(GLsync a),(a)) 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)) GL_FUNC(GL_ARB_sync,false,GLsync,glFenceSync,(GLenum a, GLbitfield b),(a,b))
#endif #endif
GL_EXT(GL_EXT_draw_buffers2,-1,-1) 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,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,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,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_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_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_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_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,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_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_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(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_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_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,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,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,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_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_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,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_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_APPLE_client_storage,-1,-1)
GL_EXT(GL_ARB_uniform_buffer,-1,-1) GL_EXT(GL_ARB_uniform_buffer,-1,-1)
GL_EXT(GL_ARB_vertex_array_bgra,-1,-1) GL_EXT(GL_ARB_vertex_array_bgra,-1,-1)
GL_EXT(GL_EXT_vertex_array_bgra,-1,-1) GL_EXT(GL_EXT_vertex_array_bgra,-1,-1)
GL_EXT(GL_ARB_framebuffer_object,3,0) 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,glBindFramebuffer,(GLenum a,GLuint b),(a,b))
GL_FUNC_VOID(GL_ARB_framebuffer_object,false,glBindRenderbuffer,(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(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,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,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,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,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,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,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,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,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_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_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(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,glPushClientAttrib,(GLbitfield a),(a))
GL_FUNC_VOID(OpenGL,true,glPopClientAttrib,(void),()) GL_FUNC_VOID(OpenGL,true,glPopClientAttrib,(void),())

View File

@ -1,177 +1,177 @@
//========= Copyright Valve Corporation, All rights reserved. ============// //========= Copyright Valve Corporation, All rights reserved. ============//
// //
// glmdisplay.h // glmdisplay.h
// display related stuff - used by both GLMgr and the CocoaMgr // display related stuff - used by both GLMgr and the CocoaMgr
// //
//=============================================================================== //===============================================================================
#ifndef GLMDISPLAY_H #ifndef GLMDISPLAY_H
#define GLMDISPLAY_H #define GLMDISPLAY_H
#pragma once #pragma once
#ifdef OSX #ifdef OSX
#include <OpenGL/OpenGL.h> #include <OpenGL/OpenGL.h>
#include <OpenGL/gl.h> #include <OpenGL/gl.h>
#include <OpenGL/glext.h> #include <OpenGL/glext.h>
#include <OpenGL/CGLTypes.h> #include <OpenGL/CGLTypes.h>
#include <OpenGL/CGLRenderers.h> #include <OpenGL/CGLRenderers.h>
#include <OpenGL/CGLCurrent.h> #include <OpenGL/CGLCurrent.h>
typedef uint32_t CGDirectDisplayID; typedef uint32_t CGDirectDisplayID;
typedef uint32_t CGOpenGLDisplayMask; typedef uint32_t CGOpenGLDisplayMask;
typedef double CGRefreshRate; typedef double CGRefreshRate;
//#include <ApplicationServices/ApplicationServices.h> //#include <ApplicationServices/ApplicationServices.h>
#elif defined(LINUX) #elif defined(LINUX)
#include "tier0/platform.h" #include "tier0/platform.h"
#include <GL/gl.h> #include <GL/gl.h>
#include <GL/glext.h> #include <GL/glext.h>
#else #else
#error #error
#endif #endif
typedef void _PseudoNSGLContext; // aka NSOpenGLContext typedef void _PseudoNSGLContext; // aka NSOpenGLContext
typedef _PseudoNSGLContext *PseudoNSGLContextPtr; typedef _PseudoNSGLContext *PseudoNSGLContextPtr;
struct GLMDisplayModeInfoFields struct GLMDisplayModeInfoFields
{ {
uint m_modePixelWidth; uint m_modePixelWidth;
uint m_modePixelHeight; uint m_modePixelHeight;
uint m_modeRefreshHz; uint m_modeRefreshHz;
// are we even going to talk about bit depth... not yet // are we even going to talk about bit depth... not yet
}; };
struct GLMDisplayInfoFields struct GLMDisplayInfoFields
{ {
#ifdef OSX #ifdef OSX
CGDirectDisplayID m_cgDisplayID; CGDirectDisplayID m_cgDisplayID;
CGOpenGLDisplayMask m_glDisplayMask; // result of CGDisplayIDToOpenGLDisplayMask on the cg_displayID. CGOpenGLDisplayMask m_glDisplayMask; // result of CGDisplayIDToOpenGLDisplayMask on the cg_displayID.
#endif #endif
uint m_displayPixelWidth; uint m_displayPixelWidth;
uint m_displayPixelHeight; uint m_displayPixelHeight;
}; };
struct GLMRendererInfoFields struct GLMRendererInfoFields
{ {
/*properties of interest and their desired values. /*properties of interest and their desired values.
kCGLRPFullScreen = 54, true kCGLRPFullScreen = 54, true
kCGLRPAccelerated = 73, true kCGLRPAccelerated = 73, true
kCGLRPWindow = 80, true kCGLRPWindow = 80, true
kCGLRPRendererID = 70, informational kCGLRPRendererID = 70, informational
kCGLRPDisplayMask = 84, informational kCGLRPDisplayMask = 84, informational
kCGLRPBufferModes = 100, informational kCGLRPBufferModes = 100, informational
kCGLRPColorModes = 103, informational kCGLRPColorModes = 103, informational
kCGLRPAccumModes = 104, informational kCGLRPAccumModes = 104, informational
kCGLRPDepthModes = 105, informational kCGLRPDepthModes = 105, informational
kCGLRPStencilModes = 106, informational kCGLRPStencilModes = 106, informational
kCGLRPMaxAuxBuffers = 107, informational kCGLRPMaxAuxBuffers = 107, informational
kCGLRPMaxSampleBuffers = 108, informational kCGLRPMaxSampleBuffers = 108, informational
kCGLRPMaxSamples = 109, informational kCGLRPMaxSamples = 109, informational
kCGLRPSampleModes = 110, informational kCGLRPSampleModes = 110, informational
kCGLRPSampleAlpha = 111, informational kCGLRPSampleAlpha = 111, informational
kCGLRPVideoMemory = 120, informational kCGLRPVideoMemory = 120, informational
kCGLRPTextureMemory = 121, informational kCGLRPTextureMemory = 121, informational
kCGLRPRendererCount = 128 number of renderers in the CGLRendererInfoObj under examination kCGLRPRendererCount = 128 number of renderers in the CGLRendererInfoObj under examination
kCGLRPOffScreen = 53, D/C kCGLRPOffScreen = 53, D/C
kCGLRPRobust = 75, FALSE or D/C - aka we're asking for no-fallback kCGLRPRobust = 75, FALSE or D/C - aka we're asking for no-fallback
kCGLRPBackingStore = 76, D/C kCGLRPBackingStore = 76, D/C
kCGLRPMPSafe = 78, D/C kCGLRPMPSafe = 78, D/C
kCGLRPMultiScreen = 81, D/C kCGLRPMultiScreen = 81, D/C
kCGLRPCompliant = 83, D/C kCGLRPCompliant = 83, D/C
*/ */
//--------------------------- info we have from CGL renderer queries, IOKit, Gestalt //--------------------------- info we have from CGL renderer queries, IOKit, Gestalt
//--------------------------- these are set up in the displayDB by CocoaMgr //--------------------------- these are set up in the displayDB by CocoaMgr
GLint m_fullscreen; GLint m_fullscreen;
GLint m_accelerated; GLint m_accelerated;
GLint m_windowed; GLint m_windowed;
GLint m_rendererID; GLint m_rendererID;
GLint m_displayMask; GLint m_displayMask;
GLint m_bufferModes; GLint m_bufferModes;
GLint m_colorModes; GLint m_colorModes;
GLint m_accumModes; GLint m_accumModes;
GLint m_depthModes; GLint m_depthModes;
GLint m_stencilModes; GLint m_stencilModes;
GLint m_maxAuxBuffers; GLint m_maxAuxBuffers;
GLint m_maxSampleBuffers; GLint m_maxSampleBuffers;
GLint m_maxSamples; GLint m_maxSamples;
GLint m_sampleModes; GLint m_sampleModes;
GLint m_sampleAlpha; GLint m_sampleAlpha;
GLint m_vidMemory; GLint m_vidMemory;
GLint m_texMemory; GLint m_texMemory;
uint m_pciVendorID; uint m_pciVendorID;
uint m_pciDeviceID; uint m_pciDeviceID;
char m_pciModelString[64]; char m_pciModelString[64];
char m_driverInfoString[64]; char m_driverInfoString[64];
//--------------------------- OS version related - set up by CocoaMgr //--------------------------- OS version related - set up by CocoaMgr
// OS version found // OS version found
uint m_osComboVersion; // 0x00XXYYZZ : XX major, YY minor, ZZ minor minor : 10.6.3 --> 0x000A0603. 10.5.8 --> 0x000A0508. 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 //--------------------------- shorthands - also set up by CocoaMgr - driven by vendorid / deviceid
bool m_ati; bool m_ati;
bool m_atiR5xx; bool m_atiR5xx;
bool m_atiR6xx; bool m_atiR6xx;
bool m_atiR7xx; bool m_atiR7xx;
bool m_atiR8xx; bool m_atiR8xx;
bool m_atiNewer; bool m_atiNewer;
bool m_intel; bool m_intel;
bool m_intel95x; bool m_intel95x;
bool m_intel3100; bool m_intel3100;
bool m_intelNewer; bool m_intelNewer;
bool m_nv; bool m_nv;
bool m_nvG7x; bool m_nvG7x;
bool m_nvG8x; bool m_nvG8x;
bool m_nvNewer; 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) //--------------------------- context query results - left blank in the display DB - but valid in a GLMContext (call ctx->Caps() to get a const ref)
// booleans // booleans
bool m_hasGammaWrites; // aka glGetBooleanv(GL_FRAMEBUFFER_SRGB_CAPABLE_EXT) / glEnable(GL_FRAMEBUFFER_SRGB_EXT) 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_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_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_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_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_hasOcclusionQuery; // occlusion query: do you speak it ?!
bool m_hasFramebufferBlit; // framebuffer blit: know what I'm sayin?! 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) bool m_hasPerfPackage1; // means new MTGL, fast OQ, fast uniform upload, NV can resolve flipped (late summer 2010 post 10.6.4 update)
// counts // counts
int m_maxAniso; // aniso limit - context query int m_maxAniso; // aniso limit - context query
// other exts // other exts
bool m_hasBindableUniforms; bool m_hasBindableUniforms;
bool m_hasUniformBuffers; bool m_hasUniformBuffers;
// runtime options that aren't negotiable once set // runtime options that aren't negotiable once set
bool m_hasDualShaders; // must supply CLI arg "-glmdualshaders" or we go GLSL only bool m_hasDualShaders; // must supply CLI arg "-glmdualshaders" or we go GLSL only
//--------------------------- " can'ts " - specific problems that need to be worked around //--------------------------- " can'ts " - specific problems that need to be worked around
bool m_cantBlitReliably; // Intel chipsets have problems blitting sRGB sometimes 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_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_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_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 bool m_costlyGammaFlips; // this means that sRGB sampling state affects shader code gen, resulting in state-dependent code regen
//--------------------------- " bads " - known bad drivers //--------------------------- " bads " - known bad drivers
bool m_badDriver1064NV; // this is the bad NVIDIA driver on 10.6.4 - stutter, tex corruption, black screen issues bool m_badDriver1064NV; // this is the bad NVIDIA driver on 10.6.4 - stutter, tex corruption, black screen issues
}; };
#endif #endif

File diff suppressed because it is too large Load Diff

View File

@ -1,299 +1,299 @@
//========= Copyright Valve Corporation, All rights reserved. ============// //========= Copyright Valve Corporation, All rights reserved. ============//
// //
// glmgrbasics.h // glmgrbasics.h
// types, common headers, forward declarations, utilities // types, common headers, forward declarations, utilities
// //
//=============================================================================== //===============================================================================
#ifndef GLMBASICS_H #ifndef GLMBASICS_H
#define GLMBASICS_H #define GLMBASICS_H
#pragma once #pragma once
#ifdef OSX #ifdef OSX
#include <OpenGL/OpenGL.h> #include <OpenGL/OpenGL.h>
#include <OpenGL/gl.h> #include <OpenGL/gl.h>
#include <OpenGL/glext.h> #include <OpenGL/glext.h>
#include <OpenGL/CGLTypes.h> #include <OpenGL/CGLTypes.h>
#include <OpenGL/CGLRenderers.h> #include <OpenGL/CGLRenderers.h>
#include <OpenGL/CGLCurrent.h> #include <OpenGL/CGLCurrent.h>
#include <OpenGL/CGLProfiler.h> #include <OpenGL/CGLProfiler.h>
//#include <ApplicationServices/ApplicationServices.h> //#include <ApplicationServices/ApplicationServices.h>
#elif defined(LINUX) #elif defined(LINUX)
#include <GL/gl.h> #include <GL/gl.h>
#include <GL/glext.h> #include <GL/glext.h>
#else #else
#error #error
#endif #endif
#include "tier0/platform.h" #include "tier0/platform.h"
#include "bitmap/imageformat.h" #include "bitmap/imageformat.h"
#include "bitvec.h" #include "bitvec.h"
#include "tier1/checksum_md5.h" #include "tier1/checksum_md5.h"
#include "tier1/utlvector.h" #include "tier1/utlvector.h"
#include "tier1/convar.h" #include "tier1/convar.h"
#include <sys/stat.h> #include <sys/stat.h>
#include "dxabstract_types.h" #include "dxabstract_types.h"
// types // types
struct GLMRect; struct GLMRect;
typedef void *PseudoGLContextPtr; typedef void *PseudoGLContextPtr;
// 3-d integer box (used for texture lock/unlock etc) // 3-d integer box (used for texture lock/unlock etc)
struct GLMRegion struct GLMRegion
{ {
int xmin,xmax; int xmin,xmax;
int ymin,ymax; int ymin,ymax;
int zmin,zmax; int zmin,zmax;
}; };
struct GLMRect // follows GL convention - if coming from the D3D rect you will need to fiddle the Y's struct GLMRect // follows GL convention - if coming from the D3D rect you will need to fiddle the Y's
{ {
int xmin; // left int xmin; // left
int ymin; // bottom int ymin; // bottom
int xmax; // right int xmax; // right
int ymax; // top int ymax; // top
}; };
// macros // macros
//#define GLMassert(x) assert(x) //#define GLMassert(x) assert(x)
// forward decls // forward decls
class GLMgr; // singleton class GLMgr; // singleton
class GLMContext; // GL context class GLMContext; // GL context
class CGLMContextTester; // testing class class CGLMContextTester; // testing class
class CGLMTex; class CGLMTex;
class CGLMFBO; class CGLMFBO;
class CGLMProgram; class CGLMProgram;
class CGLMBuffer; class CGLMBuffer;
// utilities // utilities
typedef enum typedef enum
{ {
// D3D codes // D3D codes
eD3D_DEVTYPE, eD3D_DEVTYPE,
eD3D_FORMAT, eD3D_FORMAT,
eD3D_RTYPE, eD3D_RTYPE,
eD3D_USAGE, eD3D_USAGE,
eD3D_RSTATE, // render state eD3D_RSTATE, // render state
eD3D_SIO, // D3D shader bytecode eD3D_SIO, // D3D shader bytecode
eD3D_VTXDECLUSAGE, eD3D_VTXDECLUSAGE,
// CGL codes // CGL codes
eCGL_RENDID, eCGL_RENDID,
// OpenGL error codes // OpenGL error codes
eGL_ERROR, eGL_ERROR,
// OpenGL enums // OpenGL enums
eGL_ENUM, eGL_ENUM,
eGL_RENDERER eGL_RENDERER
} GLMThing_t; } GLMThing_t;
const char* GLMDecode( GLMThing_t type, unsigned long value ); // decode a numeric const 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 const char* GLMDecodeMask( GLMThing_t type, unsigned long value ); // decode a bitmask
void GLMStop( void ); // aka Debugger() void GLMStop( void ); // aka Debugger()
void GLMCheckError( bool noStop = false, bool noLog= false ); void GLMCheckError( bool noStop = false, bool noLog= false );
void GLMEnableTrace( bool on ); void GLMEnableTrace( bool on );
// expose these in release now // expose these in release now
// Mimic PIX events so we can decorate debug spew // Mimic PIX events so we can decorate debug spew
void GLMBeginPIXEvent( const char *str ); void GLMBeginPIXEvent( const char *str );
void GLMEndPIXEvent( void ); void GLMEndPIXEvent( void );
//=============================================================================== //===============================================================================
// knob twiddling // knob twiddling
float GLMKnob( char *knobname, float *setvalue ); // Pass NULL to not-set the knob value float GLMKnob( char *knobname, float *setvalue ); // Pass NULL to not-set the knob value
float GLMKnobToggle( char *knobname ); float GLMKnobToggle( char *knobname );
//=============================================================================== //===============================================================================
// other stuff // other stuff
// helpers for CGLSetOption - no op if no profiler // helpers for CGLSetOption - no op if no profiler
void GLMProfilerClearTrace( void ); void GLMProfilerClearTrace( void );
void GLMProfilerEnableTrace( bool enable ); void GLMProfilerEnableTrace( bool enable );
// helpers for CGLSetParameter - no op if no profiler // helpers for CGLSetParameter - no op if no profiler
void GLMProfilerDumpState( void ); void GLMProfilerDumpState( void );
//=============================================================================== //===============================================================================
// classes // classes
// helper class making function tracking easier to wire up // helper class making function tracking easier to wire up
#if GLMDEBUG #if GLMDEBUG
class GLMFuncLogger class GLMFuncLogger
{ {
public: public:
// simple function log // simple function log
GLMFuncLogger( const char *funcName ) GLMFuncLogger( const char *funcName )
{ {
m_funcName = funcName; m_funcName = funcName;
m_earlyOut = false; m_earlyOut = false;
GLMPrintf( ">%s", m_funcName ); GLMPrintf( ">%s", m_funcName );
}; };
// more advanced version lets you pass args (i.e. called parameters or anything else of interest) // 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 // 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, ... ) GLMFuncLogger( const char *funcName, char *fmt, ... )
{ {
m_funcName = funcName; m_funcName = funcName;
m_earlyOut = false; m_earlyOut = false;
// this acts like GLMPrintf here // this acts like GLMPrintf here
// all the indent policy is down in GLMPrintfVA // 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. // which means we need to inject a ">" at the front of the format string to make this work... sigh.
char modifiedFmt[2000]; char modifiedFmt[2000];
modifiedFmt[0] = '>'; modifiedFmt[0] = '>';
strcpy( modifiedFmt+1, fmt ); strcpy( modifiedFmt+1, fmt );
va_list vargs; va_list vargs;
va_start(vargs, fmt); va_start(vargs, fmt);
GLMPrintfVA( modifiedFmt, vargs ); GLMPrintfVA( modifiedFmt, vargs );
va_end( vargs ); va_end( vargs );
} }
~GLMFuncLogger( ) ~GLMFuncLogger( )
{ {
if (m_earlyOut) if (m_earlyOut)
{ {
GLMPrintf( "<%s (early out)", m_funcName ); GLMPrintf( "<%s (early out)", m_funcName );
} }
else else
{ {
GLMPrintf( "<%s", m_funcName ); GLMPrintf( "<%s", m_funcName );
} }
}; };
void EarlyOut( void ) void EarlyOut( void )
{ {
m_earlyOut = true; m_earlyOut = true;
}; };
const char *m_funcName; // set at construction time const char *m_funcName; // set at construction time
bool m_earlyOut; bool m_earlyOut;
}; };
// handy macro to go with the function tracking class // handy macro to go with the function tracking class
#define GLM_FUNC GLMFuncLogger _logger_ ( __FUNCTION__ ) #define GLM_FUNC GLMFuncLogger _logger_ ( __FUNCTION__ )
#else #else
#define GLM_FUNC #define GLM_FUNC
#endif #endif
// class to keep an in-memory mirror of a file which may be getting edited during run // class to keep an in-memory mirror of a file which may be getting edited during run
class CGLMFileMirror class CGLMFileMirror
{ {
public: public:
CGLMFileMirror( char *fullpath ); // just associates mirror with file. if file exists it will be read. 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 //if non existent it will be created with size zero
~CGLMFileMirror( ); ~CGLMFileMirror( );
bool HasData( void ); // see if data avail bool HasData( void ); // see if data avail
void GetData( char **dataPtr, uint *dataSizePtr ); // read it out void GetData( char **dataPtr, uint *dataSizePtr ); // read it out
void SetData( char *data, uint dataSize ); // put data in (and write it to disk) 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. 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 UpdateStatInfo( void ); // make sure stat info is current for our file
void ReadFile( void ); void ReadFile( void );
void WriteFile( void ); void WriteFile( void );
void OpenInEditor( bool foreground=false ); // pass TRUE if you would like the editor to pop to foreground void OpenInEditor( bool foreground=false ); // pass TRUE if you would like the editor to pop to foreground
/// how about a "wait for change" method.. /// how about a "wait for change" method..
char *m_path; // fullpath to file char *m_path; // fullpath to file
bool m_exists; bool m_exists;
struct stat m_stat; // stat results for the file (last time checked) struct stat m_stat; // stat results for the file (last time checked)
char *m_data; // content of file char *m_data; // content of file
uint m_size; // length of content uint m_size; // length of content
}; };
// class based on the file mirror, that makes it easy to edit them outside the app. // 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 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") // 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. // 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. // 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) // (i.e. engine is instructing this subsystem to wipe out any old/modified variants of the text)
class CGLMEditableTextItem class CGLMEditableTextItem
{ {
public: public:
CGLMEditableTextItem( char *text, uint size, bool forceOverwrite, char *prefix, char *suffix = NULL ); // create a text blob from text source, optional filename suffix CGLMEditableTextItem( char *text, uint size, bool forceOverwrite, char *prefix, char *suffix = NULL ); // create a text blob from text source, optional filename suffix
~CGLMEditableTextItem( ); ~CGLMEditableTextItem( );
bool HasData( void ); bool HasData( void );
bool PollForChanges( void ); // return true if stale i.e. you need to get a new edition 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 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 void OpenInEditor( bool foreground=false ); // call user attention to this text
// internal methods // internal methods
void GenHashOfOrigText( void ); void GenHashOfOrigText( void );
void GenBaseNameAndFullPath( char *prefix, char *suffix ); void GenBaseNameAndFullPath( char *prefix, char *suffix );
void GenMungedText( bool fromMirror ); void GenMungedText( bool fromMirror );
// members // members
// orig // orig
uint m_origSize; uint m_origSize;
char *m_origText; // what was submitted char *m_origText; // what was submitted
unsigned char m_origDigest[MD5_DIGEST_LENGTH]; // digest of what was submitted unsigned char m_origDigest[MD5_DIGEST_LENGTH]; // digest of what was submitted
// munged // munged
uint m_mungedSize; uint m_mungedSize;
char *m_mungedText; // re-processed edition, initial content submission to the file mirror char *m_mungedText; // re-processed edition, initial content submission to the file mirror
// mirror // mirror
char *m_mirrorBaseName; // generated from the hash of the orig text, plus the label / prefix char *m_mirrorBaseName; // generated from the hash of the orig text, plus the label / prefix
char *m_mirrorFullPath; // base name char *m_mirrorFullPath; // base name
CGLMFileMirror *m_mirror; // file mirror itself. holds "official" copy for GetCurrentText to return. CGLMFileMirror *m_mirror; // file mirror itself. holds "official" copy for GetCurrentText to return.
}; };
// debug font // debug font
extern unsigned char g_glmDebugFontMap[16384]; extern unsigned char g_glmDebugFontMap[16384];
// class for cracking multi-part text blobs // class for cracking multi-part text blobs
// sections are demarcated by beginning-of-line markers submitted in a table by the caller // sections are demarcated by beginning-of-line markers submitted in a table by the caller
struct GLMTextSection struct GLMTextSection
{ {
int m_markerIndex; // based on table of markers passed in to constructor int m_markerIndex; // based on table of markers passed in to constructor
uint m_textOffset; // where is the text - offset uint m_textOffset; // where is the text - offset
int m_textLength; // how big is the section int m_textLength; // how big is the section
}; };
class CGLMTextSectioner class CGLMTextSectioner
{ {
public: public:
CGLMTextSectioner( char *text, int textSize, char **markers ); // constructor finds all the sections CGLMTextSectioner( char *text, int textSize, char **markers ); // constructor finds all the sections
~CGLMTextSectioner( ); ~CGLMTextSectioner( );
int Count( void ); // how many sections found int Count( void ); // how many sections found
void GetSection( int index, uint *offsetOut, uint *lengthOut, int *markerIndexOut ); void GetSection( int index, uint *offsetOut, uint *lengthOut, int *markerIndexOut );
// find section, size, what marker // find section, size, what marker
// note that more than one section can be marked similarly. // 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. // so policy isn't made here, you walk the sections and decide what to do if there are dupes.
//members //members
//section table //section table
CUtlVector< GLMTextSection > m_sectionTable; CUtlVector< GLMTextSection > m_sectionTable;
}; };
#endif #endif

View File

@ -1,93 +1,93 @@
//========= Copyright Valve Corporation, All rights reserved. ============// //========= Copyright Valve Corporation, All rights reserved. ============//
// //
// glmgrext.h // glmgrext.h
// helper file for extension testing and runtime importing of entry points // helper file for extension testing and runtime importing of entry points
// //
//=============================================================================== //===============================================================================
#pragma once #pragma once
#ifdef OSX #ifdef OSX
#include <OpenGL/gl.h> #include <OpenGL/gl.h>
#include <OpenGL/glext.h> #include <OpenGL/glext.h>
#elif defined(LINUX) #elif defined(LINUX)
#include <GL/gl.h> #include <GL/gl.h>
#include <GL/glext.h> #include <GL/glext.h>
#else #else
#error #error
#endif #endif
#ifndef GL_EXT_framebuffer_sRGB #ifndef GL_EXT_framebuffer_sRGB
#define GL_FRAMEBUFFER_SRGB_EXT 0x8DB9 #define GL_FRAMEBUFFER_SRGB_EXT 0x8DB9
#define GL_FRAMEBUFFER_SRGB_CAPABLE_EXT 0x8DBA #define GL_FRAMEBUFFER_SRGB_CAPABLE_EXT 0x8DBA
#endif #endif
#ifndef ARB_texture_rg #ifndef ARB_texture_rg
#define GL_COMPRESSED_RED 0x8225 #define GL_COMPRESSED_RED 0x8225
#define GL_COMPRESSED_RG 0x8226 #define GL_COMPRESSED_RG 0x8226
#define GL_RG 0x8227 #define GL_RG 0x8227
#define GL_RG_INTEGER 0x8228 #define GL_RG_INTEGER 0x8228
#define GL_R8 0x8229 #define GL_R8 0x8229
#define GL_R16 0x822A #define GL_R16 0x822A
#define GL_RG8 0x822B #define GL_RG8 0x822B
#define GL_RG16 0x822C #define GL_RG16 0x822C
#define GL_R16F 0x822D #define GL_R16F 0x822D
#define GL_R32F 0x822E #define GL_R32F 0x822E
#define GL_RG16F 0x822F #define GL_RG16F 0x822F
#define GL_RG32F 0x8230 #define GL_RG32F 0x8230
#define GL_R8I 0x8231 #define GL_R8I 0x8231
#define GL_R8UI 0x8232 #define GL_R8UI 0x8232
#define GL_R16I 0x8233 #define GL_R16I 0x8233
#define GL_R16UI 0x8234 #define GL_R16UI 0x8234
#define GL_R32I 0x8235 #define GL_R32I 0x8235
#define GL_R32UI 0x8236 #define GL_R32UI 0x8236
#define GL_RG8I 0x8237 #define GL_RG8I 0x8237
#define GL_RG8UI 0x8238 #define GL_RG8UI 0x8238
#define GL_RG16I 0x8239 #define GL_RG16I 0x8239
#define GL_RG16UI 0x823A #define GL_RG16UI 0x823A
#define GL_RG32I 0x823B #define GL_RG32I 0x823B
#define GL_RG32UI 0x823C #define GL_RG32UI 0x823C
#endif #endif
#ifndef GL_EXT_bindable_uniform #ifndef GL_EXT_bindable_uniform
#define GL_UNIFORM_BUFFER_EXT 0x8DEE #define GL_UNIFORM_BUFFER_EXT 0x8DEE
#endif #endif
// unpublished extension enums (thus the "X") // unpublished extension enums (thus the "X")
// from EXT_framebuffer_multisample_blit_scaled.. // from EXT_framebuffer_multisample_blit_scaled..
#define XGL_SCALED_RESOLVE_FASTEST_EXT 0x90BA #define XGL_SCALED_RESOLVE_FASTEST_EXT 0x90BA
#define XGL_SCALED_RESOLVE_NICEST_EXT 0x90BB #define XGL_SCALED_RESOLVE_NICEST_EXT 0x90BB
#ifndef GL_TEXTURE_MINIMIZE_STORAGE_APPLE #ifndef GL_TEXTURE_MINIMIZE_STORAGE_APPLE
#define GL_TEXTURE_MINIMIZE_STORAGE_APPLE 0x85B6 #define GL_TEXTURE_MINIMIZE_STORAGE_APPLE 0x85B6
#endif #endif
#ifndef GL_ALL_COMPLETED_NV #ifndef GL_ALL_COMPLETED_NV
#define GL_ALL_COMPLETED_NV 0x84F2 #define GL_ALL_COMPLETED_NV 0x84F2
#endif #endif
#ifndef GL_MAP_READ_BIT #ifndef GL_MAP_READ_BIT
#define GL_MAP_READ_BIT 0x0001 #define GL_MAP_READ_BIT 0x0001
#endif #endif
#ifndef GL_MAP_WRITE_BIT #ifndef GL_MAP_WRITE_BIT
#define GL_MAP_WRITE_BIT 0x0002 #define GL_MAP_WRITE_BIT 0x0002
#endif #endif
#ifndef GL_MAP_INVALIDATE_RANGE_BIT #ifndef GL_MAP_INVALIDATE_RANGE_BIT
#define GL_MAP_INVALIDATE_RANGE_BIT 0x0004 #define GL_MAP_INVALIDATE_RANGE_BIT 0x0004
#endif #endif
#ifndef GL_MAP_INVALIDATE_BUFFER_BIT #ifndef GL_MAP_INVALIDATE_BUFFER_BIT
#define GL_MAP_INVALIDATE_BUFFER_BIT 0x0008 #define GL_MAP_INVALIDATE_BUFFER_BIT 0x0008
#endif #endif
#ifndef GL_MAP_FLUSH_EXPLICIT_BIT #ifndef GL_MAP_FLUSH_EXPLICIT_BIT
#define GL_MAP_FLUSH_EXPLICIT_BIT 0x0010 #define GL_MAP_FLUSH_EXPLICIT_BIT 0x0010
#endif #endif
#ifndef GL_MAP_UNSYNCHRONIZED_BIT #ifndef GL_MAP_UNSYNCHRONIZED_BIT
#define GL_MAP_UNSYNCHRONIZED_BIT 0x0020 #define GL_MAP_UNSYNCHRONIZED_BIT 0x0020
#endif #endif

View File

@ -1,112 +1,112 @@
//========= Copyright Valve Corporation, All rights reserved. ============// //========= Copyright Valve Corporation, All rights reserved. ============//
/******************************************************************/ /******************************************************************/
/* qsort.c -- Non-Recursive ANSI Quicksort function */ /* qsort.c -- Non-Recursive ANSI Quicksort function */
/* */ /* */
/* Public domain by Raymond Gardner, Englewood CO February 1991 */ /* Public domain by Raymond Gardner, Englewood CO February 1991 */
/* */ /* */
/* Usage: */ /* Usage: */
/* qsort(base, nbr_elements, width_bytes, compare_function); */ /* qsort(base, nbr_elements, width_bytes, compare_function); */
/* void *base; */ /* void *base; */
/* size_t nbr_elements, width_bytes; */ /* size_t nbr_elements, width_bytes; */
/* int (*compare_function)(const void *, const void *); */ /* int (*compare_function)(const void *, const void *); */
/* */ /* */
/* Sorts an array starting at base, of length nbr_elements, each */ /* Sorts an array starting at base, of length nbr_elements, each */
/* element of size width_bytes, ordered via compare_function, */ /* element of size width_bytes, ordered via compare_function, */
/* which is called as (*compare_function)(ptr_to_element1, */ /* which is called as (*compare_function)(ptr_to_element1, */
/* ptr_to_element2) and returns < 0 if element1 < element2, */ /* ptr_to_element2) and returns < 0 if element1 < element2, */
/* 0 if element1 = element2, > 0 if element1 > element2. */ /* 0 if element1 = element2, > 0 if element1 > element2. */
/* Most refinements are due to R. Sedgewick. See "Implementing */ /* Most refinements are due to R. Sedgewick. See "Implementing */
/* Quicksort Programs", Comm. ACM, Oct. 1978, and Corrigendum, */ /* Quicksort Programs", Comm. ACM, Oct. 1978, and Corrigendum, */
/* Comm. ACM, June 1979. */ /* Comm. ACM, June 1979. */
/******************************************************************/ /******************************************************************/
// modified to take (and use) a context object, ala Microsoft's qsort_s // modified to take (and use) a context object, ala Microsoft's qsort_s
// "extension" to the stdlib // "extension" to the stdlib
#include <stddef.h> /* for size_t definition */ #include <stddef.h> /* for size_t definition */
/* /*
** swap nbytes between a and b ** swap nbytes between a and b
*/ */
static void swap_bytes(char *a, char *b, size_t nbytes) static void swap_bytes(char *a, char *b, size_t nbytes)
{ {
char tmp; char tmp;
do { do {
tmp = *a; *a++ = *b; *b++ = tmp; tmp = *a; *a++ = *b; *b++ = tmp;
} while ( --nbytes ); } while ( --nbytes );
} }
#define SWAP(a, b) (swap_bytes((char *)(a), (char *)(b), size)) #define SWAP(a, b) (swap_bytes((char *)(a), (char *)(b), size))
#define COMP(ctx, a, b) ((*comp)((void *)ctx, (void *)(a), (void *)(b))) #define COMP(ctx, a, b) ((*comp)((void *)ctx, (void *)(a), (void *)(b)))
#define T 7 /* subfiles of T or fewer elements will */ #define T 7 /* subfiles of T or fewer elements will */
/* be sorted by a simple insertion sort */ /* be sorted by a simple insertion sort */
/* Note! T must be at least 3 */ /* Note! T must be at least 3 */
extern "C" void qsort_s(void *basep, size_t nelems, size_t size, extern "C" void qsort_s(void *basep, size_t nelems, size_t size,
int (*comp)(void *, const void *, const void *), int (*comp)(void *, const void *, const void *),
void *ctx) void *ctx)
{ {
char *stack[40], **sp; /* stack and stack pointer */ char *stack[40], **sp; /* stack and stack pointer */
char *i, *j, *limit; /* scan and limit pointers */ char *i, *j, *limit; /* scan and limit pointers */
size_t thresh; /* size of T elements in bytes */ size_t thresh; /* size of T elements in bytes */
char *base; /* base pointer as char * */ char *base; /* base pointer as char * */
base = (char *)basep; /* set up char * base pointer */ base = (char *)basep; /* set up char * base pointer */
thresh = T * size; /* init threshold */ thresh = T * size; /* init threshold */
sp = stack; /* init stack pointer */ sp = stack; /* init stack pointer */
limit = base + nelems * size;/* pointer past end of array */ limit = base + nelems * size;/* pointer past end of array */
for ( ;; ) { /* repeat until break... */ for ( ;; ) { /* repeat until break... */
if ( limit - base > thresh ) { /* if more than T elements */ if ( limit - base > thresh ) { /* if more than T elements */
/* swap base with middle */ /* swap base with middle */
SWAP((((limit-base)/size)/2)*size+base, base); SWAP((((limit-base)/size)/2)*size+base, base);
i = base + size; /* i scans left to right */ i = base + size; /* i scans left to right */
j = limit - size; /* j scans right to left */ j = limit - size; /* j scans right to left */
if ( COMP(ctx, i, j) > 0 ) /* Sedgewick's */ if ( COMP(ctx, i, j) > 0 ) /* Sedgewick's */
SWAP(i, j); /* three-element sort */ SWAP(i, j); /* three-element sort */
if ( COMP(ctx, base, j) > 0 )/* sets things up */ if ( COMP(ctx, base, j) > 0 )/* sets things up */
SWAP(base, j); /* so that */ SWAP(base, j); /* so that */
if ( COMP(ctx, i, base) > 0 )/* *i <= *base <= *j */ if ( COMP(ctx, i, base) > 0 )/* *i <= *base <= *j */
SWAP(i, base); /* *base is pivot element */ SWAP(i, base); /* *base is pivot element */
for ( ;; ) { /* loop until break */ for ( ;; ) { /* loop until break */
do /* move i right */ do /* move i right */
i += size; /* until *i >= pivot */ i += size; /* until *i >= pivot */
while ( COMP(ctx, i, base) < 0 ); while ( COMP(ctx, i, base) < 0 );
do /* move j left */ do /* move j left */
j -= size; /* until *j <= pivot */ j -= size; /* until *j <= pivot */
while ( COMP(ctx, j, base) > 0 ); while ( COMP(ctx, j, base) > 0 );
if ( i > j ) /* if pointers crossed */ if ( i > j ) /* if pointers crossed */
break; /* break loop */ break; /* break loop */
SWAP(i, j); /* else swap elements, keep scanning*/ SWAP(i, j); /* else swap elements, keep scanning*/
} }
SWAP(base, j); /* move pivot into correct place */ SWAP(base, j); /* move pivot into correct place */
if ( j - base > limit - i ) { /* if left subfile larger */ if ( j - base > limit - i ) { /* if left subfile larger */
sp[0] = base; /* stack left subfile base */ sp[0] = base; /* stack left subfile base */
sp[1] = j; /* and limit */ sp[1] = j; /* and limit */
base = i; /* sort the right subfile */ base = i; /* sort the right subfile */
} else { /* else right subfile larger*/ } else { /* else right subfile larger*/
sp[0] = i; /* stack right subfile base */ sp[0] = i; /* stack right subfile base */
sp[1] = limit; /* and limit */ sp[1] = limit; /* and limit */
limit = j; /* sort the left subfile */ limit = j; /* sort the left subfile */
} }
sp += 2; /* increment stack pointer */ sp += 2; /* increment stack pointer */
} else { /* else subfile is small, use insertion sort */ } else { /* else subfile is small, use insertion sort */
for ( j = base, i = j+size; i < limit; j = i, i += size ) for ( j = base, i = j+size; i < limit; j = i, i += size )
for ( ; COMP(ctx, j, j+size) > 0; j -= size ) { for ( ; COMP(ctx, j, j+size) > 0; j -= size ) {
SWAP(j, j+size); SWAP(j, j+size);
if ( j == base ) if ( j == base )
break; break;
} }
if ( sp != stack ) { /* if any entries on stack */ if ( sp != stack ) { /* if any entries on stack */
sp -= 2; /* pop the base and limit */ sp -= 2; /* pop the base and limit */
base = sp[0]; base = sp[0];
limit = sp[1]; limit = sp[1];
} else /* else stack empty, done */ } else /* else stack empty, done */
break; break;
} }
} }
} }

View File

@ -1,99 +1,99 @@
//========= Copyright Valve Corporation, All rights reserved. ============// //========= Copyright Valve Corporation, All rights reserved. ============//
// //
// cglmprogram.h // cglmprogram.h
// GLMgr buffers (index / vertex) // GLMgr buffers (index / vertex)
// ... maybe add PBO later as well // ... maybe add PBO later as well
//=============================================================================== //===============================================================================
#ifndef CGLMBUFFER_H #ifndef CGLMBUFFER_H
#define CGLMBUFFER_H #define CGLMBUFFER_H
#pragma once #pragma once
// ext links // ext links
// http://www.opengl.org/registry/specs/ARB/vertex_buffer_object.txt // http://www.opengl.org/registry/specs/ARB/vertex_buffer_object.txt
//=============================================================================== //===============================================================================
// tokens not in the SDK headers // tokens not in the SDK headers
//#ifndef GL_DEPTH_STENCIL_ATTACHMENT_EXT //#ifndef GL_DEPTH_STENCIL_ATTACHMENT_EXT
// #define GL_DEPTH_STENCIL_ATTACHMENT_EXT 0x84F9 // #define GL_DEPTH_STENCIL_ATTACHMENT_EXT 0x84F9
//#endif //#endif
//=============================================================================== //===============================================================================
// forward declarations // forward declarations
class GLMContext; class GLMContext;
enum EGLMBufferType enum EGLMBufferType
{ {
kGLMVertexBuffer, kGLMVertexBuffer,
kGLMIndexBuffer, kGLMIndexBuffer,
kGLMUniformBuffer, // for bindable uniform kGLMUniformBuffer, // for bindable uniform
kGLMPixelBuffer, // for PBO kGLMPixelBuffer, // for PBO
kGLMNumBufferTypes kGLMNumBufferTypes
}; };
// pass this in "options" to constructor to make a dynamic buffer // pass this in "options" to constructor to make a dynamic buffer
#define GLMBufferOptionDynamic 0x00000001 #define GLMBufferOptionDynamic 0x00000001
struct GLMBuffLockParams struct GLMBuffLockParams
{ {
uint m_offset; uint m_offset;
uint m_size; uint m_size;
bool m_nonblocking; bool m_nonblocking;
bool m_discard; bool m_discard;
}; };
class CGLMBuffer class CGLMBuffer
{ {
public: public:
void Lock( GLMBuffLockParams *params, char **addressOut ); void Lock( GLMBuffLockParams *params, char **addressOut );
void Unlock( void ); void Unlock( void );
//protected: //protected:
friend class GLMContext; // only GLMContext can make CGLMBuffer objects friend class GLMContext; // only GLMContext can make CGLMBuffer objects
friend class GLMTester; friend class GLMTester;
friend class IDirect3D9; friend class IDirect3D9;
friend class IDirect3DDevice9; friend class IDirect3DDevice9;
CGLMBuffer ( GLMContext *ctx, EGLMBufferType type, uint size, uint options ); CGLMBuffer ( GLMContext *ctx, EGLMBufferType type, uint size, uint options );
~CGLMBuffer ( ); ~CGLMBuffer ( );
void SetModes ( bool asyncMap, bool explicitFlush, bool force = false ); void SetModes ( bool asyncMap, bool explicitFlush, bool force = false );
void FlushRange ( uint offset, uint size ); void FlushRange ( uint offset, uint size );
GLMContext *m_ctx; // link back to parent context GLMContext *m_ctx; // link back to parent context
EGLMBufferType m_type; EGLMBufferType m_type;
uint m_size; uint m_size;
GLenum m_buffGLTarget; // GL_ARRAY_BUFFER_ARB / GL_ELEMENT_BUFFER_ARB GLenum m_buffGLTarget; // GL_ARRAY_BUFFER_ARB / GL_ELEMENT_BUFFER_ARB
GLuint m_name; // name of this program in the context GLuint m_name; // name of this program in the context
uint m_revision; // bump anytime the size changes or buffer is orphaned uint m_revision; // bump anytime the size changes or buffer is orphaned
bool m_enableAsyncMap; // mirror of the buffer state bool m_enableAsyncMap; // mirror of the buffer state
bool m_enableExplicitFlush; // mirror of the buffer state bool m_enableExplicitFlush; // mirror of the buffer state
bool m_bound; // true if bound to context bool m_bound; // true if bound to context
bool m_mapped; // is it currently mapped bool m_mapped; // is it currently mapped
uint m_dirtyMinOffset; // when equal, range is empty uint m_dirtyMinOffset; // when equal, range is empty
uint m_dirtyMaxOffset; uint m_dirtyMaxOffset;
float *m_lastMappedAddress; float *m_lastMappedAddress;
// --------------------- pseudo-VBO support below here (explicitly for dynamic index buffers) // --------------------- 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 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. // 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. // 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, // 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. // there's no need to do any fencing or multibuffering. orphaning in particular becomes a no-op.
char *m_pseudoBuf; // storage for pseudo buffer char *m_pseudoBuf; // storage for pseudo buffer
}; };
#endif #endif

View File

@ -1,91 +1,91 @@
//========= Copyright Valve Corporation, All rights reserved. ============// //========= Copyright Valve Corporation, All rights reserved. ============//
// //
// cglmfbo.h // cglmfbo.h
// GLMgr FBO's (render targets) // GLMgr FBO's (render targets)
// //
//=============================================================================== //===============================================================================
#ifndef CGLMFBO_H #ifndef CGLMFBO_H
#define CGLMFBO_H #define CGLMFBO_H
#pragma once #pragma once
#include "togl/rendermechanism.h" #include "togl/rendermechanism.h"
// good FBO references / recaps // good FBO references / recaps
// http://www.songho.ca/opengl/gl_fbo.html // http://www.songho.ca/opengl/gl_fbo.html
// http://www.gamedev.net/reference/articles/article2331.asp // http://www.gamedev.net/reference/articles/article2331.asp
// ext links // ext links
// http://www.opengl.org/registry/specs/EXT/framebuffer_object.txt // http://www.opengl.org/registry/specs/EXT/framebuffer_object.txt
// http://www.opengl.org/registry/specs/EXT/framebuffer_multisample.txt // http://www.opengl.org/registry/specs/EXT/framebuffer_multisample.txt
//=============================================================================== //===============================================================================
// tokens not in the SDK headers // tokens not in the SDK headers
#ifndef GL_DEPTH_STENCIL_ATTACHMENT_EXT #ifndef GL_DEPTH_STENCIL_ATTACHMENT_EXT
#define GL_DEPTH_STENCIL_ATTACHMENT_EXT 0x84F9 #define GL_DEPTH_STENCIL_ATTACHMENT_EXT 0x84F9
#endif #endif
//=============================================================================== //===============================================================================
// forward declarations // forward declarations
class GLMContext; class GLMContext;
// implicitly 16 maximum color attachments possible // implicitly 16 maximum color attachments possible
enum EGLMFBOAttachment { enum EGLMFBOAttachment {
kAttColor0, kAttColor1, kAttColor2, kAttColor3, kAttColor0, kAttColor1, kAttColor2, kAttColor3,
kAttColor4, kAttColor5, kAttColor6, kAttColor7, kAttColor4, kAttColor5, kAttColor6, kAttColor7,
kAttColor8, kAttColor9, kAttColor10, kAttColor11, kAttColor8, kAttColor9, kAttColor10, kAttColor11,
kAttColor12, kAttColor13, kAttColor14, kAttColor15, kAttColor12, kAttColor13, kAttColor14, kAttColor15,
kAttDepth, kAttStencil, kAttDepthStencil, kAttDepth, kAttStencil, kAttDepthStencil,
kAttCount kAttCount
}; };
struct GLMFBOTexAttachParams struct GLMFBOTexAttachParams
{ {
CGLMTex *m_tex; CGLMTex *m_tex;
int m_face; // keep zero if not cube map int m_face; // keep zero if not cube map
int m_mip; // keep zero if notmip mapped int m_mip; // keep zero if notmip mapped
int m_zslice; // keep zero if not a 3D tex int m_zslice; // keep zero if not a 3D tex
}; };
class CGLMFBO class CGLMFBO
{ {
public: public:
protected: protected:
friend class GLMContext; // only GLMContext can make CGLMFBO objects friend class GLMContext; // only GLMContext can make CGLMFBO objects
friend class GLMTester; friend class GLMTester;
friend class CGLMTex; friend class CGLMTex;
friend class IDirect3D9; friend class IDirect3D9;
friend class IDirect3DDevice9; friend class IDirect3DDevice9;
CGLMFBO( GLMContext *ctx ); CGLMFBO( GLMContext *ctx );
~CGLMFBO( ); ~CGLMFBO( );
void TexAttach( GLMFBOTexAttachParams *params, EGLMFBOAttachment attachIndex, GLenum fboBindPoint = GL_FRAMEBUFFER_EXT ); void TexAttach( GLMFBOTexAttachParams *params, EGLMFBOAttachment attachIndex, GLenum fboBindPoint = GL_FRAMEBUFFER_EXT );
void TexDetach( 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. // 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 ); void TexScrub( CGLMTex *tex );
// search and destroy any attachment for the named texture // search and destroy any attachment for the named texture
bool IsReady( void ); // aka FBO completeness check - ready to draw bool IsReady( void ); // aka FBO completeness check - ready to draw
GLMContext *m_ctx; // link back to parent context GLMContext *m_ctx; // link back to parent context
GLuint m_name; // name of this FBO in the context GLuint m_name; // name of this FBO in the context
GLMFBOTexAttachParams m_attach[ kAttCount ]; // indexed by EGLMFBOAttachment GLMFBOTexAttachParams m_attach[ kAttCount ]; // indexed by EGLMFBOAttachment
int m_sizeX,m_sizeY; int m_sizeX,m_sizeY;
}; };
#endif #endif

View File

@ -1,291 +1,291 @@
//========= Copyright Valve Corporation, All rights reserved. ============// //========= Copyright Valve Corporation, All rights reserved. ============//
// //
// cglmprogram.h // cglmprogram.h
// GLMgr programs (ARBVP/ARBfp) // GLMgr programs (ARBVP/ARBfp)
// //
//=============================================================================== //===============================================================================
#ifndef CGLMPROGRAM_H #ifndef CGLMPROGRAM_H
#define CGLMPROGRAM_H #define CGLMPROGRAM_H
#include <sys/stat.h> #include <sys/stat.h>
#pragma once #pragma once
// good ARB program references // good ARB program references
// http://petewarden.com/notes/archives/2005/05/fragment_progra_2.html // http://petewarden.com/notes/archives/2005/05/fragment_progra_2.html
// http://petewarden.com/notes/archives/2005/06/fragment_progra_3.html // http://petewarden.com/notes/archives/2005/06/fragment_progra_3.html
// ext links // ext links
// http://www.opengl.org/registry/specs/ARB/vertex_program.txt // 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/ARB/fragment_program.txt
// http://www.opengl.org/registry/specs/EXT/gpu_program_parameters.txt // http://www.opengl.org/registry/specs/EXT/gpu_program_parameters.txt
//=============================================================================== //===============================================================================
// tokens not in the SDK headers // tokens not in the SDK headers
//#ifndef GL_DEPTH_STENCIL_ATTACHMENT_EXT //#ifndef GL_DEPTH_STENCIL_ATTACHMENT_EXT
// #define GL_DEPTH_STENCIL_ATTACHMENT_EXT 0x84F9 // #define GL_DEPTH_STENCIL_ATTACHMENT_EXT 0x84F9
//#endif //#endif
//=============================================================================== //===============================================================================
// forward declarations // forward declarations
class GLMContext; class GLMContext;
class CGLMShaderPair; class CGLMShaderPair;
class CGLMShaderPairCache; class CGLMShaderPairCache;
// CGLMProgram can contain two flavors of the same program, one in assembler, one in GLSL. // 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 - // 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 // 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. // 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 // 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. // flavor you want to use. GLMContext has to handle that.
enum EGLMProgramType enum EGLMProgramType
{ {
kGLMVertexProgram, kGLMVertexProgram,
kGLMFragmentProgram, kGLMFragmentProgram,
kGLMNumProgramTypes kGLMNumProgramTypes
}; };
enum EGLMProgramLang enum EGLMProgramLang
{ {
kGLMARB, kGLMARB,
kGLMGLSL, kGLMGLSL,
kGLMNumProgramLangs kGLMNumProgramLangs
}; };
struct GLMShaderDesc struct GLMShaderDesc
{ {
union union
{ {
GLuint arb; // ARB program object name GLuint arb; // ARB program object name
GLhandleARB glsl; // GLSL shader object handle (void*) GLhandleARB glsl; // GLSL shader object handle (void*)
} m_object; } m_object;
// these can change if shader text is edited // these can change if shader text is edited
bool m_textPresent; // is this flavor(lang) of text present in the buffer? bool m_textPresent; // is this flavor(lang) of text present in the buffer?
int m_textOffset; // where is it int m_textOffset; // where is it
int m_textLength; // how big int m_textLength; // how big
bool m_compiled; // has this text been through a compile attempt bool m_compiled; // has this text been through a compile attempt
bool m_valid; // and if so, was the compile successful 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_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) int m_highWater; // vount of vec4's in the major uniform array ("vc" on vs, "pc" on ps)
// written by dxabstract.... gross! // written by dxabstract.... gross!
}; };
GLenum GLMProgTypeToARBEnum( EGLMProgramType type ); // map vert/frag to ARB asm bind target GLenum GLMProgTypeToARBEnum( EGLMProgramType type ); // map vert/frag to ARB asm bind target
GLenum GLMProgTypeToGLSLEnum( EGLMProgramType type ); // map vert/frag to ARB asm bind target GLenum GLMProgTypeToGLSLEnum( EGLMProgramType type ); // map vert/frag to ARB asm bind target
class CGLMProgram class CGLMProgram
{ {
public: public:
friend class CGLMShaderPairCache; friend class CGLMShaderPairCache;
friend class CGLMShaderPair; friend class CGLMShaderPair;
friend class GLMContext; // only GLMContext can make CGLMProgram objects friend class GLMContext; // only GLMContext can make CGLMProgram objects
friend class GLMTester; friend class GLMTester;
friend class IDirect3D9; friend class IDirect3D9;
friend class IDirect3DDevice9; friend class IDirect3DDevice9;
//=============================== //===============================
// constructor is very light, it just makes one empty program object per flavor. // constructor is very light, it just makes one empty program object per flavor.
CGLMProgram( GLMContext *ctx, EGLMProgramType type ); CGLMProgram( GLMContext *ctx, EGLMProgramType type );
~CGLMProgram( ); ~CGLMProgram( );
void SetProgramText ( char *text ); // import text to GLM object - invalidate any prev compiled program 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 CompileActiveSources ( void ); // compile only the flavors that were provided.
bool Compile ( EGLMProgramLang lang ); bool Compile ( EGLMProgramLang lang );
bool CheckValidity ( 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 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 GetLabelIndexCombo ( char *labelOut, int labelOutMaxChars, int *indexOut, int *comboOut );
void GetComboIndexNameString ( char *stringOut, int stringOutMaxChars ); // mmmmmmmm-nnnnnnnn-filename void GetComboIndexNameString ( char *stringOut, int stringOutMaxChars ); // mmmmmmmm-nnnnnnnn-filename
#if GLMDEBUG #if GLMDEBUG
bool PollForChanges( void ); // check mirror for changes. bool PollForChanges( void ); // check mirror for changes.
void ReloadStringFromEditable( void ); // populate m_string from editable item (react to change) void ReloadStringFromEditable( void ); // populate m_string from editable item (react to change)
bool SyncWithEditable( void ); bool SyncWithEditable( void );
#endif #endif
//=============================== //===============================
// common stuff // common stuff
GLMContext *m_ctx; // link back to parent context GLMContext *m_ctx; // link back to parent context
EGLMProgramType m_type; // vertex or pixel EGLMProgramType m_type; // vertex or pixel
uint m_serial; // serial number for hashing uint m_serial; // serial number for hashing
char *m_text; // copy of text passed into constructor. Can change if editable shaders is enabled. 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 // note - it can contain multiple flavors, so use CGLMTextSectioner to scan it and locate them
#if GLMDEBUG #if GLMDEBUG
CGLMEditableTextItem *m_editable; // editable text item for debugging CGLMEditableTextItem *m_editable; // editable text item for debugging
#endif #endif
GLMShaderDesc m_descs[ kGLMNumProgramLangs ]; GLMShaderDesc m_descs[ kGLMNumProgramLangs ];
uint m_samplerMask; // (1<<n) mask of sampler active locs, if this is a fragment shader (dxabstract sets this field) uint m_samplerMask; // (1<<n) mask of sampler active locs, if this is a fragment shader (dxabstract sets this field)
}; };
//=============================================================================== //===============================================================================
struct GLMShaderPairInfo struct GLMShaderPairInfo
{ {
int m_status; // -1 means req'd index was out of bounds (loop stop..) 0 means not present. 1 means present/active. 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 ]; char m_vsName[ 128 ];
int m_vsStaticIndex; int m_vsStaticIndex;
int m_vsDynamicIndex; int m_vsDynamicIndex;
char m_psName[ 128 ]; char m_psName[ 128 ];
int m_psStaticIndex; int m_psStaticIndex;
int m_psDynamicIndex; int m_psDynamicIndex;
}; };
class CGLMShaderPair // a container for a linked GLSL shader pair, and metadata obtained post-link class CGLMShaderPair // a container for a linked GLSL shader pair, and metadata obtained post-link
{ {
public: public:
friend class CGLMProgram; friend class CGLMProgram;
friend class GLMContext; friend class GLMContext;
friend class CGLMShaderPairCache; friend class CGLMShaderPairCache;
//=============================== //===============================
// constructor just sets up a GLSL program object and leaves it empty. // constructor just sets up a GLSL program object and leaves it empty.
CGLMShaderPair( GLMContext *ctx ); CGLMShaderPair( GLMContext *ctx );
~CGLMShaderPair( ); ~CGLMShaderPair( );
bool SetProgramPair ( CGLMProgram *vp, CGLMProgram *fp ); bool SetProgramPair ( CGLMProgram *vp, CGLMProgram *fp );
// true result means successful link and query // true result means successful link and query
bool RefreshProgramPair ( void ); bool RefreshProgramPair ( void );
// re-link and re-query the uniforms // re-link and re-query the uniforms
//=============================== //===============================
// common stuff // common stuff
GLMContext *m_ctx; // link back to parent context GLMContext *m_ctx; // link back to parent context
CGLMProgram *m_vertexProg; CGLMProgram *m_vertexProg;
CGLMProgram *m_fragmentProg; CGLMProgram *m_fragmentProg;
GLhandleARB m_program; // linked program object GLhandleARB m_program; // linked program object
// need meta data for attribs / samplers / params // need meta data for attribs / samplers / params
// actually we only need it for samplers and params. // actually we only need it for samplers and params.
// attributes are hardwired. // attributes are hardwired.
// vertex stage uniforms // vertex stage uniforms
GLint m_locVertexParams; // "vc" per dx9asmtogl2 convention GLint m_locVertexParams; // "vc" per dx9asmtogl2 convention
GLint m_locVertexInteger0; // "i0" GLint m_locVertexInteger0; // "i0"
GLint m_locVertexBool0; // "b0" GLint m_locVertexBool0; // "b0"
GLint m_locVertexBool1; // "b1" GLint m_locVertexBool1; // "b1"
GLint m_locVertexBool2; // "b2" GLint m_locVertexBool2; // "b2"
GLint m_locVertexBool3; // "b3" GLint m_locVertexBool3; // "b3"
// fragment stage uniforms // fragment stage uniforms
GLint m_locFragmentParams; // "pc" per dx9asmtogl2 convention GLint m_locFragmentParams; // "pc" per dx9asmtogl2 convention
GLint m_locFragmentFakeSRGBEnable; // "flSRGBWrite" - set to 1.0 to effect sRGB encoding on output 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 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) // 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..." GLint m_locSamplers[ 16 ]; // "sampler0 ... sampler1..."
// other stuff // other stuff
bool m_valid; // true on successful link 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) 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. uint m_revision; // if this pair is relinked, bump this number.
}; };
//=============================================================================== //===============================================================================
// N-row, M-way associative cache with LRU per row. // N-row, M-way associative cache with LRU per row.
// still needs some metric dump ability and some parameter tuning. // still needs some metric dump ability and some parameter tuning.
// extra credit would be to make an auto-tuner. // extra credit would be to make an auto-tuner.
struct CGLMPairCacheEntry struct CGLMPairCacheEntry
{ {
long long m_lastMark; // a mark of zero means an empty entry long long m_lastMark; // a mark of zero means an empty entry
CGLMProgram *m_vertexProg; CGLMProgram *m_vertexProg;
CGLMProgram *m_fragmentProg; CGLMProgram *m_fragmentProg;
uint m_extraKeyBits; uint m_extraKeyBits;
CGLMShaderPair *m_pair; CGLMShaderPair *m_pair;
}; };
class CGLMShaderPairCache // cache for linked GLSL shader pairs class CGLMShaderPairCache // cache for linked GLSL shader pairs
{ {
public: public:
protected: protected:
friend class CGLMShaderPair; friend class CGLMShaderPair;
friend class CGLMProgram; friend class CGLMProgram;
friend class GLMContext; friend class GLMContext;
//=============================== //===============================
CGLMShaderPairCache( GLMContext *ctx ); CGLMShaderPairCache( GLMContext *ctx );
~CGLMShaderPairCache( ); ~CGLMShaderPairCache( );
CGLMShaderPair *SelectShaderPair ( CGLMProgram *vp, CGLMProgram *fp, uint extraKeyBits ); CGLMShaderPair *SelectShaderPair ( CGLMProgram *vp, CGLMProgram *fp, uint extraKeyBits );
void QueryShaderPair ( int index, GLMShaderPairInfo *infoOut ); void QueryShaderPair ( int index, GLMShaderPairInfo *infoOut );
// shoot down linked pairs that use the program in the arg // 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 // return true if any had to be skipped due to conflict with currently bound pair
bool PurgePairsWithShader( CGLMProgram *prog ); bool PurgePairsWithShader( CGLMProgram *prog );
// purge everything (when would GLM know how to do this ? at context destroy time, but any other times?) // 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 // return true if any had to be skipped due to conflict with currently bound pair
bool Purge ( void ); bool Purge ( void );
// stats // stats
void DumpStats ( void ); void DumpStats ( void );
//=============================== //===============================
uint HashRowIndex ( CGLMProgram *vp, CGLMProgram *fp, uint extraKeyBits ); uint HashRowIndex ( CGLMProgram *vp, CGLMProgram *fp, uint extraKeyBits );
CGLMPairCacheEntry* HashRowPtr ( uint hashRowIndex ); CGLMPairCacheEntry* HashRowPtr ( uint hashRowIndex );
void HashRowProbe ( CGLMPairCacheEntry *row, CGLMProgram *vp, CGLMProgram *fp, uint extraKeyBits, int *hitwayOut, int *emptywayOut, int *oldestwayOut ); void HashRowProbe ( CGLMPairCacheEntry *row, CGLMProgram *vp, CGLMProgram *fp, uint extraKeyBits, int *hitwayOut, int *emptywayOut, int *oldestwayOut );
//=============================== //===============================
// common stuff // common stuff
GLMContext *m_ctx; // link back to parent context GLMContext *m_ctx; // link back to parent context
long long m_mark; long long m_mark;
uint m_rowsLg2; uint m_rowsLg2;
uint m_rows; uint m_rows;
uint m_waysLg2; uint m_waysLg2;
uint m_ways; uint m_ways;
uint m_entryCount; uint m_entryCount;
CGLMPairCacheEntry *m_entries; // array[ m_rows ][ m_ways ] CGLMPairCacheEntry *m_entries; // array[ m_rows ][ m_ways ]
uint *m_evictions; // array[ m_rows ]; uint *m_evictions; // array[ m_rows ];
uint *m_hits; // array[ m_rows ]; uint *m_hits; // array[ m_rows ];
}; };
#endif #endif

View File

@ -1,85 +1,85 @@
//========= Copyright Valve Corporation, All rights reserved. ============// //========= Copyright Valve Corporation, All rights reserved. ============//
// //
// cglmquery.h // cglmquery.h
// GLMgr queries // GLMgr queries
// //
//=============================================================================== //===============================================================================
#ifndef CGLMQUERY_H #ifndef CGLMQUERY_H
#define CGLMQUERY_H #define CGLMQUERY_H
#pragma once #pragma once
//=============================================================================== //===============================================================================
// forward declarations // forward declarations
class GLMContext; class GLMContext;
class CGLMQuery; class CGLMQuery;
//=============================================================================== //===============================================================================
enum EGLMQueryType enum EGLMQueryType
{ {
EOcclusion, EOcclusion,
EFence, EFence,
EGLMQueryCount EGLMQueryCount
}; };
struct GLMQueryParams struct GLMQueryParams
{ {
EGLMQueryType m_type; EGLMQueryType m_type;
}; };
class CGLMQuery class CGLMQuery
{ {
// leave everything public til it's running // leave everything public til it's running
public: public:
friend class GLMContext; // only GLMContext can make CGLMTex objects friend class GLMContext; // only GLMContext can make CGLMTex objects
friend class IDirect3DDevice9; friend class IDirect3DDevice9;
friend class IDirect3DQuery9; friend class IDirect3DQuery9;
GLMContext *m_ctx; // link back to parent context GLMContext *m_ctx; // link back to parent context
GLMQueryParams m_params; // params created with 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! 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 #ifdef HAVE_GL_ARB_SYNC
GLsync m_syncobj; // GL_ARB_sync object. NOT USED WITH GL_NV_fence or GL_APPLE_fence! GLsync m_syncobj; // GL_ARB_sync object. NOT USED WITH GL_NV_fence or GL_APPLE_fence!
#else #else
GLuint m_syncobj; GLuint m_syncobj;
#endif #endif
bool m_started; bool m_started;
bool m_stopped; bool m_stopped;
bool m_done; 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 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. // restated - only Start should examine the convar.
CGLMQuery( GLMContext *ctx, GLMQueryParams *params ); CGLMQuery( GLMContext *ctx, GLMQueryParams *params );
~CGLMQuery( ); ~CGLMQuery( );
// for an occlusion query: // for an occlusion query:
// Start = BeginQuery query-start goes into stream // 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 // 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?) // 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 // Complete = GetQueryObjectuivARB(uint id, enum pname, uint *params) - extract the sample count
// for a fence query: // for a fence query:
// Start = SetFence fence goes into command stream // Start = SetFence fence goes into command stream
// Stop = NOP fences are self finishing - no need to call Stop on a fence // Stop = NOP fences are self finishing - no need to call Stop on a fence
// IsDone = TestFence ask if fence passed // IsDone = TestFence ask if fence passed
// Complete = FinishFence // Complete = FinishFence
void Start ( void ); void Start ( void );
void Stop ( void ); void Stop ( void );
bool IsDone ( void ); bool IsDone ( void );
void Complete ( uint *result ); void Complete ( uint *result );
// accessors for the started/stopped state // accessors for the started/stopped state
bool IsStarted ( void ); bool IsStarted ( void );
bool IsStopped ( void ); bool IsStopped ( void );
}; };
#endif #endif

View File

@ -1,273 +1,273 @@
//========= Copyright Valve Corporation, All rights reserved. ============// //========= Copyright Valve Corporation, All rights reserved. ============//
// //
// cglmtex.h // cglmtex.h
// GLMgr textures // GLMgr textures
// //
//=============================================================================== //===============================================================================
#ifndef CGLMTEX_H #ifndef CGLMTEX_H
#define CGLMTEX_H #define CGLMTEX_H
#pragma once #pragma once
#include "tier1/utlhash.h" #include "tier1/utlhash.h"
#include "tier1/utlmap.h" #include "tier1/utlmap.h"
//=============================================================================== //===============================================================================
// forward declarations // forward declarations
class GLMContext; class GLMContext;
class GLMTester; class GLMTester;
class CGLMTexLayoutTable; class CGLMTexLayoutTable;
class CGLMTex; class CGLMTex;
class CGLMFBO; class CGLMFBO;
class IDirect3DSurface9; class IDirect3DSurface9;
//=============================================================================== //===============================================================================
struct GLMTexFormatDesc struct GLMTexFormatDesc
{ {
char *m_formatSummary; // for debug visibility char *m_formatSummary; // for debug visibility
D3DFORMAT m_d3dFormat; // what D3D knows it as; see public/bitmap/imageformat.h D3DFORMAT m_d3dFormat; // what D3D knows it as; see public/bitmap/imageformat.h
GLenum m_glIntFormat; // GL internal format GLenum m_glIntFormat; // GL internal format
GLenum m_glIntFormatSRGB; // internal format if SRGB flavor GLenum m_glIntFormatSRGB; // internal format if SRGB flavor
GLenum m_glDataFormat; // GL data format GLenum m_glDataFormat; // GL data format
GLenum m_glDataType; // GL data type GLenum m_glDataType; // GL data type
int m_chunkSize; // 1 or 4 - 4 is used for compressed textures 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) 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 // this description lets us calculate size cleanly without conditional logic for compression
}; };
const GLMTexFormatDesc *GetFormatDesc( D3DFORMAT format ); const GLMTexFormatDesc *GetFormatDesc( D3DFORMAT format );
//=============================================================================== //===============================================================================
// utility function for generating slabs of texels. mostly for test. // utility function for generating slabs of texels. mostly for test.
typedef struct typedef struct
{ {
// in // in
D3DFORMAT m_format; D3DFORMAT m_format;
void *m_dest; // dest address void *m_dest; // dest address
int m_chunkCount; // square chunk count (single texels or compressed blocks) int m_chunkCount; // square chunk count (single texels or compressed blocks)
int m_byteCountLimit; // caller expectation of max number of bytes to write out int m_byteCountLimit; // caller expectation of max number of bytes to write out
float r,g,b,a; // color desired float r,g,b,a; // color desired
// out // out
int m_bytesWritten; int m_bytesWritten;
} GLMGenTexelParams; } GLMGenTexelParams;
// return true if successful // return true if successful
bool GLMGenTexels( GLMGenTexelParams *params ); bool GLMGenTexels( GLMGenTexelParams *params );
//=============================================================================== //===============================================================================
struct GLMTexLayoutSlice struct GLMTexLayoutSlice
{ {
int m_xSize,m_ySize,m_zSize; //texel dimensions of this slice 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_storageOffset; //where in the storage slab does this slice live
int m_storageSize; //how much storage does this slice occupy int m_storageSize; //how much storage does this slice occupy
}; };
enum EGLMTexFlags enum EGLMTexFlags
{ {
kGLMTexMipped = 0x01, kGLMTexMipped = 0x01,
kGLMTexMippedAuto = 0x02, kGLMTexMippedAuto = 0x02,
kGLMTexRenderable = 0x04, kGLMTexRenderable = 0x04,
kGLMTexIsStencil = 0x08, kGLMTexIsStencil = 0x08,
kGLMTexIsDepth = 0x10, kGLMTexIsDepth = 0x10,
kGLMTexSRGB = 0x20, kGLMTexSRGB = 0x20,
kGLMTexMultisampled = 0x40, // has an RBO backing it. Cannot combine with Mipped, MippedAuto. One slice maximum, only targeting GL_TEXTURE_2D. 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 // actually not 100% positive on the mipmapping, the RBO itself can't be mipped, but the resulting texture could
// have mipmaps generated. // have mipmaps generated.
}; };
//=============================================================================== //===============================================================================
struct GLMTexLayoutKey struct GLMTexLayoutKey
{ {
// input values: held const, these are the hash key for the form map // 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 GLenum m_texGLTarget; // flavor of texture: GL_TEXTURE_2D, GL_TEXTURE_3D, GLTEXTURE_CUBE_MAP
D3DFORMAT m_texFormat; // D3D texel format D3DFORMAT m_texFormat; // D3D texel format
unsigned long m_texFlags; // mipped, autogen mips, render target, ... ? 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) 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 int m_xSize,m_ySize,m_zSize; // size of base mip
}; };
bool LessFunc_GLMTexLayoutKey( const GLMTexLayoutKey &a, const GLMTexLayoutKey &b ); bool LessFunc_GLMTexLayoutKey( const GLMTexLayoutKey &a, const GLMTexLayoutKey &b );
#define GLM_TEX_MAX_MIPS 14 #define GLM_TEX_MAX_MIPS 14
#define GLM_TEX_MAX_FACES 6 #define GLM_TEX_MAX_FACES 6
#define GLM_TEX_MAX_SLICES (GLM_TEX_MAX_MIPS * GLM_TEX_MAX_FACES) #define GLM_TEX_MAX_SLICES (GLM_TEX_MAX_MIPS * GLM_TEX_MAX_FACES)
struct GLMTexLayout struct GLMTexLayout
{ {
char *m_layoutSummary; // for debug visibility char *m_layoutSummary; // for debug visibility
// const inputs used for hashing // const inputs used for hashing
GLMTexLayoutKey m_key; GLMTexLayoutKey m_key;
// refcount // refcount
int m_refCount; int m_refCount;
// derived values: // derived values:
GLMTexFormatDesc *m_format; // format specific info GLMTexFormatDesc *m_format; // format specific info
int m_mipCount; // derived by starying at base size and working down towards 1x1 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_faceCount; // 1 for 2d/3d, 6 for cubemap
int m_sliceCount; // product of faces and mips int m_sliceCount; // product of faces and mips
int m_storageTotalSize; // size of storage slab required int m_storageTotalSize; // size of storage slab required
// slice array // slice array
GLMTexLayoutSlice m_slices[0]; // dynamically allocated 2-d array [faces][mips] GLMTexLayoutSlice m_slices[0]; // dynamically allocated 2-d array [faces][mips]
}; };
class CGLMTexLayoutTable class CGLMTexLayoutTable
{ {
public: public:
CGLMTexLayoutTable(); CGLMTexLayoutTable();
GLMTexLayout *NewLayoutRef( GLMTexLayoutKey *key ); // pass in a pointer to layout key - receive ptr to completed layout 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 DelLayoutRef( GLMTexLayout *layout ); // pass in pointer to completed layout. refcount is dropped.
void DumpStats( void ); void DumpStats( void );
protected: protected:
CUtlMap< GLMTexLayoutKey, GLMTexLayout* > m_layoutMap; CUtlMap< GLMTexLayoutKey, GLMTexLayout* > m_layoutMap;
}; };
//=============================================================================== //===============================================================================
// a sampler specifies desired state for drawing on a given sampler index // 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 // 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 // see http://msdn.microsoft.com/en-us/library/bb172602(VS.85).aspx
struct GLMTexSamplingParams struct GLMTexSamplingParams
{ {
GLenum m_addressModes[3]; // S, T, R GLenum m_addressModes[3]; // S, T, R
GLfloat m_borderColor[4]; // R,G,B,A GLfloat m_borderColor[4]; // R,G,B,A
GLenum m_magFilter; GLenum m_magFilter;
GLenum m_minFilter; GLenum m_minFilter;
GLfloat m_mipmapBias; GLfloat m_mipmapBias;
GLint m_minMipLevel; GLint m_minMipLevel;
GLint m_maxMipLevel; GLint m_maxMipLevel;
GLint m_maxAniso; GLint m_maxAniso;
GLenum m_compareMode; // only used for depth and stencil type textures GLenum m_compareMode; // only used for depth and stencil type textures
bool m_srgb; // srgb texture read... bool m_srgb; // srgb texture read...
}; };
struct GLMTexLockParams struct GLMTexLockParams
{ {
// input params which identify the slice of interest // input params which identify the slice of interest
CGLMTex *m_tex; CGLMTex *m_tex;
int m_face; int m_face;
int m_mip; int m_mip;
// identifies the region of the slice // identifies the region of the slice
GLMRegion m_region; GLMRegion m_region;
// tells GLM to force re-read of the texels back from GL // 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" // i.e. "I know I stepped on those texels with a draw or blit - the GLM copy is stale"
bool m_readback; bool m_readback;
}; };
struct GLMTexLockDesc struct GLMTexLockDesc
{ {
GLMTexLockParams m_req; // form of the lock request GLMTexLockParams m_req; // form of the lock request
bool m_active; // set true at lock time. cleared at unlock time. bool m_active; // set true at lock time. cleared at unlock time.
int m_sliceIndex; // which slice in the layout int m_sliceIndex; // which slice in the layout
int m_sliceBaseOffset; // where is that in the texture data int m_sliceBaseOffset; // where is that in the texture data
int m_sliceRegionOffset; // offset to the start (lowest address corner) of the region requested int m_sliceRegionOffset; // offset to the start (lowest address corner) of the region requested
}; };
//=============================================================================== //===============================================================================
#define GLM_SAMPLER_COUNT 16 #define GLM_SAMPLER_COUNT 16
typedef CBitVec<GLM_SAMPLER_COUNT> CTexBindMask; typedef CBitVec<GLM_SAMPLER_COUNT> CTexBindMask;
enum EGLMTexSliceFlag enum EGLMTexSliceFlag
{ {
kSliceValid = 0x01, // slice has been teximage'd in whole at least once - set to 0 initially 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 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 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) kSliceFullyDirty = 0x08, // does the slice need to be fully downloaded at unlock time (disregard dirty rects)
}; };
class CGLMTex class CGLMTex
{ {
public: public:
void Lock( GLMTexLockParams *params, char** addressOut, int* yStrideOut, int *zStrideOut ); void Lock( GLMTexLockParams *params, char** addressOut, int* yStrideOut, int *zStrideOut );
void Unlock( GLMTexLockParams *params ); void Unlock( GLMTexLockParams *params );
protected: protected:
friend class GLMContext; // only GLMContext can make CGLMTex objects friend class GLMContext; // only GLMContext can make CGLMTex objects
friend class GLMTester; friend class GLMTester;
friend class CGLMFBO; friend class CGLMFBO;
friend class IDirect3DDevice9; friend class IDirect3DDevice9;
friend class IDirect3DBaseTexture9; friend class IDirect3DBaseTexture9;
friend class IDirect3DTexture9; friend class IDirect3DTexture9;
friend class IDirect3DSurface9; friend class IDirect3DSurface9;
friend class IDirect3DCubeTexture9; friend class IDirect3DCubeTexture9;
friend class IDirect3DVolumeTexture9; friend class IDirect3DVolumeTexture9;
CGLMTex( GLMContext *ctx, GLMTexLayout *layout, GLMTexSamplingParams *sampling, char *debugLabel = NULL ); CGLMTex( GLMContext *ctx, GLMTexLayout *layout, GLMTexSamplingParams *sampling, char *debugLabel = NULL );
~CGLMTex( ); ~CGLMTex( );
int CalcSliceIndex( int face, int mip ); int CalcSliceIndex( int face, int mip );
void CalcTexelDataOffsetAndStrides( int sliceIndex, int x, int y, int z, int *offsetOut, int *yStrideOut, int *zStrideOut ); void CalcTexelDataOffsetAndStrides( int sliceIndex, int x, int y, int z, int *offsetOut, int *yStrideOut, int *zStrideOut );
void ApplySamplingParams( GLMTexSamplingParams *params, bool noCheck=FALSE ); void ApplySamplingParams( GLMTexSamplingParams *params, bool noCheck=FALSE );
void ReadTexels( GLMTexLockDesc *desc, bool readWholeSlice=true ); void ReadTexels( GLMTexLockDesc *desc, bool readWholeSlice=true );
void WriteTexels( GLMTexLockDesc *desc, bool writeWholeSlice=true, bool noDataWrite=false ); void WriteTexels( GLMTexLockDesc *desc, bool writeWholeSlice=true, bool noDataWrite=false );
// last param lets us send NULL data ptr (only legal with uncompressed formats, beware) // last param lets us send NULL data ptr (only legal with uncompressed formats, beware)
// this helps out ResetSRGB. // this helps out ResetSRGB.
void ResetSRGB( bool srgb, bool noDataWrite ); void ResetSRGB( bool srgb, bool noDataWrite );
// re-specify texture format to match desired sRGB form // 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 // 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) 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_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. 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 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) // (consult this at draw time, in order to know if changes need to be made)
GLMContext *m_ctx; // link back to parent context GLMContext *m_ctx; // link back to parent context
GLuint m_texName; // name of this texture in the context GLuint m_texName; // name of this texture in the context
bool m_texClientStorage; // was CS selecetd for texture bool m_texClientStorage; // was CS selecetd for texture
bool m_texPreloaded; // has it been kicked into VRAM with GLMContext::PreloadTex yet 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) 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 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 CTexBindMask m_bindPoints; // true for each place in the parent ctx where currently
// bound (indexed via EGLMTexCtxBindingIndex) // bound (indexed via EGLMTexCtxBindingIndex)
int m_rtAttachCount; // how many RT's have this texture attached somewhere int m_rtAttachCount; // how many RT's have this texture attached somewhere
char *m_backing; // backing storage if available char *m_backing; // backing storage if available
int m_lockCount; // lock reqs are stored in the GLMContext for tracking int m_lockCount; // lock reqs are stored in the GLMContext for tracking
CUtlVector<unsigned char> m_sliceFlags; CUtlVector<unsigned char> m_sliceFlags;
char *m_debugLabel; // strdup() of debugLabel passed in, or NULL char *m_debugLabel; // strdup() of debugLabel passed in, or NULL
}; };
#endif #endif

File diff suppressed because it is too large Load Diff

View File

@ -1,184 +1,184 @@
//========= Copyright Valve Corporation, All rights reserved. ============// //========= Copyright Valve Corporation, All rights reserved. ============//
// !!! FIXME: Some of these aren't base OpenGL...pick out the extensions. // !!! FIXME: Some of these aren't base OpenGL...pick out the extensions.
// !!! FIXME: Also, look up these -1, -1 versions numbers. // !!! FIXME: Also, look up these -1, -1 versions numbers.
GL_FUNC(OpenGL,true,GLenum,glGetError,(void),()) GL_FUNC(OpenGL,true,GLenum,glGetError,(void),())
GL_FUNC_VOID(OpenGL,true,glActiveTexture,(GLenum a),(a)) 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,glAlphaFunc,(GLenum a,GLclampf b),(a,b))
GL_FUNC_VOID(OpenGL,true,glAttachObjectARB,(GLhandleARB a,GLhandleARB 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,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,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,glBindBufferARB,(GLenum a,GLuint b),(a,b))
GL_FUNC_VOID(OpenGL,true,glBindProgramARB,(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,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,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,glBlendEquation,(GLenum a),(a))
GL_FUNC_VOID(OpenGL,true,glBlendFunc,(GLenum a,GLenum b),(a,b)) 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,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,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,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,glClearDepth,(GLclampd a),(a))
GL_FUNC_VOID(OpenGL,true,glClearStencil,(GLint 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,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,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,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,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_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,glCreateProgramObjectARB,(void),())
GL_FUNC(OpenGL,true,GLhandleARB,glCreateShaderObjectARB,(GLenum a),(a)) 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,glDeleteBuffersARB,(GLsizei a,const GLuint *b),(a,b))
GL_FUNC_VOID(OpenGL,true,glDeleteObjectARB,(GLhandleARB a),(a)) 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,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,glDeleteQueriesARB,(GLsizei a,const GLuint *b),(a,b))
GL_FUNC_VOID(OpenGL,true,glDeleteShader,(GLuint a),(a)) 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,glDeleteTextures,(GLsizei a,const GLuint *b),(a,b))
GL_FUNC_VOID(OpenGL,true,glDepthFunc,(GLenum a),(a)) GL_FUNC_VOID(OpenGL,true,glDepthFunc,(GLenum a),(a))
GL_FUNC_VOID(OpenGL,true,glDepthMask,(GLboolean 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,glDepthRange,(GLclampd a,GLclampd b),(a,b))
GL_FUNC_VOID(OpenGL,true,glDetachObjectARB,(GLhandleARB a,GLhandleARB 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,glDisable,(GLenum a),(a))
GL_FUNC_VOID(OpenGL,true,glDisableVertexAttribArray,(GLuint 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,glDrawArrays,(GLenum a,GLint b,GLsizei c),(a,b,c))
GL_FUNC_VOID(OpenGL,true,glDrawBuffer,(GLenum a),(a)) 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,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,glEnable,(GLenum a),(a))
GL_FUNC_VOID(OpenGL,true,glEnableVertexAttribArray,(GLuint a),(a)) GL_FUNC_VOID(OpenGL,true,glEnableVertexAttribArray,(GLuint a),(a))
GL_FUNC_VOID(OpenGL,true,glEnd,(void),()) GL_FUNC_VOID(OpenGL,true,glEnd,(void),())
GL_FUNC_VOID(OpenGL,true,glFinish,(void),()) GL_FUNC_VOID(OpenGL,true,glFinish,(void),())
GL_FUNC_VOID(OpenGL,true,glFlush,(void),()) GL_FUNC_VOID(OpenGL,true,glFlush,(void),())
GL_FUNC_VOID(OpenGL,true,glFrontFace,(GLenum a),(a)) 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,glGenBuffersARB,(GLsizei a,GLuint *b),(a,b))
GL_FUNC_VOID(OpenGL,true,glGenProgramsARB,(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,glGenQueriesARB,(GLsizei a,GLuint *b),(a,b))
GL_FUNC_VOID(OpenGL,true,glGenTextures,(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,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,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,glGetDoublev,(GLenum a,GLdouble *b),(a,b))
GL_FUNC_VOID(OpenGL,true,glGetFloatv,(GLenum a,GLfloat *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,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,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,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_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(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_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,GLint,glGetUniformLocationARB,(GLhandleARB a,const GLcharARB *b),(a,b))
GL_FUNC(OpenGL,true,GLboolean,glIsEnabled,(GLenum a),(a)) GL_FUNC(OpenGL,true,GLboolean,glIsEnabled,(GLenum a),(a))
GL_FUNC(OpenGL,true,GLboolean,glIsTexture,(GLuint a),(a)) GL_FUNC(OpenGL,true,GLboolean,glIsTexture,(GLuint a),(a))
GL_FUNC_VOID(OpenGL,true,glLinkProgramARB,(GLhandleARB 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(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,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,glPixelStorei,(GLenum a,GLint b),(a,b))
GL_FUNC_VOID(OpenGL,true,glPolygonMode,(GLenum a,GLenum 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,glPolygonOffset,(GLfloat a,GLfloat b),(a,b))
GL_FUNC_VOID(OpenGL,true,glPopAttrib,(void),()) 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,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,glPushAttrib,(GLbitfield a),(a))
GL_FUNC_VOID(OpenGL,true,glReadBuffer,(GLenum 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,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,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,glStencilFunc,(GLenum a,GLint b,GLuint c),(a,b,c))
GL_FUNC_VOID(OpenGL,true,glStencilMask,(GLuint a),(a)) 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,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,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,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,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,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,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,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,glUniform1f,(GLint a,GLfloat b),(a,b))
GL_FUNC_VOID(OpenGL,true,glUniform1i,(GLint a,GLint 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,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_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(OpenGL,true,GLboolean,glUnmapBuffer,(GLenum a),(a))
GL_FUNC_VOID(OpenGL,true,glUseProgram,(GLuint 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,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,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,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,glEnableClientState,(GLenum a),(a))
GL_FUNC_VOID(OpenGL,true,glDisableClientState,(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,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,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,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,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,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,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,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,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_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_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,glBindFramebufferEXT,(GLenum a,GLuint b),(a,b))
GL_FUNC_VOID(GL_EXT_framebuffer_object,false,glBindRenderbufferEXT,(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(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,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,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,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,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,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,glGenRenderbuffersEXT,(GLsizei a,GLuint *b),(a,b))
GL_FUNC_VOID(GL_EXT_framebuffer_object,false,glDeleteFramebuffersEXT,(GLsizei a,const 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_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_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_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_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_EXT(GL_APPLE_fence,-1,-1)
GL_FUNC(GL_APPLE_fence,false,GLboolean,glTestFenceAPPLE,(GLuint a),(a)) 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,glSetFenceAPPLE,(GLuint a),(a))
GL_FUNC_VOID(GL_APPLE_fence,false,glFinishFenceAPPLE,(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,glDeleteFencesAPPLE,(GLsizei a,const GLuint *b),(a,b))
GL_FUNC_VOID(GL_APPLE_fence,false,glGenFencesAPPLE,(GLsizei a,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_EXT(GL_NV_fence,-1,-1)
GL_FUNC(GL_NV_fence,false,GLboolean,glTestFenceNV,(GLuint a),(a)) 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,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,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,glDeleteFencesNV,(GLsizei a,const GLuint *b),(a,b))
GL_FUNC_VOID(GL_NV_fence,false,glGenFencesNV,(GLsizei a,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) GL_EXT(GL_ARB_sync,3,2)
#ifdef HAVE_GL_ARB_SYNC #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_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(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,glWaitSync,(GLsync a, GLbitfield b, GLuint64 c),(a,b,c))
GL_FUNC_VOID(GL_ARB_sync,false,glDeleteSync,(GLsync a),(a)) 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)) GL_FUNC(GL_ARB_sync,false,GLsync,glFenceSync,(GLenum a, GLbitfield b),(a,b))
#endif #endif
GL_EXT(GL_EXT_draw_buffers2,-1,-1) 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,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,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,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_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_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_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_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,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_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_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(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_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_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,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,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,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_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_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,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_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_APPLE_client_storage,-1,-1)
GL_EXT(GL_ARB_uniform_buffer,-1,-1) GL_EXT(GL_ARB_uniform_buffer,-1,-1)
GL_EXT(GL_ARB_vertex_array_bgra,-1,-1) GL_EXT(GL_ARB_vertex_array_bgra,-1,-1)
GL_EXT(GL_EXT_vertex_array_bgra,-1,-1) GL_EXT(GL_EXT_vertex_array_bgra,-1,-1)
GL_EXT(GL_ARB_framebuffer_object,3,0) 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,glBindFramebuffer,(GLenum a,GLuint b),(a,b))
GL_FUNC_VOID(GL_ARB_framebuffer_object,false,glBindRenderbuffer,(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(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,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,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,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,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,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,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,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,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_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_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(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,glPushClientAttrib,(GLbitfield a),(a))
GL_FUNC_VOID(OpenGL,true,glPopClientAttrib,(void),()) GL_FUNC_VOID(OpenGL,true,glPopClientAttrib,(void),())

View File

@ -1,177 +1,177 @@
//========= Copyright Valve Corporation, All rights reserved. ============// //========= Copyright Valve Corporation, All rights reserved. ============//
// //
// glmdisplay.h // glmdisplay.h
// display related stuff - used by both GLMgr and the CocoaMgr // display related stuff - used by both GLMgr and the CocoaMgr
// //
//=============================================================================== //===============================================================================
#ifndef GLMDISPLAY_H #ifndef GLMDISPLAY_H
#define GLMDISPLAY_H #define GLMDISPLAY_H
#pragma once #pragma once
#ifdef OSX #ifdef OSX
#include <OpenGL/OpenGL.h> #include <OpenGL/OpenGL.h>
#include <OpenGL/gl.h> #include <OpenGL/gl.h>
#include <OpenGL/glext.h> #include <OpenGL/glext.h>
#include <OpenGL/CGLTypes.h> #include <OpenGL/CGLTypes.h>
#include <OpenGL/CGLRenderers.h> #include <OpenGL/CGLRenderers.h>
#include <OpenGL/CGLCurrent.h> #include <OpenGL/CGLCurrent.h>
typedef uint32_t CGDirectDisplayID; typedef uint32_t CGDirectDisplayID;
typedef uint32_t CGOpenGLDisplayMask; typedef uint32_t CGOpenGLDisplayMask;
typedef double CGRefreshRate; typedef double CGRefreshRate;
//#include <ApplicationServices/ApplicationServices.h> //#include <ApplicationServices/ApplicationServices.h>
#elif defined(LINUX) #elif defined(LINUX)
#include "tier0/platform.h" #include "tier0/platform.h"
#include <GL/gl.h> #include <GL/gl.h>
#include <GL/glext.h> #include <GL/glext.h>
#else #else
#error #error
#endif #endif
typedef void _PseudoNSGLContext; // aka NSOpenGLContext typedef void _PseudoNSGLContext; // aka NSOpenGLContext
typedef _PseudoNSGLContext *PseudoNSGLContextPtr; typedef _PseudoNSGLContext *PseudoNSGLContextPtr;
struct GLMDisplayModeInfoFields struct GLMDisplayModeInfoFields
{ {
uint m_modePixelWidth; uint m_modePixelWidth;
uint m_modePixelHeight; uint m_modePixelHeight;
uint m_modeRefreshHz; uint m_modeRefreshHz;
// are we even going to talk about bit depth... not yet // are we even going to talk about bit depth... not yet
}; };
struct GLMDisplayInfoFields struct GLMDisplayInfoFields
{ {
#ifdef OSX #ifdef OSX
CGDirectDisplayID m_cgDisplayID; CGDirectDisplayID m_cgDisplayID;
CGOpenGLDisplayMask m_glDisplayMask; // result of CGDisplayIDToOpenGLDisplayMask on the cg_displayID. CGOpenGLDisplayMask m_glDisplayMask; // result of CGDisplayIDToOpenGLDisplayMask on the cg_displayID.
#endif #endif
uint m_displayPixelWidth; uint m_displayPixelWidth;
uint m_displayPixelHeight; uint m_displayPixelHeight;
}; };
struct GLMRendererInfoFields struct GLMRendererInfoFields
{ {
/*properties of interest and their desired values. /*properties of interest and their desired values.
kCGLRPFullScreen = 54, true kCGLRPFullScreen = 54, true
kCGLRPAccelerated = 73, true kCGLRPAccelerated = 73, true
kCGLRPWindow = 80, true kCGLRPWindow = 80, true
kCGLRPRendererID = 70, informational kCGLRPRendererID = 70, informational
kCGLRPDisplayMask = 84, informational kCGLRPDisplayMask = 84, informational
kCGLRPBufferModes = 100, informational kCGLRPBufferModes = 100, informational
kCGLRPColorModes = 103, informational kCGLRPColorModes = 103, informational
kCGLRPAccumModes = 104, informational kCGLRPAccumModes = 104, informational
kCGLRPDepthModes = 105, informational kCGLRPDepthModes = 105, informational
kCGLRPStencilModes = 106, informational kCGLRPStencilModes = 106, informational
kCGLRPMaxAuxBuffers = 107, informational kCGLRPMaxAuxBuffers = 107, informational
kCGLRPMaxSampleBuffers = 108, informational kCGLRPMaxSampleBuffers = 108, informational
kCGLRPMaxSamples = 109, informational kCGLRPMaxSamples = 109, informational
kCGLRPSampleModes = 110, informational kCGLRPSampleModes = 110, informational
kCGLRPSampleAlpha = 111, informational kCGLRPSampleAlpha = 111, informational
kCGLRPVideoMemory = 120, informational kCGLRPVideoMemory = 120, informational
kCGLRPTextureMemory = 121, informational kCGLRPTextureMemory = 121, informational
kCGLRPRendererCount = 128 number of renderers in the CGLRendererInfoObj under examination kCGLRPRendererCount = 128 number of renderers in the CGLRendererInfoObj under examination
kCGLRPOffScreen = 53, D/C kCGLRPOffScreen = 53, D/C
kCGLRPRobust = 75, FALSE or D/C - aka we're asking for no-fallback kCGLRPRobust = 75, FALSE or D/C - aka we're asking for no-fallback
kCGLRPBackingStore = 76, D/C kCGLRPBackingStore = 76, D/C
kCGLRPMPSafe = 78, D/C kCGLRPMPSafe = 78, D/C
kCGLRPMultiScreen = 81, D/C kCGLRPMultiScreen = 81, D/C
kCGLRPCompliant = 83, D/C kCGLRPCompliant = 83, D/C
*/ */
//--------------------------- info we have from CGL renderer queries, IOKit, Gestalt //--------------------------- info we have from CGL renderer queries, IOKit, Gestalt
//--------------------------- these are set up in the displayDB by CocoaMgr //--------------------------- these are set up in the displayDB by CocoaMgr
GLint m_fullscreen; GLint m_fullscreen;
GLint m_accelerated; GLint m_accelerated;
GLint m_windowed; GLint m_windowed;
GLint m_rendererID; GLint m_rendererID;
GLint m_displayMask; GLint m_displayMask;
GLint m_bufferModes; GLint m_bufferModes;
GLint m_colorModes; GLint m_colorModes;
GLint m_accumModes; GLint m_accumModes;
GLint m_depthModes; GLint m_depthModes;
GLint m_stencilModes; GLint m_stencilModes;
GLint m_maxAuxBuffers; GLint m_maxAuxBuffers;
GLint m_maxSampleBuffers; GLint m_maxSampleBuffers;
GLint m_maxSamples; GLint m_maxSamples;
GLint m_sampleModes; GLint m_sampleModes;
GLint m_sampleAlpha; GLint m_sampleAlpha;
GLint m_vidMemory; GLint m_vidMemory;
GLint m_texMemory; GLint m_texMemory;
uint m_pciVendorID; uint m_pciVendorID;
uint m_pciDeviceID; uint m_pciDeviceID;
char m_pciModelString[64]; char m_pciModelString[64];
char m_driverInfoString[64]; char m_driverInfoString[64];
//--------------------------- OS version related - set up by CocoaMgr //--------------------------- OS version related - set up by CocoaMgr
// OS version found // OS version found
uint m_osComboVersion; // 0x00XXYYZZ : XX major, YY minor, ZZ minor minor : 10.6.3 --> 0x000A0603. 10.5.8 --> 0x000A0508. 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 //--------------------------- shorthands - also set up by CocoaMgr - driven by vendorid / deviceid
bool m_ati; bool m_ati;
bool m_atiR5xx; bool m_atiR5xx;
bool m_atiR6xx; bool m_atiR6xx;
bool m_atiR7xx; bool m_atiR7xx;
bool m_atiR8xx; bool m_atiR8xx;
bool m_atiNewer; bool m_atiNewer;
bool m_intel; bool m_intel;
bool m_intel95x; bool m_intel95x;
bool m_intel3100; bool m_intel3100;
bool m_intelNewer; bool m_intelNewer;
bool m_nv; bool m_nv;
bool m_nvG7x; bool m_nvG7x;
bool m_nvG8x; bool m_nvG8x;
bool m_nvNewer; 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) //--------------------------- context query results - left blank in the display DB - but valid in a GLMContext (call ctx->Caps() to get a const ref)
// booleans // booleans
bool m_hasGammaWrites; // aka glGetBooleanv(GL_FRAMEBUFFER_SRGB_CAPABLE_EXT) / glEnable(GL_FRAMEBUFFER_SRGB_EXT) 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_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_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_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_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_hasOcclusionQuery; // occlusion query: do you speak it ?!
bool m_hasFramebufferBlit; // framebuffer blit: know what I'm sayin?! 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) bool m_hasPerfPackage1; // means new MTGL, fast OQ, fast uniform upload, NV can resolve flipped (late summer 2010 post 10.6.4 update)
// counts // counts
int m_maxAniso; // aniso limit - context query int m_maxAniso; // aniso limit - context query
// other exts // other exts
bool m_hasBindableUniforms; bool m_hasBindableUniforms;
bool m_hasUniformBuffers; bool m_hasUniformBuffers;
// runtime options that aren't negotiable once set // runtime options that aren't negotiable once set
bool m_hasDualShaders; // must supply CLI arg "-glmdualshaders" or we go GLSL only bool m_hasDualShaders; // must supply CLI arg "-glmdualshaders" or we go GLSL only
//--------------------------- " can'ts " - specific problems that need to be worked around //--------------------------- " can'ts " - specific problems that need to be worked around
bool m_cantBlitReliably; // Intel chipsets have problems blitting sRGB sometimes 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_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_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_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 bool m_costlyGammaFlips; // this means that sRGB sampling state affects shader code gen, resulting in state-dependent code regen
//--------------------------- " bads " - known bad drivers //--------------------------- " bads " - known bad drivers
bool m_badDriver1064NV; // this is the bad NVIDIA driver on 10.6.4 - stutter, tex corruption, black screen issues bool m_badDriver1064NV; // this is the bad NVIDIA driver on 10.6.4 - stutter, tex corruption, black screen issues
}; };
#endif #endif

File diff suppressed because it is too large Load Diff

View File

@ -1,299 +1,299 @@
//========= Copyright Valve Corporation, All rights reserved. ============// //========= Copyright Valve Corporation, All rights reserved. ============//
// //
// glmgrbasics.h // glmgrbasics.h
// types, common headers, forward declarations, utilities // types, common headers, forward declarations, utilities
// //
//=============================================================================== //===============================================================================
#ifndef GLMBASICS_H #ifndef GLMBASICS_H
#define GLMBASICS_H #define GLMBASICS_H
#pragma once #pragma once
#ifdef OSX #ifdef OSX
#include <OpenGL/OpenGL.h> #include <OpenGL/OpenGL.h>
#include <OpenGL/gl.h> #include <OpenGL/gl.h>
#include <OpenGL/glext.h> #include <OpenGL/glext.h>
#include <OpenGL/CGLTypes.h> #include <OpenGL/CGLTypes.h>
#include <OpenGL/CGLRenderers.h> #include <OpenGL/CGLRenderers.h>
#include <OpenGL/CGLCurrent.h> #include <OpenGL/CGLCurrent.h>
#include <OpenGL/CGLProfiler.h> #include <OpenGL/CGLProfiler.h>
//#include <ApplicationServices/ApplicationServices.h> //#include <ApplicationServices/ApplicationServices.h>
#elif defined(LINUX) #elif defined(LINUX)
#include <GL/gl.h> #include <GL/gl.h>
#include <GL/glext.h> #include <GL/glext.h>
#else #else
#error #error
#endif #endif
#include "tier0/platform.h" #include "tier0/platform.h"
#include "bitmap/imageformat.h" #include "bitmap/imageformat.h"
#include "bitvec.h" #include "bitvec.h"
#include "tier1/checksum_md5.h" #include "tier1/checksum_md5.h"
#include "tier1/utlvector.h" #include "tier1/utlvector.h"
#include "tier1/convar.h" #include "tier1/convar.h"
#include <sys/stat.h> #include <sys/stat.h>
#include "dxabstract_types.h" #include "dxabstract_types.h"
// types // types
struct GLMRect; struct GLMRect;
typedef void *PseudoGLContextPtr; typedef void *PseudoGLContextPtr;
// 3-d integer box (used for texture lock/unlock etc) // 3-d integer box (used for texture lock/unlock etc)
struct GLMRegion struct GLMRegion
{ {
int xmin,xmax; int xmin,xmax;
int ymin,ymax; int ymin,ymax;
int zmin,zmax; int zmin,zmax;
}; };
struct GLMRect // follows GL convention - if coming from the D3D rect you will need to fiddle the Y's struct GLMRect // follows GL convention - if coming from the D3D rect you will need to fiddle the Y's
{ {
int xmin; // left int xmin; // left
int ymin; // bottom int ymin; // bottom
int xmax; // right int xmax; // right
int ymax; // top int ymax; // top
}; };
// macros // macros
//#define GLMassert(x) assert(x) //#define GLMassert(x) assert(x)
// forward decls // forward decls
class GLMgr; // singleton class GLMgr; // singleton
class GLMContext; // GL context class GLMContext; // GL context
class CGLMContextTester; // testing class class CGLMContextTester; // testing class
class CGLMTex; class CGLMTex;
class CGLMFBO; class CGLMFBO;
class CGLMProgram; class CGLMProgram;
class CGLMBuffer; class CGLMBuffer;
// utilities // utilities
typedef enum typedef enum
{ {
// D3D codes // D3D codes
eD3D_DEVTYPE, eD3D_DEVTYPE,
eD3D_FORMAT, eD3D_FORMAT,
eD3D_RTYPE, eD3D_RTYPE,
eD3D_USAGE, eD3D_USAGE,
eD3D_RSTATE, // render state eD3D_RSTATE, // render state
eD3D_SIO, // D3D shader bytecode eD3D_SIO, // D3D shader bytecode
eD3D_VTXDECLUSAGE, eD3D_VTXDECLUSAGE,
// CGL codes // CGL codes
eCGL_RENDID, eCGL_RENDID,
// OpenGL error codes // OpenGL error codes
eGL_ERROR, eGL_ERROR,
// OpenGL enums // OpenGL enums
eGL_ENUM, eGL_ENUM,
eGL_RENDERER eGL_RENDERER
} GLMThing_t; } GLMThing_t;
const char* GLMDecode( GLMThing_t type, unsigned long value ); // decode a numeric const 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 const char* GLMDecodeMask( GLMThing_t type, unsigned long value ); // decode a bitmask
void GLMStop( void ); // aka Debugger() void GLMStop( void ); // aka Debugger()
void GLMCheckError( bool noStop = false, bool noLog= false ); void GLMCheckError( bool noStop = false, bool noLog= false );
void GLMEnableTrace( bool on ); void GLMEnableTrace( bool on );
// expose these in release now // expose these in release now
// Mimic PIX events so we can decorate debug spew // Mimic PIX events so we can decorate debug spew
void GLMBeginPIXEvent( const char *str ); void GLMBeginPIXEvent( const char *str );
void GLMEndPIXEvent( void ); void GLMEndPIXEvent( void );
//=============================================================================== //===============================================================================
// knob twiddling // knob twiddling
float GLMKnob( char *knobname, float *setvalue ); // Pass NULL to not-set the knob value float GLMKnob( char *knobname, float *setvalue ); // Pass NULL to not-set the knob value
float GLMKnobToggle( char *knobname ); float GLMKnobToggle( char *knobname );
//=============================================================================== //===============================================================================
// other stuff // other stuff
// helpers for CGLSetOption - no op if no profiler // helpers for CGLSetOption - no op if no profiler
void GLMProfilerClearTrace( void ); void GLMProfilerClearTrace( void );
void GLMProfilerEnableTrace( bool enable ); void GLMProfilerEnableTrace( bool enable );
// helpers for CGLSetParameter - no op if no profiler // helpers for CGLSetParameter - no op if no profiler
void GLMProfilerDumpState( void ); void GLMProfilerDumpState( void );
//=============================================================================== //===============================================================================
// classes // classes
// helper class making function tracking easier to wire up // helper class making function tracking easier to wire up
#if GLMDEBUG #if GLMDEBUG
class GLMFuncLogger class GLMFuncLogger
{ {
public: public:
// simple function log // simple function log
GLMFuncLogger( const char *funcName ) GLMFuncLogger( const char *funcName )
{ {
m_funcName = funcName; m_funcName = funcName;
m_earlyOut = false; m_earlyOut = false;
GLMPrintf( ">%s", m_funcName ); GLMPrintf( ">%s", m_funcName );
}; };
// more advanced version lets you pass args (i.e. called parameters or anything else of interest) // 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 // 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, ... ) GLMFuncLogger( const char *funcName, char *fmt, ... )
{ {
m_funcName = funcName; m_funcName = funcName;
m_earlyOut = false; m_earlyOut = false;
// this acts like GLMPrintf here // this acts like GLMPrintf here
// all the indent policy is down in GLMPrintfVA // 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. // which means we need to inject a ">" at the front of the format string to make this work... sigh.
char modifiedFmt[2000]; char modifiedFmt[2000];
modifiedFmt[0] = '>'; modifiedFmt[0] = '>';
strcpy( modifiedFmt+1, fmt ); strcpy( modifiedFmt+1, fmt );
va_list vargs; va_list vargs;
va_start(vargs, fmt); va_start(vargs, fmt);
GLMPrintfVA( modifiedFmt, vargs ); GLMPrintfVA( modifiedFmt, vargs );
va_end( vargs ); va_end( vargs );
} }
~GLMFuncLogger( ) ~GLMFuncLogger( )
{ {
if (m_earlyOut) if (m_earlyOut)
{ {
GLMPrintf( "<%s (early out)", m_funcName ); GLMPrintf( "<%s (early out)", m_funcName );
} }
else else
{ {
GLMPrintf( "<%s", m_funcName ); GLMPrintf( "<%s", m_funcName );
} }
}; };
void EarlyOut( void ) void EarlyOut( void )
{ {
m_earlyOut = true; m_earlyOut = true;
}; };
const char *m_funcName; // set at construction time const char *m_funcName; // set at construction time
bool m_earlyOut; bool m_earlyOut;
}; };
// handy macro to go with the function tracking class // handy macro to go with the function tracking class
#define GLM_FUNC GLMFuncLogger _logger_ ( __FUNCTION__ ) #define GLM_FUNC GLMFuncLogger _logger_ ( __FUNCTION__ )
#else #else
#define GLM_FUNC #define GLM_FUNC
#endif #endif
// class to keep an in-memory mirror of a file which may be getting edited during run // class to keep an in-memory mirror of a file which may be getting edited during run
class CGLMFileMirror class CGLMFileMirror
{ {
public: public:
CGLMFileMirror( char *fullpath ); // just associates mirror with file. if file exists it will be read. 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 //if non existent it will be created with size zero
~CGLMFileMirror( ); ~CGLMFileMirror( );
bool HasData( void ); // see if data avail bool HasData( void ); // see if data avail
void GetData( char **dataPtr, uint *dataSizePtr ); // read it out void GetData( char **dataPtr, uint *dataSizePtr ); // read it out
void SetData( char *data, uint dataSize ); // put data in (and write it to disk) 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. 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 UpdateStatInfo( void ); // make sure stat info is current for our file
void ReadFile( void ); void ReadFile( void );
void WriteFile( void ); void WriteFile( void );
void OpenInEditor( bool foreground=false ); // pass TRUE if you would like the editor to pop to foreground void OpenInEditor( bool foreground=false ); // pass TRUE if you would like the editor to pop to foreground
/// how about a "wait for change" method.. /// how about a "wait for change" method..
char *m_path; // fullpath to file char *m_path; // fullpath to file
bool m_exists; bool m_exists;
struct stat m_stat; // stat results for the file (last time checked) struct stat m_stat; // stat results for the file (last time checked)
char *m_data; // content of file char *m_data; // content of file
uint m_size; // length of content uint m_size; // length of content
}; };
// class based on the file mirror, that makes it easy to edit them outside the app. // 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 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") // 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. // 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. // 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) // (i.e. engine is instructing this subsystem to wipe out any old/modified variants of the text)
class CGLMEditableTextItem class CGLMEditableTextItem
{ {
public: public:
CGLMEditableTextItem( char *text, uint size, bool forceOverwrite, char *prefix, char *suffix = NULL ); // create a text blob from text source, optional filename suffix CGLMEditableTextItem( char *text, uint size, bool forceOverwrite, char *prefix, char *suffix = NULL ); // create a text blob from text source, optional filename suffix
~CGLMEditableTextItem( ); ~CGLMEditableTextItem( );
bool HasData( void ); bool HasData( void );
bool PollForChanges( void ); // return true if stale i.e. you need to get a new edition 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 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 void OpenInEditor( bool foreground=false ); // call user attention to this text
// internal methods // internal methods
void GenHashOfOrigText( void ); void GenHashOfOrigText( void );
void GenBaseNameAndFullPath( char *prefix, char *suffix ); void GenBaseNameAndFullPath( char *prefix, char *suffix );
void GenMungedText( bool fromMirror ); void GenMungedText( bool fromMirror );
// members // members
// orig // orig
uint m_origSize; uint m_origSize;
char *m_origText; // what was submitted char *m_origText; // what was submitted
unsigned char m_origDigest[MD5_DIGEST_LENGTH]; // digest of what was submitted unsigned char m_origDigest[MD5_DIGEST_LENGTH]; // digest of what was submitted
// munged // munged
uint m_mungedSize; uint m_mungedSize;
char *m_mungedText; // re-processed edition, initial content submission to the file mirror char *m_mungedText; // re-processed edition, initial content submission to the file mirror
// mirror // mirror
char *m_mirrorBaseName; // generated from the hash of the orig text, plus the label / prefix char *m_mirrorBaseName; // generated from the hash of the orig text, plus the label / prefix
char *m_mirrorFullPath; // base name char *m_mirrorFullPath; // base name
CGLMFileMirror *m_mirror; // file mirror itself. holds "official" copy for GetCurrentText to return. CGLMFileMirror *m_mirror; // file mirror itself. holds "official" copy for GetCurrentText to return.
}; };
// debug font // debug font
extern unsigned char g_glmDebugFontMap[16384]; extern unsigned char g_glmDebugFontMap[16384];
// class for cracking multi-part text blobs // class for cracking multi-part text blobs
// sections are demarcated by beginning-of-line markers submitted in a table by the caller // sections are demarcated by beginning-of-line markers submitted in a table by the caller
struct GLMTextSection struct GLMTextSection
{ {
int m_markerIndex; // based on table of markers passed in to constructor int m_markerIndex; // based on table of markers passed in to constructor
uint m_textOffset; // where is the text - offset uint m_textOffset; // where is the text - offset
int m_textLength; // how big is the section int m_textLength; // how big is the section
}; };
class CGLMTextSectioner class CGLMTextSectioner
{ {
public: public:
CGLMTextSectioner( char *text, int textSize, char **markers ); // constructor finds all the sections CGLMTextSectioner( char *text, int textSize, char **markers ); // constructor finds all the sections
~CGLMTextSectioner( ); ~CGLMTextSectioner( );
int Count( void ); // how many sections found int Count( void ); // how many sections found
void GetSection( int index, uint *offsetOut, uint *lengthOut, int *markerIndexOut ); void GetSection( int index, uint *offsetOut, uint *lengthOut, int *markerIndexOut );
// find section, size, what marker // find section, size, what marker
// note that more than one section can be marked similarly. // 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. // so policy isn't made here, you walk the sections and decide what to do if there are dupes.
//members //members
//section table //section table
CUtlVector< GLMTextSection > m_sectionTable; CUtlVector< GLMTextSection > m_sectionTable;
}; };
#endif #endif

View File

@ -1,93 +1,93 @@
//========= Copyright Valve Corporation, All rights reserved. ============// //========= Copyright Valve Corporation, All rights reserved. ============//
// //
// glmgrext.h // glmgrext.h
// helper file for extension testing and runtime importing of entry points // helper file for extension testing and runtime importing of entry points
// //
//=============================================================================== //===============================================================================
#pragma once #pragma once
#ifdef OSX #ifdef OSX
#include <OpenGL/gl.h> #include <OpenGL/gl.h>
#include <OpenGL/glext.h> #include <OpenGL/glext.h>
#elif defined(LINUX) #elif defined(LINUX)
#include <GL/gl.h> #include <GL/gl.h>
#include <GL/glext.h> #include <GL/glext.h>
#else #else
#error #error
#endif #endif
#ifndef GL_EXT_framebuffer_sRGB #ifndef GL_EXT_framebuffer_sRGB
#define GL_FRAMEBUFFER_SRGB_EXT 0x8DB9 #define GL_FRAMEBUFFER_SRGB_EXT 0x8DB9
#define GL_FRAMEBUFFER_SRGB_CAPABLE_EXT 0x8DBA #define GL_FRAMEBUFFER_SRGB_CAPABLE_EXT 0x8DBA
#endif #endif
#ifndef ARB_texture_rg #ifndef ARB_texture_rg
#define GL_COMPRESSED_RED 0x8225 #define GL_COMPRESSED_RED 0x8225
#define GL_COMPRESSED_RG 0x8226 #define GL_COMPRESSED_RG 0x8226
#define GL_RG 0x8227 #define GL_RG 0x8227
#define GL_RG_INTEGER 0x8228 #define GL_RG_INTEGER 0x8228
#define GL_R8 0x8229 #define GL_R8 0x8229
#define GL_R16 0x822A #define GL_R16 0x822A
#define GL_RG8 0x822B #define GL_RG8 0x822B
#define GL_RG16 0x822C #define GL_RG16 0x822C
#define GL_R16F 0x822D #define GL_R16F 0x822D
#define GL_R32F 0x822E #define GL_R32F 0x822E
#define GL_RG16F 0x822F #define GL_RG16F 0x822F
#define GL_RG32F 0x8230 #define GL_RG32F 0x8230
#define GL_R8I 0x8231 #define GL_R8I 0x8231
#define GL_R8UI 0x8232 #define GL_R8UI 0x8232
#define GL_R16I 0x8233 #define GL_R16I 0x8233
#define GL_R16UI 0x8234 #define GL_R16UI 0x8234
#define GL_R32I 0x8235 #define GL_R32I 0x8235
#define GL_R32UI 0x8236 #define GL_R32UI 0x8236
#define GL_RG8I 0x8237 #define GL_RG8I 0x8237
#define GL_RG8UI 0x8238 #define GL_RG8UI 0x8238
#define GL_RG16I 0x8239 #define GL_RG16I 0x8239
#define GL_RG16UI 0x823A #define GL_RG16UI 0x823A
#define GL_RG32I 0x823B #define GL_RG32I 0x823B
#define GL_RG32UI 0x823C #define GL_RG32UI 0x823C
#endif #endif
#ifndef GL_EXT_bindable_uniform #ifndef GL_EXT_bindable_uniform
#define GL_UNIFORM_BUFFER_EXT 0x8DEE #define GL_UNIFORM_BUFFER_EXT 0x8DEE
#endif #endif
// unpublished extension enums (thus the "X") // unpublished extension enums (thus the "X")
// from EXT_framebuffer_multisample_blit_scaled.. // from EXT_framebuffer_multisample_blit_scaled..
#define XGL_SCALED_RESOLVE_FASTEST_EXT 0x90BA #define XGL_SCALED_RESOLVE_FASTEST_EXT 0x90BA
#define XGL_SCALED_RESOLVE_NICEST_EXT 0x90BB #define XGL_SCALED_RESOLVE_NICEST_EXT 0x90BB
#ifndef GL_TEXTURE_MINIMIZE_STORAGE_APPLE #ifndef GL_TEXTURE_MINIMIZE_STORAGE_APPLE
#define GL_TEXTURE_MINIMIZE_STORAGE_APPLE 0x85B6 #define GL_TEXTURE_MINIMIZE_STORAGE_APPLE 0x85B6
#endif #endif
#ifndef GL_ALL_COMPLETED_NV #ifndef GL_ALL_COMPLETED_NV
#define GL_ALL_COMPLETED_NV 0x84F2 #define GL_ALL_COMPLETED_NV 0x84F2
#endif #endif
#ifndef GL_MAP_READ_BIT #ifndef GL_MAP_READ_BIT
#define GL_MAP_READ_BIT 0x0001 #define GL_MAP_READ_BIT 0x0001
#endif #endif
#ifndef GL_MAP_WRITE_BIT #ifndef GL_MAP_WRITE_BIT
#define GL_MAP_WRITE_BIT 0x0002 #define GL_MAP_WRITE_BIT 0x0002
#endif #endif
#ifndef GL_MAP_INVALIDATE_RANGE_BIT #ifndef GL_MAP_INVALIDATE_RANGE_BIT
#define GL_MAP_INVALIDATE_RANGE_BIT 0x0004 #define GL_MAP_INVALIDATE_RANGE_BIT 0x0004
#endif #endif
#ifndef GL_MAP_INVALIDATE_BUFFER_BIT #ifndef GL_MAP_INVALIDATE_BUFFER_BIT
#define GL_MAP_INVALIDATE_BUFFER_BIT 0x0008 #define GL_MAP_INVALIDATE_BUFFER_BIT 0x0008
#endif #endif
#ifndef GL_MAP_FLUSH_EXPLICIT_BIT #ifndef GL_MAP_FLUSH_EXPLICIT_BIT
#define GL_MAP_FLUSH_EXPLICIT_BIT 0x0010 #define GL_MAP_FLUSH_EXPLICIT_BIT 0x0010
#endif #endif
#ifndef GL_MAP_UNSYNCHRONIZED_BIT #ifndef GL_MAP_UNSYNCHRONIZED_BIT
#define GL_MAP_UNSYNCHRONIZED_BIT 0x0020 #define GL_MAP_UNSYNCHRONIZED_BIT 0x0020
#endif #endif

View File

@ -1,112 +1,112 @@
//========= Copyright Valve Corporation, All rights reserved. ============// //========= Copyright Valve Corporation, All rights reserved. ============//
/******************************************************************/ /******************************************************************/
/* qsort.c -- Non-Recursive ANSI Quicksort function */ /* qsort.c -- Non-Recursive ANSI Quicksort function */
/* */ /* */
/* Public domain by Raymond Gardner, Englewood CO February 1991 */ /* Public domain by Raymond Gardner, Englewood CO February 1991 */
/* */ /* */
/* Usage: */ /* Usage: */
/* qsort(base, nbr_elements, width_bytes, compare_function); */ /* qsort(base, nbr_elements, width_bytes, compare_function); */
/* void *base; */ /* void *base; */
/* size_t nbr_elements, width_bytes; */ /* size_t nbr_elements, width_bytes; */
/* int (*compare_function)(const void *, const void *); */ /* int (*compare_function)(const void *, const void *); */
/* */ /* */
/* Sorts an array starting at base, of length nbr_elements, each */ /* Sorts an array starting at base, of length nbr_elements, each */
/* element of size width_bytes, ordered via compare_function, */ /* element of size width_bytes, ordered via compare_function, */
/* which is called as (*compare_function)(ptr_to_element1, */ /* which is called as (*compare_function)(ptr_to_element1, */
/* ptr_to_element2) and returns < 0 if element1 < element2, */ /* ptr_to_element2) and returns < 0 if element1 < element2, */
/* 0 if element1 = element2, > 0 if element1 > element2. */ /* 0 if element1 = element2, > 0 if element1 > element2. */
/* Most refinements are due to R. Sedgewick. See "Implementing */ /* Most refinements are due to R. Sedgewick. See "Implementing */
/* Quicksort Programs", Comm. ACM, Oct. 1978, and Corrigendum, */ /* Quicksort Programs", Comm. ACM, Oct. 1978, and Corrigendum, */
/* Comm. ACM, June 1979. */ /* Comm. ACM, June 1979. */
/******************************************************************/ /******************************************************************/
// modified to take (and use) a context object, ala Microsoft's qsort_s // modified to take (and use) a context object, ala Microsoft's qsort_s
// "extension" to the stdlib // "extension" to the stdlib
#include <stddef.h> /* for size_t definition */ #include <stddef.h> /* for size_t definition */
/* /*
** swap nbytes between a and b ** swap nbytes between a and b
*/ */
static void swap_bytes(char *a, char *b, size_t nbytes) static void swap_bytes(char *a, char *b, size_t nbytes)
{ {
char tmp; char tmp;
do { do {
tmp = *a; *a++ = *b; *b++ = tmp; tmp = *a; *a++ = *b; *b++ = tmp;
} while ( --nbytes ); } while ( --nbytes );
} }
#define SWAP(a, b) (swap_bytes((char *)(a), (char *)(b), size)) #define SWAP(a, b) (swap_bytes((char *)(a), (char *)(b), size))
#define COMP(ctx, a, b) ((*comp)((void *)ctx, (void *)(a), (void *)(b))) #define COMP(ctx, a, b) ((*comp)((void *)ctx, (void *)(a), (void *)(b)))
#define T 7 /* subfiles of T or fewer elements will */ #define T 7 /* subfiles of T or fewer elements will */
/* be sorted by a simple insertion sort */ /* be sorted by a simple insertion sort */
/* Note! T must be at least 3 */ /* Note! T must be at least 3 */
extern "C" void qsort_s(void *basep, size_t nelems, size_t size, extern "C" void qsort_s(void *basep, size_t nelems, size_t size,
int (*comp)(void *, const void *, const void *), int (*comp)(void *, const void *, const void *),
void *ctx) void *ctx)
{ {
char *stack[40], **sp; /* stack and stack pointer */ char *stack[40], **sp; /* stack and stack pointer */
char *i, *j, *limit; /* scan and limit pointers */ char *i, *j, *limit; /* scan and limit pointers */
size_t thresh; /* size of T elements in bytes */ size_t thresh; /* size of T elements in bytes */
char *base; /* base pointer as char * */ char *base; /* base pointer as char * */
base = (char *)basep; /* set up char * base pointer */ base = (char *)basep; /* set up char * base pointer */
thresh = T * size; /* init threshold */ thresh = T * size; /* init threshold */
sp = stack; /* init stack pointer */ sp = stack; /* init stack pointer */
limit = base + nelems * size;/* pointer past end of array */ limit = base + nelems * size;/* pointer past end of array */
for ( ;; ) { /* repeat until break... */ for ( ;; ) { /* repeat until break... */
if ( limit - base > thresh ) { /* if more than T elements */ if ( limit - base > thresh ) { /* if more than T elements */
/* swap base with middle */ /* swap base with middle */
SWAP((((limit-base)/size)/2)*size+base, base); SWAP((((limit-base)/size)/2)*size+base, base);
i = base + size; /* i scans left to right */ i = base + size; /* i scans left to right */
j = limit - size; /* j scans right to left */ j = limit - size; /* j scans right to left */
if ( COMP(ctx, i, j) > 0 ) /* Sedgewick's */ if ( COMP(ctx, i, j) > 0 ) /* Sedgewick's */
SWAP(i, j); /* three-element sort */ SWAP(i, j); /* three-element sort */
if ( COMP(ctx, base, j) > 0 )/* sets things up */ if ( COMP(ctx, base, j) > 0 )/* sets things up */
SWAP(base, j); /* so that */ SWAP(base, j); /* so that */
if ( COMP(ctx, i, base) > 0 )/* *i <= *base <= *j */ if ( COMP(ctx, i, base) > 0 )/* *i <= *base <= *j */
SWAP(i, base); /* *base is pivot element */ SWAP(i, base); /* *base is pivot element */
for ( ;; ) { /* loop until break */ for ( ;; ) { /* loop until break */
do /* move i right */ do /* move i right */
i += size; /* until *i >= pivot */ i += size; /* until *i >= pivot */
while ( COMP(ctx, i, base) < 0 ); while ( COMP(ctx, i, base) < 0 );
do /* move j left */ do /* move j left */
j -= size; /* until *j <= pivot */ j -= size; /* until *j <= pivot */
while ( COMP(ctx, j, base) > 0 ); while ( COMP(ctx, j, base) > 0 );
if ( i > j ) /* if pointers crossed */ if ( i > j ) /* if pointers crossed */
break; /* break loop */ break; /* break loop */
SWAP(i, j); /* else swap elements, keep scanning*/ SWAP(i, j); /* else swap elements, keep scanning*/
} }
SWAP(base, j); /* move pivot into correct place */ SWAP(base, j); /* move pivot into correct place */
if ( j - base > limit - i ) { /* if left subfile larger */ if ( j - base > limit - i ) { /* if left subfile larger */
sp[0] = base; /* stack left subfile base */ sp[0] = base; /* stack left subfile base */
sp[1] = j; /* and limit */ sp[1] = j; /* and limit */
base = i; /* sort the right subfile */ base = i; /* sort the right subfile */
} else { /* else right subfile larger*/ } else { /* else right subfile larger*/
sp[0] = i; /* stack right subfile base */ sp[0] = i; /* stack right subfile base */
sp[1] = limit; /* and limit */ sp[1] = limit; /* and limit */
limit = j; /* sort the left subfile */ limit = j; /* sort the left subfile */
} }
sp += 2; /* increment stack pointer */ sp += 2; /* increment stack pointer */
} else { /* else subfile is small, use insertion sort */ } else { /* else subfile is small, use insertion sort */
for ( j = base, i = j+size; i < limit; j = i, i += size ) for ( j = base, i = j+size; i < limit; j = i, i += size )
for ( ; COMP(ctx, j, j+size) > 0; j -= size ) { for ( ; COMP(ctx, j, j+size) > 0; j -= size ) {
SWAP(j, j+size); SWAP(j, j+size);
if ( j == base ) if ( j == base )
break; break;
} }
if ( sp != stack ) { /* if any entries on stack */ if ( sp != stack ) { /* if any entries on stack */
sp -= 2; /* pop the base and limit */ sp -= 2; /* pop the base and limit */
base = sp[0]; base = sp[0];
limit = sp[1]; limit = sp[1];
} else /* else stack empty, done */ } else /* else stack empty, done */
break; break;
} }
} }
} }